自制 COCO api 直接讀取類 COCO 的標註數據的壓縮文件

第6章 COCO API 的使用

COCO 數據庫是由微軟發佈的一個大型圖像數據集,該數據集專爲對象檢測、分割、人體關鍵點檢測、語義分割和字幕生成而設計。若是你要了解 COCO 數據庫的一些細節,你能夠參考:html

  • MS COCO 數據集主頁:http://mscoco.org/
  • 我改寫的 COCO API 網址:https://github.com/Xinering/cocoapi
  • 數據下載: http://mscoco.org/dataset/#download

COCO API1 提供了 Matlab, Python 和 Lua 的 API 接口。該 API 接口提供完整的圖像標籤數據的加載,解析和可視化的工做。此外,網站還提供了與數據相關的文章,教程等。python

在使用 COCO 數據庫提供的 API 和 demo 以前,咱們首先須要下載 COCO 的圖像和標籤數據:linux

  • 圖像數據下載到 coco/images/ 文件夾中
  • 標籤數據下載到 coco/annotations/ 文件夾中

本章快報:git

  • 介紹和使用官方 API:詳細說明如何在 Linux 和 Windows 系統下使用 cocoapi
  • 改寫官方 API:利用 Python 的特性對 API 進行改寫,同時支持直接讀取壓縮文件
  • API 擴展:將 API 推廣至其餘數據集

下面咱們來探討一下如何利用 Python 來使用 COCO 數據集?github

6.1 COCO API 的配置與簡介

爲了方便操做,咱們先 fork 官方 COCO API,而後下載到本地,並切換到 API 所在目錄,如 D:\API\cocoapi\PythonAPI數據庫

cd D:\API\cocoapi\PythonAPI

打開當前目錄下的 Makefile 能夠看到 API 的安裝和使用說明。json

6.1.1 Windows 的配置

在 Windows 下直接運行 python setup.py build_ext --inplace 會報錯:windows

Windows 中 (通常須要安裝 visual studio)有許多的坑,參考 Windows 10 編譯 Pycocotools 踩坑記2 暴力刪掉參數 Wno-cppWno-unused-function,以下圖所示:api

這樣,咱們即可以在 Python 中使用 pycocotools,不過每次你想要調用 pycocotools 須要先載入局部環境:數組

import sys
sys.path.append('D:\API\cocoapi\PythonAPI')   # 將你的 `pycocotools` 所在路徑添加到系統環境

若是你不想這麼麻煩,你能夠直接將 pycocotools 安裝在你的主環境下:

cd D:\API\cocoapi\PythonAPI

python setup.py build_ext install
rd build   # 刪除

可是,這樣並無解決根本問題,還有許多 bug 須要你本身調,於是在第 6.2 節 介紹了 cocoapi 對 Windows 系統更加的友好實現。

6.1.2 Linux 下的配置

在 Linux 下,不須要上面這麼多編譯步驟,咱們直接在終端輸入下列命令便可正常使用 COCO API:

pip3 install -U Cython
pip3 install -U pycocotools

固然,你也可使用和 Windows 系統一樣的處理方法,具體操做方法也能夠參考 Makefile3

6.1.3 API 簡介

COCO API 能夠幫助你載入、解析和可視化 annotations。 該 API 支持 multiple annotation 格式 (詳情見 data format4). 更多關於 API 的細節可參考 coco.py5,同時 Python API demo6 也提供了API 的英文使用說明。

下面從官方頁面截了張 COCO API 的記號說明的圖片:

cocoapi

COCO 還爲每一個實例對象提供了分割掩碼(segmentation masks),可是產生了兩個挑戰:緊湊地存儲掩碼和高效地執行掩碼計算。 MASK API 使用自定義運行長度編碼 (Run Length Encoding, RLE) 方案解決這兩個難題。RLE 表示的大小與掩碼的邊界像素數成正比,而且能夠在 RLE 上直接有效地計算操做 (如面積、聯合或交集)。具體來講,假設 shapes 至關簡單, RLE 表示形式爲 \(O(\sqrt{n})\), 其中 \(n\) 是對象中的像素數, 而一般計算量一樣是 \(O(\sqrt{n})\)。在解碼掩碼 (存儲爲陣列) 上進行相同操做的天然的計算量將是 \(O(n)\)7

