С развитием глубокого обучения было введено много новых подходов к обнаружению объектов, а модели обнаружения, такие как YOLO (You Only Look Once), стали устаревшими.
В моделях обнаружения объектов, таких как SNIPER, Retinanet и Trident, остались Faster-RCNN и YOLO strong. > далеко позади.
Отличный пост, чтобы получить общее представление о том, как работает 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
Аннотации окрашены в зеленый цвет, если есть доступные якоря, и окрашены в красный цвет, когда якоря нет. Если у аннотации нет привязок, это означает, что она не будет способствовать обучению. Небольшое количество аннотаций отображается красным цветом - это нормально, но если большинство или все аннотации имеют красный цвет, это может быть причиной для беспокойства. Наиболее частые проблемы заключаются в том, что аннотации слишком маленькие или имеют слишком странную форму (растянуты).
Обучение
После этой огромной и трудной задачи по маркировке и отладке ваших данных. Теперь вы, наконец, можете приступить к тренировкам. Прежде чем начать, вам необходимо знать, что у вас есть определенные варианты, которые, помимо прочего, включают:
- Архитектура магистрали (по умолчанию это resnet50, но вы также можете использовать resnet101, resnet152. Вы можете найти все параметры, которые у вас есть в каталоге keras-retinanet / models в репозитории)
- Веса (по умолчанию загружаются веса изображений для тренировки, если не указано иное)
- Эпохи (по умолчанию установлено 50)
- Каталог для сохранения весов и журналов тензорной доски по умолчанию установлен в домашний каталог, но вы также можете это изменить.
Команды для этих важных вещей приведены ниже:
--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'}
Измените его в соответствии с количеством имеющихся у вас классов.
После этого все, что осталось, это указать путь к вашему тестовому изображению в разделе «Выполнить обнаружение в примере» записной книжки.