Обучение каскадного классификатора

Работа с каскадным классификатором включает два этапа: обучение и детектирование. Детектирование вы можете посмотреть, к примеру, на обнаружении лиц. А здесь описано как обучать классификатор.

В OpenCV есть два приложения для тренировки каскадов: opencv_haartraining и opencv_traincascade (новая версия написанная на C++). Но главное различие между этими двумя приложениями является то, что opencv_traincascade поддерживает как Хаара[Paul Viola, Michael Jones. Rapid Object Detection using a Boosted Cascade of Simple Features. Conference on Computer Vision and Pattern Recognition (CVPR), 2001, pp. 511-518.], так и LBP [Shengcai Liao, Xiangxin Zhu, Zhen Lei, Lun Zhang and Stan Z. Li. Learning Multi-scale Block Local Binary Patterns for Face Recognition. International Conference on Biometrics (ICB), 2007, pp. 828-837.] особенности. LBP с точки зрения, как обучения, так и детектирования в несколько раз быстрее Хаара. Что касается достоверности распознавания, то все зависит от обучающей выборки. Можно обучить LBP так, что оно будет приближаться к Хаара особенностям.

opencv_traincascade и opencv_haartraining хранят обученные классификаторы в различных форматах. Новый интерфейс обнаружения (CascadeClassifier класса в objdetect модуле) поддерживают оба формата. opencv_traincascade может сохранять обучение каскада в старом формате. Но opencv_traincascade и opencv_haartraining не может загрузить классификатор в другом формате для дальнейшего обучения после перерыва.

opencv_traincascade приложение может использовать TBB для многопоточности. Чтобы использовать его в режиме многоядерных процессоров OpenCV должно быть откомпилировано с TBB.

Другие утилиты, используемые для обучения:

1. opencv_createsamples используется для подготовки учебного набора положительных и тестовых образцов в формате, который поддерживается как opencv_haartraining так и opencv_traincascade приложениями. На выходе получается файл с расширением *.vec, это двоичный формат, который содержит изображение.

2. opencv_performance может быть использовано для оценки качества классификаторов, но только для обученных opencv_haartraining. Она использует коллекцию размеченных изображений, запускает классификатор и сообщает так называемую производительность, т.е. количество найденных объектов, количество пропущенных объектов, количество ложных срабатываний и другую информацию.

Для обучения необходимо собрать образы. Есть два типа образов: негативные и позитивные. Негативные образы соответствуют отсутствию объекта на изображении. Положительные образы соответствуют изображением с обнаруженными объектами. Набор негативных образов должен быть подготовлен вручную, в то время как множество положительных образов создается с помощью утилиты opencv_createsamples.

Негативные образы должны быть взяты из произвольного изображения. Эти изображения не должны содержать обнаруженных объектов. Негативные образы перечислены в специальном файле. Это текстовый файл, в котором каждая строка содержит имя файла изображения (относительно каталога файла) с негативным образом. Этот файл должен быть создан вручную. Обратите внимание, что негативные примеры называют также фоновыми пробами или образцами фона изображения. Описанные изображения могут быть разных размеров. Но каждое изображение должно быть больше, чем размер окна обучения. Пример описываемого файла:

Структура каталогов:

/images
  image1.jpg
  image2.jpg
test.txt

text.txt:
images/image1.jpg
images/image2.jpg

Позитивные образы создаются утилитой opencv_createsamples. Они могут быть созданы из одного изображения с объектом или из коллекции ранее размеченных изображений.

Обратите внимание, что вам нужен большой набор положительных образов, прежде чем передать его в указанную утилиту. Например, вам, возможно, потребуется только один положительный образ для абсолютно одинаковых объектов, таких как логотипа OpenCV, но вам определенно нужны сотни и даже тысячи позитивных образов для лица.

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

Аргументы:

-vec <vec_file_name>

Имя выходного файла, содержащего позитивные образы для обучения.

-img <image_file_name>

Источник изображения объекта (например, логотип компании).

-bg <background_file_name>

Файл описание фона, который содержит список изображений, которые используются в качестве фона для случайно искаженных версий объекта.

-num <number_of_samples>

Количество положительных образов для генерации.

-bgcolor <background_color>

Цвет фона (в настоящее время предполагается черно-белые изображения); цвет фона обозначает прозрачный цвет. Так как могут быть артефакты сжатия, количество цветов допуска может быть задано -bgthresh. Все пиксели в диапазоне [bgcolor-bgthresh, bgcolor+bgthresh] интерпретируются как прозрачные.

-bgthresh <background_color_threshold>

-inv

Если указано, то цвета будут обращены.

-randinv

Если указано, то цвета будут обращены в случайном порядке.

-maxidev <max_intensity_deviation>

Максимальное отклонение интенсивностей пикселей на переднем плане образов.

-maxxangle <max_x_rotation_angle>

-maxxangle <max_y _rotation_angle>

-maxxangle <max_z_rotation_angle>

Максимальные углы поворота должны быть предоставлены в радианах.

-show

Полезные опции отладки. Если указано, то каждый образец будет показан. Нажатие Esc даст сигнал продолжать процесс создания образов без отображения.

-w <sample_width>

Ширина (в пикселях) выходных примеров.

-h <sample_height>

