Я создавал лабораторную по этой теме, могу привести инструкцию.
- Загрузите набор утилит opencv(гугл-диск, но я советую поискать самостоятельно), в частности
opencv_createsamples
и opencv_traincascade
, а также необходимые им DLL-библиотеки. Распакуйте их в рабочий каталог в корне диска, без русских букв и пробелов в названии. Здесь и далее предполагается, что C:\MyDirName
- ваш рабочий каталог.
- Подготовьте фото вашего объекта. Используйте контрастный объект без движущихся частей, и желательно не дающий бликов. Для этой цели хорошо подходят логотипы.
- Подготовьте отрицательные примеры (не менее 100 изображений). Для этого можно снять короткое видео помещения, затем написать программу, которая разделяет это видео на отдельные кадры. Рекомендуется поместить их в отдельный подкаталог
negatives
.
- Подготовьте файлы, содержащие список файлов в этом каталоге. Их можно сгенерировать следующей парой команд в терминале:
dir C:\MyDirName\negatives\*.jpg /B /S >C:\MyDirName\negatives\negatives_abs.txt
dir C:\MyDirName\negatives\*.jpg /B >C:\MyDirName\negatives\negatives_rel.txt
- Создайте пустые подкаталоги
C:\MyDirName\positives
и C:\MyDirName\training
. Поместите ваше изображение - положительный пример в каталог C:\MyDirName\
и назовите его positive.jpg
. В качестве положительного примера желательно разместить ваш объект на светлом фоне, если он тёмный, и наоборот.
- Сгенерируйте положительные примеры с помощью утилиты
opencv_createsamples
. Команда будет выглядеть примерно следующим образом:
C:\MyDirName\opencv_createsamples.exe -info positives\info.lst -img positive.jpg -bg negatives\negatives_rel.txt -maxxangle 0.1 -maxyangle 0.1 -maxzangle 0.1 -bgcolor 0 -bgthresh 0 -w 50 -h 50 -num 100
Параметры:
-info - выходной файл.
-img - входное изображение - положительный пример
-bg - фоновые изображения. Положительный пример будет наложен на них (в оттенках серого).
-max?angle - допустимые углы поворота примера. Утилита выполнит перспективное преобразование примера перед наложением.
-bgcolor и -bgthresh задают яркость (среднее и диапазон изменения) для "прозрачного цвета". Например, если ваш объект на белом фоне, задайте эти параметры равными 240 и 15 (диапазон яркости 225-255). Задав оба параметра равными 0, вы отключите эту функцию и все цвета будут непрозрачными.
-w и -h задают минимальный размер для размещаемой копии вашего образца.
-num - количество примеров, которые стоит генерировать. Не должно превышать количество изображений в каталоге.
Утилита должна вывести ряд сообщений вида "Open background image", а в конце вывести "Done".
- Сгенерируйте vec файл следующей командой:
C:\MyDirName\opencv_createsamples.exe -info positives\info.lst -num 100 -w 20 -h 20 -vec positives\positives.vec
где info.lst был сгенерирован в ходе пункта 6.
-w и -h задают минимальный размер для объекта, распознаваемого в ходе работы каскада.
-num - количество сгенерированных примеров. Столько же, сколько и в пункте 6.
- Проведите обучение каскада с помощью утилиты opencv_traincascade. Команда будет иметь примерно следующий вид:
C:\MyDirName\opencv_traincascade.exe -data training -vec positives\positives.vec -bg negatives\negatives_abs.txt -numStages 100 -numPos 100 -numNeg 100 -featureType haar -w 20 -h 20 -minHitRate 0.999 -maxFalseAlarmRate 0.4 -precalcValBufSize 4048 -precalcIdxBufSize 4048 -numThreads 24 -acceptanceRatioBreakValue 10e-5
-data - каталог для рабочих данных, который вы создали в пункте 5.
-vec - индекс, который был создан в пункте 7.
-bg - файл со списком отрицательных примеров (используйте абсолютные пути!)
-numPos и -numNeg - количество положительных примеров (пункт 6) и отрицательных примеров (пункт 3).
-numStages - максимальное количество этапов каскада. Итоговый каскад может содержать меньшее количество этапов.
-featureType - определяет тип признаков. Признаки Хаара обучаются медленнее, но зато более точны.
-w и -h задают минимальный размер для объекта, распознаваемого в ходе работы каскада. Должны строго совпадать с заданными в пункте 7.
-minHitRate и -maxFalseAlarmRate задают качество работы одного каскада.
-acceptanceRatioBreakValue определяет момент, когда каскад перестаёт обучаться.
-precalcValBufSize и -precalcIdxBufSize задают потребление памяти процессом.
-numThreads определяет число рабочих потоков.
- По итогам обучения в каталоге training должен появиться файл cascade.xml, который можно загружать так же, как типовые каскады, поставляемые с opencv. Обратите внимание, что если вы хотите запустить обучение с начала, нужно очистить содержимое каталога training, иначе утилита будет дообучать существующий каскад.