使用哈尔特征级联分类器识别人脸

哈尔特征级联分类器介绍

基于哈尔特征级联分类器的目标检测是Paul Viola和 Michael Jones提出的一种有效的目标检测方法,他们在2001年发表“使用快速级联的简单特征进行快速目标检测”论文。它是一种基于机器学习的方法,从许多正面和负面图像中训练级联函数。这种方法经常用来检测在图像中的物体。
在这里,我们将用于人脸检测。最初,该算法需要大量正面图像(人脸图像)和负面图像(没有人脸的图像)来训练分类器。然后我们需要从中提取特征。为此,Haar特征如下图所示。他们就像我们的卷积核。每个特征是一个单一的值,减去黑矩形下的像素和在白色矩形像素的总和。
QQ20171006-105255@2x
现在所有可能的尺寸和位置的每个内核是用来计算很多特征。(想象一下需要多少计算?一个24×24的窗口结果超过160000的特征)。对于每个特征计算,我们需要找到和白色和黑色矩形的像素。为了解决这个问题,他们推出了积分图像。它简化了像素总和的计算,像素的数目有多大,仅涉及四像素的运算。很好,不是吗?它使计算变得超快。
但是在所有这些功能我们计算,他们中的大多数都是无关紧要的。例如,考虑下面的图像。顶行显示两个好的特性。选择的第一个特征似乎集中在眼睛区域通常比鼻子和脸颊区域更黑暗的属性上。第二个特征取决于眼睛比鼻梁更暗的属性。但是在脸颊或任何其他地方使用相同的Windows是无关紧要的。那么我们如何选择最好的功能在160000 +的特点?它是通过AdaBoost实现的。
QQ20171006-105308@2x
为此,我们将每个特征应用于所有的训练图像。对于每一个特征,找到最佳阈值,将分类脸的正面和负面的。但很明显,会有误差或错误分类。我们选择具有最小错误率的特征,这意味着它们是对人脸和非人脸图像进行最佳分类的特征。(这个过程不简单,每幅图像都是在开始的时候给予相等的重量。每次分类之后,错误分类图像权重增加。然后再次执行相同的过程。计算出新的错误率和新权重。过程持续进行,直到找到所需的精度或错误率或找到所需的特征数量)。
最终的分类器是这些弱分类器的加权总和。它被称为弱,因为它不能单独对图像分类,但与这些弱分类器联合形成一个强大的分类。论文说,即使200个特征可以提供95%准确检测。他们的最终设置大约有6000个特征。(想象一下160000 +特征6000特征降低。那是一大收获)。
现在你拿一个图片。把每个24×24的窗口。向它应用6000个特性。检查它是不是脸。真的..真的..这是不是一个低效和浪费时间办法吗?是的。作者有一个很好的解决方案。
在一个图像中,图像的大部分区域是非人脸区域。因此,一个更好的主意是用一个简单的方法检查是否人脸区域。如果不是一次性扔掉,不要再处理它了。聚焦有脸区域。这样,我们可以花更多的时间来检查可能的人脸区域。
为此他们介绍了级联分类器的概念。不要将所有6000个特性应用于窗口,而是将这些特性分组到不同的分类器阶段,并逐一应用。(通常前几个阶段将包含非常少的特点)。如果一个窗口失败的第一阶段,抛弃它。我们不考虑它的剩余特征。如果通过,将特色的第二阶段和持续的过程。通过各个阶段的窗口是人脸区域。计划怎么样?!!!
作者侦测有6000个特征,38个阶段,1, 10, 25个、25个和50个特征。(上图中的两个特点是得到最好的两个特征从Adaboost)。根据作者,平均10特点6000 +评估每个子窗口。
所以这是一个简单的直观的解释,Viola Jones是如何面对的检测工作。阅读更多细节或额外的资源部分参考文献。

Haar-cascade Detection in OpenCV

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import numpy as np
import cv2

import argparse

ap = argparse.ArgumentParser()
ap.add_argument(“-i”, “–image”, required=True,
help=”path to the input image”)
args = vars(ap.parse_args())

#读取待识别的图片并转化灰色
img = cv2.imread(args[“image”])
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#初始化正面人脸分类器和人眼分类器
face_cascade = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)
eye_cascade = cv2.CascadeClassifier(‘haarcascade_eye.xml’)
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
    #识别到人脸区域画出矩形框
    cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
    eyes = eye_cascade.detectMultiScale(roi_gray)
    for (ex,ey,ew,eh) in eyes:
        #识别到人脸眼部画出矩形框
        cv2.rectangle(roi_color,(ex,ey),(ex+ew,ey+eh),(0,255,0),2)
cv2.imshow(‘img’,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
QQ20171006-105401@2x
参考资料:OpenCV官网文档

推荐文章

沪公网安备 31010702002009号