Mask API 提供了一個用於操做以 RLE 格式存儲的掩碼的接口。這個 API 被定義在 mask.py8。最後, 大多數 ground truth masks 存儲爲多邊形 (至關緊湊), 這些多邊形在須要時轉換爲 RLE。

MASK

至此,cocoapi 的介紹便宣告結束了,具體使用細則能夠參考pycocoDemo.ipynb9 提供的 cocoapi 的使用 demo,我已經翻譯成中文,你們能夠查閱:COCO 數據集的使用10

6.2 改寫 COCO API 的初衷

前文我一直在說 cocoapi 對 Windows 系統不友好,相信在 Windows 系統下使用過 cocoapi 的朋友必定會十分贊同的。

6.2.1 Why? API 改寫的目的

爲了在 Windows 系統下更加友好的使用 cocoapi,拋去各類調 bug 的煩惱,咱們十分有必要對 cocoapi 進行改寫。可是,徹底改寫源碼是有點讓人感到恐懼的事情,而 Python 是一個十分強大的語言,咱們利用它的繼承機制能夠無壓力改寫代碼。

6.2.2 What? API 能夠作什麼

讀者朋友是否是感受改寫 API 在作無用功,咱們直接在 Linux 系統使用 cocoapi 也沒有這麼多的煩惱,爲何必定要改寫?由於,改寫後的 API 除了能夠直接在 Windows 系統友好使用以外,它還提供了無需解壓(直接跳過解壓)直接獲取標註信息和圖片的功能。

6.2.3 How? API 如何設計

咱們在 cocoapi 所在目錄 D:\API\cocoapi\PythonAPI\pycocotools 下建立 cocoz.py 文件。下面咱們來一步一步的填充 cocoz.py。爲了方便調試,咱們先在 Notebook 模式下設計該 API,設計好以後,咱們再封裝到 cocoz.py 文件中。爲了令 cocoapi 可使用,須要先載入環境:

import sys
sys.path.append(r'D:\API\cocoapi\PythonAPI')

from pycocotools.coco import COCO

因爲咱們須要直接讀取壓縮文件,於是咱們須要 zipfile,爲了減小代碼編寫的工做量,咱們直接借用 cocoapi 的 COCO 類。又由於標註信息是以 .json 形式存儲的,因此載入 json 也是必要的,而 numpycv2 處理圖片數據的重要工具固然也須要。

import os
import zipfile
import numpy as np
import cv2
import json
import time

爲了更加方便的查看某個函數運行時間,咱們須要一個計時器:

def timer(func):
    '''
    Define a timer, pass in one, and
    return another method with the timing feature attached
    '''
    def wrapper(*args):
        start = time.time()
        print('Loading json in memory ...')
        value = func(*args)
        end = time.time()
        print('used time: {0:g} s'.format(end - start))
        return value

    return wrapper

我將 COCO 的全部數據都下載到了磁盤,咱們能夠查看以下:

root = r'E:\Data\coco'   # COCO 數據根目錄

dataDir = os.path.join(root, 'images')  #  圖片所在目錄
annDir = os.path.join(root, 'annotations')  # 標註信息所在目錄

print('images:\n',os.listdir(dataDir))
print('='*50)
print('annotations:\n',os.listdir(dataDir))
print(os.listdir(annDir))

輸出結果:

images:
['test2014.zip', 'test2015.zip', 'test2017.zip', 'train2014.zip', 'train2017.zip', 'unlabeled2017.zip', 'val2014.zip', 'val2017.zip']
==================================================
annotations:
['test2014.zip', 'test2015.zip', 'test2017.zip', 'train2014.zip', 'train2017.zip', 'unlabeled2017.zip', 'val2014.zip', 'val2017.zip']
['annotations_trainval2014.zip', 'annotations_trainval2017.zip', 'image_info_test2014.zip', 'image_info_test2015.zip', 'image_info_test2017.zip', 'image_info_unlabeled2017.zip', 'panoptic_annotations_trainval2017.zip', 'stuff_annotations_trainval2017.zip']

