Опубликован: 02.09.2013 | Доступ: свободный | Студентов: 429 / 54 | Длительность: 19:27:00
Самостоятельная работа 8:

Детектирование пешеходов

< Самостоятельная работа 7 || Самостоятельная работа 8: 12345

2.4. Обучение классификатора

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

Следует отметить, что в качестве классификатора не обязательно использовать линейную машину опорных векторов, однако, в данном случае функцию HOG-детектора, аналогичную методу detectMultiScale, требуется реализовывать самостоятельно.

2.5. Детектор LatentSVM

Библиотека OpenCV содержит не только реализацию HOG-детектора, способного решать задачу детектирования пешеходов, но также и других алгоритмов детектирования объектов. Таким примером может служить алгоритм LatentSVM [7, 8], предназначенный для детектирования объектов различных классов, среди которых есть и пешеходы. Общая схема работы LatentSVM-детектора описывается в соответствующей лабораторной работе курса. В данной работе рассматривается использование программной реализации алгоритма LatentSVM из библиотеки OpenCV для детектирования пешеходов.

Функционал по использованию LatentSVM-детектора в библиотеке OpenCV сосредоточен в классе LatentSvmDetector. Перед выполнением детектирования требуется создать объект данного класса и загрузить модели объектов. Это может быть сделано путем использования конструктора

LatentSvmDetector(const vector<string>& filenames, 
        const vector<string>& classNames=vector<string>()); 

или конструктора по умолчанию с последующим вызовом функции

bool load(const vector<string>& filenames, 
        const vector<string>& classNames=vector<string>()); 

Параметрами данных методов являются:

  • filenames – имена xml-файлов с обученными моделями.
  • classNames – названия классов объектов соответствующих загружаемым моделям.

Для того чтобы в дальнейшем узнать количество загруженных моделей и назначенные им имена используются методы getClassCount и getClassNames соответственно:

size_t getClassCount() const; const vector<string>& getClassNames() const;

Для сброса загруженных моделей и их имен предназначен метод clear:

void clear(); 

Детектирование с помощью загруженных моделей осуществляется с использованием метода detect:

void detect(const Mat& image, 
            vector<ObjectDetection>& objectDetections, 
            float overlapThreshold=0.5f, 
            int numThreads=-1); 

Рассмотрим параметры метода:

  • image – изображение, на котором будет производиться детектирование.
  • objectDetections – срабатывания детектора, представляемые структурой ObjectDetection. Данная структура содержит следующие поля: rect – окаймляющий прямоугольник, score – вес срабатывания, classID – номер класса объекта.
  • overlapThreshold – параметр группировки срабатываний. Для группировки прямоугольников используется следующий алгоритм. Все срабатывания детектора сортируются по убыванию присвоенного им классификатором веса. После чего рассматривается первый прямоугольник (имеющий наибольший вес) и удаляются все такие прямоугольники, что отношение площади их пересечения к области объединения не превосходит величины overlapThreshold. Процесс повторяется со вторым прямоугольником и т.д.
  • numThreads – количество вычислительных потоков, используемых алгоритмом детектирования. Значения numThreads меньше единицы указывают на использование одного потока (т.е. последовательной версии кода).

В составе библиотеке OpenCV предоставляются модели объектов различных классов [11]. Файл person.xml содержит модель для детектирования пешеходов. Рассмотрим пример программы для детектирования алгоритмом LatentSVM.

#include <assert.h> 
#include "opencv2/core/core.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/objdetect/objdetect.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 

using namespace cv;  
int main() 
{ 
    // загружаем тестовое изображение 
    Mat img = imread("testimg.jpg"); 
 
    // увеличиваем начальный масштаб изображения 
    // для лучшего поиска мелких объектов 
    resize(img, img, Size(2 * img.cols, 2 * img.rows)); 
 
    // создаем объект класса LatentSvmDetector 
    // и загружаем модель для детектирвоания пешеходов 
    LatentSvmDetector lsvm; 
    vector<string> modelFiles; 
    modelFiles.push_back("person.xml"); 
    vector<string> modelNames; 
    modelNames.push_back("pedestrian"); 
    lsvm.load(modelFiles, modelNames); 
    assert(lsvm.getClassCount() > 0); 
 
    // запускаем LatentSVM-детектор в два потока 
    vector<LatentSvmDetector::ObjectDetection> detections; 
    lsvm.detect(img, detections, 0.5f, 2); 
 
    // уменьшаем изображение до начальных размеров 
    resize(img, img, Size(img.cols / 2, img.rows / 2)); 
 
    // устанавливаем порог весов срабатываний 
    float threshold = -.1f; 
 
    // отрисовываем срабатывания детектора на изображении 
    for (size_t i = 0; i < detections.size(); ++i) 
    { 
        LatentSvmDetector::ObjectDetection detection = 
                                             detections[i]; 
        if (detection.score < threshold) 
        { 
            continue; 
        } 
        Rect detectionRect = detection.rect; 
        detectionRect.x /= 2; 
        detectionRect.y /= 2; 
        detectionRect.width /= 2; 
        detectionRect.height /= 2; 
        rectangle(img, detectionRect, 
                  Scalar(0, 0, 255), 2); 
    } 
 
    // отображаем результат 
    namedWindow("detections");     imshow("detections", img); 
    waitKey(); 
 
    destroyAllWindows(); 
    return 0; 
} 

Результат работы данной программы на тестовом изображении приведен на рис. 15.2.

Результат работы LatentSVM-детектора на тестовом  изображении

Рис. 15.2. Результат работы LatentSVM-детектора на тестовом изображении
< Самостоятельная работа 7 || Самостоятельная работа 8: 12345
Андрей Терёхин
Андрей Терёхин

Нахожу в тесте вопросы, которые в принципе не освещаются в лекции. Нужно гуглить на других ресурсах, чтобы решить тест, или же он всё же должен испытывать знания, полученные в ходе лекции?

Демянчик Иван
Демянчик Иван

В главе 14 мы видим понятие фильтра, но не могу разобраться, чем он является в теории и практике.

" Искомый объект можно описать с помощью фильтра F= \lbrace f_{x',y'},x' \in \lbrace0, ...,w_f \rbrace , y' \in \lbrace 0,...,h_f \rbrace \rbrace "