25行Python代码实现人脸识别

本文概述

  • OpenCV的
  • 安装OpenCV
  • 了解守则
  • 检查结果
  • 扩展到网络摄像头
  • 想知道更多?
在本文中, 我们将介绍一种使用Python和开源库OpenCV进行面部识别的简单方法。
在评论部分提出任何问题之前:不要跳过本文, 而只是尝试运行代码。你必须了解代码的作用, 不仅要正确运行它, 还要对它进行故障排除。确保使用OpenCV v2。具有可正常使用的网络摄像头, 以便此脚本可以正常运行。复查其他评论和问题, 因为你的问题可能已经解决。谢谢。
免费红利:单击此处以获得Python人脸检测和OpenCV示例迷你指南, 该指南向你展示了现实世界中Python计算机视觉技术的实用代码示例。
注意:另请查看我们有关使用Python进行人脸检测的更新教程。
OpenCV的 OpenCV是最受欢迎的计算机视觉库。最初使用C / C ++编写, 现在提供了Python绑定。
OpenCV使用机器学习算法搜索图片中的人脸。由于面孔非常复杂, 因此没有一项简单的测试可以告诉你是否找到了面孔。相反, 有成千上万个必须匹配的小模式和功能。该算法将识别面部的任务分解为成千上万个较小的, 一口大小的任务, 每个任务都易于解决。这些任务也称为分类器。
对于诸如人脸之类的东西, 你可能具有6, 000个或更多的分类器, 所有这些分类器必须匹配才能被检测到人脸(当然, 在误差范围内)。但是其中存在一个问题:对于人脸检测, 该算法从图片的左上方开始, 然后向下移动跨小块数据, 查看每个块, 不断询问:“这是一张脸吗? ……这是一张脸吗? ……这是一张脸吗?”由于每个块有6, 000个或更多测试, 因此你可能需要进行数百万次计算, 这将使你的计算机停顿下来。
为了解决这个问题, OpenCV使用级联。什么是级联?最好的答案可以在字典中找到:“一个瀑布或一系列瀑布”。
像一系列瀑布一样, OpenCV级联将检测面部的问题分为多个阶段。对于每个块, 它都会进行非常粗略和快速的测试。如果通过, 它将进行更详细的测试, 依此类推。该算法可能有30到50个这样的阶段或级联, 并且只有在所有阶段都通过后才能检测到人脸。
这样做的好处是, 大部分图片会在前几个阶段返回负值, 这意味着该算法不会浪费时间测试其上的所有6, 000个功能。现在可以实时进行人脸检测, 而无需花费数小时。
级联实践
尽管理论听起来很复杂, 但在实践中却很容易。级联本身只是一堆XML文件, 其中包含用于检测对象的OpenCV数据。你可以使用所需的级联来初始化代码, 然后为你完成工作。
由于人脸检测很常见, 因此OpenCV带有许多内置的级联, 用于检测从脸到眼睛到手到腿的所有东西。甚至还有非人类事物的级联。例如, 如果你经营一家香蕉店, 并想追踪偷香蕉的人, 那么这个家伙为此而建了一个!
安装OpenCV 首先, 你需要为你的操作系统找到正确的安装文件。
我发现安装OpenCV是任务中最困难的部分。如果遇到奇怪的无法解释的错误, 则可能是由于库冲突, 32/64位差异等引起的。我发现最简单的方法是仅使用Linux虚拟机并从头开始安装OpenCV。
完成安装后, 可以通过启动Python会话并键入以下命令来测试其是否有效:
> > >
> > > import cv2 > > >

如果没有任何错误, 可以继续进行下一部分。
了解守则 让我们分解一下实际代码, 你可以从存储库中下载该代码。抓取face_detect.py脚本, abba.png图片和haarcascade_frontalface_default.xml。
# Get user supplied values imagePath = sys.argv[1] cascPath = sys.argv[2]

你首先将图像和级联名称作为命令行参数传入。我们将使用ABBA图像以及默认级联来检测OpenCV提供的面部。
# Create the haar cascade faceCascade = cv2.CascadeClassifier(cascPath)

现在, 我们创建级联并使用面部级联对其进行初始化。这样会将面部级联加载到内存中, 以便可以使用。请记住, 级联只是一个XML文件, 其中包含用于检测人脸的数据。
# Read the image image = cv2.imread(imagePath) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

在这里, 我们读取图像并将其转换为灰度。 OpenCV中的许多操作都是在灰度下完成的。
# Detect faces in the image faces = faceCascade.detectMultiScale( gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30), flags = cv2.cv.CV_HAAR_SCALE_IMAGE )

此功能可检测实际的面孔, 并且是我们代码的关键部分, 因此让我们来看一下这些选项:
  1. detectMultiScale函数是检测对象的常规函数??。由于我们是在面部层叠上调用它的, 因此它可以检测到。
  2. 第一个选项是灰度图像。
  3. 第二个是scaleFactor。由于某些人脸可能更靠近相机, 因此它们看起来会比背面的人脸大。比例因子对此进行了补偿。
  4. 该检测算法使用移动窗口来检测对象。 minNeighbors定义在声明当前脸部之前在当前对象附近检测到多少个对象。同时, minSize给出每个窗口的大小。
注意:我采用了这些字段的常用值。在现实生活中, 你将尝试使用不同的窗口大小, 比例因子等值, 直到找到最适合你的值。
该函数返回一个矩形列表, 它认为在其中找到了脸。接下来, 我们将遍历它认为找到了什么的地方。
print "Found {0} faces!".format(len(faces))# Draw a rectangle around the faces for (x, y, w, h) in faces: cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)

此函数返回4个值:矩形的x和y位置以及矩形的宽度和高度(w, h)。
我们使用这些值通过内置的square()函数绘制一个矩形。
cv2.imshow("Faces found", image) cv2.waitKey(0)

最后, 我们显示图像并等待用户按下一个键。
移除广告
检查结果 让我们对照ABBA的照片进行测试:
$ python face_detect.py abba.png haarcascade_frontalface_default.xml

25行Python代码实现人脸识别

文章图片
那行得通。另一张照片怎么样:
25行Python代码实现人脸识别

文章图片
那……不是一张脸。让我们再试一次。我更改了参数, 发现将scaleFactor设置为1.2可以消除错误的表情。
25行Python代码实现人脸识别

文章图片
发生了什么?
好吧, 第一张照片是用高质量的相机近距离拍摄的。第二个似乎是从远处拿来的, 可能还带了手机。这就是为什么必须修改scaleFactor的原因。正如我所说, 你必须根据具体情况设置算法, 以避免误报。
请注意, 由于这是基于机器学习的, 因此结果永远不会100%准确。在大多数情况下, 你将获得足够好的结果, 但有时该算法会将不正确的对象识别为面部。
最终代码可以在这里找到。
扩展到网络摄像头 如果要使用网络摄像头怎么办? OpenCV从网络摄像头获取每个帧, 然后你可以通过处理每个帧来检测面部。你将需要一台功能强大的计算机, 但是只要我不跳舞太多, 我的5岁笔记本电脑似乎还可以。
更新:下一篇文章上线。使用网络摄像头检查Python中的人脸检测!
想知道更多? 免费红利:单击此处以获得Python人脸检测和OpenCV示例迷你指南, 该指南向你展示现实世界中的Python计算机视觉技术的实用代码示例。
我将在我即将出版的《面向科学和工程的Python》一书中对此进行详细介绍, 该书目前在Kickstarter上。对于感兴趣的人, 我还将介绍机器学习。
【25行Python代码实现人脸识别】谢谢!

    推荐阅读