Обучение каскадов Хаара

ИНФОРМАТИКА

Вестник Сыктывкарского университета. Серия 1: Математика. Механика. Информатика. Выпуск 1 (22). 2017

УДК 004.93

ОБУЧЕНИЕ КАСКАДОВ ХААРА Е. А. Белых

Данная статья посвящена каскадам Хаара и базируется на статье Viola P., Jones M. «Rapid Object Detection using a Boosted Cascade of Simple Features». Здесь описаны некоторые тонкости обучения каскадов, которые не были описаны в оригинальной статье. В частности, это метод перебора порогов слабых классификаторов, а также оптимизированный метод построения каскада классификаторов.

Ключевые слова: распознавание образов, машинное обучение, классификация, обработка изображений.

1. Введение

Обученный каскад Хаара [1], принимая на вход изображение, определяет, есть ли на нем искомый объект, т. е. выполняет задачу классификации, разделяя входные данные на два класса (есть искомый объект, нет искомого объекта).

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

© Белых Е. А., 2017.

2. Признаки Хаара

Признак Хаара является набором прямоугольных областей изображения, примыкающих друг к другу и разделенных на две группы. Возможных признаков Хаара огромное множество (разнообразные комбинации областей разной ширины и высоты с разными позициями на изображении). Первоначальный набор признаков зависит от реализации и конкретной задачи.

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

У а, -1 ха. +-та. -1 Уъ.. +ьъ. -1 хь. +тъ. -1

a = Y1 Y1 vjk' bi = Y1 Y1 vjk'

j = yai k=xa. j=yb.. k=xb.

Na Nb

h(u) = ^2 ai bi,

i=l i=l

где Vjk — яркость пикселя с координатами [j,k], ai — сумма яркостей пикселей в i-й области первой группы, bi — сумма яркостей пикселей в i-й области второй группы, h — значение признака Хаара для этого изображения, hai, wai, hbi и Wbi — высота и ширина i-х областей первой и второй групп соответственно, yai и xai, ybi и Xbi — смещения по оси y и x i-х областей первой и второй групп, а Na и Nb — количество областей в первой и второй группах.

3. Алгоритм AdaBoost

Для выбора признаков, лучше всего классифицирующих изображения, используется алгоритм AdaBoost (adaptive boosting). Этот алгоритм предложили Йовав Фройнд (Yoav Freund) и Роберт Шапир (Robert E. Schapire) [2]. Данный алгоритм построен на идее, что из большого числа простых способов классификации (называемых слабыми классификаторами ) можно составить новый способ, выполняющий эту задачу намного эффективнее.

Слабый классификатор — это функция, которая принимает на вход изображение, вычисляет значение соответствующего ей признака Хаара для этого изображения и сравнивает это значение с порогом, возвращая либо 0, либо 1.

hi

0, иначе,

где вг — порог, х — входное изображение, /¿(ж) — значение соответствующего признака Хаара для изображения х, рг — направление знака неравенства, а кг(х) — слабый классификатор.

Данный алгоритм перебирает все возможные слабые классификаторы и выбирает те, которые допускают меньше всего ошибок. После выбора очередного слабого классификатора веса перераспределяются так, что неверно классифицированные изображения начинают сильнее влиять на значение ошибки. Ниже приведем полный алгоритм.

Входные данные:

кг — г-й признак Хаара (из всех возможных); Ег — г-й обучающий пример;

уг — 0, если г-й обучающий пример отрицательный, и 1, если г-й обучающий пример положительный;

п — количество обучающих примеров.

Переменные:

/шг — вес, соответствующий г-му обучающему примеру;

вг и рг — порог и направление знака неравенства для г-го признака Хаара, дающие наименьшую ошибку;

е(кг) — ошибка г-го слабого классификатора;

к г — слабый классификатор, выбранный на г-й итерации;

в — минимальное значение ошибки слабого классификатора на г-й итерации, представленное в другой форме (для оптимизации вычислений и экономии места на бумаге).

Выходные данные (результат): 1. Инициализировать веса обучающих примеров: /шг, кг, вг.

где т — число отрицательных примеров, а I — число положительных примеров.

если уг = 0, если уг = 1,

2. Для г = 1,...,С:

(a) Нормализовать веса обучающих примеров:

