Что такое формат COCO?

COCO — это большой набор данных изображений, предназначенный для обнаружения объектов, сегментации, обнаружения ключевых точек людей, сегментации материалов и создания подписей. Он хранит свои аннотации в формате JSON, описывающие классы объектов, ограничивающие рамки и битовые маски.

для хранения и использования инструментов, разработанных для COCO, мы должны создать набор данных, такой как COCO, мы можем либо преобразовать тот, который у нас есть, в формат COCO, либо мы можем создать его для себя.

Структура COCO

{
    "info": {
        "year": "2021",
        "version": "1.0",
        "description": "Exported from FiftyOne",
        "contributor": "Voxel51",
        "url": "https://fiftyone.ai",
        "date_created": "2021-01-19T09:48:27"
    },
    "licenses": [
        {
          "url": "http://creativecommons.org/licenses/by-nc-sa/2.0/",
          "id": 1,
          "name": "Attribution-NonCommercial-ShareAlike License"
        },
        ...   
    ],
    "categories": [
        ...
        {
            "id": 2,
            "name": "cat",
            "supercategory": "animal"
        },
        ...
    ],
    "images": [
        {
            "id": 0,
            "license": 1,
            "file_name": "<filename0>.<ext>",
            "height": 480,
            "width": 640,
            "date_captured": null
        },
        ...
    ],
    "annotations": [
        {
            "id": 0,
            "image_id": 0,
            "category_id": 2,
            "bbox": [260, 177, 231, 199],
            "segmentation": [...],
            "area": 45969,
            "iscrowd": 0
        },
        ...
    ]
}

информация: эта часть структуры содержит информацию о наборе данных, версии, времени, дате создания, авторе и т. д.

лицензии: в этой части содержится информация о лицензиях, которые у нас есть для нашего набора данных.

категория: она дает идентификатор для аннотаций и объектов, обнаруженных вместе с именем, также мы можем определить в ней подкатегории.

images: здесь хранятся изображения, имена файлов, высота, ширина, время и т. д.

аннотации: для идентификатора, который у нас есть для изображений, он содержит ограничивающую рамку, область координат сегментации, здесь ограничивающая рамка - это координаты x1, y1, x2, y2 обнаруженного объекта, а сегментация - это контур объекта iscrowd это двоичный параметр, который сообщает, есть ли на шкале несколько объектов, мы не можем сегментировать каждый из них, мы можем преобразовать их в один большой блок и указать это с помощью параметра iscrowd

Загрузка и визуализация набора данных в формате COCO

для этой цели мы будем использовать набор данных COCO 2017

есть встроенные функции для выполнения операций в формате COCO

мы собираемся использовать библиотеку pycocotools для выполнения операций с набором данных coco.

Импорт библиотек, которые нам нужны

!pip install pycocotools
import pandas as pd 
import os
from pycocotools.coco import COCO
import skimage.io as io
import matplotlib.pyplot as plt
from pathlib import Path

Чтение набора данных

dataDir=Path('../input/coco-2017-dataset/coco2017/val2017')
annFile = Path('../input/coco-2017-dataset/coco2017/annotations/person_keypoints_val2017.json')
coco = COCO(annFile)
imgIds = coco.getImgIds()
imgs = coco.loadImgs(imgIds[-3:])

здесь мы используем COCO для чтения аннотаций. Я прочитал аннотации данных проверки, мы можем получить информацию о нашем наборе данных, используя метод coco.info()

coco возвращает словарь набора данных, здесь мы можем получить идентификаторы изображений с помощью функции coco.getImgIds() после получения идентификаторов изображений мы должны загрузить эти изображения для загрузки изображений, которые мы можем использовать coco.loadImgs()

Визуализация наших изображений

imgs = coco.loadImgs(imgIds[-3:])
_,axs = plt.subplots(len(imgs),2,figsize=(10,5 * len(imgs)))
for img, ax in zip(imgs, axs):
    I = io.imread(dataDir/img['file_name'])
    annIds = coco.getAnnIds(imgIds=[img['id']])
    anns = coco.loadAnns(annIds)
    ax[0].imshow(I)
    ax[1].imshow(I)
    plt.sca(ax[1])
    coco.showAnns(anns, draw_bbox=False)

для визуализации набора данных мы используем matplotlib, здесь для иллюстрации мы будем использовать 3 изображения.

сначала мы отображаем наше базовое изображение, мы можем получить image_filename из нашего загруженного набора данных coco, используя img[‘file_name’] (обратите внимание, что мы загрузили изображения с coco.loadImgs(), передав идентификаторы изображений)

для загрузки аннотаций нам нужно получить идентификаторы аннотаций, для их получения мы используем метод getAnnIds() словаря coco.

после получения идентификатора мы загружаем их с помощью coco.loadAnns(annIds) для построения этих идентификаторов на изображениях, нам нужно изменить ось изображений, мы используем метод plt.sca(), этот метод выбирает текущую ось для редактирования, и, наконец, мы используем метод coco.showAnns() для рисования аннотаций здесь мы можем выбрать, хотим ли мы рисовать ограниченные прямоугольники с параметром draw_bbox.

мы обсудим, как создать набор данных COCO с файлами CSV в другом посте :)

Ссылка на блокнот

kaggle.com/somesh88/coco-dataset-representa..

спасибо, что читаете мой блог :) следите за новостями, здоровайтесь со мной в комментариях, это вдохновляет меня писать больше блогов :) хорошего дня :)