上一篇文章我们讲到,“美颜”牵涉到这些技术包括:人脸检测、人脸关键点定位、瘦脸、磨皮、美白等,人脸检测技术是“美颜”技术最开始的部分。在接下来的系列文章中,我打算分成几篇,来具体阐述“人脸检测”这一技术的工程实践、发展现状、技术原理:这一篇针对工程实践,我想先结合代码来讲述:通过代码的形式,让大家能够直观地感受到这个技术,并且可以自己亲身实践;然后,在之后的文章当中,讲述人脸检测的发展现状、技术原理以及如何使用卷积神经网络来训练出一个工业级的人脸检测模型。
这篇文章将主要介绍人脸检测、开源库及代码实战,文章分成了三个小节:第一个小节讲述人脸检测这一专业术语的概念;第二个小节介绍人脸检测的一些开源库;第三个小节基于OpenCV,讲解如何使用代码来对一张图片进行人脸检测。
众所周知,美剧《权利的游戏》自2011年开播以来,已经走过了8个年头!而今年最后一季也将于4月17日正式和观众见面~~~为了庆祝最后一季的播出,权游在美国《娱乐周刊》发布了集体封面写真,手动点赞!文章中,我们打算采用封面写真图片来给大家做人脸识别的实战演示。
人脸检测指的是在一张图片中,能够检测到人脸并将人脸的区域用方框框出来。
第一张封面当然是男主角雪诺啦!身披守夜人的战衣,骑着骏马非常有气质。作为整部剧中唯一绽放出主角光环而复活了一次的雪诺,在最后一季是否能笑到最后呢?
下图是对上图中的人脸,进行了人脸检测,人脸部分由红色方框框出,男主这颜值还是迷倒一片的。
可以看出,人脸检测技术主要完成了两件工作:第一,判断图片中是否包含人脸区域;第二,如果图片中存在人脸,将人脸的位置预测出来。
@所有人,attention, please! 这里区分两个专业名字。很多人没有将人脸检测和人脸识别这两种不同的术语区分开来。其实,人脸检测和人脸识别是既不相同又互有联系的两种技术:人脸检测是在一张图片中检测出人脸,而人脸识别是通过比对两张图片中的人脸,来判断这两张图片中的人脸是不是同一个人的;人脸识别技术需要人脸检测技术的参与,人脸识别需要在有人脸的图片上进行操作。因此,如果想使用人脸识别技术,那么首先需要有人脸检测技术来检测出图片中人脸的位置。
人脸检测在与人脸有关的很多技术中都发挥着重要的作用。人脸检测技术检测人脸时检不检得出来、检测得准不准以及检测得快不快,将直接关系着其它人脸技术的成败,如美颜、人脸识别等。
人脸检测技术需要借助人脸检测算法来实现,而评价不同的人脸检测算法,有三个关键性的技术指标:召回率、误检率和耗时。
召回率指的是:在一堆有人脸的图片中,人脸检测算法能够检测出来的人脸数除以总的人脸数。
误检率指的是:在算法认为包含人脸的图片中,错误检测的人脸数除以总的检测数。
耗时指的是:人脸检测算法在完成一幅图片中的人脸检测所需要的时间。
前两个指标从不同的角度评价了一个人脸检测算法。总体来说,人脸检测算法的目标,是朝着较高的召回率和较低的误检率这个方向前进;在前两个指标大致相当的情况下,人脸检测算法的耗时越小,其性能越优良。
人脸检测开源库有OpenCV(Open Computer Vision),Dlib。
OpenCV是一个开源的计算机数据库。这个库包含了图像处理的诸多传统算法,同时也在进一步扩展,来包含计算机视觉领域的一些新技术,如深度学习;在OpenCV中,人脸检测使用的算法是:haar特征+adaboost级联分类器,其检测效果在一些图片上表现还不错。
Dlib是一个现代的C++工具包,包含机器学习算法和工具,用于在C ++中创建复杂的软件来解决实际问题;它广泛应用于学术界和工业界,包括机器人、嵌入式设备、移动电话和大型高性能计算环境。
在Dlib中,人脸检测算法可以使用HOG特征,也可以使用卷积神经网络(CNN);卷积神经网络无论是在召回率上还是在误检率上,其性能都要优于传统算法。
这一小节跟大家讨论如何使用OpenCV里的人脸检测。本来打算使用C++的代码来讲述人脸检测,考虑到文章读者可能更多的对Python熟悉一些,因此用Python代码来讲述人脸检测实战。使用Python基于OpenCV库做人脸检测,代码比较简单。
代码所需要的环境是,python2.7和一个OpenCV的Python包。OpenCV的Python包,可以通过如下命令安装。
$ pip install opencv-python
以下讲述代码。
3.1 导入OpenCV包。
import cv2
3.2 读取图片,并将图片灰度化,filepath是文件所在的路径。
img = cv2.imread(filepath)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
3.3 创建对象来加载训练好的参数数据,并使用这个对象来检测图片中的人脸。其中,haarcascade_frontalface_default.xml来自https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml。
face_cascade = cv2.CascadeClassifier('./haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(
gray,
scaleFactor = 1.15,
minNeighbors = 5,
minSize = (5,5),
flags = 2 #2表示CV_HAAR_SCALE_IMAGE
)
3.4 将人脸框画到原图片中。
for(x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w*9/10,y+h), (0,0,255), 2)
3.5 保存中间过程中的灰度图片,以及人脸检测后的图片。
cv2.imwrite("gray.jpg", gray)
cv2.imwrite("result.jpg", img)
在短短十五行的代码里,我们可以使用Python基于OpenCV来完成人脸检测。下面给小伙伴们,演示下代码的功能。
第二张封面是女主角龙母,从一开始跌宕起伏的公主角色,一直到中后期持续开挂而获得了全剧最长称号的女王,每次出场都带动着故事的进程。三龙只剩两条的她,能不能坐上铁王座呢?
最终完成人脸检测的输出图片,龙母气质凸显无疑啊。。。
相信大家都非常喜欢看小恶魔提利昂的表演,睿智、果断、目光长远的小个子已经获得了国王之手的勋章。虽然作为配角却一度抢了主角的人气,活到最后问题不大啦!
可惜的是满脸毛发和胡渣的小恶魔没有识别出来。。。
珊莎一开始是非常不受人待见的“傻白甜”角色,因为自己的天真和固执而让史塔克家族走向末路,桑莎不是主因,但绝对是导火索;不过在斗败小指头之后的桑莎简直换了一个人,马丁老爷子还借小指头的口说出了那句“她会比你们所有人都活得长!”
甜美的颜值几毫秒就识别出来了。
出乎意料,一直神出鬼没的夜王居然也登上了权游的人物封面。很多剧迷表示以前只在片中偶尔看到模糊不清的脸,非常惊悚!这次海报中夜王终于露出了清晰的面孔,乍一看还有点“萌萌哒”。。。
结果也是没有识别出来,毕竟夜王是异鬼军团总司令,这应该不能算是人类吧。。。
随后便是人气超高的小妹妹——“缝衣针”艾丽娅啦!然鹅封面当中并没有出现“缝衣针”,而是只有她的瓦雷利亚钢匕首。作为封面中为数不多给出全身照的艾丽娅依旧英气十足,能够逃过无面者的惩罚,能逃得过马丁老爷子的笔吗?
识别结果如下,帅气超过美丽吧?
詹姆·兰尼斯特是《权游》中塑造得最为成功的一名角色,从刚开始为和平而背上弑君者之名,到禁忌之恋,再到找回荣誉之名。观众也从讨厌、到理解、再到骄傲。如果按詹姆的性格来看,莫非将成为大局的牺牲品?
这位形象饱满的帅哥哥竟然没有识别出来。。。对此我只想说:换个姿势,再来一次!
作为逆袭的胖子,山姆从第一集开始就一直和死亡相拥相伴!但幸运和看似笨拙的机智,却总能让他化险为夷。山姆能走到最后问题不大,据说他就是马丁在剧中的分身。。。毕竟两人都很胖哇。。。
对于包含两个人物的图片,咱们的人脸检测算法可以hold住么?
结果如下,两张脸都能检测出来,事实证明:只要你的姿势水平足够,完全没有问题!
在全剧海报中,瑟曦被放到了最后一张人物封面中。看到这里不由得让人突然怀疑起剧情来,《权力的游戏》这部神剧,每一个预告片、海报都是埋下了FLAG的!难道说瑟后最终和铁王座有缘?
不得不说短发瑟曦还是别有一番女王气质的。
接下来是见证奇迹的时刻,使用OpenCV自带的人脸检测算法,来一张全剧福合影检测!
少数人物头像没有检测出来,总体效果不错!
除此之外,权游本次晒出的海报还有布蕾妮、米珊迪、灰虫子、梅丽珊卓、洋葱骑士、乔拉·莫尔蒙、席恩、桑铎·克里冈、魔山、攸伦·葛雷乔伊和瓦里斯,这里就不一一例举啦!小伙伴们,铁王座之争,你最看好谁呢?
本文的主要目标是使读者理解人脸检测这一专业名词,了解人脸检测的一些开源库,并且能够使用相应的库实现人脸检测。那么人脸检测的算法原理究竟是怎样的呢?
欲知人脸检测的技术原理,且听下回分解。
作者:Clarence, Andersonxie
关注微信公众号“机器学习和人工智能”,干货多多~
我们会定期推送Python编程,人工智能基础算法,学术界、工业界最新动态,让更多的人了解人工智能~
欢迎扫描下方二维码关注哈~