当前位置: 首页 > 后端技术 > Python

【Python自动戴圣诞帽】01熟悉face_recognition库

时间:2023-03-25 21:57:25 Python

最近两三年,每到圣诞节,朋友圈里就会出现各种“@微信官方给我戴圣诞帽”。先不说官方微信给不给。本着“求人不如求己”的思想,本次我们将使用Python编写一个自动戴圣诞帽的脚本。起源每到圣诞节,朋友圈就热闹起来。大家都争先恐后的向微信官求圣诞帽:你别说,微信官真的满足了所有网友的心愿:先不说有人信不信,这波网友的演技绝对是满分分数。注:本栏目图片来自新浪新闻->重庆商报2017年12月23日12:35文章,如有侵权请联系删除。简单分析本着“自己动手,丰衣足食”的精神,我打算自己做一个戴着圣诞帽的剧本。毕竟微信官方真的很忙,要照顾这么多人的需求。那么,需要做些什么才能自动将圣诞帽戴在头像的正确位置(这里只考虑头像包含人脸的情况)?以下是我认为的步骤:获取头像,定位人脸,获取人脸关键点,获取合适的圣诞帽位置,调整圣诞帽大小,合成头像,人脸检测。要定位人脸,就不得不说说人脸检测技术。人脸检测与识别的研究一直很火热,也有很多成熟的应用。大部分地方坐火车都可以刷脸进站,有的地方甚至支持刷脸支付。同时,很多研究者都开源了自己的代码库,供学习者参考。本文使用了号称世界上最简洁的人脸识别库face_recognition库。熟悉face_recognitionface_recognition的人脸识别基于业界领先的深度学习模型,在LabeledFacesintheWildface数据集中准确率高达99.38%。唯一美中不足的是儿童和亚洲面孔的识别准确率有待提高。在实际使用中,人脸检测的效果也会受到人脸光照和遮挡的影响,不过我们不妨研究一下。最近有一部很火的电视剧《庆余年》,我们就拿这部电视剧里的人物做实验。以下是《庆余年》的剧照或宣传照,真是又帅又美:安装方法在这里。由于face_recognition库依赖的dlib包需要编译,懒得理会的同学可以直接下载编译好的.whl文件,用pip命令安装,或者在face_recognition后台回复公众号得到它。安装命令如下:pipinstalldlib-****.whl人脸位置检测号称是世界上最简洁的人脸识别库,代码一定非常简单。首先自然要引入相关包:importface_recognitionimportcv2然后使用face_recognition读取有脸的图片:image=face_recognition.load_image_file('your-path-to-face')关键代码来了:face_locations=face_recognition。face_locations(image)是的,你没看错,这句话检测的是图片中所有的人脸。简单处理,在检测到人脸的地方画一个方框:fortop,right,bottom,leftinface_locations:cv2.rectangle(image,(left,top),(right,bottom),(0,0,255),2)face_locations=face_recognition.face_locations(image)cv2.imshow('rects_face',image[:,:,::-1])cv2.waitKey(0)细心的读者可能会注意到image[:,:,::-1].原因是在读取图片的时候,普通的方法一般是按照R,G,B的顺序排列,而在OpenCV中是按照B,G,R的顺序排列的,所以需要使用::-1最后一个维度中的方法以相反的顺序进行处理。下面是人脸识别的结果:是不是很简单,加上包导入和显示代码一共才9行。人脸关键点检测仔细观察检测到的人脸,会发现框出的位置比较宽,没办法贴近人脸,后面戴圣诞帽会比较困难。好在face_recognition库还为我们提供了人脸关键点检测功能,可以告诉我们五官的详细坐标。在获取坐标之前,还是需要检测人脸类似上面的代码:image=face_recognition.load_image_file(face)face_locations=face_recognition.face_locations(image)face_landmarks=face_recognition.face_landmarks(image,face_locations)还是代码解决问题。face_landmarks存储面部特征的详细位置。以“范闲”为例,face_landmarks的具体信息如下:[{'chin':[(148,100),(149,117),(152,133),(155,148),(161,163),(169,177),(178,189),(190,198),(203,200),(216,198),(226,189),(235,178),(244,165),(250,151),(254,136),(257,120),(259,104)],'左眉':[(162,105),(172,103),(182,106),(191,109),(202,112)],'right_eyebrow':[(213,114),(222,110),(231,106),(241,103),(250,106)],'nose_bridge':[(206,121),(206,131),(206,141),(206,151)],'nose_tip':[(195,156),(200,157),(206,159),(211,157),(216,155)],'左眼':[(173,118),(179,117),(187,117),(192,121),(185,123),(178,122)],'right_eye':[(220,122),(226,118),(233,117),(239,119),(234,123),(227,123)],'top_lip':[(187,174),(194,171),(201,169),(206,171),(211,169),(216,171),(223,173),(220,174),(211,174),(205,175),(200,174),(191,174)],'bottom_lip':[(223,173),(216,180),(210,184),(205,185),(200,184),(193,181),(187,174),(191,174),(200,175),(205,176),(211,175),(220,174)]}]一共72个关键点,包括左右眉毛5个,左右眼6个,鼻子5个,鼻梁4个,上下唇12个,脸颊17个,和之前一样。为了直观观察,使用代码来绘制这些点,代码如下:foreachinface_landmarks:foriineach.keys():foranyineach[i]:points_face=cv2.circle(points_face,any,3,(0,0,255),-1)结果如下:有了这些关键点,我们就可以轻松定位到圣诞帽的位置了。下一个预览中提到的以上是face_recognition库提供的最基本的功能,face_recognition库还有越来越多有趣的地方。下一期我们会简单介绍一下其他的功能,然后实现我们的自动戴帽脚本,敬请期待~不管你在后记写什么,希望能和更多人交流。如果您有任何问题或需求,欢迎随时交流。我所有的项目源码都会放在下面的github仓库,有需要的可以参考,有问题请指正,谢谢!https://github.com/TitusWongCN/WeChatSubscriptionArticles下面是我的公众号,有兴趣的可以扫一扫: