Фреймворк обнаружения объектов Виолы–Джонса — это фреймворк обнаружения объектов машинного обучения, предложенный в 2001 году Полом Виолой и Майклом Джонсом . [1] [2] Он был в первую очередь мотивирован проблемой обнаружения лиц , хотя его можно адаптировать для обнаружения других классов объектов.
Короче говоря, он состоит из последовательности классификаторов. Каждый классификатор представляет собой один персептрон с несколькими бинарными масками (признаками Хаара). Для обнаружения лиц на изображении по изображению вычисляется скользящее окно. Для каждого изображения применяются классификаторы. Если в какой-либо момент классификатор выводит «лицо не обнаружено», то считается, что окно не содержит лица. В противном случае, если все классификаторы выводят «лицо обнаружено», то считается, что окно содержит лицо.
Алгоритм эффективен для своего времени, способен обнаруживать лица на изображениях размером 384 на 288 пикселей со скоростью 15 кадров в секунду на обычном 700 МГц Intel Pentium III . Он также надежен, достигая высокой точности и полноты .
Хотя точность у него ниже, чем у более современных методов, таких как сверточная нейронная сеть , его эффективность и компактный размер (всего около 50 тыс. параметров по сравнению с миллионами параметров для типичной CNN, такой как DeepFace ) означают, что он по-прежнему используется в случаях с ограниченной вычислительной мощностью. Например, в оригинальной статье [1] сообщалось, что этот детектор лиц может работать на Compaq iPAQ со скоростью 2 кадра в секунду (это устройство имеет маломощный StrongARM без оборудования с плавающей точкой).
Распознавание лиц — это задача бинарной классификации в сочетании с задачей локализации: по заданной фотографии нужно решить, содержит ли она лица, и построить ограничивающие рамки для лиц.
Чтобы сделать задачу более выполнимой, алгоритм Виолы-Джонса распознает только анфас (без окклюзии), фронтально (без поворота головы), в вертикальном положении (без поворота), хорошо освещенные, полноразмерные (занимающие большую часть кадра) лица на изображениях с фиксированным разрешением.
Ограничения не столь строги, как кажутся, поскольку можно нормализовать изображение, приблизив его к требованиям Виолы-Джонса.
Требование «фронтальности» не подлежит обсуждению, поскольку на изображении нет простого преобразования, которое может превратить лицо из вида сбоку в вид спереди. Однако можно обучить несколько классификаторов Виолы-Джонса, по одному для каждого угла: один для вида спереди, один для вида в 3/4, один для вида в профиль, еще несколько для углов между ними. Затем можно во время выполнения выполнять все эти классификаторы параллельно для обнаружения лиц под разными углами обзора.
Требование «полного обзора» также не подлежит обсуждению и не может быть удовлетворено просто обучением большего количества классификаторов Виолы-Джонса, поскольку существует слишком много возможных способов скрыть лицо.
Полное представление алгоритма находится в [3] .
Рассмотрим изображение фиксированного разрешения . Наша задача — принять бинарное решение: является ли это фотографией стандартизированного лица (анфас, хорошо освещенного и т. д.) или нет.
Виола-Джонс по сути является усиленным алгоритмом обучения признаков , обученным путем запуска модифицированного алгоритма AdaBoost на классификаторах признаков Хаара для поиска последовательности классификаторов . Классификаторы признаков Хаара грубы, но позволяют очень быстро вычислять, а модифицированный AdaBoost создает сильный классификатор из многих слабых.
Во время выполнения заданное изображение проверяется последовательно. Если в какой-либо момент, алгоритм немедленно возвращает «лицо не обнаружено». Если все классификаторы возвращают 1, то алгоритм возвращает «лицо обнаружено». По этой причине классификатор Виолы-Джонса также называют «каскадным классификатором Хаара».
Рассмотрим персептрон, определяемый двумя переменными . Он принимает изображение фиксированного разрешения и возвращает
Классификатор признаков Хаара — это персептрон с очень специальным видом , который делает его чрезвычайно дешевым для вычисления. А именно, если мы выпишем матрицу , мы обнаружим, что она принимает только три возможных значения , и если мы раскрасим матрицу белым на , черным на и прозрачным на , матрица будет в одном из 5 возможных узоров, показанных справа.
Каждый шаблон также должен быть симметричен относительно x-отражения и y-отражения (игнорируя изменение цвета), так, например, для горизонтальной бело-черной детали два прямоугольника должны быть одинаковой ширины. Для вертикальной бело-черно-белой детали белые прямоугольники должны быть одинаковой высоты, но ограничений на высоту черного прямоугольника нет.
Функции Хаара, используемые в алгоритме Виолы-Джонса, являются подмножеством более общих базисных функций Хаара , которые ранее применялись в области обнаружения объектов на основе изображений. [4]
Хотя характеристики Хаара и грубы по сравнению с альтернативами, такими как управляемые фильтры , они достаточно сложны, чтобы соответствовать характеристикам типичных человеческих лиц. Например:
Состав свойств, формирующих соответствующие черты лица:
Кроме того, конструкция признаков Хаара позволяет проводить эффективные вычисления, используя только постоянное число сложений и вычитаний, независимо от размера прямоугольных признаков, используя таблицу суммированных площадей .
Выберите разрешение для изображений, которые нужно классифицировать. В оригинальной статье рекомендовалось .
Соберите обучающий набор, некоторые из которых содержат лица, а другие не содержат лиц. Выполните определенное модифицированное обучение AdaBoost на наборе всех классификаторов признаков Хаара размерности , пока не будет достигнут желаемый уровень точности и полноты. Модифицированный алгоритм AdaBoost выведет последовательность классификаторов признаков Хаара .
Подробности модифицированного алгоритма AdaBoost приведены ниже.
Чтобы использовать классификатор Виолы-Джонса с изображением , вычисляйте последовательно. Если в какой-либо точке , алгоритм немедленно возвращает «лицо не обнаружено». Если все классификаторы возвращают 1, то алгоритм возвращает «лицо обнаружено».
Однако скорость, с которой могут быть оценены признаки, не компенсирует их количество. Например, в стандартном подокне размером 24x24 пикселя существует всего M = 162336 [5] возможных признаков, и было бы непозволительно дорого оценивать их все при тестировании изображения. Таким образом, фреймворк обнаружения объектов использует вариант алгоритма обучения AdaBoost как для выбора лучших признаков, так и для обучения классификаторов, которые их используют. Этот алгоритм создает «сильный» классификатор как линейную комбинацию взвешенных простых «слабых» классификаторов.
Каждый слабый классификатор представляет собой пороговую функцию, основанную на признаке .
В процессе обучения определяются пороговое значение и полярность , а также коэффициенты .
Ниже представлена упрощенная версия алгоритма обучения: [6]
Вход: Набор из N положительных и отрицательных обучающих изображений с их метками . Если изображение i является лицом , если нет .
В каскадировании каждый этап состоит из сильного классификатора. Таким образом, все признаки группируются в несколько этапов, где каждый этап имеет определенное количество признаков.
Задача каждого этапа — определить, является ли данное подокно определенно не лицом или может быть лицом. Данное подокно немедленно отбрасывается как не лицо, если оно терпит неудачу на любом из этапов.
Ниже приведена простая структура каскадного обучения:
F(0) = 1,0; D(0) = 1,0; i = 0пока F(i) > Fцелевое увеличение i n(i) = 0; F(i) = F(i-1) пока F(i) > f × F(i-1) увеличивают n(i) используйте P и N для обучения классификатора с n(i) признаками с помощью AdaBoost Оценить текущий каскадный классификатор на проверочном наборе для определения F(i) и D(i) уменьшать пороговое значение для i-го классификатора (т.е. сколько слабых классификаторов необходимо принять, чтобы сильный классификатор принял) , пока текущий каскадный классификатор не будет иметь скорость обнаружения не менее d × D(i-1) (это также влияет на F(i)) Н = ∅ если F(i) > Ftarget тогда оценить текущий каскадный детектор на наборе изображений, не содержащих лица и поместить все ложные обнаружения в набор N.
Каскадная архитектура имеет интересные последствия для производительности отдельных классификаторов. Поскольку активация каждого классификатора полностью зависит от поведения его предшественника, частота ложных срабатываний для всего каскада составляет:
Аналогично, показатель обнаружения составляет:
Таким образом, чтобы соответствовать ложноположительным показателям, обычно достигаемым другими детекторами, каждый классификатор может обойтись без удивительно низкой производительности. Например, для 32-ступенчатого каскада, чтобы достичь ложноположительного показателя 10−6 , каждому классификатору необходимо достичь только ложноположительного уровня около 65%. В то же время, однако, каждый классификатор должен быть исключительно способным, если он хочет достичь адекватных уровней обнаружения. Например, чтобы достичь уровня обнаружения около 90%, каждый классификатор в вышеупомянутом каскаде должен достичь уровня обнаружения около 99,7%. [8]
В видеороликах с движущимися объектами не нужно применять обнаружение объектов к каждому кадру. Вместо этого можно использовать алгоритмы отслеживания, такие как алгоритм KLT, для обнаружения заметных особенностей в пределах ограничивающих рамок обнаружения и отслеживания их перемещения между кадрами. Это не только повышает скорость отслеживания, устраняя необходимость повторного обнаружения объектов в каждом кадре, но и повышает надежность, поскольку заметные особенности более устойчивы к вращению и фотометрическим изменениям, чем структура обнаружения Виолы-Джонса. [9]
cvHaarDetectObjects()
.