注意
转到末尾以下载完整的示例代码。 或者通过 Binder 在您的浏览器中运行此示例
使用级联分类器进行人脸检测#
这个计算机视觉示例展示了如何使用基于机器学习的对象检测框架来检测图像中的人脸。
首先,您需要一个 xml 文件,从中读取训练数据。该框架使用 Multi-block Local Binary Patterns Features(参见MB-LBP)和带有注意力级联的 Gentle Adaboost 训练的文件。因此,检测框架也可以使用来自OpenCV 的 xml 文件。在那里,您可以找到训练用于检测猫脸、侧脸和其他物体的文件。但是,如果您想检测正面人脸,scikit-image 中已包含相应的文件。
接下来,您必须为detect_multi_scale
函数指定参数。在这里,您可以找到每个参数的含义。
第一个是scale_ratio
。为了找到所有的人脸,该算法会在多个尺度上进行搜索。这是通过更改搜索窗口的大小来完成的。最小窗口大小是在训练中使用的窗口大小。此大小在带有训练参数的 xml 文件中指定。scale_ratio
参数指定搜索窗口在每个步骤中增加的比率。如果您增加此参数,则搜索时间会减少,而准确性会降低。因此,某些尺度上的人脸可能无法检测到。
step_ratio
指定滑动窗口的步长,用于在图像的每个尺度上搜索人脸。如果此参数等于 1,则会搜索所有可能的位置。如果该参数大于 1,例如 2,则窗口将移动两个像素,并且不会搜索所有可能的位置以查找人脸。通过增加此参数,我们可以减少算法的工作时间,但准确性也会降低。
min_size
是尺度搜索期间的最小搜索窗口大小。max_size
指定窗口的最大大小。如果您知道要搜索的图像上人脸的大小,则应尽可能精确地指定这些参数,因为您可以避免进行昂贵的计算,并可能减少错误检测的数量。您可以通过增加 min_size
参数来节省大量时间,因为大部分时间都花费在最小尺度上的搜索。
min_neighbor_number
和 intersection_score_threshold
参数用于对同一人脸的过度检测进行聚类,并过滤掉错误检测。真实的人脸周围通常有很多检测,而错误的人脸通常只有单个检测。首先,算法搜索聚类:如果两个矩形检测之间的交集得分大于 intersection_score_threshold
,则将它们放置在同一聚类中。交集得分使用公式(交集面积)/(小矩形比率)计算。选择所描述的交集标准而不是交集并集是为了避免当大矩形内的小矩形具有小的交集得分时的极端情况。然后,使用 min_neighbor_number
参数对每个聚类进行阈值处理,该参数保留其中具有相同或更大数量检测的聚类。
您还应该考虑到错误检测是不可避免的,如果您想要一个真正精确的检测器,则必须使用 OpenCV 训练级联实用程序自行训练。
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)
)
fig, ax = plt.subplots()
ax.imshow(img, cmap='gray')
for patch in detected:
ax.axes.add_patch(
patches.Rectangle(
(patch['c'], patch['r']),
patch['width'],
patch['height'],
fill=False,
color='r',
linewidth=2,
)
)
plt.show()
脚本总运行时间:(0 分 0.481 秒)