如何实现简单的人脸检测—基于Haar特征提取的Adaboost强化分类器实现
日期: 2020-02-22 分类: 个人收藏 358次阅读
如何实现简单的人脸检测—基于Haar特征提取的Adaboost强化分类器实现
分类器的测试结果:
Ⅰ.背景知识了解:
1.什么是Haar特征提取?
Haar特征很简单,分为三类:边缘特征、线性特征、中心特征和对角线特征,组合成特征模板。特征模板内有白色和黑色两种矩形,并定义该模板的特征值为白色矩形像素和减去黑色矩形像素和。Haar特征值反映了图像的灰度变化情况。
缺点:==矩形特征只对一些简单的图形结构,如边缘、线段较敏感,所以只能描述特定走向(水平、垂直、对角)的结构。 ==
2.什么是Adaboost分类器?
Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这Adaboost些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。使用Adaboost分类器可以排除一些不必要的训练数据特征,并放在关键的训练数据上面。
Ⅱ.搭建步骤:
1.加载Adaboost官网的haarcascade_frontalface_default.xml和haarcascade_eye.xml文件(链接提取码:gr49)
# load xml
face_xml = cv2.CascadeClassifier('E:/DeepLearn/face Detection/xml/haarcascade_frontalface_default.xml')#面部检测
eye_xml = cv2.CascadeClassifier('E:/DeepLearn/face Detection/xml/haarcascade_eye.xml')#眼睛检测
2.加载本地图片路径
# load jpg
img = cv2.imread('E:/DeepLearn/21.jpg')
cv2.imshow('face', img)
3.颜色转换为灰度图
# haar gray
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 将原图转换为灰度图
==这里需要注意的是:使用haar的特征提取只能是灰度图。==
4.检测
# detect face
faces = face_xml.detectMultiScale(gray, 1.3, 5) # 灰度图数据+scale缩放比例+目标大小下限5像素
print('face=', len(faces))#打印图片中人脸的数目
5.绘图
对识别出的目标进行绘制矩形框,而未识别出人脸的图片则打印“No Detection”。
# draw
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]
# gray
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)
if len(faces) == 0:
font = cv2.FONT_HERSHEY_SCRIPT_SIMPLEX
cv2.putText(img, "No Detection", (100, 150), font, 1, (0, 0, 255), 2, cv2.LINE_AA)
# 图片+text+text的起始位置+字体+scale缩放+字体颜色值+线宽+风格
cv2.imshow('dat', img)
cv2.waitKey(0)
Ⅲ.测试与评估
我们选取了3张不同角度的美女人脸进行检测。
而测试的结果如下:
分析检测:
使用haar+Adaboost的人脸检测方法对角度要求较高,仅支持正脸检测,对图片的适应性较差,但是对初学者的上手学习还是比较友好的。
除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog
精华推荐