Понимание формата популярных наборов данных для компьютерного зрения

Вступление

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

Цитата создателей COCO:

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

- Сегментация объектов

- Узнавание в контексте

- Сегментация суперпиксельного материала

- 330 тыс. Изображений (›помечено 200 тыс.)

- 1,5 миллиона экземпляров объектов

- 80 категорий объектов

Формат этого набора данных автоматически понимается расширенными библиотеками нейронных сетей, например. грамм. Detectron2 от Facebook (ссылка). Существуют даже инструменты, созданные специально для работы с наборами данных в формате COCO, например. грамм. COCO-аннотатор и COCOapi. Понимание того, как представлен этот набор данных, поможет использовать и изменять существующие наборы данных, а также создавать собственные. В частности, нас интересуют файлы аннотаций, поскольку полный набор данных состоит из каталога изображений и файла аннотаций, предоставляющих метаданные, используемые алгоритмами машинного обучения.

Что можно делать с COCO?

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

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

  • Сегментация объекта / экземпляра - модель должна иметь не только ограничивающие рамки для объектов (экземпляров / вещей), но и маски сегментации, т.е. е. координаты многоугольника близко к объекту

  • Сегментация материала - модель должна сегментировать объекты, но не на отдельные объекты (вещи), а на непрерывные фоновые узоры, такие как трава или небо.

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

Формат набора данных COCO

Базовая структура и общие элементы

Формат файла, используемый аннотациями COCO, - это JSON, который имеет словарь (пары ключ-значение в фигурных скобках, {…}) в качестве верхнего значения. Он также может иметь списки (упорядоченные коллекции элементов в квадратных скобках, […]) или словари, вложенные внутрь.

Базовая структура выглядит следующим образом:

{
  "info": {…},
  "licenses": […],
  "images": […],
  "categories": […],
  "annotations": […]
}

Давайте подробнее рассмотрим каждую из этих ценностей.

Раздел «информация»

Этот словарь содержит метаданные о наборе данных. Для официальных наборов данных COCO это выглядит следующим образом:

{
  "description": "COCO 2017 Dataset",
  "url": "http://cocodataset.org",
  "version": "1.0",
  "year": 2017,
  "contributor": "COCO Consortium",
  "date_created": "2017/09/01"
}

Как видите, он содержит только основную информацию, а значение "url" указывает на официальный сайт набора данных (например, страницу репозитория UCI или в отдельном домене). В наборах данных машинного обучения обычное дело - указывать на свои веб-сайты для получения дополнительной информации, например. грамм. как и когда были получены данные.

Раздел «лицензии»

Вот ссылки на лицензии на изображения в наборе данных, например. грамм. Лицензии Creative Commons со следующей структурой:

[
  {
    "url": "http://creativecommons.org/licenses/by-nc-sa/2.0/", 
    "id": 1, 
    "name": "Attribution-NonCommercial-ShareAlike License"
  },
  {
    "url": "http://creativecommons.org/licenses/by-nc/2.0/", 
    "id": 2, 
    "name": "Attribution-NonCommercial License"
  },
  …
]

Здесь важно отметить поле "id" - для каждого изображения в "images" словаре должен быть указан идентификатор лицензии.

При использовании изображений убедитесь, что вы не нарушаете лицензию - полный текст можно найти по URL-адресу.

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

раздел изображений

Этот словарь, возможно, второй по важности, содержит метаданные об изображениях:

{
  "license": 3,
  "file_name": "000000391895.jpg",
  "coco_url": "http://images.cocodataset.org/train2017/000000391895.jpg",
  "height": 360,
  "width": 640,
  "date_captured": "2013–11–14 11:18:45",
  "flickr_url": "http://farm9.staticflickr.com/8186/8119368305_4e622c8349_z.jpg",
  "id": 391895
}

Пройдемся по полям одно за другим:

  • "license": идентификатор лицензии на изображение из раздела "licenses"
  • "file_name": имя файла в каталоге изображений
  • "coco_url", "flickr_url": URL-адреса копии размещенного в Интернете изображения
  • "height", "width": размер изображения, очень удобно для низкоуровневых языков, таких как C, где получение размера матрицы невозможно или сложно
  • "date_captured": когда была сделана фотография

