1.前言
前几天唠了一些Python的基础知识,确实无聊,但是无聊归无聊确实有用.今天来搞点有趣的事情--利用计算机视觉实现人脸检测和识别.
计算机视觉是人工智能的一个重要分支.计算机视觉中的人脸识别现在是我们生活最常出现的功能,比如刷脸打卡,这是每个打工人上班必备.人脸识别门禁,身份验证等等.看过钢铁侠的童鞋是否还记得,钢铁侠初次飞行时.他的人工智能系统头盔中显示了道路上的车辆信息.包括车辆的品牌和车中的人物,当时我们把它当成科幻来看,其实在现实中我们利用计算机视觉技术完全可以做到,而且我们目前已在运用,比如停车场系统车辆自动识别闸机.人流量检测,还有我们的无人驾驶汽车,都在使用计算机视觉技术中的人物检测识别技术.在现实当中,计算机视觉技术的使用远不止如此.例如,军事导弹的巡航系统,交通道路的监控,医学影像的处理,机器人,还有目前最火的VR全息.是不是非常炫酷,计算机视觉涉及到的东西太多,太高深了.一篇文章道不尽,而且毕竟我也能力有限,本文仅从应用的角度来体验一下使用计算机视觉技术实现人脸识别
2.准备
2.1视觉库OpenCV
计算机视觉的学习离不开OpenCV.OpenCV是非常著名的视觉库,相信很多小伙伴都听说过它,英文全称Open Source Computer Vision Library.OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、MacOS操作系统上。它轻量级而且高效——由一系列 C 函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。通过openCV可实现计算机图像、视频的编辑。广泛应用于图像识别、运动跟踪、机器视觉、特征提取等领域。
说明:本文环境基于Python3.8+windows7 64位系统+OpenCV4.5
安装OpenCV:
pip install opencv-python
也可下载安装包进行安装(https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/opencv-python/)
下载对应版本,解压后执行以下命令:
pip install opencv_python-****-win_amd64.whl
引入:
importcv2
注意:引入包是cv2,不是opencv
3.视频捕捉
体验下捕捉摄像头视频:
importcv2capture=cv2.VideoCapture(0,cv2.CAP_DSHOW) whileTrue: res, frame=capture.read() cv2.imshow('Output', frame) ifcv2.waitKey(1) ==ord('q'): break
利用VideoCapture可以打开本机文件夹内的视频文件或者启用摄像装置,本例就是启用摄像头。使用默认参数0,摄像头打开之后就可以看到一个连续的动态画面,我们分析时对视频的处理需要逐帧画面,所以这里使用while循环来实现对视频帧的逐一提取。我们还可以利用cvtColor函数进行颜色转换,比如转化为灰度图(cv2.COLOR_BGR2GRAY),最后使用waitKey()函数监控键盘操作来退出程序,这里定位光标按字母q键就会退出程序
注意:如果项目中与dshow相关,dshow显示的摄像头顺序与opencv默认的打开顺序不同,则可以使用第二个参数与之对应,可能会出先现以下错误
CvCapture_MSMF::initStreamFailedtosetmediaType (stream0, (640x480@30) MFVideoFormat_RGB24(unsupportedmediatype)
则需要传入第二个参数:cv2.CAP_DSHOW
摄像头获取的视频画面:
整个流程如下:
4.人脸检测与识别
前面我们初步感受了opencv的基本使用,我们继续是opencv实现人脸识别.如今人脸识别已经是各大企业,单位,机场,地铁等场所的身份认证流程.人脸识别系统顾名思议就是采集人脸图像并与数据库中的已采集过的人脸图像作比对.人脸识别系统大概的工作流程如下图所示:
人脸图像采集是通过摄像机对进行信息采集的人员进行拍摄,形成面部图像文件,保存在数据库中;预处理是因为在不同的环境中对人脸的采集受到光线等诸多外部因素影响,不利用后续的特征提取以及与数据库进行比对,所以要对采集到的人脸图像进行预处理.这个预处理操作就是灰度变化和直方图均衡化以及光线补偿,归一化等操作.
特征提取是基于人的面部器官进行建模,比如五官之间的距离,各个特征之间的角度变化关系等等
最后是对人脸识别操作,通过对摄像头采集到的人脸特征模型与数据库中已经采集过的并保存的数据进行比对.确定身份
人脸识别比较复杂,本文只通过人脸识别系统中的人脸检测环节来体验人脸识别
素材是网上找的一张星爷的照片:
importcv2# 采集到的图人脸图片imgfile='r1.jpg'# 获取人脸实例训练数据face_cascade=cv2.CascadeClassifier(r'E:\Anaconda3\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml') # 读取图片img=cv2.imread(imgfile) # 灰度转换gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) # 检测人脸faces=face_cascade.detectMultiScale(gray,1.3,5) for(x,y,w,h) infaces: cv2.rectangle(img,(x,y),(x+w,y+w),(0,255,0),2) cv2.putText(img,'zhouxc',(x+10,y-10),cv2.FONT_HERSHEY_SIMPLEX,1.2,(0,255,0),1) # 显示图像中人脸cv2.namedWindow('find face') cv2.imshow('find face',img) cv2.imwrite('findfaces.jpg',img) cv2.waitKey(0) cv2.destroyAllWindows()
获取人脸实例训练数据的环节中的CascadeClassifier()函数是一种级联分类器.这里的是haarcascade_frontalface_default.xml,这个文件在'Python安装目录\Lib\site-packages\cv2\data\'下.一定要指定文件或者把文件复制到当前目录.否则使用默认的路径可能会报错
灰度转换后,接着使用detectMultiScale()函数可以检测出照片中的人脸.
总结
我们大致了解了人脸识别系统的工作过程,人脸识别过程看似很简单,但是里面包含了很多的算法和模型,涉及到的知识非常之多,需要考虑到的情况更加复杂,如人的衰老,体型的胖瘦,是否化妆,头发的遮挡等等都需要考虑到.后续还会随着技术的不断深入,可能还有很多可以优化的环节
人脸识别只是计算机视觉领域的一个小成果,计算机视觉的发展远非于此,未来还会有更多更好的发展,就像十几年前钢铁侠只是科幻,如今却是所有人触手可及的一种科技
题外话:人脸识别技术为人们提供了很大的便利,同时不可避免存在安全漏洞.比如:我们在社交网络上上传我们的照片,不良商家就可以利用人脸识别系统对用户进行个人信息的窃取,就好像之前有新闻报道:一些楼盘售楼部通过监控视频对看房的客户通过人脸识别来进行获取该客户的购房基本信息,通过售楼处人脸识别系统识别到与该名消费者相似人员曾经独自来过售楼处看房,判定其为售楼处自访客户,非中介渠道客户,无法享受相关优惠。这几乎是所有人都很反感的操作,报道还称有客户知道售楼部有人脸识别这回事之后甚至戴头盔去看房.那么人脸识别技术和反人脸识别技术,究竟哪个对我们生活更有好处?是否应该为了保护个人信息而弃用人脸识别系统呢?