个性化阅读
专注于IT技术分析

25行Python代码实现人脸识别

点击下载

本文概述

在本文中, 我们将介绍一种使用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
Python人脸检测示例1:Abba

那行得通。另一张照片怎么样:

Python人脸检测示例2:错误

那……不是一张脸。让我们再试一次。我更改了参数, 发现将scaleFactor设置为1.2可以消除错误的表情。

Python人脸检测示例2:已修复

发生了什么?

好吧, 第一张照片是用高质量的相机近距离拍摄的。第二个似乎是从远处拿来的, 可能还带了手机。这就是为什么必须修改scaleFactor的原因。正如我所说, 你必须根据具体情况设置算法, 以避免误报。

请注意, 由于这是基于机器学习的, 因此结果永远不会100%准确。在大多数情况下, 你将获得足够好的结果, 但有时该算法会将不正确的对象识别为面部。

最终代码可以在这里找到。

扩展到网络摄像头

如果要使用网络摄像头怎么办? OpenCV从网络摄像头获取每个帧, 然后你可以通过处理每个帧来检测面部。你将需要一台功能强大的计算机, 但是只要我不跳舞太多, 我的5岁笔记本电脑似乎还可以。

更新:下一篇文章上线。使用网络摄像头检查Python中的人脸检测!

想知道更多?

免费红利:单击此处以获得Python人脸检测和OpenCV示例迷你指南, 该指南向你展示现实世界中的Python计算机视觉技术的实用代码示例。

我将在我即将出版的《面向科学和工程的Python》一书中对此进行详细介绍, 该书目前在Kickstarter上。对于感兴趣的人, 我还将介绍机器学习。

谢谢!

赞(0)
未经允许不得转载:srcmini » 25行Python代码实现人脸识别

评论 抢沙发

评论前必须登录!