Самым важным полем является поле "id". Это номер, который используется в "annotations" для идентификации изображения, поэтому, если вы хотите, чтобы e. грамм. чтобы идентифицировать аннотации для данного файла изображения, вам нужно будет проверить "id" для соответствующего документа изображения в "images", а затем сделать перекрестную ссылку на него в "annotations".

В официальном наборе данных COCO "id" совпадает с "file_name" (после удаления ведущих нулей). Обратите внимание, что это не обязательно относится к пользовательским наборам данных COCO! Это не принудительное правило, e. грамм. наборы данных, созданные из частных фотографий, могут иметь оригинальные имена фотографий, которые не имеют ничего общего с "id".

Раздел «категории»

Этот раздел немного отличается для задачи обнаружения и сегментации объектов и для задачи сегментации содержимого.

Обнаружение объектов / сегментация объектов:

[
  {"supercategory": "person", "id": 1, "name": "person"},
  {"supercategory": "vehicle", "id": 2, "name": "bicycle"},
  {"supercategory": "vehicle", "id": 3, "name": "car"},
  …
  {"supercategory": "indoor", "id": 90, "name": "toothbrush"}
]

Это классы объектов, которые могут быть обнаружены на изображениях ("categories" в COCO - это другое название классов, которое вы, возможно, знаете из контролируемого машинного обучения).

Каждая категория имеет уникальный "id", и они должны находиться в диапазоне [1, количество категорий]. Категории также сгруппированы в «суперкатегории», которые вы можете использовать в своих программах. E. грамм. для обнаружения транспортных средств в целом, когда вам все равно, велосипед это, автомобиль или грузовик.

Сегментация материалов:

[
  {"supercategory": "textile", "id": 92, "name": "banner"},
  {"supercategory": "textile", "id": 93, "name": "blanket"},
  …
  {"supercategory": "other", "id": 183, "name": "other"}
]

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

раздел «аннотации»

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

{
  "segmentation":
  [[
    239.97,
    260.24,
    222.04,
    …
  ]],
  "area": 2765.1486500000005,
  "iscrowd": 0,
  "image_id": 558840,
  "bbox":
  [
    199.84,
    200.46,
    77.71,
    70.88
  ],
  "category_id": 58,
  "id": 156
}
  • "segmentation": список пикселей маски сегментации; это сплющенный список пар, поэтому вы должны взять первое и второе значение (x и y на картинке), затем третье, четвертое и т. д., чтобы получить координаты; обратите внимание, что это не индексы изображений, поскольку они являются плавающими числами - они создаются и сжимаются такими инструментами, как COCO-annotator, из необработанных координат пикселей
  • "area": количество пикселей внутри маски сегментации
  • "iscrowd": предназначена ли аннотация для одного объекта (значение 0) или для нескольких объектов, расположенных близко друг к другу (значение 1); для сегментации материала это поле всегда 0 и игнорируется
  • "image_id": поле id из словаря изображений; предупреждение: это значение следует использовать для перекрестной ссылки на изображение с другими словарями, а не с полем "id"!
  • "bbox": ограничивающая рамка, т. е. координаты (верхний левый x, верхний левый y, ширина, высота) прямоугольника вокруг объекта; очень полезно извлекать отдельные объекты из изображений, поскольку во многих языках, таких как Python, это можно сделать, обратившись к массиву изображений, например cropped_object = image[bbox[0]:bbox[0] + bbox[2], bbox[1]:bbox[1] + bbox[3]]
  • "category_id": класс объекта, соответствующий полю "id" в "categories"
  • "id": уникальный идентификатор аннотации; предупреждение: это только идентификатор аннотации, он не указывает на конкретное изображение в других словарях!

При работе с изображениями толпы ("iscrowd": 1) часть "segmentation" может немного отличаться:

"segmentation":
{
  "counts": [179,27,392,41,…,55,20],
  "size": [426,640]
}

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

Резюме

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