内容简介:(本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2,opencv-python 3.4.2)有两个重要的概念需要澄清一下:人脸检测:是指检测图像或视频中是否存在人脸,以及定位人脸的具体位置,人脸识别:确定图像或视频中的人脸是张三还是李四还是其他某人。故而人脸检测是人脸识别的基础和前提条件。在这一章我们来学习如何用OpenCV构建人脸检测器,鼻子检测器和眼睛检测器。
(本文所使用的 Python 库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2,opencv-python 3.4.2)
有两个重要的概念需要澄清一下:人脸检测:是指检测图像或视频中是否存在人脸,以及定位人脸的具体位置,人脸识别:确定图像或视频中的人脸是张三还是李四还是其他某人。故而人脸检测是人脸识别的基础和前提条件。
在这一章我们来学习如何用OpenCV构建人脸检测器,鼻子检测器和眼睛检测器。
1. 构建人脸检测器
前面提到过,人脸检测器是确定图像中人脸位置的过程,我们将用Haar级联来构建人脸检测器。Haar级联通过在多个尺度上从图像中提取大量的简单特征来实现,这些简单特征包括有边,角,线,矩形特征等,然后通过创建一系列简单的分类器来做训练。
Haar级联是一个基于Haar特征的级联分类器,所谓级联分类器,是把多个弱分类器串联成一个强分类器的过程,弱分类器是指性能受限,预测准确度不太高的分类器,所以此处的串联实际上就是机器学习中的Boost方法,即集成方法。所以Haar分类器 = Haar-like特征 + 积分图方法 + AdaBoost + 级联。关于Haar-like特征和积分图的概念,可以参考博文: 浅析人脸检测之Haar分类器方法 .
1.1 对单张图片进行人脸检测
# 构建单张图片的人脸检测器
def img_face_detector(img_path,face_cascade_file):
image=cv2.imread(img_path)
face_cascade=cv2.CascadeClassifier(face_cascade_file)
if face_cascade.empty():
raise IOError('Unable to load the face cascade classifier xml file!')
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
face_rects=face_cascade.detectMultiScale(gray,1.3,5)
# 在检测到的脸部周围画矩形框
for (x,y,w,h) in face_rects:
cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),3)
return image
复制代码
# 测试一下这个人脸检测器:
image1=img_face_detector('E:\PyProjects\DataSet\FireAI/face1.jpg',
'E:\PyProjects\DataSet\FireAI\cascade_files/haarcascade_frontalface_alt.xml')
image1=cv2.cvtColor(image1,cv2.COLOR_BGR2RGB)
plt.imshow(image1)
复制代码
通过对下面几张图片进行人脸检测,得到的结果分别为:
1.2 对视频流进行人脸检测
视频流的本质其实就是图片,将图片按照一定的每秒帧率fps播放出来即可。故而我们在对视频进行分析时,需要从视频流中捕获图片,对图片进行分析。
# 对视频流进行人脸检测
def video_face_detector(face_cascade_file):
face_cascade=cv2.CascadeClassifier(face_cascade_file)
if face_cascade.empty():
raise IOError('Unable to load the face cascade classifier xml file!')
capture=cv2.VideoCapture(0)
while True:
_,frame=capture.read() # 捕获当前帧
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
face_rects=face_cascade.detectMultiScale(gray,1.3,5)
# 在检测到的脸部周围画矩形框
for (x,y,w,h) in face_rects:
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),3)
cv2.imshow('Video Face Detector', frame)
key=cv2.waitKey(1) # 按ESC退出检测
if key==27:
break
capture.release()
cv2.destroyAllWindows()
复制代码
2. 构建鼻子检测器
2.1 对单张图片进行鼻子检测
# 构建单张图片的鼻子检测器
def img_nose_detector(img_path,face_cascade_file,nose_cascade_file,show_face=True):
image=cv2.imread(img_path)
face_cascade=cv2.CascadeClassifier(face_cascade_file)
if face_cascade.empty():
raise IOError('Unable to load the face cascade classifier xml file!')
nose_cascade=cv2.CascadeClassifier(nose_cascade_file)
if nose_cascade.empty():
raise IOError('Unable to load the nose cascade classifier xml file!')
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
face_rects=face_cascade.detectMultiScale(gray,1.3,5)
# 在检测到的脸部周围画矩形框
for (x,y,w,h) in face_rects:
if show_face: cv2.rectangle(image,(x,y),(x+w,y+h),(0,0,255),3)
roi=gray[y:y+h,x:x+w]
nose_rects=nose_cascade.detectMultiScale(roi,1.3,5)
for (x_nose,y_nose,w_nose,h_nose) in nose_rects:
cv2.rectangle(image,(x+x_nose,y+y_nose),(x+x_nose+w_nose,y+y_nose+h_nose),
(0,255,0),3)
break # 一张脸上只能有一个鼻子,故而此处break
return image
复制代码
2.2 对视频流进行鼻子检测
同样的,对视频流进行鼻子检测的代码为:
# 对视频流进行鼻子检测
def video_nose_detector(face_cascade_file,nose_cascade_file):
face_cascade=cv2.CascadeClassifier(face_cascade_file)
if face_cascade.empty():
raise IOError('Unable to load the face cascade classifier xml file!')
nose_cascade=cv2.CascadeClassifier(nose_cascade_file)
if nose_cascade.empty():
raise IOError('Unable to load the nose cascade classifier xml file!')
capture=cv2.VideoCapture(0)
while True:
_,frame=capture.read() # 捕获当前帧
gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
face_rects=face_cascade.detectMultiScale(gray)
# 在检测到的脸部周围画矩形框
for (x,y,w,h) in face_rects:
cv2.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),3)
roi=gray[y:y+h,x:x+w]
nose_rects=nose_cascade.detectMultiScale(roi,1.3,5)
for (x_nose,y_nose,w_nose,h_nose) in nose_rects:
cv2.rectangle(frame,(x+x_nose,y+y_nose),(x+x_nose+w_nose,y+y_nose+h_nose),
(0,255,0),3)
break # 一张脸上只能有一个鼻子,故而此处break
cv2.imshow('Video Face Detector', frame)
key=cv2.waitKey(1) # 按ESC退出检测
if key==27:
break
capture.release()
cv2.destroyAllWindows()
复制代码
同样的,可以构建对单张图片和视频流的眼睛检测器,具体代码可以看( 我的github )
当然,还可以建立函数同时对鼻子和眼睛进行检测,只需要对原来的鼻子检测函数做少许修改即可。
########################小**********结###############################
1,此处使用Haar级联构建了人脸,鼻子,眼睛检测器,能够很好的检测到图片,视频流中的各个结构信息。
2,从结果上可以看出,虽然能够有效检测,但是还有些人脸或鼻子,眼睛等难以被检测到,此时可能要调整检测函数detectMultiScale()的参数,如果调整参数仍然不理想,就需要修改特征检测级联文件cascade_file这个xml了。
#################################################################
注:本部分代码已经全部上传到( 我的github )上,欢迎下载。
参考资料:
1, Python机器学习经典实例,Prateek Joshi著,陶俊杰,陈小莉译
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- InsightFace 力作:RetinaFace 单阶段人脸检测器
- FaceBoxes:官方开源 CPU 实时高精度人脸检测器
- 向「假脸」说 No:用OpenCV搭建活体检测器
- MIT团队:开发自动化假新闻检测器|技术前沿洞察
- CVPR 2019 | 天秤座R-CNN:全面平衡的目标检测器
- CVPR 2018|Cascade R-CNN:向高精度目标检测器迈进
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
500 Lines or Less
Amy Brown、Michael DiBernardo / 2016-6-28 / USD 35.00
This book provides you with the chance to study how 26 experienced programmers think when they are building something new. The programs you will read about in this book were all written from scratch t......一起来看看 《500 Lines or Less》 这本书的介绍吧!