Цель данной работы - изучить программные средства библиотеки OpenCV, позволяющие обучать и применять каскадные детекторы объектов.
Основные задачи
- Разработать приложение, осуществляющее детектирование объектов определенного класса на одиночном изображении и видео с помощью каскадного классификатора.
- Обучить детекторы логотипов ННГУ и OpenCV на основе HAAR- и LBP-признаков.
- Применить полученные самостоятельно детекторы и стандартные детекторы из состава OpenCV к тестовым видео. Визуально сравнить качество различных детекторов для одних и тех же объектов.
Дополнительные задачи
- Разработать приложение, позволяющее детектировать объекты нескольких классов на одном изображении/видео одновременно.
- Разработать приложение, осуществляющее детектирование объектов
на изображении и видео с помощью HOG-детектора
(см. документацию
HOGDescriptor
). - Добавить в разработанное приложение возможность оценки качества детектирования
при наличии файла с описанием истинных положений объектов на изображении/кадрах видео,
используя класс
DetectionQualityEvaluator
, объявленный в файлеinclude/benchmark.hpp
.
В лабораторной работе основные задачи решаются на базе программного
модуля detection
библиотеки summer_school_2016_lib
. Модуль
включает заголовочный файл include\detection.hpp
и исходный файлsrc\detection.cpp
. Модуль содержит объявление
абстрактного класса Detector
.
class Detector {
public:
static std::shared_ptr<Detector> CreateDetector(const std::string& name);
virtual bool Init(const std::string& model_file_path) = 0;
virtual void Detect(const cv::Mat& frame, std::vector<cv::Rect>& objects,
std::vector<double>& scores) = 0;
};
Класс имеет следующие чисто виртуальные методы:
Init
- метод загрузки детектора из файла.Detect
- метод детектирования объектов на одиночном изображении. Входные параметры:frame
- изображение. Выходные параметры:objects
- вектор прямоугольников, выделяющих найденные объекты на изображении;scores
- вектор, содержащий для каждого срабатывания детектора число, определяющее уверенность детектора в наличии объекта в соответствующей области изображения.
Также класс содержит фабричный метод CreateDetector
.
- Объявить класс-наследник
CascadeDetector
от классаDetector
. - Последовательно реализовать методы класса
CascadeDetector
. - Скопировать
samples\template_demo.cpp
в директориюsamples
. - Переименовать копию примера в
samples\detection_demo.cpp
. - Разработать приложение
samples\detection_demo.cpp
в соответствии с перечнем требований, представленным в описании основных задач. - Разработать приложения, решающие дополнительные задачи.
- Дополнить заголовочный файл
include\detection.hpp
объявлением классаCascadeDetector
, унаследовав его от классаDetector
.
class CascadeDetector : public Detector {
public:
virtual bool Init(const std::string& model_file_path);
virtual void Detect(const cv::Mat& frame, std::vector<cv::Rect>& objects,
std::vector<double>& scores);
protected:
cv::CascadeClassifier detector;
};
- Добавить код для создания экземпляра класса
CascadeDetector
в фабричный методDetector::CreateDetector
.
if (name == "cascade") {
return std::make_shared<CascadeDetector>();
}
-
Реализовать метод
CascadeDetector::Init
. Метод предполагает выполнение следующей последовательности действий:- Произвести загрузку каскадного детектора из файла, с помощью метода
load
классаcv::CascadeClassifier
. - Обработать возможные ошибки при загрузке детектора
и вернуть
true
при успешной загрузке, иначеfalse
.
- Произвести загрузку каскадного детектора из файла, с помощью метода
-
Реализовать метод
CascadeDetector::Detector
. Метод предполагает выполнение следующей последовательности действий:- Проверить был ли загружен детектор из файла ранее.
- Если детектор был загружен, то осуществить детектирование
объектов на пирамиде изображений с использованием метода
cv::CascadeClassifier::detectMultiScale
. - В качестве значения параметра
score
вернуть число срабатываний детектора, пришедшихся на один объект.
-
Сделать копию файла
samples\template_demo.cpp
под именемsamples\detection_demo.cpp
. -
Разработать приложение
samples\detection_demo.cpp
в соответствии с требованиями, перечисленными в основных задачах.- Создать массив опций приложения:
image
- путь до исходного изображения;video
- путь до исходного видеофайла;camera
- идентификатор камеры, с которой требуется получить видеопоток;model
- путь до файла детектора. Опцииimage
,video
иcamera
взаимоисключающие.
const char* kOptions = "{ i image | <none> | image to process }" "{ v video | <none> | video to process }" "{ c camera | <none> | camera to get video from }" "{ m model | <none> | path to detector file }" "{ h ? help usage | | print help message }";
-
Создать экземпляр класса
CascadeDetector
и загрузить детектор из файла. -
Загрузить изображение/очередной кадр видео и выполнить детектирование на нем.
-
Отрисовать все срабатывания детектора в виде прямоугольников на изображении и отобразить результат.
- Создать массив опций приложения:
-
Загрузить один из готовых детекторов из директории
test/test_data/detection/cascades/
и визуально оценить качество его работы на тестовом видео (test/test_data/video/logo.mp4
) или/и видео с веб-камеры. Также можно протестировать готовые модели для детектирования лиц/людей, которые предоставляются в составе библиотеки OpenCV (<source-каталог OpenCV>/data/*cascades/
). -
Поочередно обучить детекторы на LBP- и HAAR-признаках для одного из логотипов из директории
test/test_data/detection/positives
.-
Скопировать папку
test/test_data/detection/negatives/
и файлtest/test_data/detection/negatives.txt
в текущую рабочую директорию. -
Запустить приложение
opencv_traincascade
из состава OpenCV (<build-каталог OpenCV>/bin/opencv_traincascade
или<build-каталог OpenCV>/x64/vc*/bin/opencv_traincascade
), указав следующие параметры:-
-vec <путь до vec-файла с позитивными примерами>
. Готовые vec-файлы c 2000 позитивов для некоторых логотипов можно найти в директорииtest/test_data/detection/vec_files/
. -
-numPos <кол-во позитивов для тренировки>
. -
-bg <путь до файла со списком негативных изображений>
. Файлnegatives.txt
как раз и содержит такой список. -
-numNeg <кол-во негативов для тренировки>
. -
-featureType <тип используемых признаков>
. Выберите HAAR или LBP. -
-data <путь до директории для сохранения полученного детектора>
. Директорию требуется создать заранее! -
-w <ширина объекта в пикселях> -h <высота объекта в пикселях>
. Так задается минимальный размер детектируемого объекта. -
-numStages <максимальное кол-во стадий каскада>
. -
-maxFalseAlarmRate <максимально допустимая частота ложных срабатываний>
.
-
$ opencv_traincascade -vec logo.vec -numPos 500 -bg negatives.txt -numNeg 500 -featureType HAAR -maxFalseAlarmRate 0.1 -numStages 5 -w 32 -h 32 -data logo_cascade
Замечание: работа данного приложения может занять несколько минут и время может существенно меняться в зависимости от указанных значений параметров.
-
-
Сгенерировать vec-файл для выбранного лого самостоятельно и повторить обучение детектора. Для генерации vec-файла предназначено приложение
opencv_createsamples
(<build-каталог OpenCV>/bin/opencv_createsamples
или<build-каталог OpenCV>/x64/vc*/bin/opencv_createsamples
). Данное приложение позволяет сгенерировать выборку позитивных изображений путем применения случайных геометрических преобразований и изменения яркости заданного позитивного изображения, а также наложения результата на негативное изображение. Запуск приложения без параметров приводит к перечислению всех допустимых параметров.
$ opencv_createsamples -img logo.png -bgthresh 1 -bg negatives.txt -maxxangle 0.7 -maxyangle 0.7 -maxzangle 0.5 -num 2000 -w 32 -h 32 -vec logo.vec
- Разработать приложения, решающие дополнительные задачи.