您是否曾经访问Facebook并想知道上传照片后面部识别功能的工作原理?拍照时数码相机如何检测脸部?
在本教程中,您将了解如何并学习在您自己的项目中实现这些功能。
机器学习领域的最新进展是计算机视觉应用。作为回应,开发了机器学习软件,开源计算机视觉(OpenCV)。
该程序与Python编程语言一起为未来强大且高效设计的机器学习产品铺平了道路。
在本教程中,我们将在Python分发平台Anaconda中的基于Windows的计算机上使用OpenCV3库。
本教程中最困难的部分涉及正确安装OpenCV并正确运行它。 有许多在线指南可用于介绍如何在Python 2.7上安装OpenCV,因此本教程将仅关注Python 3.5版本。
安装Anaconda环境访问Anaconda网站,下载最新版本的Anaconda for Windows 。
注意:确保选择Python 3.6版本和适当的体系结构(32位或64位)。
使用默认设置安装Anaconda环境。
确保取消选中 “将Anaconda添加到我的PATH环境变量”选项 。
本教程不需要安装“Microsoft Visual Studio Code”,因为它将使用Spyder IDE环境在Python中编程。
继续并选择在出现时IC跳过安装选项。
将通过设置过程安装一些程序:Anaconda Prompt,Anaconda Navigator和Spyder IDE。
完成安装后,在Windows任务栏中搜索“Anaconda Prompt”并打开桌面应用程序。
使用Anaconda提示要测试Anaconda命令是否正常工作,请运行以下代码。
在此过程中,为Python 3.5版本创建了一个新的Anaconda环境。
Python 3.6版本是使用Anaconda安装程序设置的,但出于兼容性原因,我们将使用带有Open CV3发行版的Python 3.5版本。
创造一个新的环境您将找到输出应如下所示的示例:
Anaconda将安装一些新包装; 只需输入'y'表示是,然后点击回车键继续安装。
在下一步中,我们将安装更多软件包,因此IC让Anaconda分销商安装所需的软件包,否则它可能无法与Python正确集成。
安装完成后,环境将被激活:
如果安装成功执行,您会注意到“(基本)”环境已更改为新环境。
这表明新环境已激活,并且Anaconda已将“$ PATH”变量更改为“C:/ Users / Akshay / Anaconda3 / envs / MyOpenCV”位置。现在所有未来的安装仅适用于此特定环境。
Python版本现在也应该显示为Python 3.5而不是系统版本。
安装OpenCV3和依赖项首先,安装NumPy库以进行科学计算。
然后安装anaconda-client。
最后,安装OpenCV3(由于它的大小,可能需要一些时间来下载库)。
现在使用Anaconda安装并运行Spyder IDE for Python。
在Windows任务栏中搜索“Anaconda Navigator”并将其打开。
从那里可以选择新环境并安装Spyder。
安装Spyder后,通过选择启动来打开程序。
人脸检测算法确保OpenCV平台在Python中运行。您可以使用以下代码:
如果它如上所示进入下一行而没有返回错误,那么您将设置为继续下一步。
您需要下载本文末尾提供的所需Python脚本(.pv),带有faces(.jpg)的图像和XML格式的Haar级联分类器(.xml)。
注意:确保将所有这些文件保存在同一文件夹中以便于访问。
Haar级联分类器背后的理论有点复杂,为了简化它,本质上它们是包含OpenCB检测对象所需的所有数据的XML文件,例如在这种情况下的面部。
通过机器学习方法训练分类器以检测图像内的图案以识别其中的面部。
“文件浏览器选项卡”将允许您导航到保存先前文件的文件夹。
您可以使用以下代码检查当前工作目录:
如果代码输出文件存储位置的文件夹位置,那么你就可以了。
代码细分由于设置了一个文件夹,其中包含所有必需文件作为当前工作目录,因此可以在没有完整路径的情况下搜索文件名。
为此项目选择的XML文件用于检测直接面向摄像机的面部。
如果需要,可以在其位置使用不同的分类器。
此时,我们创建了级联分类器并使用我们的XML文件对其进行初始化。这会将所需数据加载到变量'haar_face_cascade'中。
现在使用OpenCV的库函数可以将使用的photo.jpg转换为灰度。
注意:大多数图像机器学习操作都以灰度显示。
上述功能执行人脸检测算法,可以分解为:
detectMultiScale:检测对象的通用函数。
灰度:将照片转换为灰度颜色。
scaleFactor:补偿照片中目标面部的距离差异。
minSize:可能的最小对象大小,任何小于通过此函数指定的对象的对象都将被忽略。
minNeighbors:定义需要在窗口周围检测到的面部模式的数量,以将空间声明为面。注意:建议将此函数的值设置为0,然后逐步增加它以查看输出如何变化。
上述函数值设置为最常用的值。
我们鼓励您尝试使用不同的值来找到最佳设置。
执行该功能时,矩形标记图像中面部的位置。它还提供矩形左上侧的坐标(x,y)及其宽度(w)和高度(h)。
可以使用以下代码提取信息:
我们使用这些值使用cv.rectange函数在面周围绘制一个矩形。
最后,我们使用检测到的面部显示图像,并等待用户按下一个键。
人脸检测结果我们首先在band.jpg照片上测试算法。
当我们运行该程序时,控制台应该响应“找到5个面孔!” 并输出带有矩形的照片,指示其中面部的位置。
对这张全家福照片进行了第二次测试。
该节目在这次试验中歪曲了衣服作为一张脸,因为与第一张照片不同,所有乐队成员与相机的距离相同 - 父母离照片的距离远远超过照片中的孩子。通过将比例因子调整为1.3可以轻松解决此问题。
程序现在可以正确识别图像中的面部。
由于该程序基于机器学习,因此永远不会提供100%的准确性。如果您在大量图像样本上测试算法,您会发现它适用于大多数但不是所有情况。此外,根据照片,需要调整detectMultiScale函数中的参数以避免误报。
最终守则1. import cv2
2.
3. # Specify the image path for face detection and XML file for the cascade
4. photo_path = "band.jpg"
5. cascade_path = "haarcascade_frontalface.xml"
6.
7. # Initialise the Haar Cascade Classifier with the XML file
8. haar_face_cascade = cv2.CascadeClassifier(cascade_path)
9.
10. # Read the photo and convert to grayscale
11. photo = cv2.imread(photo_path)
12. grayscale = cv2.cvtColor(photo, cv2.COLOR_BGR2GRAY)
13.
14. # Detect faces in the photo using OpenCV library
15. faces = haar_face_cascade.detectMultiScale(
16. grayscale,
17. scaleFactor = 1.1,
18. minNeighbors = 5,
19. minSize = (30, 30)
20. )
21.
22. print("Found {0} faces!".format(len(faces)))
23.
24. # Draw a rectangle around the faces
25. for (x, y, w, h) in faces:
26. cv2.rectangle(photo, (x, y), (x+w, y+h), color = (0, 255, 0), thickness = 2)
27.
28. cv2.imshow("Faces found", photo)
29. cv2.waitKey(0)