Skip to main content

用于实时 2D 对象跟踪的轻量级 Python 库。

项目描述

Norfair by Tryolabs 徽标

拥抱面部空间 在 Colab 中打开 文档 木板 构建状态 DOI

Norfair 是一个可定制的轻量级 Python 库,用于实时多对象跟踪。

使用 Norfair,您只需几行代码即可为任何检测器添加跟踪功能。

使用移动摄像头跟踪玩家 跟踪 3D 对象

特征

  • 任何将其检测表示为一系列(x, y)坐标的检测器都可以与 Norfair 一起使用。这包括执行任务的检测器,例如对象或关键点检测(参见示例)。

  • 模块化的。它可以很容易地插入到复杂的视频处理管道中,为现有项目添加跟踪。同时,可以仅使用 Norfair 和检测器从头开始构建视频推理循环。

  • 支持移动相机、带有外观嵌入的重新识别和 n 维对象跟踪(请参阅高级功能)。

  • 用于计算被跟踪对象和检测之间距离的函数由用户定义,从而实现不同的跟踪策略。

  • 快速地。唯一限制推理速度的将是检测网络向 Norfair 提供检测。

Norfair 由Tryolabs构建、使用和维护。

安装

Norfair 目前支持 Python 3.6+。

对于最小版本,安装为:

pip install norfair

要使 Norfair 安装依赖项以支持更多功能,请安装为:

pip install norfair[video]  # Adds several video helper features running on OpenCV
pip install norfair[metrics]  # Supports running MOT metrics evaluation
pip install norfair[metrics,video]  # Everything included

如果系统中已经存在所需的依赖项,安装 Norfair 的最小版本就足以启用额外的功能。这对于嵌入式设备特别有用,在这些设备中安装编译的依赖项可能很困难,但它们有时可以预装在系统中。

文档

官方参考可在此处获得

示例和演示

拥抱面部空间 在 Colab 中打开

我们提供了几个示例,说明如何使用 Norfair 为不同的探测器添加跟踪功能,并展示更高级的功能。

注意:为了便于重现,我们为所有演示提供了 Dockerfile。尽管 Norfair 不需要 GPU,但大多数演示的默认配置都需要 GPU 才能运行检测器。为此,请确保您安装了NVIDIA Container Toolkit,以便您的 GPU 可以与 Docker 共享。

可以使用 CPU 运行多个演示,但您必须修改脚本或修补其依赖项的安装。

向不同的检测器添加跟踪

大多数跟踪演示都展示了车辆和行人,但检测器通常使用来自COCO 数据集的更多类进行训练。

  1. YOLOv7:跟踪对象质心或边界框。
  2. YOLOv5:跟踪对象质心或边界框。
  3. YOLOv4:跟踪对象质心。
  4. Detectron2:跟踪对象质心。
  5. AlphaPose:跟踪人类关键点(姿势估计)并将 Norfair 插入到复杂的现有管道中。
  6. OpenPose:跟踪人类关键点。

高级功能

  1. 通过使用OpenPose推断检测来加速姿势估计
  2. 跟踪边界框和人类关键点(多类),统一来自 YOLO 模型和 OpenPose 的检测。
  3. 使用外观嵌入对跟踪对象进行重新识别 (ReID)。对于有很多遮挡的场景,这是一个很好的起点,在这种场景中,单独的卡尔曼滤波器会很困难。
  4. 通过估计可能考虑平移、倾斜、旋转、任何方向的移动和缩放的摄像机运动,即使摄像机正在移动,也能准确跟踪对象。
  5. 使用MediaPipe Objectron在 3D 中跟踪点

基准测试和分析

  1. 使用TRT 姿态估计器的卡尔曼滤波器和距离函数分析
  2. 使用motmetrics4norfair计算MOT17分数。

Norfair OpenPose 演示

这个怎么运作

Norfair 的工作原理是根据过去的位置估计每个点的未来位置。然后它尝试将这些估计位置与检测器提供的新检测点进行匹配。为了进行这种匹配,Norfair 可以依赖库用户指定的任何距离函数。因此,每个对象跟踪器都可以根据需要变得简单或复杂。

