首页
/ Supervision 常见问题(FAQ)技术指南:从安装配置、模型生态到跟踪计数与基准评测

Supervision 常见问题(FAQ)技术指南:从安装配置、模型生态到跟踪计数与基准评测

2026-09-07 16:54:28作者:宣海椒Queenly

本指南基于开源计算机视觉工具库 Supervision 的官方 FAQ(见 docs/faq.md),围绕安装方式、支持的模型与数据格式、对象跟踪与计数、基准评测、许可证以及摄像头取流等高频问题展开。读完本文,你将掌握 Supervision 的快速上手路径、核心数据结构的定位,以及如何在真实项目中正确组合其注解器、跟踪器与评测工具,避免踩中 API 废弃与 OpenCV 依赖等常见坑。

Supervision 是什么?统一 Detections 数据结构

Supervision 是 Roboflow 团队开源的 Python 计算机视觉工作流库。它不重复造轮子去训练模型,而是把"模型预测之后的脏活累活"——结果标准化、可视化注解、过滤、跟踪、计数、数据集读写、指标评测——统一收拢成一套可复用 API。

其核心是一套统一的 Detections 类,负责承载检测(目标框)、分割(掩码)以及视觉语言模型(VLM)的输出结果,并提供了面向各类主流框架的转换器(converters)。从源码看,Detections 是一个 dataclass,其字段构成所有下游工具的"标准输入协议":

字段 形状/类型 语义
xyxy (n, 4) 边界框坐标,格式 [x1, y1, x2, y2]
mask (n, H, W) 布尔数组 或 CompactMask 分割掩码,可为 None
confidence (n,) 置信度分数,可为 None
class_id (n,) 类别编号,可为 None
tracker_id (n,) 跟踪器分配的跨帧 ID,可为 None
data dict[str, ...] 附加逐目标数据
metadata dict 作用于整批检测的集合级元数据

围绕 Detections(以及分类用的 Classifications、关键点用的 KeyPoints),整个库按能力域组织为多组工具:负责视觉呈现的 annotators、负责区域/线段/滑窗等下游处理的 tools、负责数据集读写的 dataset 子系统、负责 mAP/混淆矩阵等计算的 metrics 子系统。顶层全部符号统一从 import supervision as sv 导出(见 src/supervision/init.py)。

如何安装 Supervision?

基础包直接使用 pip 安装:

pip install supervision

当需要可选指标依赖时,安装 metrics extra:

pip install "supervision[metrics]"

以当前仓库 pyproject.toml 为准,metrics extra 目前引入 pandas>=2 作为额外依赖,用于支撑评测指标结果的结构化整理与导出。样本资源下载工具(supervision.assets)属于基础包的一部分,无需额外 extra 即可使用。

安装前请注意几点环境约束:

  • Python 版本requires-python = ">=3.10",即至少需要 Python 3.10(官方分类器覆盖 3.10 至 3.14)。
  • 许可证:项目以 MIT 协议开源(见 pyproject.toml),可自由用于商业与非商业项目。
  • 不强制安装 OpenCV:Supervision 自身不把 OpenCV 作为硬依赖打包。它的图像、绘制与文件级视频 API 统一经由内部的 supervision._cv2 兼容层访问(见 src/supervision/_cv2/init.py):当环境中已存在兼容的 cv2 时自动优先使用;当 cv2 不可用时,则使用内置的纯 Python/NumPy 回退实现,保证基础功能可用。

如果你正在已有环境上升级、或希望自行选择 OpenCV wheel(如 opencv-python-headless 以减小体积),建议先阅读 OpenCV 迁移指南 再动手,避免图像通道顺序、绘制字体等行为差异带来的意外。

支持哪些目标检测模型?

Supervision 是**模型无关(model agnostic)**的。它不绑定任何推理引擎,而是用统一的 Detections 输出格式去适配不同模型结果。模型的 predict 输出 → Detections,之后无论是画框、跟踪还是统计,代码几乎不再随模型变化。

其中 RF-DETR 是"零转换"特例:它的 predict 方法直接返回 sv.Detections 对象(源码文档注释中明确说明"no conversion step is needed",见 detection/core.py),例如:

import supervision as sv
from rfdetr import RFDETRMedium

model = RFDETRMedium()
detections = model.predict(image[:, :, ::-1])  # 已是一个 sv.Detections

对于其余框架,sv.Detections 提供了一整套 from_* 类方法转换器,覆盖面极广(方法均定义于 src/supervision/detection/core.py):

  • Roboflow Inference:from_inference
  • Hugging Face Transformers:from_transformers(检测与分割结果均可)
  • Ultralytics YOLO:from_ultralytics
  • YOLO-NAS:from_yolo_nas
  • Detectron2:from_detectron2
  • MMDetection:from_mmdetection
  • SAM / SAM3:from_sam / from_sam3
  • PaddleDet:from_paddledet
  • NCNN:from_ncnn
  • Azure AI Vision:from_azure_analyze_image
  • TensorFlow:from_tensorflow
  • EasyOCR:from_easyocr
  • VLM 输出解析器:from_vlm / from_lmm,覆盖 Florence-2、PaliGemma、Qwen VL(2.5/3)、Gemini(2.0/2.5/3.5)、DeepSeek VL 2、Moondream 等(对应实现集中在 src/supervision/detection/vlm.pyfrom_florence_2from_paligemmafrom_qwen_2_5_vlfrom_deepseek_vl_2from_moondream 等函数)。

以 Ultralytics 与 Transformers 为例:

import supervision as sv
from ultralytics import YOLO

model = YOLO("yolov8n.pt")
results = model(image)[0]
detections = sv.Detections.from_ultralytics(results)
import torch
import supervision as sv
from PIL import Image
from transformers import DetrImageProcessor, DetrForObjectDetection

processor = DetrImageProcessor.from_pretrained("facebook/detr-resnet-50")
model = DetrForObjectDetection.from_pretrained("facebook/detr-resnet-50")

inputs = processor(images=Image.open("image.jpg"), return_tensors="pt")
with torch.no_grad():
    outputs = model(**inputs)

h, w = Image.open("image.jpg").size
results = processor.post_process_object_detection(
    outputs=outputs, target_sizes=torch.tensor([[h, w]]))[0]

detections = sv.Detections.from_transformers(
    transformers_results=results, id2label=model.config.id2label)

此外,关键点(keypoint)模型的输出并不走 Detections,而是有独立的 sv.KeyPoints 及其转换器(例如 MediaPipe),配套 EdgeAnnotatorVertexAnnotatorVertexLabelAnnotator 等注解器使用。各转换器的详细签名与参数,可查阅 docs/detection/core.md

用 Supervision 可以做什么?

Detections 为核心,Supervision 提供了一套纵向贯穿检测后处理全流程的能力:

  1. 注解(Annotate):约 20+ 个注解器,包括 BoxAnnotatorMaskAnnotatorLabelAnnotatorTraceAnnotatorHeatMapAnnotatorBlurAnnotator(人脸/车牌打码)、PixelateAnnotatorDotAnnotatorRoundBoxAnnotatorTriangleAnnotatorOrientedBoxAnnotator 等,统一通过 annotate(frame, detections) 调用。完整清单见 docs/detection/annotators.md
  2. 过滤与后处理:基于 confidence 过滤、按类别筛选、with_nms/with_soft_nms 去重、OverlapFilter 重叠过滤。
  3. 跟踪(Track):为检测分配跨帧稳定 ID,为跨线计数、轨迹可视化提供前提。
  4. 计数(Count)PolygonZone 统计多边形区域内对象,LineZone 统计穿越线段的对象。
  5. 数据集读写(Datasets):在检测/分割模型与主流标注格式之间做双向转换。
  6. 评测(Metrics):mAP、混淆矩阵、精确率/召回率等,量化模型表现。
  7. 导出(Export)CSVSinkJSONSink 把逐帧检测结果序列化,供下游分析。

如何跨帧跟踪对象?

跨帧跟踪的本质是:在可视化之前,先为每一帧检测分配持久的 tracker_id,再用该 ID 串联起目标在时间轴上的行为。

过去 Supervision 内置了 sv.ByteTrack 包装类,用法是 tracker.update_with_detections(detections)需要注意:该内置实现目前已被标记废弃——源码中它以 deprecated_in="0.28.0"、计划在 remove_in="0.31.0" 移除(见 src/supervision/tracker/byte_tracker/core.py),官方推荐迁移到独立的 trackers 第三方包中的 ByteTrackTrackerpip install trackers),且方法名由 update_with_detections() 更名为 update()。因此新项目应直接以外部 trackers 包为准,Supervision 侧只需负责把跟踪结果交给注解器绘制。

跟踪后的典型可视化组合是 sv.TraceAnnotator(绘制运动轨迹)+ sv.BoxAnnotator(画框)+ sv.LabelAnnotator(叠加 ID/类别标签)。完整流程示例可参考 对象跟踪指南 与仓库中的 examples/tracking 示例目录。

支持哪些数据集格式?

针对检测数据集,Supervision 内置了五种主流格式的读写支持:

  • YOLODetectionDataset.from_yolo() / as_yolo()
  • COCO JSONDetectionDataset.from_coco() / as_coco()
  • Pascal VOCDetectionDataset.from_pascal_voc() / as_pascal_voc()
  • CreateMLDetectionDataset.from_createml() / as_createml()
  • LabelMeDetectionDataset.from_labelme() / as_labelme()

from_* 系列用于把磁盘上的标注集加载为统一的 DetectionDataset 对象,as_* 系列用于把内存中的数据集导出回对应格式,从而在格式间无缝互转。各格式解析器的实现位于 src/supervision/dataset/formats,详细用法见 数据集指南

如何统计区域内/跨线目标数?

