Обучение каскадного классификатора в OpenCV (opencv_traincascade, opencv_createsamples) — TechCave

Оглавление В данном уроке мы рассмотрим обучение каскадного классификатора в OpenCV с помощью утилит opencv_traincascade, opencv_createsamples. Каскад будем тренировать распознавать автомобили

Обучение каскадного классификатора в OpenCV (opencv_traincascade, opencv_createsamples)

OpenCV/Обработка и распознавание изображений

Обучение каскадного классификатора в OpenCV (opencv_traincascade, opencv_createsamples)

Оглавление

В данном уроке мы рассмотрим обучение каскадного классификатора в OpenCV с помощью утилит opencv_traincascade, opencv_createsamples. Каскад будем тренировать распознавать автомобили.

Для начала нам нежно скачать базу фотографий автомобилей с сайта Иллинойсского университета по ссылке. Также можно скачать данную базу с Github вместе с исходниками примера.

Распакуем архив командой:

$ tar zxvf CarData.tar.gz

Данный архив в папке TrainImages содержит изображения на которых мы и будем обучать наш классификатор. Файлы с позитивными изображениями (те которые содержат искомый объект) начинаются с букв pos, а файлы с негативными изображениями (те на которых искомый объект отсутствует) начинаются с neg. В папке содержится 550 изображений автомобилей и 500 изображений на которых автомобилей нет.

Также в архиве есть тестовые изображения с автомобилями, они находятся в папке TestImages. На них мы будем проверять работу нашего классификатора.

Теперь составим списки позитивных и негативных изображений. Список позитивных изображений поместим в файл pos.txt, негативных в файл neg.txt.

$ find ./CarData/TrainImages/ -name 'pos-*' > pos.txt
$ cat pos.txt

$ find ./CarData/TrainImages/ -name 'neg-*' > neg.txt
$ cat neg.txt

Посмотрим количество изображений в этих файлах.

$ cat pos.txt | wc -l 

$ cat neg.txt | wc -l 

Далее создадим файл с описанием позитивных изображений. Данный файл должен иметь следующий формат:

[filename] [# of objects] [[x y width height] [... 2nd object] ...]
[filename] [# of objects] [[x y width height] [... 2nd object] ...]
[filename] [# of objects] [[x y width height] [... 2nd object] ...]
...

filename — имя файла;

# of objects — число объектов на изображении;

x, y — координаты объекта;

width, heigh — ширина и высота изображения;

Пример такого файла:

img/img1.jpg 1 140 100 45 45
img/img2.jpg 2 100 200 50 50 50 30 25 25
img/img3.jpg 1 0 0 20 20

В нашем случае на каждом позитивном изображении изображен только один автомобиль, начальные координаты возьмем (0, 0), ширина и высота изображения (100, 40).

Создадим такой файл описания с именем cars.info командой:

$ find ./CarData/TrainImages/ -name 'pos-*' -exec echo \{\} 1 0 0 100 40 \; > cars.info
$ cat cars.info

Теперь создадим коллекцию позитивных изображений в vec формате с помощью утилиты opencv_createsamples.

$ opencv_createsamples -info cars.info -num 550 -w 48 -h 24 -vec cars.vec

Проверим правильность создания коллекции изображений командой:

$ opencv_createsamples -vec cars.vec -w 48 -h 24

Создадим папку data в которую будет помещен наш обученный каскад:

$ mkdir data

Теперь обучим наш каскад с помощью утилиты opencv_traincascade.

$ opencv_traincascade -data data -vec cars.vec -bg neg.txt -numPos 500 -numNeg 500 -numStages 2 -w 48 -h 24 -featureType HAAR -precalcValBufSize 512 -precalcIdxBufSize 512 -mode ALL

-data <cascade_dir_name> — папка в которую будет помещен обученный каскад;

-vec <vec_file_name> — vec файл позитивных изображений (созданный утилитой opencv_createsamples);

-bg <background_file_name> — файл с описанием изображений не содержащих искомый объект;

-numPos <number_of_positive_samples>,-numNeg<number_of_negative_samples> — число позитивных и негативных изображений;

-numStages <number_of_stages> — число этапов обучения;

-w <sampleWidth>, -h <sampleHeight> — ширина и высота изображений для обучения;

-featureType <{HAAR(default),LBP}> — тип каскада (HAAR, LBP);

-mode ALL — использовать или нет полный комплект Хаар-признаков. От этого зависит скорость работы и точность алгоритма. Но есть ситуации, когда полного комплекта признаков не нужно (например, если ваш объект не меняет ориентацию);

-precalcValBufSize <precalculated_vals_buffer_size_in_Mb>, -precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb> — выделяемая под процесс память. 

Примечание: Как правило параметр numStages задают гораздо больше 2-х, но тогда обучение каскада займет на много больше времени.  

Теперь наш каскад обучен. Протестируем его. Для этого скомпилируем простой пример opencv_cardetect, который находится на Github.

$ cmake ./cardetect && make

Запустим наш пример:

$ ./opencv_cardetect --cascade=data/cascade.xml CarData/TestImages/test-5.pgm

Оглавление

15:04
11416

Нет комментариев. Ваш будет первым!

Авторизация

Пользователи

Seangle
Галя Рубцова
Ольга Телюкова
Zhenya
Лариса Аксиненко
Dmitry Loginov
Dimas Potapov
Ваня Берёзкин
Володя Рудомаха