DNN人脸识别和微笑检测
目录
一.人脸识别
1.人脸识别原理
2. HARAL级联分类器代码实现
3.代码实现
①读取图片
②加载分类器
③检测人脸
④标注人脸及显示
二.微笑检测
1.微笑检测实现原理
2.代码实现
①加载分类器
②读取视频文件
③循环读取每一帧,作人脸检测
④循环提取每一帧图片中所有人脸位置,并对每一个人脸做笑脸检测
⑤提取笑脸的位置,并在原图上用矩形框画出,并显示文字
⑥显示结果
一.人脸识别
1.人脸识别原理
- 人脸识别需先进行人脸检测,定位人脸区域,再进行特征提取与比对以判断身份。
- 本次讲解的核心是使用OPEN CV中的哈尔级联分类器进行人脸检测。
- 分类器通过分析哈尔特征(如黑白区域对比值)和采用级联结构(分步判断,逐级淘汰)来高效检测人脸。
2. HARAL级联分类器代码实现
- 加载已存在的哈尔分类器XML文件,其路径固定在OpenCV源文件cv2库下的的data目录下。
- 利用
detectMultiScale()
方法进行检测,核心参数包括:scaleFactor
: 搜索窗口的缩放比例,用于扩大搜索范围以发现不同大小的人脸。minNeighbors
: 需要检测出的人脸特征阈值,是影响检测精确度的关键参数。minSize/maxSize
: 忽略过小或过大的人脸区域。
- 检测函数返回值为包含所有检测到的人脸坐标(左上角X, Y及宽高)的对象数组。
3.代码实现
①读取图片
并获取灰度图
import cv2
image=cv2.imread('img1.png')
image=cv2.resize(image,(800,500))
grey=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
②加载分类器
需要提前将xml文件复制到当前目录下
#加载分类器
faceCascade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
③检测人脸
detectMultiScale()方法会返回检测到的人脸的位置
faces=faceCascade.detectMultiScale(grey,scaleFactor=1.05,minNeighbors=10,minSize=(5,5))
print(f'发现{len(faces)}个人脸')
print(f'其位置分别是{faces}')
④标注人脸及显示
根据位置信息画出矩形框
#标注人脸及显示
for (x,y,w,h) in faces:cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow('result',image)
cv2.waitKey(0)
cv2.destroyAllWindows()
二.微笑检测
1.微笑检测实现原理
- “微笑检测”并非独立模型,而是基于“人脸识别”模型,再对检测到的人脸图片进行进一步分析。
- 实现流程主要包括:1) 使用前置模型加载人脸和微笑检测两套模型;2) 从视频流中捕获图像,并先通过人脸模型定位面部区域;3) 将检测到的人脸区域进行图像抠图处理;4) 在抠图后的单独胡脸上,应用“微笑”模型进行特征分析;5) 最后将结果绘制到原视频画面上,如框选口部并标注“smile”字符。
2.代码实现
①加载分类器
加载用于人脸识别和笑脸检测的xml文件
import cv2
faceCasecade=cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
smile=cv2.CascadeClassifier('haarcascade_smile.xml')
②读取视频文件
cap=cv2.VideoCapture('test4.mp4')
③循环读取每一帧,作人脸检测
while True:ret,image=cap.read()image=cv2.flip(image,1)#图片翻转,水平翻转(镜像)if not ret:breakgray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)faces=faceCasecade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=15,minSize=(5,5))#人脸检测
④循环提取每一帧图片中所有人脸位置,并对每一个人脸做笑脸检测
for (x,y,w,h) in faces:cv2.rectangle(image,(x,y),(x+w,y+h),(0,255,0),2)#提取人脸所在区域,单通道形式roi_gray_face=gray[y:y+h,x:x+w]cv2.imshow('lian',roi_gray_face)#微笑检测,仅在人脸区域内检测smiles=smile.detectMultiScale(roi_gray_face,scaleFactor=1.5,minNeighbors=18,minSize=(50,50))
⑤提取笑脸的位置,并在原图上用矩形框画出,并显示文字
注意这里的坐标要加上之前的x,y
for (sx,sy,sw,sh) in smiles:#绘制微笑区域a=x+sxb=y+sycv2.rectangle(image,(a,b),(a+sw,b+sh),(255,0,0),2)#显示文字cv2.putText(image,'smile',(x,y),cv2.FONT_HERSHEY_COMPLEX_SMALL,1,(0,255,0),2)
⑥显示结果
#显示结果cv2.imshow('dect',image)key=cv2.waitKey(25)if key==27:break