Создать набор данных в стиле 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()