原标题:Python超级教程,使用Python进行检测面部特征
今天,我们将学习如何使用图像来检测面部并提取诸如眼睛,鼻子,嘴巴等面部特征。作为捕捉面部的预处理步骤,我们可以做很多令人难以置信的事情,例如捕捉面部用于标记照片中的人物(手动或通过机器学习),创建效果以“增强”我们的图像(类似于Snapchat等应用中的图像),对面部进行情感分析等等。
在过去,我已经介绍了如何使用OpenCV检测图像中的形状,但是今天,我们将通过引入DLib并从图像中提取面部特征将其提升到一个新的水平。Dlib是一个高级的机器学习库,旨在解决复杂的实际问题。该库是使用C ++编程语言创建的,并且可与C / C ++,Python和Java一起使用。值得注意的是,本教程可能需要对OpenCV库有一些前提的了解,例如如何处理图像,打开相机,图像处理以及一些小技巧。
1、它是如何工作的
我们的脸部有几个可以识别的特征,例如我们的眼睛,嘴巴,鼻子等。当我们使用DLib算法检测这些特征时,实际上会得到围绕每个特征的点的地图。该地图由67个点(称为地标点)组成,可以标识以下特征:
颚点= 0–16
右眉点= 17–21
左眉点= 22–26
鼻点= 27–35
右眼点= 36–41
左眼点= 42–47
口角= 48–60
嘴唇分数= 61–67
现在,我们对计划如何提取特征有所了解,让我们开始编码。
2、安装要求
像往常一样,本文将提供带有代码的示例,我将逐步指导你实现面部特征识别的完整示例。但是在开始之前,你需要启动一个新的Python项目并安装3个不同的库:OpenCV的Python;dlib。如果你像我一样使用pipenv,则可以使用以下命令安装所有它们:
如果你使用的是Mac和某些版本的Linux,则在安装dlib时可能会遇到一些问题,如果在安装过程中遇到编译错误,请确保检查使用的CMake库版本。在Mac中,确保你有可用的CMake,并且可以使用正确的版本运行:
对于其他操作系统,请在线检查以获得特定支持。
步骤1:载入并显示图片
我们将从小处着手并以代码为基础,直到有一个可以正常工作的示例为止。通常,我喜欢使用绘图来渲染图像,但是由于我们在稍后的文章中准备了一些很酷的东西,因此我们将做一些不同的事情,并且我们将创建一个窗口来展示我们的工作结果。让我们跳入代码
很简单,对吧?我们只是加载了具有未读图像,然后告诉OpenCV以Winname显示图像,这将打开窗口并为其命名。之后,我们需要暂停执行,因为脚本停止时窗口将被破坏,因此我们使用cv2.waitKey保持窗口直到按下某个键,然后销毁窗口并退出脚本。如果你使用该代码并将一个名为face.jpg的图像添加到代码目录中,则应获得如下内容:
步骤2:人脸识别
到目前为止,除了将图像呈现到窗口中之外,我们还没有做其他任何事情,这很无聊,但是现在我们将开始对好东西进行编码,并且我们将从识别图像中有脸的位置开始。为此,我们将使用Dlib函数get_frontal_face_detector(),非常直观。需要注意的是,此功能仅适用于灰度图像,因此我们必须首先使用OpenCV进行此操作。
该get_frontal_face_detector()会返回一个detector就是我们可以用它来获取脸信息的功能。每个脸都是一个对象,其中包含可以找到图像的点。但是让我们更好地在代码上看到它:
上面的代码将从图像中检索所有面部,并在每个面部上渲染一个矩形,从而产生如下图像:
到目前为止,我们在发现人脸方面做得很好,但是我们仍然需要一些工作来提取所有特征(地标)。接下来让我们开始吧。
步骤3:识别人脸特征
到目前为止,DLib的工作方式一直非常神奇,仅用几行代码就可以实现很多目标,而现在我们有了一个全新的问题,它会继续变得如此容易吗?答案是肯定的!事实证明DLib提供了一个名为的功能shape_predictor(),它将为我们做所有的魔术,但需要注意的是,它需要一个预先训练的模型才能起作用。有几种可以使用的模型shape_predictor,可以在这里下载我正在使用的模型,但是也可以尝试其他模型。让我们看看新代码现在的样子
像以前一样,我们始终以相同的代码为基础,现在对每个人脸使用预测函数来查找界标。现在我仍然在做一些奇怪的事情,例如27号在做什么?
根据我们之前看到的图表,我们的预测函数将返回一个对象,其中包含与面部相符的所有68个点,如果你注意到它,则点27恰好在眼睛之间,因此,如果所有点都正确计算出,你应该像这样在眼睛之间看到一个绿色的点:
我们已经很接近了,现在让我们渲染所有的点,而不仅仅是一个点:
渲染结束:
如果你对所有脸面点都不感兴趣怎么办?你可以调整range时间间隔以获取上述词汇表中指定的任何功能,就像我在这里所做的那样:
步骤4:实时检测
下一步是连接我们的网络摄像头,并从你的视频流中进行实时地标识别。你可以通过使用相机遍历视频帧或使用视频文件来对面部进行实时面部标志检测。如果要使用自己的摄像机,请参考以下代码,但对于视频文件,请确保将数字0更改为视频路径。如果要结束窗口,请按键盘上的ESC键:
最终效果:
即使在光线不足的情况下,结果也相当准确,更好的照明效果则更完美。
结论
OpenCV和DLib是功能强大的库,可简化ML和计算机视觉的使用。今天,我们只是简单地介绍了基础知识,我还有很多东西要向他们学习。非常感谢您的阅读!返回搜狐,查看更多
责任编辑: