Supervision 常见问题(FAQ)技术指南:从安装配置、模型生态到跟踪计数与基准评测
本指南基于开源计算机视觉工具库 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.py 的from_florence_2、from_paligemma、from_qwen_2_5_vl、from_deepseek_vl_2、from_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),配套 EdgeAnnotator、VertexAnnotator、VertexLabelAnnotator 等注解器使用。各转换器的详细签名与参数,可查阅 docs/detection/core.md。
用 Supervision 可以做什么?
以 Detections 为核心,Supervision 提供了一套纵向贯穿检测后处理全流程的能力:
- 注解(Annotate):约 20+ 个注解器,包括
BoxAnnotator、MaskAnnotator、LabelAnnotator、TraceAnnotator、HeatMapAnnotator、BlurAnnotator(人脸/车牌打码)、PixelateAnnotator、DotAnnotator、RoundBoxAnnotator、TriangleAnnotator、OrientedBoxAnnotator等,统一通过annotate(frame, detections)调用。完整清单见 docs/detection/annotators.md。 - 过滤与后处理:基于
confidence过滤、按类别筛选、with_nms/with_soft_nms去重、OverlapFilter重叠过滤。 - 跟踪(Track):为检测分配跨帧稳定 ID,为跨线计数、轨迹可视化提供前提。
- 计数(Count):
PolygonZone统计多边形区域内对象,LineZone统计穿越线段的对象。 - 数据集读写(Datasets):在检测/分割模型与主流标注格式之间做双向转换。
- 评测(Metrics):mAP、混淆矩阵、精确率/召回率等,量化模型表现。
- 导出(Export):
CSVSink、JSONSink把逐帧检测结果序列化,供下游分析。
如何跨帧跟踪对象?
跨帧跟踪的本质是:在可视化之前,先为每一帧检测分配持久的 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 第三方包中的 ByteTrackTracker(pip install trackers),且方法名由 update_with_detections() 更名为 update()。因此新项目应直接以外部 trackers 包为准,Supervision 侧只需负责把跟踪结果交给注解器绘制。
跟踪后的典型可视化组合是 sv.TraceAnnotator(绘制运动轨迹)+ sv.BoxAnnotator(画框)+ sv.LabelAnnotator(叠加 ID/类别标签)。完整流程示例可参考 对象跟踪指南 与仓库中的 examples/tracking 示例目录。
支持哪些数据集格式?
针对检测数据集,Supervision 内置了五种主流格式的读写支持:
- YOLO:
DetectionDataset.from_yolo()/as_yolo() - COCO JSON:
DetectionDataset.from_coco()/as_coco() - Pascal VOC:
DetectionDataset.from_pascal_voc()/as_pascal_voc() - CreateML:
DetectionDataset.from_createml()/as_createml() - LabelMe:
DetectionDataset.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.py 中 ConfusionMatrix 与 MeanAveragePrecision)。
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.md 与 docs/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_generator 与 process_video(见 docs/utils/video.md),配合 VideoSink 即可完成"读帧→检测→注解→写回视频"的完整管线。
源码在哪里,如何继续探索?
Supervision 的完整源码位于仓库根目录下,核心代码布局如下,便于你按图索骥:
- src/supervision/detection/core.py:
Detections统一数据结构与全部from_*转换器; - src/supervision/detection/vlm.py:VLM/大模型输出解析器;
- src/supervision/annotators:全部可视化注解器;
- src/supervision/metrics/detection.py:
ConfusionMatrix、MeanAveragePrecision等评测实现; - src/supervision/dataset/formats:YOLO/COCO/VOC/CreateML/LabelMe 各格式解析;
- examples:多套可直接运行的端到端示例工程;
- tests:与各模块一一对应的测试用例,是理解行为边界的最佳旁证。
进一步的上手路线图,可依次阅读 快速开始(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 专注在拿到帧之后的一切处理。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0627
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00