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

24

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

Как использовать Обнаружение объектов TS для обучения с использованием моего собственного набора данных?

    
задан eshirima 07.07.2017 в 16:22
источник
  • ты босс, спасибо! –  rambossa 12.07.2017 в 17:00

2 ответа

36

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

Отказ

Этот ответ не предназначен для right или only для обучения модуля обнаружения объекта. Это просто я делюсь своим опытом и тем, что сработало для меня. Я открыт для предложений и больше узнаю об этом, поскольку я все еще новичок в 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- & gt; Главная . Это просто состоит из текстовых файлов. Для каждого класса существует соответствующий 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 состоят из наборов данных проверки testing . Подумайте об этом как о тестовых данных во время обучения. Вы хотите разделить свой набор данных на обучение и проверку. Более подробную информацию можно найти здесь , Формат этих файлов аналогичен формату обучения.

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

+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 / образцы / конфиги .

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

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

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

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

  

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

     

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

EDIT I ​​(28 июля '17):

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

Инструменты

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

Pascal VOC

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

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

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

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

Визуализация

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

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

tensorboard --logdir=${PATH_TO_TRAIN} --port=${DESIRED_NUMBER}
    
ответ дан eshirima 07.07.2017 в 16:23
источник
  • спасибо. В итоге я перешел на 2.7, и все было лучше. –  AruniRC 10.07.2017 в 19:40
  • @eshirima уже это сделал;) –  rambossa 12.07.2017 в 18:30
  • 2880X1800 слишком велик. Если вы посмотрите на конфигурационный файл в файле image_resizer, объект-детектор завершит изменение размера каждого изображения до 300X300. Я кормлю его изображениями 618X816, хотя и по-прежнему хорошо разбирается в моих желаемых классах. Я бы рекомендовал сначала изменить размеры изображений, прежде чем запускать обнаружение, чтобы увидеть, какие масштабы по-прежнему сохраняют хорошую визуализацию ваших объектов (это то, что я и сделал). Вы также можете настроить параметры для image_resizer, запустить детектор и сравнить результаты. –  eshirima 17.07.2017 в 19:08
  • @eshirima thanks, Таким образом, resizer также достаточно умен, чтобы настроить аннотации и ограничивать образы для исходных изображений? –  rambossa 17.07.2017 в 20:09
  • Я не могу дать конкретный ответ на это, но в ядре ограниченные поля представляют собой оценки местоположения пикселей, которые состоят из большинства атрибутов / объектов вашего объекта. Последняя коробка, которую вы видите, на самом деле является результатом множества тесно упакованных ящиков, сгруппированных вместе. Проблема с кормлением всего 2880X1800 заключается в том, что у вас будет слишком много функций, которые невозможно было бы удерживать в памяти и вычислять штрафные санкции, в результате чего одноуровневое вычисление занимает много времени. –  eshirima 17.07.2017 в 20:21
Показать остальные комментарии
11

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

    
ответ дан Dat Tran 28.07.2017 в 10:58
источник
  • Я действительно посмотрел @ ваш пост в режиме реального времени, а также многому научился. Пара вопросов / предложений. 1: В файле конфигурации у вас есть представление о том, что представляют num_hard_examples и num_examples? 2: Для аннотаций изображений на Mac вы могли бы использовать RectLabel. 3: Я действительно собирался изучить обучение по собственному набору данных, который не относится к формату Pascal Voc. Ты избил меня до удара :) –  eshirima 28.07.2017 в 15:12
  • Привет за предложения :) Я взглянул на RectLabel. Выглядит неплохо. Я дам ему попробовать. Что касается вашего первого вопроса, num_hard_examples имеет какое-то отношение к жесткому министру. Взгляните на эту статью, чтобы понять это. Параметр num_examples имеет какое-то отношение к оценке. Во время оценки он извлекает изображения, и вам нужно указать, сколько у вас есть. Они также использовали max_eval для ограничения процесса оценки. Для номера 3 :) Yeh не имеет значения, ха-ха, это не тот, кто приходит первым, а учится друг у друга. –  Dat Tran 29.07.2017 в 21:52
  • @Yirga уверен, но это может занять некоторое время. –  Dat Tran 09.08.2017 в 10:11
  • @rambossa, если вы заботитесь об устойчивости этих прямоугольников, вы должны взглянуть на ROLO. –  Dat Tran 09.08.2017 в 22:58
  • @ShamaneSiriwardhana После тренировки я обнаружил некоторые ложноположительные обнаружения. Это может случиться, потому что модель не гарантируется всегда на 100% правильной, так как mAP никогда полностью не сходится к 0. Что касается наборов данных, я использовал PASCAL, потому что это был отраслевой стандарт до того, как ImageNet, следовательно, станет более крупным сообществом. –  eshirima 14.08.2017 в 19:25
Показать остальные комментарии