Создать набор данных в стиле MS COCO

Как создать набор данных в стиле MS COCO для использования с TensorFlow? У кого-нибудь есть опыт с этим? У меня есть изображения и аннотации, а также наземные маски правды. Мне нужно преобразовать их, чтобы они были совместимы с MS COCO, и любая помощь приветствуется. Я не могу найти инструмент с открытым исходным кодом для создания JSON-аннотаций в стиле COCO.

TensorFlow MS COCO читает файлы JSON, с которыми я не очень разбираюсь.

2 ответа

Я работаю над библиотекой Python, которая имеет много полезных классов и функций для этого. Это называется семантика изображения.

Вот пример добавления масок и их экспорта в формате COCO:

from imantics import Mask, Image, Category

image = Image.from_path('path/to/image.png')
mask = Mask(mask_array)
image.add(mask, category=Category("Category Name"))

# dict of coco
coco_json = image.export(style='coco')
# Saves to file
image.save('coco/annotation.json', style='coco')

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

https://github.com/waspinator/pycococreator/

Вот пример того, как вы можете использовать его для создания информации аннотации из двоичной маски:

annotation_info = pycococreatortools.create_annotation_info(
                    segmentation_id, image_id, category_info, binary_mask,
                    image.size, tolerance=2)

Вы можете прочитать более подробную информацию о том, как использовать pycococreator здесь: https://patrickwasp.com/create-your-own-coco-style-dataset/

Чтобы преобразовать массив масок из 0 и 1 в многоугольник, подобный набору данных в стиле COCO, используйте skimage.measure.find_contours, благодаря коду waleedka.

import numpy
from skimage.measure import find_contours 

mask = numpy.zeros(width, height) # Mask
mask_polygons = [] # Mask Polygons

# Pad to ensure proper polygons for masks that touch image edges.
padded_mask = np.zeros(
(mask.shape[0] + 2, mask.shape[1] + 2), dtype=np.uint8)
padded_mask[1:-1, 1:-1] = mask
contours = find_contours(padded_mask, 0.5)
for verts in contours:
    # Subtract the padding and flip (y, x) to (x, y)
    verts = np.fliplr(verts) - 1
    pat = PatchCollection([Polygon(verts, closed=True)], facecolor='green', linewidths=0, alpha=0.6)
    mask_polygons.append(pat) 

Чтобы сгенерировать файл JSON для набора данных в стиле COCO, вы должны изучить JSON API Python. Кроме того, речь идет просто о соответствии формата, используемого файлом JSON набора данных COCO.

Вы должны взглянуть на мое репозиторий GUI генератора данных в стиле COCO. Я создал очень простой инструмент для создания наборов данных в стиле COCO.

Конкретный файл, который вас интересует, это create_json_file.py, который принимает координаты многоугольника matplotlib в форме (x1, y1, x2, y2 ...) для каждой аннотации многоугольника и преобразует его в файл аннотации JSON, очень похожий на файл по умолчанию формат Коко.

СОЗДАНИЕ ДАННЫХ В СТИЛЕ COCO И ИСПОЛЬЗОВАНИЕ ЕГО API ДЛЯ ОЦЕНКИ ПОКАЗАТЕЛЕЙ

Предположим, что мы хотим создать файлы аннотаций и результатов для задачи обнаружения объектов (Итак, нас интересуют только ограничивающие рамки). Вот простой и легкий пример, который показывает, как можно создавать файлы аннотаций и результатов, соответствующим образом отформатированные для использования метрик COCO API.

Файл аннотации: ann.json

{"images":[{"id": 73}],"annotations":[{"image_id":73,"category_id":1,"bbox":[10,10,50,100],"id":1,"iscrowd": 0,"area": 10}],"categories": [{"id": 1, "name": "person"}, {"id": 2, "name": "bicycle"}, {"id": 3, "name": "car"}]}

Файл результатов: res.json

[{"image_id":73,"category_id":1,"bbox":[10,10,50,100],"score":0.9}]

Теперь вы можете просто использовать следующий скрипт для оценки показателей COCO:

from pycocotools.coco import COCO
from pycocotools.cocoeval import COCOeval

annFile = './ann.json'
resFile='./res.json'

cocoGt=COCO(annFile)

cocoDt=cocoGt.loadRes(resFile)

annType = 'bbox'
cocoEval = COCOeval(cocoGt,cocoDt,annType)
cocoEval.evaluate()
cocoEval.accumulate()
cocoEval.summarize()
Другие вопросы по тегам