Обнаружение объекта с тензорным потоком в собственном наборе данных
Потратив пару дней на решение этой задачи, я хотел бы поделиться своим опытом того, как я отвечал на вопрос:
Как я могу использовать TS Object Detection для обучения, используя мой собственный набор данных?
2 ответа
Это предполагает, что модуль уже установлен. Пожалуйста, обратитесь к их документации, если нет.
отказ
Этот ответ не является правильным или единственным способом обучения модуля обнаружения объектов. Это просто я делюсь своим опытом и тем, что сработало для меня. Я открыт для предложений и узнаю больше об этом, так как я все еще новичок в ML в целом.
TL; DR
- Создайте свой собственный набор данных в формате PASCAL VOC
- Генерировать TFRecords из него
- Настроить конвейер
- Визуализируйте
Каждый раздел этого ответа состоит из соответствующего редактирования (см. Ниже). После прочтения каждого раздела, пожалуйста, прочитайте его Правку, а также для уточнения. Исправления и советы были добавлены для каждого раздела.
Используемые инструменты
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}