"Начиная"

Как работать с наборами данных обнаружения объектов в формате COCO

Подробное руководство по определению, загрузке, изучению и оценке наборов данных обнаружения объектов в формате COCO с использованием FiftyOne

Набор данных Microsoft Common Objects in Context (COCO) является самым популярным на данный момент набором данных для обнаружения объектов. Он широко используется для оценки производительности методов компьютерного зрения.

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

Формат COCO - это особая структура JSON, определяющая, как метки и метаданные сохраняются для набора данных изображения.

Существует множество сообщений в блогах, описывающих основной формат COCO, но часто в них отсутствуют подробные примеры загрузки и работы с вашими данными в формате COCO. В этом посте вы узнаете:

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

Вы можете легко установить FiftyOne через pip:

pip install fiftyone

Обновление: новый способ работы с COCO

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

См. Этот пост или эту документацию для получения более подробной информации!

Формат файла COCO

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

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

Файлы на диске

Структура папок набора данных COCO выглядит следующим образом:

<dataset_dir>/
    data/
        <filename0>.<ext>
        <filename1>.<ext>
        ...
    labels.json

Набор данных хранится в каталоге, содержащем ваши необработанные данные изображения и единственный файл json, содержащий все аннотации, метаданные, категории и другую информацию, которую вы, возможно, захотите сохранить о своем наборе данных. Если у вас есть несколько разделов данных, они будут храниться в разных каталогах с разными json файлами.

Формат JSON

Если бы вы загрузили набор данных COCO с их веб-сайта, это были бы файлы instances_train2017.json и instances_val2017.json. (Примечание: официальные аннотации набора тестов недоступны для общественности)

{
    "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
        },
        ...
    ]
}
  • Информация - описание и информация о версиях вашего набора данных.
  • Лицензии - список лицензий с уникальными идентификаторами, которые будут указываться вашими изображениями.
  • Категории - категории классификации, каждая из которых имеет уникальный идентификатор. Необязательно связано с суперкатегорией, которая может охватывать несколько классов. Эти категории могут быть любыми, но имейте в виду, что если вам нужно следовать классам COCO, если вы хотите использовать модель, предварительно обученную на COCO из коробки (или следовать другим категориям наборов данных, чтобы использовать другие модели, »).
  • Изображения - список изображений в вашем наборе данных и соответствующие метаданные, включая уникальный идентификатор изображения, путь к файлу, высоту, ширину и дополнительные атрибуты, такие как лицензия, URL, дата съемки и т. д.
  • Аннотации - список аннотаций, каждая из которых имеет уникальный идентификатор и идентификатор изображения, к которому они относятся. Здесь вы будете хранить информацию об ограничивающей рамке в нашем случае или информацию о сегментации / ключевой точке / другой метке для других задач. Здесь также сохраняется область ограничивающего прямоугольника и iscrowd, указывающий на большой ограничивающий прямоугольник, окружающий несколько объектов одной и той же категории, который используется для оценки.

Создание набора данных в формате COCO

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

Случай 1: у меня есть аннотированные данные

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

Если ваш набор данных соответствует другому общему формату, который поддерживается FiftyOne, например, CVAT, YOLO, KITTI, Pascal VOC, TF Object Detection или другие, то вы можете загрузить и преобразовать его в формат COCO с помощью одной команды. .

# Convert a COCO detection dataset to CVAT image format
fiftyone convert \
    --input-dir /path/to/cvat-image-dataset \
    --input-type fiftyone.types.CVATImageDataset \
    --output-dir /path/to/coco-detection-dataset \
    --output-type fiftyone.types.COCODetectionDataset

Если ваши данные не хранятся в поддерживаемом формате, их по-прежнему легко загрузить в FiftyOne с помощью Python и экспортировать в формате COCO. Идея состоит в том, чтобы загрузить каждое изображение и связанные с ним метки как FiftyOne Sample и добавить их в FiftyOne Dataset:

Затем вы можете экспортировать этот набор данных в формате COCO с одной строкой:

Вот и все! /path/to/coco-detection-dataset теперь содержит ваши изображения и этикетки в формате COCO. В следующем разделе вы узнаете, как легко загрузить его обратно в Python.

Случай 2: у меня есть только необработанные данные изображения

Если у вас есть только немаркированные изображения, вам сначала нужно сгенерировать метки объектов. Вы можете создавать метки наземной достоверности с помощью инструмента аннотации или поставщика (например, CVAT, Labelbox, MTurk или одного из многих других) или предсказанных меток с помощью существующей предварительно обученной модели.

Если, например, вы использовали CVAT для аннотирования необработанных данных, то теперь вы можете преобразовать их в формат COCO с помощью команды FiftyOne, как в предыдущем разделе:

