备注
转到结尾 下载完整示例代码。或者通过 Binder 在浏览器中运行此示例。
使用级联分类器进行人脸检测#
这个计算机视觉示例展示了如何使用基于机器学习的对象检测框架在图像上检测人脸。
首先,您需要一个xml文件,从中可以读取训练数据。该框架适用于使用多块局部二值模式特征(参见 MB-LBP)和带有注意力级联的Gentle Adaboost训练的文件。因此,检测框架也将适用于 OpenCV的xml文件。在那里,您可以找到用于检测猫脸、侧面脸和其他物体的训练文件。但如果您想检测正面人脸,相应的文件已经包含在scikit-image中。
接下来,您需要为 detect_multi_scale
函数指定参数。在这里,您可以找到每个参数的含义。
第一个是 scale_ratio
。为了找到所有的人脸,算法在多个尺度上进行搜索。这是通过改变搜索窗口的大小来完成的。最小的窗口大小是训练时使用的窗口大小。这个大小在带有训练参数的xml文件中指定。scale_ratio
参数指定了搜索窗口在每一步增加的比例。如果你增加这个参数,搜索时间会减少,但准确性也会降低。因此,某些尺度上的人脸可能无法被检测到。
step_ratio
指定了用于在图像的每个尺度上搜索面部的滑动窗口的步长。如果此参数等于一,则搜索所有可能的位置。如果参数大于一,例如,二,窗口将移动两个像素,并且不会搜索所有可能的位置。通过增加此参数,我们可以减少算法的运行时间,但准确性也会降低。
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.124 秒)