能夠看出:全部數據我都沒有解壓,下面咱們將動手設計一個無需解壓即可獲取數據信息的接口。

6.3 ImageZ 的設計和使用

咱們先設計一個用來處理 coco/images/ 文件夾下的圖片數據集的類:

class ImageZ(dict):
    '''
    Working with compressed files under the images
    '''

    def __init__(self, root, dataType, *args, **kwds):
        '''
        root:: root dir
        dataType in ['test2014', 'test2015',
                    'test2017', 'train2014',
                    'train2017', 'unlabeled2017',
                    'val2014', 'val2017']
        '''
        super().__init__(*args, **kwds)
        self.__dict__ = self
        self.shuffle = True if dataType.startswith('train') else False
        self.Z = self.__get_Z(root, dataType)
        self.names = self.__get_names(self.Z)
        self.dataType = self.Z.namelist()[0]

    @staticmethod
    def __get_Z(root, dataType):
        '''
        Get the file name of the compressed file under the images
        '''
        dataType = dataType + '.zip'
        img_root = os.path.join(root, 'images')
        return zipfile.ZipFile(os.path.join(img_root, dataType))

    @staticmethod
    def __get_names(Z):
        names = [
            name.split('/')[1] for name in Z.namelist()
            if not name.endswith('/')
        ]
        return names

    def buffer2array(self, image_name):
        '''
        Get picture data directly without decompression

        Parameters
        ===========
        Z:: Picture data is a ZipFile object
        '''
        image_name = self.dataType + image_name
        buffer = self.Z.read(image_name)
        image = np.frombuffer(buffer, dtype="B")  # 將 buffer 轉換爲 np.uint8 數組
        img_cv = cv2.imdecode(image, cv2.IMREAD_COLOR)  # BGR 格式
        img = cv2.cvtColor(img_cv, cv2.COLOR_BGR2RGB)
        return img

代碼這麼長看着是否是有點懵,具體細節你們本身琢磨,咱們直接看看它有什麼神奇之處?

dataDir = r'E:\Data\coco'   # COCO 數據根目錄
dataType = 'val2017'
imgZ = ImageZ(dataDir, dataType)

因爲 imgZ 繼承自 dict,因此它擁有字典的幾乎全部屬性和功能:

imgZ.keys()

輸出

dict_keys(['shuffle', 'Z', 'names', 'dataType'])
  • names:存儲了 val2017.zip 的全部圖片的文件名
  • shuffle:判斷是不是訓練數據集
  • ZZipFile 對象,用來操做整個 val2017.zip 文件

還有一個實例方法 buffer2array 能夠直接經過圖片的文件名獲取其像素級特徵。

fname = imgZ.names[77]  # 一張圖片的文件名
img = imgZ.buffer2array(fname)  # 獲取像素級特徵

因爲 img 是 Numpy 數組,這樣咱們就能夠對其進行各類咱們熟悉的操做,如圖片顯示:

from matplotlib import pyplot as plt

plt.imshow(img)
plt.show()

輸出:

至此,咱們已經完成無需解壓直接讀取圖片的工做。

6.4 AnnZ 的設計和使用

代碼以下:

class AnnZ(dict):
    '''
    Working with compressed files under annotations
    '''

    def __init__(self, root, annType, *args, **kwds):
        '''
        dataType in [
              'annotations_trainval2014',
              'annotations_trainval2017',
              'image_info_test2014',
              'image_info_test2015',
              'image_info_test2017',
              'image_info_unlabeled2017',
              'panoptic_annotations_trainval2017',
              'stuff_annotations_trainval2017'
        ]
        '''
        super().__init__(*args, **kwds)
        self.__dict__ = self
        self.Z = self.__get_Z(root, annType)
        self.names = self.__get_names(self.Z)

    @staticmethod
    def __get_Z(root, annType):
        '''
        Get the file name of the compressed file under the annotations
        '''
        annType = annType + '.zip'
        annDir = os.path.join(root, 'annotations')
        return zipfile.ZipFile(os.path.join(annDir, annType))

    @staticmethod
    def __get_names(Z):
        names = [name for name in Z.namelist() if not name.endswith('/')]
        return names

    @timer
    def json2dict(self, name):
        with self.Z.open(name) as fp:
            dataset = json.load(fp)
        return dataset