Щ = ™-•

(b) Найти для каждого признака Хаара такие параметры, чтобы слабый классификатор дал наименьшую ошибку:

1, pjhj(ж) <pj9j,

0, иначе

6

k=0

yk

минимальным.

(c) Найти классификатор с наименьшей ошибкой:

j I pnhn(x) < Pn@n, \ . /7. \ /гЛ

ht = < Л ; = min 6

0, иначе,

где n — номер слабого классификатора, дающего наименьшую ошибку.

(d) Обновить веса обучающих примеров:

et = £(ht) ;

1 - e

W = wiet1-|h t(Ei)-yi|.

3. Итоговый сильный классификатор:

H

0, иначе.

Полученный сильный классификатор уже способен выполнять задачу классификации, хоть и очень медленно. Значение a = log в- далее

Pi

будет рассматриваться как «коэффициент i-го слабого классификатора».

Рис. 1. Значения признака Хаара

Рис. 2. Отсортированные значения признака Хаара

4. Вычисление порога слабого классификатора

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

Если предположить, что веса всех обучающих примеров равны, то порог должен разделять плохие и хорошие примеры по значению признака Хаара таким образом, чтобы с одной стороны было как можно больше хороших, а с другой — как можно больше плохих (с какой стороны должны быть какие примеры, определяет направление знака неравенства). Но так как веса обычно разные, то задачу надо изменить так: сумма весов примеров, находящихся не по ту сторону порога, по которую им следует находиться, должна быть минимальной.

На рис. 1 изображены значения одного признака Хаара для разных обучающих примеров: по горизонтальной оси расположены номера обучающих примеров, по вертикальной — значения признака Хаара для соответствующих обучающих примеров. Закрашенные кружки — значение признака Хаара для хороших примеров, незакрашенные кружки — для плохих. Горизонтальная линия на графике — один из возможных порогов.

Отсортировав обучающие примеры по их значению признака Хаара, можно получить картинку, как на рис. 2. Теперь можно заметить, что все пороги, находящиеся между двумя соседними точками на отсортированном графике, дают одинаковые результаты. Следовательно, чтобы получить наименьшую возможную ошибку, достаточно проверить только п — 1 порогов, где п — количество обучающих примеров,

беря как значение порога, например, среднее между двумя соседними отсортированными значениями признака Хаара.

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

К счастью, есть способ вычислять ошибку слабого классификатора, не выполняя столько операций суммирования. Для этого можно использовать трюк, очень похожий на интегральную форму представления изображения:

к — признак Хаара, для которого ищется порог;

Ег — 1-й обучающий пример;

уг — 0, если 1-й обучающий пример отрицательный, и 1, если

1-й обучающий пример положительный;

п — количество обучающих примеров;

— вес, соответствующий г-му обучающему примеру; и- — дополнительные массивы;

0 — порог, проверяемый на текущей итерации;

е — ошибка на текущей итерации;

е — наименьшая полученная ошибка, изначально равна 1;

0 и р — значение порога и направление знака неравенства,

при которых была получена наименьшая ошибка.

1. Отсортировать обучающие примеры. Веса и элементы массива У расположить в таком же порядке, как и отсортированные примеры (т. е. чтобы каждому примеру после сортировки соответствовал тот же вес и элемент из У, что и до сортировки).

2. Сделать два дополнительных массива, в первом массиве г-й элемент содержит сумму весов хороших примеров до г-го значения, а во втором — плохих:

ии^, если у^ = 1, 0, если у^ = 0;

ии^, если Уз = 0, 0, если уз = 1.

(с) Если ошибка проверяемого порога меньше текущей минимальной ошибки, запомнить этот порог, ошибку и направление знака неравенства:

(е) Если ошибка проверяемого порога меньше текущей минимальной ошибки, запомнить этот порог, ошибку и направление знака неравенства:

5. Каскад классификаторов

Если уменьшать значение порога сильного классификатора, уменьшается количество ложных негативных срабатываний (неверно классифицированных хороших примеров) и увеличивается количество ложных позитивных (неверно классифицированных плохих примеров). Таким образом, даже если сильный классификатор состоит из малого количества слабых классификаторов, понижая порог ценой большего числа ложных позитивных срабатываний, можно свести к минимуму количество ложных негативных.

