С развитием глубокого обучения было введено много новых подходов к обнаружению объектов, а модели обнаружения, такие как YOLO (You Only Look Once), стали устаревшими.

В моделях обнаружения объектов, таких как SNIPER, Retinanet и Trident, остались Faster-RCNN и YOLO далеко позади.

Отличный пост, чтобы получить общее представление о том, как работает Retinanet, можно найти здесь.

Код

Вам необходимо скачать репозиторий - физыр / керас-ретинанет. Я тестировал этот код как на Ubuntu, так и на Windows.

Для пользователей Windows вам потребуется установить среду Anaconda и потребуются инструменты Microsoft Visual Basic C ++.

После загрузки репозитория перейдите в свой терминал Anaconda в Windows или терминал в Ubuntu, перейдите в папку репозитория и введите:

$ pip install . --user

Эта строка устанавливает пакет keras-retinanet локально на ваш компьютер.

ПРИМЕЧАНИЕ. Этот процесс установки пакета необходимо выполнять всякий раз, когда в фактические файлы кода вносятся какие-либо изменения.

После установки пакета у вас будет доступ к следующим командам на вашем терминале:

retinanet-train
retinanet-evaluate
retinanet-debug
retinanet-convert-model

Аннотации

Требуются два файла csv. Первый содержит путь, ограничивающую рамку и имя класса каждого изображения. Второй файл должен содержать только имя класса и их сопоставление.

CSV-файл с аннотациями должен содержать по одной аннотации на строку. Изображения с несколькими ограничивающими рамками должны использовать по одной строке на ограничивающую рамку. Обратите внимание, что индексирование значений пикселей начинается с 0. Ожидаемый формат каждой строки:

path/to/image.jpg,x1,y1,x2,y2,class_name

Некоторые изображения могут не содержать помеченных объектов. Чтобы добавить эти изображения в набор данных в качестве отрицательных примеров, добавьте аннотацию, в которой x1, y1, x2, y2 и class_name все пусты:

path/to/image.jpg,,,,,

Полный пример:

/data/imgs/img_001.jpg,837,346,981,456,cow
/data/imgs/img_002.jpg,215,312,279,391,cat
/data/imgs/img_002.jpg,22,5,89,84,bird
/data/imgs/img_003.jpg,,,,,

Имя класса в файл сопоставления идентификаторов должно содержать по одному сопоставлению в каждой строке. Каждая строка должна иметь следующий формат:

class_name,id

Индексирование классов начинается с 0. Не включайте фоновый класс, поскольку он является неявным.

Например:

cow,0
cat,1
bird,2

Я использовал labelImg, чтобы сначала сделать аннотации в формате pascal voice xml, а затем преобразовал их в txt с помощью этого скрипта. Просто переименуйте .txt в .csv, чтобы преобразовать его в формат csv.

Отладка

Перед тем, как приступить к обучению, вам необходимо проверить правильность сделанных вами аннотаций. Вы можете сделать это, набрав в терминале следующее:

$ retinanet-debug csv path/to/annotation.csv path/to/classes.csv

Аннотации окрашены в зеленый цвет, если есть доступные якоря, и окрашены в красный цвет, когда якоря нет. Если у аннотации нет привязок, это означает, что она не будет способствовать обучению. Небольшое количество аннотаций отображается красным цветом - это нормально, но если большинство или все аннотации имеют красный цвет, это может быть причиной для беспокойства. Наиболее частые проблемы заключаются в том, что аннотации слишком маленькие или имеют слишком странную форму (растянуты).

Обучение

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

  1. Архитектура магистрали (по умолчанию это resnet50, но вы также можете использовать resnet101, resnet152. Вы можете найти все параметры, которые у вас есть в каталоге keras-retinanet / models в репозитории)
  2. Веса (по умолчанию загружаются веса изображений для тренировки, если не указано иное)
  3. Эпохи (по умолчанию установлено 50)
  4. Каталог для сохранения весов и журналов тензорной доски по умолчанию установлен в домашний каталог, но вы также можете это изменить.

Команды для этих важных вещей приведены ниже:

--backbone
--weights
--epochs
--snapshot-path
--tensorboard-dir

Для получения дополнительной информации о том, как работают эти команды и какие еще параметры у вас есть, вы можете обратиться к файлу keras-retinanet / bin / train.py в репозитории.

Базовый пример того, как вы могли бы использовать их с командой retinanet-train:

retinanet-train --backbone resnet101 --weights path/to/weights.h5 --epochs 100 --snapshot-path path/to/save/dir --tensorboard-dir path/to/tensorboard/dir csv path/to/annotations.csv path/to/classes.csv

Думаю, это выглядит очень сложно….

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

retinanet-train csv path/to/annotations.csv path/to/classes.csv

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

retinanet-train --snapshot-path path/to/save/dir --tensorboard-dir path/to/tensorboard/dir csv path/to/annotations.csv path/to/classes.csv

ПРИМЕЧАНИЕ. Для ранней остановки или csvlogger не добавлен обратный вызов. Вам нужно добавить это самостоятельно в файл train.py.

Это сначала загрузит веса imagnet для resnet50, а затем начнет ваше обучение.

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

Вывод

Процедура обучения keras-retinanet работает с моделями обучения. Это урезанные версии по сравнению с моделью вывода и содержат только уровни, необходимые для обучения (значения регрессии и классификации). Если вы хотите сделать вывод на модели (выполнить обнаружение объекта на изображении), вам необходимо преобразовать обученную модель в модель вывода. Это делается следующим образом:

retinanet-convert-model /path/to/training/model.h5 /path/to/save/inference/model.h5

После конвертации модели. Перейдите к папке с примером в репозитории и откройте записную книжку.

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

model_path = os.path.join('..', 'snapshots', 'resnet50_coco_best_v2.1.0.h5')

# load retinanet model
model = models.load_model(model_path, backbone_name='resnet50')

Также существует переменная labels_to_names, которая представляет собой словарь, в котором отображаются классы.

labels_to_names = { 0: ‘person’, 1: 'bat'}

Измените его в соответствии с количеством имеющихся у вас классов.

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

использованная литература

  1. Потеря фокуса при обнаружении плотных объектов
  2. Керас-ретинанет