0.教学资源
以下是本节课的微课,配合文档学习效果更佳喔。
人脸识别和Haar特征.pptx
1.课前导入
1.1人脸识别是什么?
人脸识别用摄像头和电脑对图像进行分析,从而提取出人脸特征,检测并跟踪人脸的过程。它可以具体运用在相机中的人脸识别对焦、手机中的人脸解锁以及便利店常用的人脸识别支付等等。
图1.人脸识别示意图
2.知识准备
2.1人脸识别的步骤
我们本节课学习的是用Haar特征实现人脸识别,它的步骤就一句话:将图像进行预处理之后,通过Haar级联强分类器,即可识别人脸和非人脸。
但是,这Haar、级联、和强分类器究竟是什么意思呢?这就是我们今天的课程重点。
2.2Haar特征
曾经科学家想要进行人脸识别,需要对图像的逐个像素进行分析,这样的识别正确率很低,而且速度很慢。科学家通过观察脸部特征(人脸的眼部比周围的皮肤黑,鼻子比周围皮肤亮等),提出可以运用Haar特征对人脸的特点进行提取。如果一张图像中有Haar特征点,那么它可能是人脸。
其实人的视觉过程也是这样的,图像一开始进入我们的视野中,首先大脑皮层感知到的是许多像素点,这些像素点被传到下一个大脑皮层再被识别成边缘、细节最后被辨别出来。这是日本科学家福岛邦彦提出来的神经认知模型。
图2.Haar特征以及识别示意图
2.3强分类器和弱分类器
强分类器:能够准确判断识别结果的分类器;弱分类器:识别结果易错的分类器。
上面说到,如果一张图像中存在Haar特征点,那么这张图像可能是人脸。所以单单一个Haar特征点是无法区别人脸和非人脸的,做人脸识别需要非常多个Haar特征点共同判断。
弱分类器在这个例子里指的就是单个Haar特征,它分类人脸和非人脸的能力很弱。而强分类器就是一大群Haar特征点共同判断,它能准确的区分人脸和非人脸。
所以强分类器可以由许多弱分类器组成。
2.4级联(Cascade)
一张图片的大部分区域往往不是人脸,如果对图片的每一个角落都通过分类器检测,那会耗费大量的资源。
我们可以通过级联,把分类过程分成几个阶段,在第一个阶段淘汰掉大部分不是人脸的区域,着重分析可能是人脸的区域。这样能大大的加快识别速度。
图3.级联分类器工作流程
2.5Haar级联分类器相关代码(HaarCascade)
face_cascade = image.HaarCascade("frontalface", stages=25)
while (True):
img = sensor.snapshot()
objects = img.find_features(face_cascade, threshold=0.75, scale=1.35)
1/使用image.HaarCascade启用Haar级联分类器;”frontalface”:指的是运用前脸识别模式,也可以用”eye”(眼部识别);stages值可应用于调整识别速度,stages越小,识别速度越快,但越不准确。
2/find_features中第一个参数是HaarCascade对象,也就是前面创建的face_cascade,threshold和stages的功能相同。scale指的是识别到的人脸的大小,这个值不能小于1,在1.35~1.5的时候效果最佳。
3.完整代码
import sensor, image
# 重置感光元件
sensor.reset()
# 感光元件设置
sensor.set_contrast(3)
sensor.set_gainceiling(16)
# HQVGA and GRAYSCALE are the best for face tracking.
# HQVGA和灰度对于人脸识别效果最好
sensor.set_framesize(sensor.HQVGA)
sensor.set_pixformat(sensor.GRAYSCALE)
#注意人脸识别只能用灰度图
# 加载Haar级联分类器
# 默认情况下,这将使用所有阶段,更低的satges更快,但不太准确。
face_cascade = image.HaarCascade("frontalface", stages=25)
#“frontalface” 是人脸模型,可以换成“eye”人眼模型。
print(face_cascade)
while (True):
# 将摄像头拍到的 赋值给img
img = sensor.snapshot()
# Find objects.
# Scale值越小,能监测到的人脸越小.
# threshold越低,识别速度越快但错误率会上升.
objects = img.find_features(face_cascade, threshold=0.75, scale=1.35)
#在找到的目标上画框,标记出来
for r in objects:
img.draw_rectangle(r)