人脸检测(Python dlib)

code: ​ ​https://github.com/davisking/dlib​
介绍
在本教程中,我们将学习如何使用dlib和 Python 在图像中执行人脸检测。

如果您正在寻找使用 OpenCV 的类似教程,请查看此处。有关如何安装 dlib 以及如何读取和显示图像的介绍性教程,请转到此处。

代码在 Windows 8.1 上使用dlib版本 19.22.0 和 Python 版本 3.7.2进行了测试。

编码
我们将从导入dlib模块开始。

之后我们将调用load_rgb_image函数从文件系统加载图像。此函数接收图像路径作为字符串的输入,并返回一个numpy ndarray。我们将结果存储在一个变量中。

img = dlib.load_rgb_image("C:/Users/N/Desktop/Test.jpg")
在此之后,我们将创建一个image_window类的对象,在那里我们将能够显示我们的原始图像以及检测到的人脸周围的矩形。作为构造函数的输入,我们将传递先前加载的图像,该图像将显示在窗口中。

请注意,image_window类还有一个无参数构造函数,它允许在没有任何图像的情况下初始化窗口。这允许我们稍后通过调用set_image方法来设置图像。
win = dlib.image_window(img)
然后我们将从dlib模块调用get_frontal_face_detector函数。这将返回给我们一个fhog_object_detector类的对象(dlib的默认检测器),我们可以用它来检测人脸。

detector = dlib.get_frontal_face_detector()
这个类的实例可调用(查看更多关于Python中可调用这里和定义__call__该类这里)。在我们的例子中,要执行人脸检测,我们只需要调用实例并将我们想要检测人脸的图像作为输入传递。作为输出,它将返回一个矩形类对象的数组(如果没有找到人脸,它将为空)。
face = detector(img)
现在我们有了矩形数组,我们可以简单地在 或image_window上调用add_overlay方法,将矩形作为输入传递。矩形将绘制在窗口上,覆盖我们之前加载的图像。
win.add_overlay(face)
最后,我们将在image_window对象上调用wait_until_closed方法,以确保窗口保持打开状态,直到我们关闭它。
win.wait_until_closed()
完整的代码可以在下面看到。

import dlib
 
img = dlib.load_rgb_image("C:/Users/N/Desktop/Test.jpg")
win = dlib.image_window(img)
 
detector = dlib.get_frontal_face_detector()
face = detector(img)
 
win.add_overlay(face)
 
win.wait_until_closed()

要测试代码,只需使用您选择的工具运行它。就我而言,我使用的是 Python IDE PyCharm。在运行代码之前,不要忘记更改作为load_rgb_image输入传递的字符串以指向文件系统中的图像。

运行代码后,您应该获得类似于图 1 的结果。可以看出,在图像中正确检测到人脸,并按预期渲染了重叠矩形。

对图像进行上采样
在本节中,我们将针对稍微复杂的用例测试我们的代码,其中包含面部的图像较小。请注意,我们将使用的代码完全相同,除了我们将传递给检测器的附加参数。

就像上一节中介绍的那样,我们获得的fhog_object_detector实例是可调用的,我们应该将要检测人脸的图像作为输入传递。除了图像之外,我们还可以传递一个名为upsample_num_times的可选参数,我们在上一节中省略了该参数。

所述upsample_num_times参数默认为零,但是,当指定时,检测器将施加所述面部检测之前上采样图像N倍。引擎盖下应用的逻辑可以在这里看到,但简而言之,它调用了pyramid_up函数(如果我们检查C++ 中的人脸检测库示例,实际上在应用程序代码中调用了这个pyramid_up函数)。

自然地,对图像进行上采样会使检测器运行得更慢,因为它需要处理更大的图像。

在我们的例子中,我们将传递一个值 1 作为对图像进行上采样的次数。

import dlib
 
img = dlib.load_rgb_image("C:/Users/N/Desktop/Test.jpg")
win = dlib.image_window(img)
 
detector = dlib.get_frontal_face_detector()
face = detector(img, 1)
 
win.add_overlay(face)
 
win.wait_until_closed()

再一次,只需运行指向文件系统中图像的代码。在我的例子中,我在一张图像上运行它,在没有上采样的情况下没有检测到任何人脸,但是当图像被上采样 1 倍时被检测到。

结果如图 2 所示。它还表明,当图像中有多个人脸时,程序按预期工作。

posted @ 2022-07-02 22:07  萧海~  阅读(807)  评论(0编辑  收藏  举报