Используя это свойство, из найденных слабых классификаторов можно составить каскад, являющийся набором сильных классификаторов (называемых стадиями), через которые последовательно проходит проверяемое изображение.

Ниже приведен алгоритм, описанный в статье Пола Виолы и Майкла Джонса.

если е < е, тогда е = е,0 = 0,р = 1.

(ё) Посчитать ошибку для р = — 1:

+ 1 - -е = + ип — иг-1.

если е < е, тогда е = е, 0 = 0, р = —1.

С — число доступных слабых классификаторов; Сг — число слабых классификаторов на г-й стадии; вг — порог на г-й стадии; в — номер текущей стадии; ф — заданное наперед значение;

Рг и N — доля ложных позитивных и ложных негативных срабатываний г-й стадии соответственно;

аг — коэффициент г-го слабого классификатора.

1. Установить текущей стадией первую, сделав число слабых классификаторов на ней равным 1:

в =1, С3 = 1.

2. Установить для текущей стадии такой порог, чтобы все положительные примеры классифицировались верно:

установить в3 такой, что N = 0.

3. Если доля ложных позитивных срабатываний текущей стадии больше ф, увеличить число слабых классификаторов на ней, в противном случае сделать текущей следующую стадию, установив на ней число слабых классификаторов равным числу слабых классификаторов предыдущей, увеличенному на 1:

если Р3 > ф, тогда С3 = С3 + 1, иначе в = в + 1, С3 = С3-1 + 1.

4. Если число слабых классификаторов на текущей стадии меньше числа доступных слабых классификаторов или доля ложных положительных срабатываний равна 0, перейти к пункту 2:

если С3 < С или Р3 = 0, перейти к пункту 2.

5. Вернуть стандартный порог последней стадии, если выход из цикла произошел из-за того, что закончились доступные слабые классификаторы:

1 Св

если Р3 > 0, тогда 03 = - ^^ аг.

г=1

6. Быстрое построение каскада

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

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

Для того чтобы применить этот метод, надо изменить условия, при которых порог считается наилучшим. Также следует учесть, что у порога сильного классификатора фиксированное направление знака неравенства (> ).

Для слабого классификатора порог считался наилучшим, если сумма весов неверно классифицированных примеров была минимальной. В сильных же классификаторах наилучший порог тот, при котором верно классифицируются все хорошие примеры, а также максимальное число отрицательных.

Значение, сравниваемое с порогом сильного классификатора, является суммой коэффициентов тех классификаторов, которые верно классифицировали входное изображение:

где С — число доступных слабых классификаторов, аг — коэффициент г-го слабого классификатора, Нг — г-й слабый классификатор, а Е — входное изображение.

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

Учитывая, что чем порог ниже, тем больше плохих примеров будет классифицировано неверно, условие стоит изменить так: порог должен быть меньше наименьшей среди всех таких сумм для хороших примеров на наименьшее возможное значение.

При таком условии, в отличие от порогов слабых классификаторов, не требуется ни сортировки, ни проверки выбранного порога. Теперь можно оптимизировать вычислениие сумм для хороших примеров. Для этого следует обратить внимание на тот факт, что при каждой новой итерации число слабых классификаторов на текущей стадии на 1 больше, чем на предыдущей. Тогда вместо того, чтобы каждый раз вычислять сумму заново, можно сделать дополнительный массив (для каждо-

С

г=1

го хорошего примера — соответствующий элемент массива) и при каждой итерации добавлять туда необходимые слагаемые. Ниже приведен алгоритм с учетом всех описанных оптимизаций:

C — число доступных слабых классификаторов; hi — i-й слабый классификатор; Ci — число слабых классификаторов на i-й стадии; Oi — порог на i-й стадии; s — номер текущей стадии; ф — заданное наперед значение;

Pi и Ni — доля ложных позитивных и ложных негативных срабатываний i-й стадии;

gi — i-й хороший пример;

ai — коэффициент i-го слабого классификатора;

Si — i-я ячейка дополнительного массива, соответствующая i-му хорошему примеру;

5 — минимальное возможное число, которое можно вычесть из уменьшаемого.

1. Задать каждому элементу дополнительного массива значение 0:

Si = 0.