Высота (в пикселях) выходных примеров.

Следующая процедура используется для создания экземпляра образа объекта: исходное изображение поворачивается случайно вокруг всех трех осей. Выбранный угол ограничен максимумами угла. Пиксели, имеющие интенсивность в диапзоне [bg_color-bg_color_threshold; bg_color + bg_color_threshold] интерпретируются как прозрачные. Белый шум добавляется к интенсивности на переднем плане. Если -inv ключ указан, то пиксели на переднем плане инвертируются. Если –randinv ключ указан, то алгоритм случайным образом выбирает, будет ли обращение пикселей применено к этому образцу. Наконец, полученное изображение помещается на произвольный фон из файла описания фона, масштабировать до нужного размера, указанного в -h и -w и сохраняется в vec-файл, заданный в параметре -vec.

Позитивные примеры также могут быть получены из коллекции ранее размеченных изображений. Эта коллекция, которая описывается в текстовом файле, похожа на файл описания фона. Каждая строка этого файла соответствует изображению. Первым элементом линии является имя файла. За ней следуют количество экземпляров объекта. Следующие числа являются координатами объектов ограничивающих прямоугольников (х, у, ширина, высота).

Структура каталогов:

/images
  image1.jpg
  image2.jpg
info.dat

info.dat:
images/image1.jpg  1  140 100 45 45
images/image2.jpg  2  100 200 50 50   50 30 25 25

Т.е. первое изображение дает одно положение объекта, а второе два.

Для того, чтобы создать позитивные образы из таких коллекций, -info аргумент должен быть указан вместо –img:

-info <collection_file_name>

Схема по созданию образов в данном случае заключается в следующем. Экземпляры объектов взяты из изображений. Затем они изменяются до размера целевых образов и сохраняются в выходной vec-файл. Никаких искажений не применяется, поэтому влияющие аргументы это: -w,-h,-show и -Num.

opencv_createsamples может быть использована для изучения образов, хранящихся в файле позитивных образов. Для того, чтобы сделать это только -vec,-w и -h параметры должны быть указаны.

Следующим шагом является подготовка классификатора. Как уже упоминалось выше opencv_traincascade или opencv_haartraining могут быть использованы для обучения каскада классификаторов, но только opencv_traincascade будет описан в дальнейшем.

Аргументы командной строки opencv_traincascade приложения сгруппированы по целям:

1. Общие аргументы:
-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>

Количество этапов каскада для обучения.

-precalcValBufSize <precalculated_vals_buffer_size_in_Mb>

Размер буфера — расчетное значение функции (в Мб).

-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>

Размер буфера для индексов расчетных функций (в Мб). Чем больше памяти у вас есть, тем быстрее процесс обучения.

-baseFormatSave

Этот аргумент является актуальным в случае Хаар-подобных функций. Если он указан, то каскад будет сохранен в старом формате.

2. Параметры каскада:
-stageType <BOOST(default)>

Тип этапов. Только boosted классификаторы поддерживаются как этап типа на данный момент.

-featureType<{HAAR(default), LBP}>

Тип функции: HAAR — Хаара-подобные функции, LBP — местные модели двоичные.

-w < .sampleWidth >

-h < .sampleHeight >

Размер обучаемых образов (в пикселях). Должно быть ровно те же значения, которые используются во время создания образов обучения (opencv_createsamples).

3. Параметры Boosted-классификатора:
-bt <{DAB, RAB, LB, GAB(default)}>

Тип boosted классификаторов: DAB — Дискретная AdaBoost, RAB — Real AdaBoost, LB — LogitBoost, GAB — Gentle AdaBoost.

-minHitRate <min_hit_rate>

Минимальный желаемый показатель попадания на каждом этапе классификатора. Общий рейтинг популярности можно оценить как (min_hit_rate ^ number_of_stages).

-maxFalseAlarmRate <max_false_alarm_rate>

Максимальный желаемый уровень ложных тревог для каждого этапа классификатора. Общий уровень ложных тревог можно оценить как (max_false_alarm_rate ^ number_of_stages).

-weightTrimRate <weight_trim_rate>

Указывает, будет ли использована обрезка и ее вес. Достойный выбор 0,95.

-maxDepth <max_depth_of_weak_tree>

Максимальная глубина слабого дерева. Достойный выбор 1.

-maxWeakCount <max_weak_tree_count>

Максимальное количество слабых деревьев для каждого этапа каскада. Boosted классификатор имеет так много слабых деревьев (<= maxWeakCount), сколько необходимо для достижения заданного maxFalseAlarmRate.

4. Параметры для особенностей Хаара:
-mode <BASIC (default) | CORE | ALL>

Выбор типа функции Хаара установлено, как используемые в обучении. Основное использование только вертикальные функции, а все использует полный набор вертикальных и 45 градусов набором функций. См. [Rainer Lienhart and Jochen Maydt. An Extended Set of Haar-like Features for Rapid Object Detection. Submitted to ICIP2002.] для более подробной информации.

После opencv_traincascade приложение завершит свою работу, обученный каскад будет сохранен в cascade.xml файл в папке, которая была принята в качестве данных параметров. Другие файлы в этой папке создаются на случай прервания обучение, так что вы можете удалить их после завершения обучения.