下面是一个计算跟踪对象和检测之间的欧几里德距离的特别简单的距离函数的示例。这可能是您可以在 Norfair 中使用的最简单的距离函数,因为每个检测/对象仅使用一个点。

 def euclidean_distance(detection, tracked_object):
     return np.linalg.norm(detection.points - tracked_object.estimate)

作为一个例子,我们使用Detectron2来获取单点检测以与此距离函数一起使用。我们只是使用它在汽车周围产生的边界框的质心作为我们的检测,并得到以下结果。

使用 Norfair 跟踪汽车

在左侧,您可以看到我们从 Detectron2 获得的点,而在右侧,Norfair 如何跟踪它们并通过时间分配唯一标识符。当所需的跟踪很简单时,即使是这样一个简单的距离函数也可以工作。

Norfair 还提供了几个有用的工具来创建视频推理循环。以下是创建上一个示例的完整代码,包括设置 Detectron2 所需的代码:

import cv2
import numpy as np
from detectron2.config import get_cfg
from detectron2.engine import DefaultPredictor

from norfair import Detection, Tracker, Video, draw_tracked_objects

# Set up Detectron2 object detector
cfg = get_cfg()
cfg.merge_from_file("demos/faster_rcnn_R_50_FPN_3x.yaml")
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5
cfg.MODEL.WEIGHTS = "detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl"
detector = DefaultPredictor(cfg)

# Norfair
video = Video(input_path="video.mp4")
tracker = Tracker(distance_function=euclidean_distance, distance_threshold=20)

