人脸追踪详解与实现

·  阅读 2132
人脸追踪详解与实现

1. 人脸追踪技术简介

基于判别相关滤波器 (discriminative correlation filter, DCF) 的视觉跟踪器具有优异的性能和较高的计算效率,可用于实时应用程序。DCF 跟踪器是一种非常流行的基于边界框跟踪的方法。 在 dlib 库中实现了基于 DCF 的跟踪器,可以很方便的将其用于对象跟踪。在本文中,我们将介绍如何使用此跟踪器进行人脸和用户选择对象的跟踪,这种方法也称为判别尺度空间跟踪器 (Discriminative Scale Space Tracker, DSST),追踪器仅需要输入原始视频和目标初始位置的边界框,然后跟踪器自动预测目标的轨迹。

2. 使用基于 dlib DCF 的跟踪器进行人脸跟踪

在进行人脸追踪时,我们首先使用 dlib 人脸检测器进行初始化,然后使用基于 dlib DCF 的跟踪器 DSST 进行人脸跟踪。调用以下函数初始化相关跟踪器:

tracker = dlib.correlation_tracker()
复制代码

这将使用默认值 (filter_size = 6, num_scale_levels = 5, scale_window_size = 23, regularizer_space = 0.001, nu_space = 0.025, regularizer_scale = 0.001, nu_scale = 0.025, scale_pyramid_alpha = 1.020) 初始化跟踪器。 filter_sizenum_scale_levels 的值越大,跟踪精度越高,但它需要算力也更大;filter_size 的推荐使用值为 567num_scale_levels 的推荐使用值为 456。 使用 tracker.start_track() 可以开始跟踪。在开始追踪前,我们需要先执行人脸检测,并将检测到的人脸位置传递给这个方法:

if tracking_face is False:
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 尝试检测人脸以初始化跟踪器
    rects = detector(gray, 0)
    # 检查是否检测到人脸
    if len(rects) > 0:
        # 开始追踪
        tracker.start_track(frame, rects[0])
        tracking_face = True
复制代码

当检测到人脸后,人脸跟踪器将开始跟踪边界框内的内容。为了更新被跟踪对象的位置,需要调用 tracker.update() 方法:

tracker.update(frame)
复制代码

tracker.update() 方法更新跟踪器并返回衡量跟踪器置信度的指标,此指标可用于使用人脸检测重新初始化跟踪器。 要获取被跟踪对象的位置,需要调用 tracker.get_position() 方法:

pos = tracker.get_position()
复制代码

tracker.get_position() 方法返回被跟踪对象的位置。最后,绘制人脸的预测位置:

cv2.rectangle(frame, (int(pos.left()), int(pos.top())), (int(pos.right()), int(pos.bottom())), (0, 255, 0), 3)
复制代码

下图中,显示了人脸跟踪算法的跟踪效果过程:

人脸追踪

在上图中,可以看到算法当前正在跟踪检测到的人脸,同时还可以按数字 1 以重新初始化跟踪。

3. 使用基于 dlib DCF 的跟踪器进行对象跟踪

除了人脸外,基于 dlib DCF 的跟踪器可以用于跟踪任意对象。接下来,我们使用鼠标选择要跟踪的对象,并监听键盘事件,如果按 1,将开始跟踪预定义边界框内的对象;如果按 2,预定义的边界框将被清空,跟踪算法将停止,并等待用户选择另一个边界框。 例如,我们对检测小姐姐并不感兴趣,而更喜欢猫,那么我们可以首先用鼠标绘制矩形框选择喵咪,然后按 1 开始追踪小猫咪,如果我们想要追踪其他物体,可以按 2 重新绘制矩形框并进行追踪。

    # 设置并绘制一个矩形,跟踪矩形框内的对象
    if len(points) == 2:
        cv2.rectangle(frame, points[0], points[1], (0, 0, 255), 3)
        dlib_rectangle = dlib.rectangle(points[0][0], points[0][1], points[1][0], points[1][1])

    if tracking_face is True:
        # 更新跟踪器并打印测量跟踪器的置信度
        print(tracker.update(frame))
        # 获取被跟踪对象的位置
        pos = tracker.get_position()
        # 绘制被跟踪对象的位置
        cv2.rectangle(frame, (int(pos.left()), int(pos.top())), (int(pos.right()), int(pos.bottom())), (0, 255, 0), 3)
复制代码

如下所示,我们可以看到算法跟踪对象并进行实时输出:

使用基于 dlib DCF 的跟踪器进行对象跟踪

小结

dlib 库实现了基于 DCF 的跟踪器,非常适合用于进行人脸追踪,使用 dlib.correlation_tracker() 函数初始化跟踪器,tracker.start_track() 函数用于开始追踪对象,tracker.update() 函数更新追踪器并且返回追踪器置信度,若要获取被跟踪对象的位置需要使用 tracker.get_position() 函数。