Supervision 提供了两种"按空间规则计数"的工具:

  • sv.PolygonZone:针对任意多边形区域统计内部对象数量(常用于人流量、占用率分析)。配套 PolygonZoneAnnotator 可把多边形与计数结果直接绘制到画面上,详见 docs/detection/tools/polygon_zone.md
  • sv.LineZone:统计穿过一条自定义线段的对象数量(区分正向/反向穿越),多用于出入口客流。配套 LineZoneAnnotator / LineZoneAnnotatorMulticlass 负责可视化。

一个关键前置条件是:LineZone 的触发依赖 detections.tracker_id。源码 line_zone.py 中明确指出,当 tracker_id 缺失时"line zone counting skipped",因为跨帧判定"同一目标是否过线"必须借助稳定的跟踪 ID——如果每帧都按新目标处理,计数将完全失真。因此标准流水线顺序是:先跑跟踪器填充 tracker_id,再喂给 LineZone

import supervision as sv

zone = sv.LineZone(start=sv.Point(0, 400), end=sv.Point(1280, 400))
# detections 必须先经过 tracker,确保 detections.tracker_id 非空
zone.trigger(detections)
print(zone.in_count, zone.out_count)

一个演示区域统计与跟踪结合完整链路的可运行工程是 examples/count_people_in_zone,它同时提供了基于单区域、多区域与四象限配置的示例;逐帧计数的原理验证也可参考测试 tests/detection/test_line_counter.py。更综合的实践指引见 docs/how_to/count_in_zone.md

如何基准评测一个模型?

评测需要先安装可选依赖:

pip install "supervision[metrics]"

随后使用两类核心评测对象:

  • supervision.metrics.mean_average_precision.MeanAveragePrecision:计算 mAP 系列指标,亦可直接通过顶层 sv.MeanAveragePrecision 访问;
  • sv.ConfusionMatrix:生成混淆矩阵,直观反映误检与漏检分布(类间混淆)。

两者的使用范式一致:先把"预测结果"与"真实标注"分别累积为对应的 Detections 集合,再调用 compute() 统一结算指标(类定义见 src/supervision/metrics/detection.pyConfusionMatrixMeanAveragePrecision)。

import supervision as sv

mAP = sv.MeanAveragePrecision()
confusion_matrix = sv.ConfusionMatrix()

# 逐样本累积预测与真值 Detections
# mAP.update(predictions, targets)
# confusion_matrix.update(predictions, targets)

results = mAP.compute()      # 返回结构化指标结果
print(results.map50_95)

叠加检测模型的端到端评测流程见 docs/how_to/benchmark_a_model.md,mAP 指标的字段含义与计算细节可参考 docs/metrics/mean_average_precision.mddocs/detection/metrics.md

Supervision 免费吗?

免费。Supervision 以 MIT 许可证开源发布(许可证全文见仓库 LICENSE.md,版本信息在 pyproject.toml),可以自由地用于个人、科研与商业项目,无需授权费用。不过在实际项目落地时仍需留意:它打包的模型与推理框架各自拥有独立的许可证,商用前请逐一对所用组件进行合规确认。

如何用 Supervision 处理摄像头画面?

Supervision 本身不负责采集实时摄像头画面,这一点在 FAQ 中被明确说明。正确的姿势是:自己用 cv2.VideoCapture 管理采集设备(无论环境装的是 opencv-python 还是 opencv-python-headless 均可),逐帧读取后,把每一帧交给 Supervision 的注解器处理:

import cv2  # requires: pip install opencv-python (or opencv-python-headless)
import supervision as sv

cap = cv2.VideoCapture(0)
annotator = sv.BoxAnnotator()

while True:
    ret, frame = cap.read()
    if not ret:
        break
    # 在这里运行你的检测器,得到 detections
    # detections = model.predict(frame)
    # 然后进行注解:
    # annotated = annotator.annotate(frame, detections)

cap.release()

若你想处理的不是摄像头而是已录制的视频文件(或逐帧回调处理整段视频),Supervision 则提供了开箱即用的 get_video_frames_generatorprocess_video(见 docs/utils/video.md),配合 VideoSink 即可完成"读帧→检测→注解→写回视频"的完整管线。

源码在哪里,如何继续探索?

Supervision 的完整源码位于仓库根目录下,核心代码布局如下,便于你按图索骥:

进一步的上手路线图,可依次阅读 快速开始(Quickstart)笔记本docs/detection/core.md,再根据业务场景切入对应的 how-to 文档。

小结

Supervision 的价值在于把计算机视觉项目里"重复、易错、模型相关"的部分标准化:用 Detections 统一所有检测/分割/VLM 输出,用 annotators、zone/line 工具、dataset 与 metrics 覆盖检测后全流程,同时通过内置回退与不强制 OpenCV 的策略降低环境耦合。实践时请记住三件事:新项目直接用外部 trackers 包的 ByteTrackTracker(内置 sv.ByteTrack 已废弃);跨线计数务必先跟踪出 tracker_id摄像头采集自己用 cv2.VideoCapture 管理,Supervision 专注在拿到帧之后的一切处理。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.13 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
897
5.8 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
529
593
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
915
1.83 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.58 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.35 K
1.46 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.01 K
515
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
547
388