Введение

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

Требования

Для загрузки задачи нам необходимо импортировать следующие библиотеки:

from pycocotools.coco import COCO
import numpy as np
import skimage.io as io
import matplotlib.pyplot as plt

скачать файлы .json, указанные в папке аннотаций, со следующего сайта: https://www.kaggle.com/nadaibrahim/coco2014.

После установки требований и загрузки файлов json создайте папку с именем «аннотации» и переместите в нее файлы .json. Инициализируйте API наземной проверки COCO следующим образом:

dataType='val2017'
annFile='./annotations/instances_{}.json'.format(dataType)

Код ниже отображает категории и суперкатегории COCO:

cats = coco.loadCats(coco.getCatIds())
nms=[cat[‘name’] for cat in cats]
print(‘COCO categories: \n{}\n’.format(‘ ‘.join(nms)))
nms = set([cat[‘supercategory’] for cat in cats])
print(‘COCO supercategories: \n{}’.format(‘ ‘.join(nms)))

Маска / двоичная аннотация

Предположим, мы хотим выполнить сегментацию изображений на основе людей, где нам требуются изображения людей и их уважаемое двоичное изображение. Для следующего давайте создадим 2 папки в том же каталоге, что и скрипт:

  1. Входная папка изображений с именем «loaded_images_person»
  2. Выходные двоичные имена папок «загруженные_изображения_персонал_бинарный»

Импортируйте библиотеки и соберите URL-адреса изображений вместе с информацией о маске:

import cv2
from PIL import Image
from os import path
catIds = coco.getCatIds(catNms=['person']);
imgIds = coco.getImgIds(catIds=catIds );
images = coco.loadImgs(imgIds)

Для данного идентификатора категории в нашем случае мы будем читать изображение с URL-адреса и сохранять их в указанных выше папках. Создайте двоичную маску маски и сохраните ее с тем же именем файла, что и соответствующее изображение, с «_binary.png» в конце.

print(len(images))
for im in images:
  if path.isfile('downloaded_images_person/' + im['file_name']):
    print('Skipped!')
    continue
  print(im['coco_url'])
  img_data = io.imread(im['coco_url'])
  Image.fromarray(img_data).save('downloaded_images_person/' +    im['file_name'])
  annIds = coco.getAnnIds(imgIds=im['id'], catIds=catIds,   iscrowd=None)
  anns = coco.loadAnns(annIds)
  mask = coco.annToMask(anns[0])
  for i in range(len(anns)):
  mask = mask | coco.annToMask(anns[i])
  mask = mask*255
  Image.fromarray(mask).save('downloaded_images_person_binary/' +   im['file_name']+'_binary.png')

Вывод изображений из приведенных выше изображений.

Аннотация коробки

Скажем, например, мы хотим обнаружить объект человека. В аннотации мы хотим сохранить координаты ограничивающего прямоугольника, соответствующие изображению. Формат поля набора данных COCO: [x, y, ширина, высота]. Я преобразовал в формат [«левый», «верхний», «правый», «нижний»], который вы можете изменить в соответствии с вашими потребностями. Создайте папку входных изображений с именем «loaded_images_person».

Соберите данные URL-адресов изображений и инициализируйте фрейм данных

import pandas as pd
catIds = coco.getCatIds(catNms=['person'])
imgIds = coco.getImgIds(catIds=catIds )
images = coco.loadImgs(imgIds)
print(len(images))
df = pd.DataFrame(columns=["image_path","left","top","right","bottom","cat_ID","cat_Name"])
for im in images:
  img_data = io.imread(im['coco_url'])
  Image.fromarray(img_data).save('downloaded_images_person/' +    im['file_name'])
  annIds = coco.getAnnIds(imgIds=im['id'], catIds=catIds, iscrowd=None)
  anns = coco.loadAnns(annIds)
  for i in range(len(anns)):
    df.loc[i] = ['downloaded_images_person/' + im['file_name'],  int(round(anns[i]['bbox'][0])), int(round(anns[i]['bbox'][1])),  int(round(anns[i]['bbox'][0] + anns[i]['bbox'][2])),  int(round(anns[i]['bbox'][1] + anns[i]['bbox'][3])),anns[i] ['category_id'],nms[anns[i]['category_id']-1]]
   print("anns: ", im['coco_url'], anns[i]['bbox'][0], anns[i]['bbox'][1], anns[i]['bbox'][0] + anns[i]['bbox'][2], anns[i]['bbox'][1] + anns[i]['bbox'][3],anns[i]['category_id'] ,nms[anns[i]['category_id']-1])
#Save database to csv
df.to_csv('annotations_download_train_' + 'person' + '.csv',index=False)

Вывод Dataframe в сохраненном CSV-файле будет выглядеть примерно так:

Репозиторий Git для этого же сайта связан здесь.

Заметка от AI In Plain English

Мы всегда заинтересованы в продвижении качественного контента. Если у вас есть статья, которую вы хотели бы отправить в какую-либо из наших публикаций, отправьте нам электронное письмо по адресу [email protected] с вашим именем пользователя Medium, и мы добавим вас в качестве автора.