咱們直接看看如何使用?

root = r'E:\Data\coco'   # COCO 數據集所在根目錄
annType = 'annotations_trainval2017'   # COCO 標註數據類型

annZ = AnnZ(root, annType)

咱們來查看一下,該標註數據所包含的標註種類:

annZ.names

輸出:

['annotations/instances_train2017.json',
 'annotations/instances_val2017.json',
 'annotations/captions_train2017.json',
 'annotations/captions_val2017.json',
 'annotations/person_keypoints_train2017.json',
 'annotations/person_keypoints_val2017.json']

下面以 dict 的形式載入 'annotations/instances_train2017.json' 的具體信息:

annFile = 'annotations/instances_val2017.json'
dataset = annZ.json2dict(annFile)

輸出:

Loading json in memory ...
used time: 1.052 s

咱們還能夠查看 dataset 的關鍵字:

dataset.keys()

輸出:

dict_keys(['info', 'licenses', 'images', 'annotations', 'categories'])

這樣,咱們能夠很方便的使用 dict 的相關操做獲取咱們想要的一些信息:

dataset['images'][7]  # 查看一張圖片的一些標註信息

輸出:

{'license': 6,
'file_name': '000000480985.jpg',
'coco_url': 'http://images.cocodataset.org/val2017/000000480985.jpg',
'height': 500,
'width': 375,
'date_captured': '2013-11-15 13:09:24',
'flickr_url': 'http://farm3.staticflickr.com/2336/1634911562_703ff01cff_z.jpg',
'id': 480985}

咱們能夠利用 'coco_url' 直接從網上獲取圖片:

from matplotlib import pyplot as plt
import skimage.io as sio

coco_url = dataset['images'][7]['coco_url']
# use url to load image
I = sio.imread(coco_url)
plt.axis('off')
plt.imshow(I)
plt.show()

輸出:

藉助 ImageZ 從本地讀取圖片:

from matplotlib import pyplot as plt
imgType = 'val2017'
imgZ = ImageZ(root, imgType)

I = imgZ.buffer2array(dataset['images'][100]['file_name'])

plt.axis('off')
plt.imshow(I)
plt.show()

輸出:

6.5 COCOZ 的設計和使用

ImageZ 和 AnnZ 雖然很好用,可是它們的靈活性太大,而且如今的開源代碼均是基於 COCO 類進行設計的。爲了更加契合 cocoapi 咱們須要一箇中轉類 COCOZ 去實現和 COCO 幾乎同樣的功能,而且使用方法也儘量的保留。具體是代碼以下:

class COCOZ(COCO, dict):
    def __init__(self, annZ, annFile, *args, **kwds):
        '''
        ptint(coco):: View Coco's Instance object Coco's 'info'

        example
        ==========
        annZ = AnnZ(annDir, annType)
        '''
        super().__init__(*args, **kwds)
        self.__dict__ = self
        self.dataset = annZ.json2dict(annFile)
        self.createIndex()

    @timer
    def createIndex(self):
        # create index
        print('creating index...')
        cats, anns, imgs = {}, {}, {}
        imgToAnns, catToImgs = {}, {}
        if 'annotations' in self.dataset:
            for ann in self.dataset['annotations']:
                imgToAnns[ann['image_id']] = imgToAnns.get(
                    ann['image_id'], []) + [ann]
                anns[ann['id']] = ann
        if 'images' in self.dataset:
            for img in self.dataset['images']:
                imgs[img['id']] = img
        if 'categories' in self.dataset:
            for cat in self.dataset['categories']:
                cats[cat['id']] = cat
        if 'annotations' in self.dataset and 'categories' in self.dataset:
            for ann in self.dataset['annotations']:
                catToImgs[ann['category_id']] = catToImgs.get(
                    ann['category_id'], []) + [ann['image_id']]

        print('index created!')

        # create class members
        self.anns = anns
        self.imgToAnns = imgToAnns
        self.catToImgs = catToImgs
        self.imgs = imgs
        self.cats = cats

    def __str__(self):
        """
        Print information about the annotation file.
        """
        S = [
            '{}: {}'.format(key, value)
            for key, value in self.dataset['info'].items()
        ]
        return '\n'.join(S)

