- PVSM.RU - https://www.pvsm.ru -

Колыбель для AI

Колыбель для AI - 1

Есть одна тема в современном Computer Vision, которая часто остаётся за кадром. В ней нет сложной математики и глубокой логики. Но то что её никак не освещают — вгоняет в ступор многих новичков. А тема не проста: имеет множество граблей, про которые не узнаешь, пока не наступишь.

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

  1. Как можно отличить хорошую базу
  2. Примеры хороших баз
  3. Примеры программ, которыми удобно размечать базы


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

Колыбель для AI - 2

Идеальный вариант, на мой взгляд, такой:

Колыбель для AI - 3

Тут отмечено:

  1. Рамка для каждого номера, которую видно. Ключевой момент: нужно подчеркнуть угол наклона номера + его положение.
  2. Значение каждого номера, который виден. Система не будет распознавать лучше, чем человек, который смотрит на фотографию, так что номера, которые практически нельзя разглядеть можно не обозначать.
  3. Положение каждого символа номера.

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

Теперь рассмотрим откуда это берётся. И почему этого достаточно. Классический алгоритм выделения номера выглядит следующим образом:

Колыбель для AI - 4

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

Первая часть — нам нужно найти номера. Предположим, что выделение номера мы реализуем через каскад Хаара, или через HOG дескрипторы. Тогда на вход алгоритма обучения нам нужно будет подать набор положительных и отрицательных примеров:

Положительные:

Колыбель для AI - 5

Отрицательные:

Колыбель для AI - 6

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

Колыбель для AI - 7

Как видно, из данных, которые мы разметили просто получить оба варианта.

После того как номер найден его нужно обработать. Опять же, тут есть много подходов. Но в целом, вторая часть — это «нормировка номера». Можно сделать алгоритм, ищущий границы в ручную, как описано тут [1]:

Колыбель для AI - 8

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

А можно обучить несколько нейронных сетей. Например первая ищет угол, вторая ищет кроп.
И опять. Данных, которые мы разметили — полностью хватает.

Можно объединить часть один и часть два и сделать поисковую сеть для номеров, которая сразу выводит и угол и поворот номера. Для неё данных тоже достаточно.

Принципы

Попробуем сформулировать основные принципы разметки:

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

2. Старайтесь, чтобы разметка была в простом, верифицируемом формате. Помните, что любые задачи компьютерного зрения — достаточно сложны в отладке и в поиске багов. Любая часть должна быть просто визуализируема и проста для проверки глазами. Отдавайте предпочтения текстовым форматам данных или графическим. Старайтесь избегать бинарных форматов, или форматов с большим объёмом метаданных. Старайтесь писать всю возможную информацию. Например не забывайте текстовое название изображения. Если вы используете какую-то функцию «получить список названий файлов» помните, что в Windows, Linux, C#, Python порядок этих файлов может различаться.

3. Помните, что разметка — это длительный процесс. Зачастую разметка большой базы может занимать дни или недели. Монотонного труда. Старайтесь предусмотреть в вашей программе всё что понадобиться.

Примеры баз данных

MSRA dataset [2]. MSRA — это целая серия датасетов. Возьмём для примера датасет с детектированием объектов. Для каждой картинки задан ограничивающий прямоугольник объекта на этой картинке:

Колыбель для AI - 9

При этом все параметры лежат в текстовом файле такого вида:

235 - число описанных изображений в файле

0_101.jpg - адрес картинки
400 300 - её размер
89 10 371 252; 87 9 379 279; 89 11 376 275; - ограничивающий прямоугольник объекта

0_108.jpg
400 300
112 4 241 214; 119 0 241 208; 118 0 238 141; 
.....

При этом каждый текстовый файл описывает все объекты одного из классов.

VOC2012 [3] Один из наиболее полных датасетов. Делался в исследовательских целях => старались описать всё хорошо и качественно. До 2012 года датасет обновлялся каждый год (2005-2012). Формат описания: xml.

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

Колыбель для AI - 10 Колыбель для AI - 11

При этом пишутся все данные:

<annotation>
<folder>VOC2007</folder>
<filename>000019.jpg</filename>
<source>
<database>The VOC2007 Database</database>
<annotation>PASCAL VOC2007</annotation>
<image>flickr</image>
<flickrid><owner>
<flickrid>Rosenberg1 Simmo</flickrid>
<name>?</name>
</owner>330638158</flickrid>
<source>

<size>
<width>500</width>
<height>375</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>cat</name>
<pose>Right</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>231</xmin>
<ymin>88</ymin>
<xmax>483</xmax>
<ymax>256</ymax>
</bndbox>
</object>
<object>
<name>cat</name>
<pose>Right</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>11</xmin>
<ymin>113</ymin>
<xmax>266</xmax>
<ymax>259</ymax>
</bndbox>
</object>
</annotation>

