基于级联分类器的人脸检测

这个计算机视觉例子展示了如何使用基于机器学习的对象检测框架来检测图像上的人脸。

首先,您需要一个可以从中读取训练数据的XML文件。该框架使用使用多块局部二进制模式特征进行训练的文件(请参见 MB-LBP )和绅士阿达布斯与注意力级联。因此,该检测框架还将与 xml files from OpenCV 。在那里,你可以找到经过训练的文件,以检测猫脸、侧面脸和其他东西。但是,如果你想要检测正面脸,各自的文件已经包含在SCRKIT-IMAGE中。

下一步,您必须为 detect_multi_scale 功能。在这里你可以找到每一个词的意思。

第一个是 scale_ratio 。为了找到所有人脸,该算法在多个尺度上进行搜索。这是通过改变搜索窗口的大小来实现的。最小窗口大小是训练中使用的窗口大小。该大小在带有训练参数的XML文件中指定。这个 scale_ratio 参数指定在每个步骤上增加搜索窗口的比率。如果增加此参数,搜索时间会减少,精度也会降低。因此,某些尺度上的人脸无法被检测到。

step_ratio 指定用于在图像的每个比例上搜索面的滑动窗口的步骤。如果该参数等于1,则搜索所有可能的位置。如果参数大于1,例如,2,则窗口将移动两个像素,并且不是所有可能的位置都将搜索人脸。增加这个参数可以减少算法的工作时间,但精度也会降低。

min_size 是缩放搜索期间搜索窗口的最小大小。 max_size 指定窗口的最大大小。如果您知道要搜索的图像上的脸的大小,则应尽可能精确地指定这些参数,因为您可以避免进行昂贵的计算,并可能减少错误检测的数量。您可以通过增加 min_size 参数,因为大部分时间都花在最小比例的搜索上。

min_neighbour_numberintersection_score_threshold 参数被用来对同一人脸的过多检测进行聚类,并过滤掉错误检测。真脸通常有很多检测,而假脸通常只有一次检测。第一种算法搜索簇:如果两个矩形检测之间的相交分数大于 intersection_score_threshold 。相交分数是使用公式(相交面积)/(小矩形比)计算的。当大矩形内部的小矩形具有较小的相交分数时,所描述的相交条件被选择而不是相交而不是并集,以避免出现拐角情况。然后,使用以下选项设置每个集群的阈值 min_neighbour_number 参数,该参数将保留具有相同或更多检测次数的簇。

你还应该考虑到错误检测是不可避免的,如果你想拥有一个真正精确的检测器,你将不得不自己训练它使用 OpenCV train cascade utility

plot face detection
from skimage import data
from skimage.feature import Cascade

import matplotlib.pyplot as plt
from matplotlib import patches

# Load the trained file from the module root.
trained_file = data.lbp_frontal_face_cascade_filename()

# Initialize the detector cascade.
detector = Cascade(trained_file)

img = data.astronaut()

detected = detector.detect_multi_scale(img=img,
                                       scale_factor=1.2,
                                       step_ratio=1,
                                       min_size=(60, 60),
                                       max_size=(123, 123))

plt.imshow(img)
img_desc = plt.gca()
plt.set_cmap('gray')

for patch in detected:

    img_desc.add_patch(
        patches.Rectangle(
            (patch['c'], patch['r']),
            patch['width'],
            patch['height'],
            fill=False,
            color='r',
            linewidth=2
        )
    )

plt.show()

脚本的总运行时间: (0分0.176秒)

Gallery generated by Sphinx-Gallery