Это версия кода для следующей статьи:
Бугра Текин, Судипта Н. Синха и Паскаль Фуа, «Бесшовное прогнозирование положения 6D-объекта в режиме реального времени», CVPR 2018.
Исходный репозиторий кодовой базы для приведенной выше статьи можно найти по следующей ссылке.
Мы предлагаем однократный подход для одновременного обнаружения объекта на изображении RGB и прогнозирования его 6D-позы без необходимости выполнения нескольких этапов или проверки нескольких гипотез. Ключевым компонентом нашего метода является новая архитектура CNN, вдохновленная сетевым дизайном YOLO, которая напрямую предсказывает местоположения 2D-изображений проецируемых вершин трехмерной ограничивающей рамки объекта. Затем шестимерная поза объекта оценивается с использованием алгоритма PnP. Бумага, arXiv
Если вы используете этот код, укажите следующее
@inproceedings{tekin18,
НАЗВАНИЕ = {{Бесшовное предсказание позы объекта в режиме реального времени по одному снимку 6D}}, АВТОР = {Текин, Бугра и Синха, Судипта Н. и Фуа, Паскаль},
КНИГА = {CVPR},
ГОД = {2018}
}
SingleShotPose выпускается под лицензией MIT (подробности см. в файле LICENSE).
Код протестирован в Windows с CUDA v8 и cudNN v5.1. Реализация основана на PyTorch 0.4.1 и протестирована на Python3.6 . Для кода требуются следующие зависимости, которые можно установить с помощью conda или pip: numpy, scipy, PIL, opencv-python. Более раннюю версию, совместимую с PyTorch 0.3.1 и протестированную на Python2.7, см. в папке py2
.
Внутри каталога основного кода запустите следующую команду, чтобы загрузить и извлечь (1) предварительно обработанный набор данных LINEMOD, (2) обученные модели для набора данных LINEMOD, (3) обученную модель для набора данных OCCLUSION, (4) фоновые изображения из VOC2012. набор данных соответственно.
wget -O LINEMOD.tar --no-check-certificate "https://onedrive.live.com/download?cid=05750EBEE1537631&resid=5750EBEE1537631%21135&authkey=AJRHFmZbcjXxTmI"
wget -O backup.tar --no-check-certificate "https://onedrive.live.com/download?cid=0C78B7DE6C569D7B&resid=C78B7DE6C569D7B%21191&authkey=AP183o4PlczZR78"
wget -O multi_obj_pose_estimation/backup_multi.tar --no-check-certificate "https://onedrive.live.com/download?cid=05750EBEE1537631&resid=5750EBEE1537631%21136&authkey=AFQv01OSbvhGnoM"
wget https://pjreddie.com/media/files/VOCtrainval_11-May-2012.tar
wget https://pjreddie.com/media/files/darknet19_448.conv.23 -P cfg/
tar xf LINEMOD.tar
tar xf backup.tar
tar xf multi_obj_pose_estimation/backup_multi.tar -C multi_obj_pose_estimation/
tar xf VOCtrainval_11-May-2012.tar
Кроме того, вы можете напрямую перейти по ссылкам выше и вручную загрузить и извлечь файлы в соответствующие каталоги. Весь процесс загрузки может занять много времени (~ 60 минут). Также имейте в виду, что доступ к OneDrive в некоторых странах может быть ограничен.
Чтобы обучить запуск модели,
python train.py --datacfg [path_to_data_config_file] --modelcfg [path_to_model_config_file] --initweightfile [path_to_initialization_weights] --pretrain_num_epochs [number_of_epochs to pretrain]
например
python train.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --initweightfile cfg/darknet19_448.conv.23 --pretrain_num_epochs 15
если вы хотите начать с инициализированных весов ImageNet или
python train.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --initweightfile backup/duck/init.weights
если вы хотите начать с уже предварительно обученной модели в LINEMOD для более быстрой сходимости.
[datacfg] содержит информацию о разделении обучения/тестирования, трехмерных моделях объектов и параметрах камеры.
[modelcfg] содержит информацию о структуре сети.
[initweightfile] содержит веса инициализации. <
В начале обучения вы увидите такой результат:
layer filters size input output
0 conv 32 3 x 3 / 1 416 x 416 x 3 -> 416 x 416 x 32
1 max 2 x 2 / 2 416 x 416 x 32 -> 208 x 208 x 32
2 conv 64 3 x 3 / 1 208 x 208 x 32 -> 208 x 208 x 64
3 max 2 x 2 / 2 208 x 208 x 64 -> 104 x 104 x 64
...
30 conv 20 1 x 1 / 1 13 x 13 x1024 -> 13 x 13 x 20
31 detection
Это определяет структуру сети. Во время обучения лучшая модель сети сохраняется в файл model.weights. Чтобы обучить сети другим объектам, просто измените имя объекта при вызове функции обучения, например: « python train.py --datacfg cfg/duck.data --modelcfg cfg/yolo-pose.cfg --initweightfile backup/duck/init.weights
". Если во время обучения вы столкнулись с ошибками памяти графического процессора, вы можете попробовать уменьшить размер пакета, например, до 16 или 8, чтобы он вписался в память. Версия кода с открытым исходным кодом подверглась серьезному рефакторингу, и, кроме того, некоторые модели пришлось переобучить. Переобученные модели, которые мы предоставляем, не сильно отличаются от первоначальных результатов, которые мы предоставляем (иногда немного хуже, иногда немного лучше).
Чтобы протестировать запуск модели
python valid.py --datacfg [path_to_data_config_file] --modelcfg [path_to_model_config_file] --weightfile [path_to_trained_model_weights]
например
python valid.py --datacfg cfg/ape.data --modelcfg cfg/yolo-pose.cfg --weightfile backup/ape/model_backup.weights
Вы также можете использовать valid.ipynb для тестирования модели и визуализации результатов.
Внутри папки multi_obj_pose_estimation/
Тестирование:
python valid_multi.py cfgfile weightfile
например
python valid_multi.py cfg/yolo-pose-multi.cfg backup_multi/model_backup.weights
Обучение:
python train_multi.py datafile cfgfile weightfile
например,
python train_multi.py cfg/occlusion.data cfg/yolo-pose-multi.cfg backup_multi/init.weights
Наши файлы меток состоят из 21 истинного значения. Мы прогнозируем 9 точек, соответствующих центру тяжести и углам трехмерной модели объекта. Дополнительно мы прогнозируем класс в каждой ячейке. Это составляет 9x2+1 = 19 очков. При многообъектном обучении во время обучения мы назначаем тот блок привязки, который имеет размер, наиболее похожий на текущий объект, в качестве ответственного за прогнозирование 2D-координат для этого объекта. Чтобы закодировать размер объектов, у нас есть дополнительные два числа для диапазона в измерении x и измерении y. Следовательно, у нас есть 9x2+1+2 = 21 число.
Соответственно, 21 число соответствует следующему: 1-е число: метка класса, 2-е число: x0 (x-координата центроида), 3-е число: y0 (y-координата центроида), 4-е число: x1 (x-координата центроида). первого угла), 5-е число: y1 (y-координата первого угла), ..., 18-е число: x8 (x-координата восьмой угол), 19-е число: y8 (координата y восьмого угла), 20-е число: диапазон x, 21-е число: диапазон y.
Координаты нормализуются по ширине и высоте изображения: x / image_width
и y / image_height
. Полезно иметь одинаковые выходные диапазоны для задач координатной регрессии и классификации объектов.
Мы обучаем и тестируем наши модели на наборе данных LINEMOD, используя те же разделения обучения и тестирования, что и метод BB8, для проверки нашего подхода. Если вы хотите обучить модель на своем собственном наборе данных, вы можете создать ту же структуру папок с предоставленным набором данных LINEMOD и настроить пути в cfg/[OBJECT].data, [DATASET]/[OBJECT]/train.txt и Файлы [НАБОР ДАННЫХ]/[ОБЪЕКТ]/test.txt. Папка для каждого объекта должна содержать следующее:
(1) папка, содержащая файлы изображений,
(2) папка, содержащая файлы меток (пожалуйста, обратитесь к этой ссылке для подробного объяснения того, как создавать метки. Вы также можете найти сторонний набор инструментов ObjectDatasetTools, полезный для создания достоверных меток для оценки положения шестимерного объекта),
(3) текстовый файл, содержащий имена файлов для обучающих изображений ( train.txt
),
(4) текстовый файл, содержащий имена файлов для тестовых изображений ( test.txt
),
(5) файл .ply, содержащий 3D-модель объекта (единицы измерения объектной модели указаны в метрах),
(6) опционально, папка, содержащая маски сегментации (если вы хотите изменить фон ваших обучающих изображений, чтобы он был более устойчивым к разнообразному фону, это будет важно для лучшей способности к обобщению),
Также обязательно измените следующие значения в файлах конфигурации данных и модели в соответствии с вашими потребностями:
diam
» в файле конфигурации данных на диаметр имеющейся объектной модели.yolo-pose.cfg
) и некоторые параметры увеличения данных (дрожание, оттенок, насыщенность, параметры экспозиции в dataset.py
) также может потребоваться корректировка для лучшей сходимости вашего набора данных.yolo-pose-multi.cfg
). Также убедитесь, что вы используете правильное количество классов и укажите его в yolo-pose-multi.cfg
.fx
, fy
, u0
, v0
, width
, height
) в файлах конфигурации данных на те, которые соответствуют вашему набору данных. При создании набора обучающих данных выборка большого количества точек обзора/расстояний и моделирование большой изменчивости настроек освещения/окклюзии/фона будут важны для повышения способности обобщения подхода к вашему набору данных. Если вы хотите настроить некоторые параметры модели и потерь (например, весовой коэффициент для различных условий потерь) для своих целей, вы можете сделать это в файле конфигурации модели ( yolo-pose.cfg
).
Код написан Bugra Tekin и построен на реализации YOLOv2 пользователя github @marvis.
По любым вопросам или сообщениям об ошибках обращайтесь к Bugra Tekin.