Так же, часть изображений в VOC раскрашены принадлежностью к классу. Задача сегментации (например [4]) требует входных изображений, на которых были бы размечены интересные области. Обычно тип объекта задают цветом:

Колыбель для AI - 12 Колыбель для AI - 13

В данном случае разметка — это по сути раскраска.

CIFAR [5] Исследовательский датасет с небольшими изображениями. Пример неудобного датасета. Все картинки лежат в одном большом файле. Там же и их описания. Для доступа к файлу есть обёртки под Питон и под Матлаб. Описание картинки — номер класса. Больше ничего в датасете нет. Когда-то датасет был популярным. Но был неудачным по формату проектирования. Сейчас его редко кто использует.

The Street View House Numbers (SVHN) Dataset [6] Известный датасет с номерами домов от гугла.

Колыбель для AI - 14

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

MS COCO [7] Датасет от Майкрософта. Наверное один из лучших на сегодняшний день. По составу — примерно как VOC, но больше данных, сильно больше информации о разметке.

Колыбель для AI - 15 Колыбель для AI - 16

Информация храниться в сопроводительных json-файлах [8]. Вот пример как аннатируется:

annotation{
"id" : int,
"image_id" : int,
"category_id" : int,
"segmentation" : RLE or [polygon],
"area" : float,
"bbox" : [x,y,width,height],
"iscrowd" : 0 or 1,
}

categories[{
"id" : int,
"name" : str,
"supercategory" : str,
}]

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

Второй момент — для каждой из картинок есть текстовое описание происходящего.

The Citycapes Dataset [9] Набор датасетов для чисто сегментационной задачи: разметить всё происходящее на улицах. Для каждой картинки вторая картинка с разметкой. В отдельном файле описание что значит каждый цвет.

Колыбель для AI - 17

kaggle [10] На каггле много датасетов и они всегда разные под разные задачки. Это пример того, как надо делать датасеты. Все датасеты максимально просты. Есть 10 классов? Вот они лежат по папочкам без лишних текстовиков. Нужно что-то обнаружить? Вот сегментационная разметка.

IMAGENET [11] Огромный, но безблагодатный датасет. Если честно, так и не смог окончательно разобраться в всех доступных для него описаниях. Большинство описаний в mat-файлах. Задача распознавания требует классификации изображённых данных. Так что создатели решили давать полную классификацию каждому изображению:

Колыбель для AI - 18

animals → chordate → vertrbrate,craniate → bird → parrot → African grey. — формат описания изображений.

Набор датасетов по точкам лица [12]. Форматы описания разнятся, но в большинстве случаев даны просто текстовые значения координат для всех точек на лице:

Колыбель для AI - 19

http://www.absolutely.net/wenn/handy_manny_05_wenn5360250.jpg	worker_2	205.056122449	274.885204082	0	409.147959184	276.691326531	0	287.535714286	291.441326531	0	336.903061224	295.956632653	0	249.306122449	268.864795918	0	249.005102041	281.507653061	0	371.821428571	274.283163265	0	373.928571429	282.410714286	0	227.734693878	307.787755102	0	388.840816327	304.416326531	0	273.489795918	309.473469388	0	340.195918367	309.714285714	0	250.371428571	298.636734694	0	252.779591837	314.771428571	0	362.168	296.06	0	365.72244898	312.844897959	0	252.297959184	305.13877551	0	363.073469388	301.526530612	0	275.655102041	378.605612245	0	352.23877551	377.945408163	0	327.151020408	376.625	0	315.92755102	393.790306122	0	244.620408163	413.645918367	0	359.391836735	417.219387755	0	311.255102041	419.11122449	0	310.204081633	424.996938776	0	308.102040816	438.239795918	0	311.044897959	453.794897959	0	118.526530612	259.768877551	0	446.133	275.046	0	145.594897959	364.081122449	0	438.369	380.507	0	142.954081633	321.828061224	0	435.781	330.688	0	317.351020408	518.537755102	0

Набор биометрических датасетов от CASIA [13]. Тут всё замечательно просто. Датасеты для алгоритмов биометрии. Для каждого человека отдельная папочка, внутри которой всё разложено как по нотам: разные спектры, множество подходов.

KITTI [14] Набор самых разных датасетов снятых с автомобиля. Для каждой картинки свой собственный текстовичёк с описанием:

Pedestrian 0.00 1 1.43 694.62 175.43 703.96 201.82 1.74 0.75 0.64 5.98 1.92 48.22 1.55
Van 0.00 1 2.15 68.34 174.12 189.52 222.12 1.94 1.88 5.30 -21.22 2.03 32.10 1.57
Misc 0.00 1 2.06 184.58 181.15 230.79 211.99 1.54 0.85 2.84 -20.97 1.97 37.62 1.56
Car 0.00 0 2.01 221.83 183.54 302.47 223.76 1.48 1.61 3.39 -13.87 1.93 28.89 1.56
Car 0.00 1 2.07 168.24 186.13 265.38 223.54 1.44 1.79 4.32 -16.76 2.04 30.95 1.58

Описание — пример хорошего датасета. Тут задано всё: насколько объект перекрыт, границы объекта. Насколько объект повёрнут к камере, какие реальные координаты объекта по глубине. Но, как я понимаю, большинство исследователей пользуются только координатами рамки объекта.

Кроме изображений с разметкой прямоугольников в датасете есть много интересной информации. Тут есть стереопары для дорожной обстановки.

Есть оптический поток для каждого кадра, который в каждой точке задаёт цвет, кодирующий направление и скорость движения (1 [15]), (2 [16]):

Колыбель для AI - 20

В этом датасете много интересно и правильно заданной информации.

Существует огромное множество датасетов которые я здесь не упомянул. Главное, что их объединяет: если датасет серьёзный — он хорошо сделан. С ним удобно работать. Когда будете делать датасеты под свои задачи — не забывайте об этом.

Удобство оператора

Даже если базу размечаете не вы — не забывайте об удобстве оператора, который будет размечать. Удобство оператора = скорость работы + качество разметки. Вот несколько советов:

• Старайтесь дублировать все возможные операции на клавиатуре. Оставляйте на мышь только операции выделения объектов на изображении. Это повышает скорость работы в разы.
• Постоянно сохраняйте работу. Не держите её в памяти программы. Так как программы разметки часто пишутся на коленке — вылеты возможны. Обидно потерять 5000 размеченных изображений.
• Сделайте возможность редактирования размеченных данных. Ошибок не избежать.
• Не давайте оператору лишних инструментов. Всё должно быть просто, все углы должны быть срезаны. У вас 3 типа объектов? Не надо давать оператору программу где можно разметить 10 типов. Ваш девиз — «только необходимость и достаточность».

Пара примеров

Я привожу тут несколько примеров, которые я использовал в разных задачах. Написаны на C# + с подключением EmguCV для работы с изображениями (знаю, что избыточно, но так было проще).

В репозитории [17]2 программы — одна для раскраски изображений под задачи сегментации, вторая для рисования прямоугольников. Ничего сверхъестественного, но может кому-то понадобятся.

Прочее

Мне понравился сервис Яндекса — Толока [18]. Частично он может решить вопросы разметки базы. Но, нужно сказать, что сильно не всё из описанного в нём есть.

Автор: ZlodeiBaal

Источник [19]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/obrabotka-izobrazhenij/199982

Ссылки в тексте:

[1] тут: https://habrahabr.ru/company/recognitor/blog/225913/

[2] MSRA dataset: http://research.microsoft.com/en-us/um/people/jiansun/SalientObject/salient_object.htm

[3] VOC2012: http://host.robots.ox.ac.uk/pascal/VOC/voc2012/

[4] например: https://habrahabr.ru/company/recognitor/blog/277781/

[5] CIFAR: https://www.cs.toronto.edu/~kriz/cifar.html

[6] The Street View House Numbers (SVHN) Dataset: http://ufldl.stanford.edu/housenumbers/

[7] MS COCO: http://mscoco.org/dataset/#overview

[8] json-файлах: http://mscoco.org/dataset/#download

[9] The Citycapes Dataset: https://www.cityscapes-dataset.com/

[10] kaggle: https://www.kaggle.com/

[11] IMAGENET: http://image-net.org/

[12] Набор датасетов по точкам лица: http://ibug.doc.ic.ac.uk/resources/facial-point-annotations/

[13] Набор биометрических датасетов от CASIA: http://www.cbsr.ia.ac.cn/english/Databases.asp

[14] KITTI: http://www.cvlibs.net/datasets/kitti/eval_object.php

[15] 1: https://habrastorage.org/files/328/7b6/78e/3287b678ead3426c87902477c99f01fb.png

[16] 2: https://habrastorage.org/files/09d/4cf/0a9/09d4cf0a9249411885abdef1c285c257.png

[17] репозитории : https://github.com/ZlodeiBaal/Base_prepearing

[18] Яндекса — Толока: https://habrahabr.ru/company/yandex/blog/305956/

[19] Источник: https://habrahabr.ru/post/311558/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best