Компьютерное зрение — распознавание лиц (функция Хаара + классификатор Adaboost) (7)

машинное обучение искусственный интеллект алгоритм компьютерное зрение

1. Обзор принципа характеристик Хаара

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

Как показано выше, характеристики Хаара для изображений модулей A, B и D: v = сумма белого — сумма черного. Особенности изображения Хаара модуля C: v = сумма белого (слева) + сумма белого (справа) - 2 * сумма черного Необходимо следить за тем, чтобы количество пикселей в модуле белого прямоугольника было таким же, как количество пикселей в модуле черного прямоугольника, поэтому умножьте на 2

Для изображения, изменив размер и положение шаблона объекта, можно использовать большое количество объектов для представления изображения. Шаблон признака на рисунке выше называется «прототипом признака»; признак, полученный путем расширения (перемещения и масштабирования) прототипа признака в подокне изображения, называется «прямоугольный признак»; значение прямоугольного признака называется «признак ценность". Например, в изображении размером 24 * 24 вы можете вычислить функцию A на изображении выше с помощью прямоугольного шаблона, начиная с координат (0, 0) с шириной 20 и высотой 20. Вы также можете использовать координаты (0, 2), чтобы начать с прямоугольного шаблона шириной 20 и высотой 20. Чтобы вычислить особенности A на картинке выше, вы также можете начать с координат (0, 0) с шириной 22 и высота 22 для вычисления признаков A на изображении выше, так что значение прямоугольного признака меняется в зависимости от категории, размера и положения, делая очень маленькое Маленькие изображения содержат очень много прямоугольных признаков. Собственные значения прямоугольника являются функцией трех факторов: категории шаблона прямоугольника, местоположения прямоугольника и размера прямоугольника.

2. Классификатор AdaBoost

AdaBoost — типичный алгоритм Boosting, входящий в семейство Boosting. Прежде чем говорить об AdaBoost, давайте поговорим об алгоритме Boosting.
Алгоритм повышения — это процесс обновления «слабого алгоритма обучения» до «сильного алгоритма обучения». Вообще говоря, относительно легко найти слабый алгоритм обучения, а затем получить серию слабых классификаторов путем повторного обучения и объединить эти слабые классификаторы для получения сильного классификатора. Алгоритм бустинга состоит из двух частей: аддитивной модели и алгоритма прямого шага. Аддитивная модель означает, что сильный классификатор формируется путем линейного сложения ряда слабых классификаторов. Общая комбинация выглядит следующим образом:

Среди них h(x;am) — слабый классификатор, am — оптимальный параметр, изученный слабым классификатором, βm — доля слабого обучения в сильном классификаторе, а P — комбинация всех am и βm. Эти слабые классификаторы добавляются линейно, чтобы сформировать сильный классификатор.

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

Из-за различных используемых функций потерь алгоритм Boosting имеет разные типы.AdaBoost — это алгоритм Boosting, функция потерь которого представляет собой экспоненциальную потерю.

АдаБуст Принцип понимания Основываясь на понимании Boosting, для AdaBoost мы должны выяснить два момента:

В чем разница между слабым обучением h(x;am) каждой итерации и как его изучить? Как определить вес слабого классификатора βm? Для первого вопроса AdaBoost изменяет вес обучающих данных, то есть распределение вероятностей образцов, Идея состоит в том, чтобы сосредоточиться на неправильно классифицированных образцах и уменьшить веса правильно классифицированных образцов в предыдущем раунде, Увеличить веса этих неправильно классифицированных образцов. Затем он обучается на основе некоторых используемых базовых алгоритмов машинного обучения, таких как логистическая регрессия.

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

Пример объяснения

Для лучшего понимания возьмем пример.

Для следующих обучающих образцов нам нужно создать сильный классификатор для их классификации. x — функция, y — метка.

серийный номер 0 1 2 3 4 5 6 7 8 9 10
x 0 1 2 3 4 5 6 7 8 9 10
y 1 1 1 -1 -1 -1 1 1 1 -1

Пусть весовое распределение D1=(w1,1,w1,2,…,w1,10)

И предположим, что распределение веса в начале равномерное: w1, i=0.1, i=1,2,...,10

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

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

