Алгоритмы обнаружения лиц с минимальным временем обучения

Хотел спросить, существует ли какая-либо схема распознавания лиц, подходящая для видео, которая потребовала бы минимального времени обучения, в идеале, около нескольких дней, а не недель, как Виола-Джонс. Я читал о LBP, но для этого также требуется огромный набор обучающих образцов, но я не уверен, сколько времени это займет. Занимает ли тренировка LBP столько же времени, сколько метод Виолы-Джонса с таким же количеством тренировочных наборов? Я буду реализовывать это на микропроцессоре, таком как raspberry pi, под управлением ОС Linux. Я хочу реализовать его на C для скорости, так как я хочу, чтобы он мог обнаруживать изображения в видеопотоке со скоростью 10–20 кадров в секунду.


person hamede    schedule 20.11.2013    source источник
comment
Будете ли вы проводить тренировки самостоятельно или сами будете бегать?   -  person Iwillnotexist Idonotexist    schedule 20.11.2013
comment
Да, я буду реализовывать это сам. Это поможет мне лучше понять алгоритм. В основном, от реализации этапа обучения до детектора, я полностью реализую его без использования каких-либо библиотек, поэтому я могу легко редактировать код, если мне нужно перенести его на плату.   -  person hamede    schedule 20.11.2013
comment
Вы должны смотреть на реализацию OpenCV traincascade как на вдохновение. OpenCV — это большая кодовая база, но само приложение довольно маленькое.   -  person Iwillnotexist Idonotexist    schedule 20.11.2013
comment
Обязательно посмотрю. Спасибо   -  person hamede    schedule 20.11.2013
comment
Я расширяю свой ответ своим пониманием каскада поездов OpenCV. Тем временем исходный код приложения traincascade можно найти в Интернете здесь: code.opencv.org/projects/opencv/repository/revisions/master/   -  person Iwillnotexist Idonotexist    schedule 20.11.2013
comment
Еще раз спасибо, я посмотрю на эти исходные коды для лучшего понимания. Надеюсь, я смогу реализовать это на C, поняв код.   -  person hamede    schedule 20.11.2013
comment
Я расширил свое обсуждение обнаружения LBP в OpenCV, что должно помочь вам в его реализации.   -  person Iwillnotexist Idonotexist    schedule 20.11.2013


Ответы (1)


OpenCV поставляется с инструментом под названием traincascade, который обучает LBP, Haar и HOG. Специально для распознавания лиц они даже предоставляют набор данных из 3000 изображений лиц размером 24 x 24 пикселя в формате, необходимом для traincascade.

По моему опыту, из трех типов, поддерживаемых traincascade, LBP требует наименьшего времени для обучения, занимая порядка часов, а не дней для Хаара.

Краткий обзор его процесса обучения заключается в том, что для заданного количества этапов (приемлемый выбор — 20) он пытается найти функции, которые отбрасывают как можно больше не-лиц, но не отбрасывают лица. Баланс между отклонением не-лиц и сохранением лиц контролируется минимальной частотой совпадений (OpenCV выбрал 99,5%) и частотой ложных тревог (OpenCV выбрал 50%). Конкретным метаалгоритмом, используемым для создания собственного каскада LBP OpenCV, является Gentle AdaBoost (GAB).

Вариант LBP, реализованный в OpenCV, описан здесь:

Шэнцай Ляо, Сянсинь Чжу, Чжэнь Лэй, Лунь Чжан и Стэн З. Ли. Изучение многомасштабных блочных локальных бинарных шаблонов для распознавания лиц. Международная конференция по биометрии (ICB), 2007 г., стр. 828–837.

Что это означает на практике в OpenCV с параметрами по умолчанию:

Обзор среды выполнения OpenCV LBP Cascade

Детектор просматривает 24x24 окна на изображении в поисках лица. Переходя от этапа 1 к этапу 20 каскадного классификатора, если он может показать, что текущее окно 24x24, скорее всего, не является лицом, он отклоняет его и перемещается по окну на один или два пикселя к следующей позиции; В противном случае он переходит к следующему этапу.

На каждом этапе исследуется от 3 до 10 или около того признаков LBP. Каждая функция LBP имеет смещение в пределах окна и размер, а область, которую она покрывает, полностью содержится в текущем окне. Оценка функции LBP в данной позиции может привести либо к прохождению, либо к сбою. В зависимости от успешности или неудачи функции LBP к аккумулятору добавляется положительный или отрицательный вес, относящийся к этой функции.

После оценки всех функций LBP этапа значение аккумулятора сравнивается с порогом этапа. Этап не проходит, если аккумулятор ниже порога, и проходит, если он выше. Опять же, если этап выходит из строя, каскад закрывается, и окно перемещается в следующую позицию.

Оценка характеристик LBP относительно проста. При смещении этой функции в окне девять прямоугольников располагаются в конфигурации 3x3. Все эти девять прямоугольников имеют одинаковый размер для конкретной функции LBP: от 1x1 до 8x8.

Вычисляется сумма всех пикселей в девяти прямоугольниках, другими словами их интеграл. Затем интеграл центрального прямоугольника сравнивается с интегралом восьми его соседей. Результатом этих восьми сравнений являются восемь битов (1 или 0), которые собираются в 8-битный LBP.

Этот 8-битный битовый вектор используется в качестве индекса в 2^8 == 256-битной LUT, вычисленной в процессе обучения и относящейся к каждой функции LBP, которая определяет, прошла ли функция LBP или нет.

Вот и все.

person Iwillnotexist Idonotexist    schedule 20.11.2013
comment
Спасибо за отличное простое объяснение. Действительно помогло ускорить мое понимание, теперь мне просто нужно понять код в OpenCV, чтобы сделать свой собственный. - person hamede; 20.11.2013
comment
Я тренировал свою модель. Но что я должен сделать для обнаружения? В документации detectMultiScale говорится о его поддержке только функций haar, а не LBP. Любые материалы по этому поводу? - person Lakshmi Narayanan; 23.04.2015
comment
Я попытался использовать LBP cascade xml с функцией масштабирования detectMulti. Размер изображения 3000X2250, довольно большой, да, и размер образцов был ограничен до 30X50 во время обучения. Это было ровно час и 10 минут для обнаружения и все еще работает, пока я печатаю это. даже минимальный размер и максимальный размер были упомянуты от 10 до 50. Какая причина для этого? - person Lakshmi Narayanan; 23.04.2015
comment
@LakshmiNarayanan detectMultiScale() работает не только на Хаара. Если вы присмотритесь, то заметите, что параметр cascade предназначен только для C API. Что вы должны сделать в C++, так это объявить CascadeClassifier csc; объект, затем csc.read(const string& filename) XML-описание вашего каскада (LBP или Haar, не имеет значения), а затем csc.detectMultiScale(...) с вашими аргументами по выбору. - person Iwillnotexist Idonotexist; 23.04.2015
comment
@LakshmiNarayanan Вы уже загружаете в классификатор огромное изображение; Если окно обнаружения 30x50, а минимальный размер 50x50, то уменьшения совсем на самом большом масштабе не будет. Это означает, что вы будете сканировать ~ 3000x2250/4 возможных окна (>1 миллион окон!) именно в таком масштабе! Какой у вас коэффициент масштабирования? - person Iwillnotexist Idonotexist; 23.04.2015
comment
1.3. Должен ли я увеличить это и попробовать? - person Lakshmi Narayanan; 23.04.2015
comment
@LakshmiNarayanan Это действительно зависит от терпимости вашего классификатора; Однако, как правило, если вы возведете масштабный коэффициент в квадрат, вы вдвое сократите количество масштабов для поиска и, следовательно, объем работы. Но если ваши первые весы уже слишком дороги, от них мало толку. Удвоение минимального размера объекта значительно ускорит обработку изображений. - person Iwillnotexist Idonotexist; 23.04.2015