for frame in video:
    detections = detector(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
    detections = [Detection(p) for p in detections['instances'].pred_boxes.get_centers().cpu().numpy()]
    tracked_objects = tracker.update(detections=detections)
    draw_tracked_objects(frame, tracked_objects)
    video.write(frame)

视频和绘图工具使用 OpenCV 帧,因此它们与大多数在线可用的 Python 视频代码兼容。点跟踪基于SORT泛化到检测,每个检测由动态变化的点数组成。

动机

尝试最新的最先进的检测器通常需要运行并不易于使用的存储库。这些往往是与描述一种新的检测方法的研究论文相关的存储库,因此它们旨在作为一次性评估脚本运行,以获得一些结果指标以在特定的研究论文上发布。这解释了为什么它们往往不容易作为推理脚本运行,或者为什么提取核心模型以在另一个独立脚本中使用并不总是微不足道的。

Norfair 的诞生是为了在各种新发布的 SOTA 探测器上快速添加一个简单的跟踪层。它旨在以最小的努力无缝地插入复杂、高度耦合的代码库。Norfair 提供了一系列模块化但兼容的工具,您可以选择在项目中使用它们。

与其他跟踪器的比较

Norfair 对 Python 对象跟踪器库曲目的贡献在于它能够与任何对象检测器一起工作,每次检测能够处理可变数量的点,并且用户能够通过创建自己的距离函数来大量自定义跟踪器。

如果您正在寻找跟踪器,这里有一些其他值得注意的项目:

  • OpenCV包括几个跟踪解决方案,例如KCF TrackerMedianFlow Tracker,它们的运行方式是让用户选择要跟踪的帧的一部分,然后让跟踪器跟随该区域。它们往往不会在检测器之上运行,并且不是很健壮。
  • dlib包括一个相关的单对象跟踪器。如果您想用它跟踪多个对象,您必须自己在其之上创建自己的多个对象跟踪器。
  • AlphaPose刚刚发布了他们的人体姿态跟踪器的新版本。该跟踪器紧密集成到他们的代码库中,并用于跟踪人体姿势的任务。
  • SORTDeep SORT与此 repo 相似,因为它们使用卡尔曼滤波器(以及用于 Deep SORT 的深度嵌入),但它们被硬编码为固定距离函数和跟踪框。Norfair 还在将跟踪对象与检测匹配时添加了一些过滤,并为自己的距离最小化器更改了匈牙利算法。这两个 repos 也是在 GPL 许可下发布的,这对于某些个人或公司来说可能是一个问题,因为需要发布衍生作品的源代码。

基准

使用motmetrics4norfair演示脚本获得的MOT17结果。调整超参数以MOTA在该数据集上达到较高水平。建议将一组更平衡的超参数(如其他演示中使用的默认参数)用于生产。

回复 个人资料 GT MT PT ML FP FN ID 调频 莫塔MOTP
MOT17-13-DPM 18.5% 85.8% 110 6 31 73 355 9490 90 100 14.7% 26.7%
MOT17-04-FRCNN 56.3% 93.2% 83 18 43 22 1959 20775 90 104 52.0% 10.7%
MOT17-11-FRCNN 61.4% 92.9% 75 18 34 23 443 3639 65 62 56.1% 10.2%
MOT17-04-SDP 77.5% 97.4% 83 49 25 9 1003 10680 232 257 74.9% 13.2%
MOT17-13-SDP 57.6% 83.3% 110 46 26 38 1349 4934 164 163 44.6% 20.0%
MOT17-05-DPM 38.1% 82.9% 133 11 58 64 544 4281 90 100 28.9% 24.3%
MOT17-09-DPM 59.7% 75.1% 26 4 17 5 1052 2147 120 117 37.7% 26.3%
MOT17-10-DPM 37.5% 84.9% 57 6 19 32 856 8024 127 153 29.8% 24.9%
MOT17-02-SDP 50.9% 75.9% 62 11 38 13 3003 9122 272 290 33.3% 18.4%
MOT17-11-DPM 54.2% 84.7% 75 12 24 39 927 4321 87 63 43.5% 21.7%
MOT17-09-FRCNN 58.5% 98.5% 26 7 17 2 49 2209 40 39 56.8% 9.6%
MOT17-11-SDP 75.7% 90.9% 75 34 30 11 719 2297 112 105 66.9% 14.1%
MOT17-02-FRCNN 36.5% 79.5% 62 7 26 29 1751 11796 124 136 26.4% 13.4%
MOT17-05-FRCNN 54.9% 90.0% 133 23 69 41 420 3123 78 84 47.7% 18.0%
MOT17-04-DPM 42.5% 83.5% 83 7 44 32 3985 27335 406 432 33.2% 21.1%
MOT17-10-SDP 74.1% 88.0% 57 30 24 3 1295 3323 283 286 61.8% 19.8%
MOT17-10-FRCNN 60.9% 75.7% 57 14 37 6 2507 5020 310 306 39.0% 17.2%
MOT17-09-SDP 67.7% 94.6% 26 12 14 0 204 1722 54 56 62.8% 13.0%
MOT17-02-DPM 20.2% 81.4% 62 5 14 43 856 14833 113 109 15.0% 24.6%
MOT17-13-FRCNN 59.3% 74.7% 110 33 53 24 2334 4735 342 331 36.3% 18.4%
MOT17-05-SDP 66.8% 87.9% 133 32 81 20 637 2299 134 133 55.6% 16.5%
全面的 53.7% 87.3% 1638 385 724 529 26248 156135 3333 3426 44.9% 16.4%

商业支持

Tryolabs 可以提供商业支持、在 Norfair 中实施新功能或构建视频分析工具来解决您的挑战性问题。Norfair 为多个视频分析应用程序提供支持,例如面罩检测工具。

如果您有兴趣,请与我们联系

引用诺费尔

对于学术出版物中的引用,请从Zenodo导出您想要的引用格式(BibTeX 或其他) 。

执照

版权所有 © 2022,Tryolabs。根据BSD 3-Clause发布。

项目详情


下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

norfair-2.0.0.tar.gz (44.0 kB 查看哈希)

已上传 source

内置分布

norfair-2.0.0-py3-none-any.whl (41.1 kB 查看哈希

已上传 py3