咱們直接看看如何使用 COCOZ?

root = r'E:\Data\coco'   # COCO 數據集所在根目錄
annType = 'annotations_trainval2017'   # COCO 標註數據類型
annFile = 'annotations/instances_val2017.json'

annZ = AnnZ(root, annType)
coco = COCOZ(annZ, annFile)

輸出:

Loading json in memory ...
used time: 1.036 s
Loading json in memory ...
creating index...
index created!
used time: 0.421946 s

若是你須要預覽你載入的 COCO 數據集,可使用 print() 來實現:

print(coco)

輸出:

description: COCO 2017 Dataset
url: http://cocodataset.org
version: 1.0
year: 2017
contributor: COCO Consortium
date_created: 2017/09/01

再次查看:

coco.keys()

輸出:

dict_keys(['dataset', 'anns', 'imgToAnns', 'catToImgs', 'imgs', 'cats'])

6.5.1 展現 COCO 的類別與超類

cats = coco.loadCats(coco.getCatIds())
nms = set([cat['name'] for cat in cats])  # 獲取 cat 的 name 信息
print('COCO categories: \n{}\n'.format(' '.join(nms)))
# ============================================================
snms = set([cat['supercategory'] for cat in cats])  # 獲取 cat 的 name 信息
print('COCO supercategories: \n{}'.format(' '.join(snms)))

輸出:

COCO categories:
kite sports ball horse banana toilet mouse frisbee bed donut clock sheep keyboard tv cup elephant cake potted plant snowboard train zebra fire hydrant handbag cow wine glass bowl sink parking meter umbrella giraffe suitcase skis surfboard stop sign bear cat chair traffic light fork truck orange carrot broccoli couch remote hair drier sandwich laptop tie person tennis racket apple spoon pizza hot dog bird refrigerator microwave scissors backpack airplane knife baseball glove vase toothbrush book bottle motorcycle bicycle car skateboard bus dining table cell phone toaster boat teddy bear dog baseball bat bench oven

COCO supercategories:
animal kitchen food appliance indoor accessory person sports furniture outdoor electronic vehicle

6.5.2 經過給定條件獲取圖片

獲取包含給定類別的全部圖片

# get all images containing given categories, select one at random
catIds = coco.getCatIds(catNms=['cat', 'dog', 'snowboar'])  # 獲取 Cat 的 Ids
imgIds = coco.getImgIds(catIds=catIds )  # 
img = coco.loadImgs(imgIds)
# 隨機選擇一張圖片的信息
img = coco.loadImgs(imgIds[np.random.randint(0,len(imgIds))])[0]

img

輸出:

{'license': 3,
'file_name': '000000179392.jpg',
'coco_url': 'http://images.cocodataset.org/val2017/000000179392.jpg',
'height': 640,
'width': 480,
'date_captured': '2013-11-18 04:07:31',
'flickr_url': 'http://farm5.staticflickr.com/4027/4329554124_1ce02506f8_z.jpg',
'id': 179392}

6.5.3 將圖片的 anns 信息標註在圖片上

先從本地磁盤獲取一張圖片:

from matplotlib import pyplot as plt
imgType = 'val2017'
imgZ = ImageZ(root, imgType)

I = imgZ.buffer2array(dataset['images'][55]['file_name'])

plt.axis('off')
plt.imshow(I)
plt.show()