2. Установить текущей стадией первую, сделав число слабых классификаторов на ней равным 1:

S = 1 (22) Cs = 1. 1 ^

3. Для всех хороших примеров: если последний классификатор текущей стадии классифицировал пример верно, прибавить коэффициент этого классификатора к значению в соответствующей примеру ячейке дополнительного массива:

Si = Si + h CS

4. Задать порогу текущей стадии значение, меньшее наименьшего элемента дополнительного массива на минимально возможное число:

0s = min

5. Если доля ложных позитивных срабатываний текущей стадии больше ф, увеличить число слабых классификаторов на ней, в противном случае сделать текущей следующую стадию, установив в ней число слабых классификаторов равным числу слабых классификаторов предыдущей, увеличенному на 1:

6. Если число слабых классификаторов на текущей стадии меньше числа доступных слабых классификаторов или доля ложных положительных срабатываний равна 0, перейти к пункту 2.

7. Вернуть стандартный порог последней стадии, если выход из цикла произошел из-за того, что закончились доступные слабые классификаторы:

7. Результаты

Алгоритм обучения, похожий на описанный выше, уже реализован в библиотеке ОреиСУ и неплохо справляется со своей задачей. Но, к сожалению, он имеет ряд недостатков.

Одним из недостатков каскадов Хаара в ОреиСУ является отсутствие прозрачности. Несмотря на то что исходный код библиотеки открытый, реализованный там алгоритм слишком сложен и при возникновении ошибок часто не дает информации, достаточной, чтобы их локализовать. Также в нем есть некоторые проблемы со стабильностью. К примеру, иногда возникает ошибка, при которой он попадает в бесконечный цикл.

Алгоритм обучения, описанный в данной статье, был реализован на компьютере в виде набора утилит для работы с каскадами Хаара.

Для обучения использовалось 500 хороших примеров, 3226 плохих примеров и 500 тестовых примеров. Итоговый каскад состоит из 2000 слабых классификаторов и 12 стадий. Размер окна был задан равным 56 х 12 пикселей. Обучение данного каскада заняло примерно сутки.

Данный каскад способен обнаруживать номера при ощутимых перспективных искажениях и повороте до 25 градусов. Проблемой для кас-

если Р3 > ф, тогда С3 = С3 + 1, иначе 5 = 5 + 1, С3 = С3-1 + 1.

г=1

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

Более серьезной проблемой являются ложные позитивные срабатывания на разные надписи, дорожные знаки и прочие объекты. Такие срабатывания происходят в 12,8% случаев, однако значительную их часть также можно выявить при последующей обработке.

Список литературы

1. Viola P., Jones M. Rapid Object Detection using a Boosted Cascade of Simple Features // 2013 IEEE Conference on Computer Vision and Pattern Recognition. 2001. Vol. 01. 511 p.

2. Freund Y., Schapire R. E. Decision-Theoretic Generalization of OnLine Learning and an Application to Boosting // Journal of computer and system sciences 55. 1997. №SS971504. Pp. 119-139.

СГУ им. Питирима Сорокина Поступила 02.02.2017

Summary

Belykh E. A. Teaching Haar cascade

This article describes Haar cascades and based on article by Paul Viola and Michael Jones. Here is described some features, that weren't decsribed in the original article. In particular, this is a weak classifier's threshold choosing and also optimized method of building the cascade of classifiers. Keywords: pattern recognition, machine learning, classification, image processing.

References

1. Viola P., Jones M. Rapid Object Detection using a Boosted Cascade of Simple Features, 2013 IEEE Conference on Computer Vision and Pattern Recognition, 2001, vol. 01, 511 p.

2. Freund Y., Schapire R. E. Decision-Theoretic Generalization of On-Line Learning and an Application to Boosting, Journal of computer and system sciences 55, 1997, №SS971504, pp. 119-139.

Для цитирования: Белых Е. А. Обучение каскадов Хаара // Вестник Сыктывкарского университета. Сер. 1: Математика. Механика. Информатика. 2017. Вып. 1 (22). C. 41-53.

For citation: Belykh E. A. Teaching Haar cascade, Bulletin of Syktyvkar University, Series 1: Mathematics. Mechanics. Informatics, 2017, №1 (22), pp. 41-53.