# Convert a COCO detection dataset to CVAT image format
fiftyone convert \
    --input-dir /path/to/cvat-image-dataset \
    --input-type fiftyone.types.CVATImageDataset \
    --output-dir /path/to/coco-detection-dataset \
    --output-type fiftyone.types.COCODetectionDataset

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

Загрузка набора данных COCO в Python

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

Чтобы загрузить набор данных в формате COCO, вы можете написать парсер для файла меток JSON, но на самом деле вам нужно просто использовать один из различных инструментов, которые загрузят его за вас. Два из лучших инструментов для этого - официальные API COCO и FiftyOne.

Существуют официальные API COCO для Python, Lua и Matlab. Эти API-интерфейсы широко используются и предоставляют базовые функции для загрузки и вычисления оценки всего набора данных для вашего набора данных.

Если вы используете Python, я бы порекомендовал попробовать FiftyOne, поскольку он предоставляет функциональность, аналогичную cocoapi, наряду с мощным API и графическим интерфейсом, разработанным специально для того, чтобы максимально упростить вам изучение, анализ и работать со своими данными.

Если ваш набор данных правильно соответствует формату COCO, описанному в предыдущих разделах, вы можете загрузить его в набор данных FiftyOne в Python с помощью одной команды:

Визуализация и исследование

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

Для визуализации набора данных запустите приложение FiftyOne App:

С помощью API вы можете использовать агрегаты для получения статистики о вашем наборе данных, например, количество обнаружений для каждой категории:

Основной способ взаимодействия с вашим набором данных - через представления. Каждый запрос, который вы делаете, даст вам другое представление о вашем наборе данных, например, сортировку по выборкам с наибольшим количеством объектов:

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

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

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

Создание прогнозов модели

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

Большинство современных моделей полагаются на то, что ваши данные загружаются в Python. Особенно, если вы используете TensorFlow или PyTorch, поскольку эти библиотеки в основном основаны на Python. Использование COCO API или FiftyOne для переноса набора данных в Python значительно упрощает написание загрузчика данных PyTorch, например, чем если бы вам приходилось самостоятельно разбирать метки JSON. На самом деле обучение модели на ваших данных выходит за рамки этого поста, но есть множество примеров как для обучения обнаружению объектов PyTorch, так и даже для API обнаружения объектов TensorFlow, которые помогут вам.

Если вы только начинаете и хотите увидеть, как некоторые предварительно обученные модели будут вести себя в вашем наборе данных, самый простой способ сгенерировать некоторые прогнозы - с помощью FiftyOne Model Zoo. Он содержит более 70 моделей, многие из которых являются моделями обнаружения объектов.

fiftyone zoo models list

Примечание: Если вы устали настраивать модели TensorFlow / PyTorch для использования вашего графического процессора, ознакомьтесь с моим сообщением в блоге на Conda.

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

Оценка модели MAP

Основной метрикой оценки для моделей обнаружения объектов является средняя средняя точность (mAP). Это довольно сложная метрика, более подробно описанная в других постах. Таким образом, он рассчитывается:

  1. Сопоставление предсказанных обнаружений с наземными объектами истинности, если они перекрываются выше некоторого значения пересечения над объединением (IoU)
  2. Вычисление количества истинных срабатываний, ложных срабатываний и ложных отрицательных результатов для всех обнаружений каждого класса
  3. Использование этих TP / FP / FN для создания кривой точного отзыва
  4. Вычисление средней точности для каждого класса
  5. Взяв среднее значение всех средних значений точности по классам

Протокол оценки COCO вводит один дополнительный шаг: MAP усредняются в диапазоне 10 пороговых значений IoU. Кроме того, оценка обнаружения объектов COCO также включает в себя вычисление MAP для таких вещей, как маленькие, средние и большие ограничивающие прямоугольники, а также различные пороги обнаружения для каждого изображения.

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

Это значение COCO mAP может быть вычислено с помощью COCO API или FiftyOne. Предполагая, что у вас есть набор данных в формате COCO с прогнозами модели, хранящимися в поле predictions набора данных, следующее будет вычислять COCO mAP в FiftyOne:

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

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

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

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

О Voxel51

Высококачественные, специально подобранные данные имеют решающее значение для обучения отличным моделям компьютерного зрения. В Voxel51 мы обладаем более чем 25-летним опытом CV / ML и глубоко заботимся о том, чтобы дать возможность сообществу воплотить свои решения AI в жизнь. Вот почему мы разработали FiftyOne, инструмент с открытым исходным кодом, который помогает инженерам и ученым создавать высококачественные наборы данных и модели.

Хотите узнать больше? Заходите к нам на пятьдесятone.ai.