輸出:

將標註信息加入圖片:

# load and display instance annotations
plt.imshow(I)
plt.axis('off')
annIds = coco.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)
anns = coco.loadAnns(annIds)
coco.showAnns(anns)

輸出:

6.5.4 關鍵點檢測

載入標註信息:

# initialize COCO api for person keypoints annotations
root = r'E:\Data\coco'   # COCO 數據集所在根目錄
annType = 'annotations_trainval2017'   # COCO 標註數據類型
annFile = 'annotations/person_keypoints_val2017.json'

annZ = AnnZ(root, annType)
coco_kps = COCOZ(annZ, annFile)

輸出:

Loading json in memory ...
used time: 0.924155 s
Loading json in memory ...
creating index...
index created!
used time: 0.378003 s

先選擇一張帶有 person 的圖片:

from matplotlib import pyplot as plt

catIds = coco.getCatIds(catNms=['person'])  # 獲取 Cat 的 Ids
imgIds = coco.getImgIds(catIds=catIds)  
img = coco.loadImgs(imgIds)[99]
# use url to load image
I = sio.imread(img['coco_url'])
plt.axis('off')
plt.imshow(I)
plt.show()

輸出:

將標註加到圖片上:

# load and display keypoints annotations
plt.imshow(I); plt.axis('off')
ax = plt.gca()
annIds = coco_kps.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)
anns = coco_kps.loadAnns(annIds)
coco_kps.showAnns(anns)

輸出:

6.5.5 看圖說話

載入標註信息:

# initialize COCO api for person keypoints annotations
root = r'E:\Data\coco'   # COCO 數據集所在根目錄
annType = 'annotations_trainval2017'   # COCO 標註數據類型
annFile = 'annotations/captions_val2017.json'

annZ = AnnZ(root, annType)
coco_caps = COCOZ(annZ, annFile)

輸出

Loading json in memory ...
used time: 0.0760329 s
Loading json in memory ...
creating index...
index created!
used time: 0.0170002 s

將標註加到圖片上:

A man riding on a skateboard on the sidewalk.
a kid riding on a skateboard on the cement
There is a skateboarder riding his board on the sidewalk
A skateboarder with one fut on a skateboard raising it up.
A pavement where a person foot are seen having skates.

至此,咱們已經完成了咱們的預期目標。

6.6 讓 API 更加通用

雖然咱們完成了預期目標,可是 cocoz.py 還有很大的改進餘地。好比咱們能夠令 ImageZ 變得像列表同樣,支持索引和切片。爲了優化結構,咱們能夠將其封裝爲生成器。基於這些想法咱們便獲得一個改進版的 ImageZ,只需添加幾個實例方法便可:

def __getitem__(self, item):
    names = self.names[item]
    if isinstance(item, slice):
        return [self.buffer2array(name) for name in names]
    else:
        return self.buffer2array(names)


def __len__(self):
    return len(self.names)


def __iter__(self):
    for name in self.names:
        yield self.buffer2array(name)

詳細代碼被我放在:cocoz.py11

同時,爲了令其餘數據也可使用 ImageZ 類,咱們將 ImageZ 的輸入參數改成 images 所在路徑,其餘不變。因爲咱們已經將上述的 ImageZ、AnnZ、COCOZ 封裝進了 cocoz.py,因此下面咱們能夠直接調用它們:

import sys

# 將 cocoapi 添加進入環境變量
sys.path.append(r'D:\API\cocoapi\PythonAPI')

from pycocotools.cocoz import AnnZ, ImageZ, COCOZ

爲了不重複,下面咱們查看一張 train2017,zip 的圖片:

dataDir = r'E:\Data\coco\images'   # COCO 數據根目錄
dataType = 'train2017'
imgZ = ImageZ(dataDir, dataType)

下面咱們經過索引的方式查看:

from matplotlib import pyplot as plt

img = imgZ[78]
plt.imshow(img)
plt.show()

顯示以下:

咱們也能夠經過切片的方式獲取多張圖片,爲了可視化的方便,咱們先定義一個用來可視化的函數:

from IPython import display


def use_svg_display():
    # 用矢量圖顯示, 效果更好
    display.set_matplotlib_formats('svg')


def show_imgs(imgs, is_first_channel=False):
    '''
    展現 多張圖片
    '''
    if is_first_channel:
        imgs = imgs.transpose((0, 2, 3, 1))
    n = len(imgs)
    h, w = 4, int(n / 4)
    use_svg_display()
    _, ax = plt.subplots(h, w, figsize=(5, 5))  # 設置圖的尺寸
    K = np.arange(n).reshape((h, w))
    for i in range(h):
        for j in range(w):
            img = imgs[K[i, j]]
            ax[i][j].imshow(img)
            ax[i][j].axes.get_yaxis().set_visible(False)
            ax[i][j].set_xticks([])
    plt.show()

下面咱們看看其中的 16 張圖片:

show_imgs(imgZ[100:116])

顯示結果以下:

到目前爲此,咱們都是僅僅關注了 COCO 數據集,而 ImageZ 不只僅能夠處理 COCO 數據集,它也能處理其它以 .zip 形式壓縮的數據集,好比 Kaggle 上的一個比賽 Humpback Whale Identification12 提供的關於座頭鯨的數據集。該數據集大小爲 5G 左右,若是直接解壓而後再處理也是很麻煩,咱們能夠直接使用 ImageZ 來讀取圖片。

首先,咱們先將下載好的 all.zip 進行解壓:

import zipfile
import os

dataDir = r'E:\Data\Kaggle'

fname = 'all.zip'

with zipfile.ZipFile(os.path.join(dataDir, fname)) as z:
    z.extractall(os.path.join(dataDir, 'HumpbackWhale'))

解壓好以後,咱們查看一下該數據集的組成:

dataDir = r'E:\Data\Kaggle\HumpbackWhale'

os.listdir(dataDir)

輸出:

['sample_submission.csv', 'test.zip', 'train.csv', 'train.zip']

能夠看出:該數據集有圖片數據集 'test.zip''train.zip'。這樣咱們直接藉助 ImageZ 來讀取圖片:

dataDir = r'E:\Data\Kaggle\HumpbackWhale'
dataType = 'train'
imgZ = ImageZ(dataDir, dataType)

咱們也看看其中的 16 張圖片:

show_imgs(imgZ[100:116])

顯示:

6.7 小節

本章主要介紹了 COCO 數據及其 API cocoapi ,同時爲了更好的使用 cocoapi,又自制了一個能夠直接讀取 .zip 數據集的接口 cocoz.py。同時,cocoz.py 也能夠用來直接讀取以 COCO 標註數據形式封裝的其餘數據集。

也能夠直接下載代碼 Demo:

  • https://github.com/Xinering/cocoapi/blob/master/PythonAPI/pycocoZEvalDemo.ipynb
  • https://github.com/Xinering/cocoapi/blob/master/PythonAPI/pycocoZDemo.ipynb

  1. https://github.com/cocodataset/cocoapi

  2. https://www.jianshu.com/p/de455d653301

  3. https://github.com/Xinering/cocoapi/blob/master/PythonAPI/Makefile

  4. http://cocodataset.org/#format-data

  5. https://github.com/Xinering/cocoapi/blob/master/PythonAPI/pycocotools/coco.py

  6. https://github.com/Xinering/cocoapi/blob/master/PythonAPI/pycocoDemo.ipynb

  7. http://cocodataset.org/#format-data

  8. https://github.com/Xinering/cocoapi/blob/master/PythonAPI/pycocotools/mask.py

  9. https://github.com/Xinering/cocoapi/blob/master/PythonAPI/pycocoDemo.ipynb

  10. https://www.cnblogs.com/q735613050/p/8969452.html

  11. https://github.com/Xinering/cocoapi/blob/master/PythonAPI/pycocotools/cocoz.py

  12. https://www.kaggle.com/c/humpback-whale-identification

相關文章
相關標籤/搜索