李远君 ,Web和云计算开发人员。Java,Python,Golang爱好者。
个人网址:https://tomoncle.com
导言
为什么会写这个人脸例子?
浏览博客的过程,无意发现了一篇名为deal-with-it-generator-face-recognition的文章,通过这篇文章,使我有了写这个例子的想法,尤其是现在很多短视频APP中经常出现这样的效果,感觉还是有点好玩的。
感谢!
写这个例子初衷与资料来自burningion的分享。
变化?
deal-with-it-generator-face-recognition 这篇文章是一个戴眼镜的简单例子及构思,我在其原基础上,添加了烟卷的部分,并且把代码结构重构了一下,使其更易拓展和维护,也易于阅读。
实现流程
程序从命令行参数获取图片信息,然后,它将使用Dlib中的人脸检测算法来查看是否有人脸存在。如果有,它将为每个人脸创建一个结束位置,眼镜和烟卷会移动到那里结束。
然后我们需要缩放和旋转我们的眼镜以适合每个人的脸。我们将使用从Dlib的68点模型返回的点集来找到眼睛的中心,并为它们之间的空间旋转。
在我们找到眼镜的最终位置和旋转后,我们可以为gif制作动画,眼镜从屏幕顶部进入。我们将使用MoviePy和一个make_frame函数绘制它。
同理烟卷也是这样。
应用程序的体系结构非常简单。我们首先接收图片,然后将其转换为灰度NumPy数组。假如没有人脸,程序会自己退出,如果存在,我们就可以将检测到的人脸信息传递到人脸方向预测模型中。
通过返回的脸部方向,我们可以选择眼睛,缩放和旋转我们的眼镜框架以适合人的面部大小。
当然这个程序不仅仅只针对于一张人脸,可以检测多个人脸信息。
最后,通过获取的人脸列表,我们可以使用MoviePy创建一个绘图,然后生成我们的动画gif。
导入对应的工具包
import moviepy.editor as mpy
import numpy as np
from PIL import Image
from imutils import face_utils
try:
from dlib import get_frontal_face_detector, shape_predictor
except ImportError:
raise
创建人脸识别的工具类
FaceDetect
及其对应的方法
class FaceDetect(object):
pass
创建
detector
及predictor
两个属性,用来加载dlib库函数
@property
def detector(self):
"""
检测是否有人脸
:return:
"""