Хотел спросить, существует ли какая-либо схема распознавания лиц, подходящая для видео, которая потребовала бы минимального времени обучения, в идеале, около нескольких дней, а не недель, как Виола-Джонс. Я читал о LBP, но для этого также требуется огромный набор обучающих образцов, но я не уверен, сколько времени это займет. Занимает ли тренировка LBP столько же времени, сколько метод Виолы-Джонса с таким же количеством тренировочных наборов? Я буду реализовывать это на микропроцессоре, таком как raspberry pi, под управлением ОС Linux. Я хочу реализовать его на C для скорости, так как я хочу, чтобы он мог обнаруживать изображения в видеопотоке со скоростью 10–20 кадров в секунду.
Алгоритмы обнаружения лиц с минимальным временем обучения
Ответы (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 или нет.
Вот и все.
detectMultiScale()
работает не только на Хаара. Если вы присмотритесь, то заметите, что параметр cascade
предназначен только для C API. Что вы должны сделать в C++, так это объявить CascadeClassifier csc;
объект, затем csc.read(const string& filename)
XML-описание вашего каскада (LBP или Haar, не имеет значения), а затем csc.detectMultiScale(...)
с вашими аргументами по выбору.
- person Iwillnotexist Idonotexist; 23.04.2015