Обнаружение объекта с тензорным потоком в собственном наборе данных

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

Как я могу использовать TS Object Detection для обучения, используя мой собственный набор данных?

2 ответа

Решение

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

отказ

Этот ответ не является правильным или единственным способом обучения модуля обнаружения объектов. Это просто я делюсь своим опытом и тем, что сработало для меня. Я открыт для предложений и узнаю больше об этом, так как я все еще новичок в ML в целом.

TL; DR

  1. Создайте свой собственный набор данных в формате PASCAL VOC
  2. Генерировать TFRecords из него
  3. Настроить конвейер
  4. Визуализируйте

Каждый раздел этого ответа состоит из соответствующего редактирования (см. Ниже). После прочтения каждого раздела, пожалуйста, прочитайте его Правку, а также для уточнения. Исправления и советы были добавлены для каждого раздела.

Используемые инструменты

LabelImg: инструмент для создания аннотаций в формате PASCAL VOC.

1. Создайте свой собственный набор данных PASCAL VOC

PS: Для простоты соглашение об именах папок в моем ответе соответствует соглашению Pascal VOC 2012

Заглянув в набор данных за май 2012 года, вы заметите, что папка имеет следующую структуру

+VOCdevkit +VOC2012 +Annotations +ImageSets +Action +Layout +Main +Segmentation +JPEGImages +SegmentationClass +SegmentationObject

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

Аннотации: Это место, где будут размещены все соответствующие XML-файлы изображений. Используйте предложенный выше инструмент для создания аннотаций. не беспокойтесь о <truncated> а также <difficulty> теги, так как они будут игнорироваться двоичными файлами обучения и eval.

JPEGImages: расположение ваших фактических изображений. Убедитесь, что они имеют тип JPEG, потому что это то, что в настоящее время поддерживается, чтобы создавать TFRecords, используя предоставленный скрипт.

ImageSets-> Main: просто состоит из текстовых файлов. Для каждого класса существуют соответствующие train.txt, trainval.txt и val.txt. Ниже приведен пример содержимого файла aeroplane_train.txt в папке VOC 2012

2008_000008 -1
2008_000015 -1
2008_000019 -1
2008_000023 -1
2008_000028 -1
2008_000033  1

Структура - это имя изображения, за которым следует логическое значение, указывающее, существует ли соответствующий объект в этом изображении или нет. Возьмем, к примеру, изображение 2008_000008, не состоящее из самолета, следовательно, помеченное -1, но изображение 2008_000033.

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

Файлы {classname}_val.txt состоят из наборов проверочных данных. Думайте об этом как о тестовых данных во время тренировки. Вы хотите разделить свой набор данных на обучение и проверку. Более подробную информацию можно найти здесь. Формат этих файлов похож на формат обучения.

На этом этапе ваша структура папок должна быть

+VOCdevkit +VOC2012 +Annotations --(for each image, generated annotation) +ImageSets +Main --(for each class, generated *classname*_train.txt and *classname*_val.txt) +JPEGImages --(a bunch of JPEG images)


1.1 Создание карты меток

С подготовленным набором данных нам нужно создать соответствующие карты меток. Перейдите к models/object_detection/data и откройте pascal_label_map.pbtxt.

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


2. Генерация TFRecords

Если вы посмотрите на их код, особенно на эту строку, они явно захватят только aeroplane_train.txt. Для любопытных умов вот почему. Измените это имя на любой текстовый файл вашего класса.

Убедитесь, что VOCdevkit находится внутри models / object_detection, тогда вы можете продолжить и сгенерировать TFRecords.

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


3. Конфигурация трубопровода

Инструкции должны быть понятны, чтобы охватить этот сегмент. Примеры конфигов можно найти в object_detection / samples / configs.

Для тех, кто хочет тренироваться с нуля, как я, просто удалите fine_tune_checkpoint а также from_detection_checkpoint узлы. Вот как выглядел мой конфигурационный файл для справки.

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


4. Визуализируйте

Обязательно запустите eval параллельно с обучением, чтобы иметь возможность визуализировать процесс обучения. Цитировать Джонатана Хуанга

лучший способ - просто запустить двоичный файл eval.py. Обычно мы запускаем этот двоичный файл параллельно с обучением, направляя его в каталог, содержащий контрольную точку, которая обучается. Двоичный файл eval.py запишет логи в eval_dir что вы указываете, что вы можете указать с Tensorboard.

Вы хотите видеть, что mAP "взлетел" в первые несколько часов, а затем вы хотите увидеть, когда он сходится. Трудно сказать, не глядя на эти графики, сколько шагов вам нужно.


РЕДАКТИРОВАТЬ I (28 июля '17):

Я никогда не ожидал, что мой ответ привлечет столько внимания, поэтому решил вернуться и просмотреть его.

инструменты

Для моих коллег-пользователей Apple вы могли бы использовать RectLabel для аннотаций.

Паскаль VOC

Покопавшись, я наконец понял, что trainval.txt - это на самом деле объединение наборов данных для обучения и проверки.

Пожалуйста, посмотрите на их официальный набор разработчика, чтобы понять формат еще лучше.

Создание карты меток

На момент моего написания, ID 0 представляет none_of_the_above, Рекомендуется, чтобы ваши идентификаторы начинались с 1.

Визуализируйте

После выполнения оценки и направления тензорной доски в каталог Eval, он покажет вам mAP каждой категории вместе с показателями производительности каждой категории. Это хорошо, но мне нравится видеть свои тренировочные данные параллельно с Eval.

Для этого запустите тензор на другом порту и укажите его в своем каталоге поездов.

tensorboard --logdir=${PATH_TO_TRAIN} --port=${DESIRED_NUMBER}

Я написал сообщение в блоге на Medium о своем опыте, а также о том, как я обучил детектор объектов (в частности, детектор енота) работе с Tensorflow в своем собственном наборе данных. Это также может быть полезно для других и дополняет ответ eshirima.

Другие вопросы по тегам