На втором этапе вычисляются коэффициенты (G1(x) в сильном классификаторе

Эта формула ставится здесь первой, а ее вывод будет сделан ниже.

Третий шаг обновляет распределение веса образцов для следующего раунда итеративного обучения. по формуле:

Получено новое распределение веса, которое изменяется от 0,1 до:

D2=(0.0715,0.0715,0.0715,0.0715,0.0715,0.0715,0.1666,0.1666,0.1666,0.0715)

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

Четвертый шаг получает сильный классификатор для первой итерации:

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

Частота ошибок классификации равна 0, и итерация заканчивается.

F(x)=sign(F3(x)) — последний сильный классификатор.

Поток алгоритма

Подводя итог, алгоритм AdaBoost получается:

Вход: обучающий набор данных

в,

Количество итераций M

1. Инициализируйте распределение веса обучающих выборок:

2. Для m=1,2,…,M
(a) Используйте обучающий набор данных с распределением веса Dm, чтобы научиться получать слабый классификатор Gm(x)
(b) Рассчитайте частоту ошибок классификации Gm(x) в обучающем наборе данных:

(c) Вычислите вес Gm(x) в сильном классификаторе:

(d) Обновите распределение веса набора обучающих данных (здесь zm — коэффициент нормализации, чтобы сделать распределение вероятностей суммы выборок равным 1):

3. Получить окончательный классификатор:

Вывод формулы

Теперь давайте разберемся, откуда берется приведенная выше формула.

Предполагая, что для получения Fm-1(x) было пройдено m−1 раундов итераций, согласно прямому шагу мы можем получить:

Мы уже знаем, что AdaBoost использует экспоненциальную потерю, из которой можно получить функцию потерь:

В этот момент известно Fm−1(x), и его можно продвигать вперед как константу:

в,

Стучите по доске! Это вес выборки для каждой итерации! Итеративное перераспределение зависит от предыдущего раунда.

Как вы думаете, этого недостаточно? Затем снова упростите:

Достаточно ли он похож сейчас? ок, продолжаем упрощать Loss:

После того, как формула деформируется, жареный цыпленок возбуждается!

Разве это не коэффициент ошибок классификации? ? ? ! перепиши это,

Итак, мы получили приведенную функцию потерь. Далее руководство.

Чтобы найти частную производную по αm, пусть

получить:

Оригинальная ссылка анализа AdaBoost: https://www.cnblogs.com/ScorpioLu/p/8295990.html

3. Примеры

detectMultiScale()

параметр

  • Изображение InputArray, изображение для обнаружения, обычно изображение в градациях серого для ускорения скорости обнаружения;
  • std::vector & objects, прямоугольная группа векторов кадра обнаруженного объекта; для вывода, например, матрица обнаружения лиц Mat
  • double scaleFactor, указывающий коэффициент масштабирования окна поиска в двух последовательных сканированиях. По умолчанию установлено значение 1.1, то есть окно поиска каждый раз расширяется на 10%; обычно установлено значение 1.1.
  • int minNeighbors указывает минимальное количество смежных прямоугольников, составляющих цель обнаружения (по умолчанию 3). Если количество маленьких прямоугольников, составляющих цель обнаружения, меньше min_neighbors - 1, то они будут исключены. Если min_neighbors равно 0, функция возвращает все проверенные прямоугольники-кандидаты, ничего не делая, Этот тип значения настройки обычно используется в определяемой пользователем комбинированной программе результатов испытаний;
  • int, либо используйте значение по умолчанию, либо используйте CV_HAAR_DO_CANNY_PRUNING, если установлено значение CV_HAAR_DO_CANNY_PRUNING, то функция будет использовать обнаружение ребер Канни для исключения областей со слишком большим или слишком малым количеством ребер, поэтому эти области обычно не являются областями, где расположены лица;
  • Размер minSize, минимальный размер, используемый для ограничения диапазона полученной целевой области.
  • Размер maxSize, максимальный размер, используемый для ограничения диапазона полученной целевой области.
import cv2
import numpy as np
face_xml = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
eye_xml = cv2.CascadeClassifier('haarcascade_eye.xml')
# 加载文件
# 文件来源:https://juejin.cn/post/6844903607335124999
img = cv2.imread('timg.jpg')
# 加载图片
cv2.imshow('src',img)
# 打印图片
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 进行灰色处理
faces = face_xml.detectMultiScale(gray,1.3,5)
# 检测出图片的人脸
print('face=',len(faces))
# 打印检测出了多少个人脸

for (x,y,w,h) in faces:
# 绘制每一个人脸
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    # 给人脸绘制矩形
    roi_face = gray[y:y+h,x:x+w]
    roi_color = img[y:y+h,x:x+w]
    # 识别人脸
    eyes = eye_xml.detectMultiScale(roi_face)
    # 识别眼睛
    print('eye=',len(eyes))
    # 打印检测出了多少个眼睛
    for (e_x,e_y,e_w,e_h) in eyes:
        cv2.rectangle(roi_color,(e_x,e_y),(e_x+e_w,e_y+e_h),(0,255,0),2)
        # 给眼睛绘制矩形
cv2.imshow('dst',img)
# 打印绘制后图片
cv2.waitKey(0)

Исходное изображение:

результат:

face= 4
eye= 2
eye= 2
eye= 1
eye= 2