Supervision 项目深度解析:以 Detections 为核心的模型无关计算机视觉工具链
本篇基于 Supervision 仓库的 关于文档 及其源码,解析这个由 Roboflow 维护的开源 Python 计算机视觉库。Supervision 的定位是为开发者提供一套模型无关(model-agnostic)的工具包:加载模型预测结果、在图像与视频上画标注、跨帧跟踪、区域计数、数据集格式转换,以及模型性能评估。读完本文,你将理解其核心数据结构 Detections 为何是整个库的“通用语言”、它支持哪些模型输出转换器、如何安装配置,以及标注、跟踪、数据集与指标等各模块的源码落点,从而能把它接入自己的视觉流水线而不必为更换模型重写后处理代码。
项目定位:把模型输出统一为一种数据表示
Supervision 的核心思路可以概括为一句话:先把“模型说了什么”统一成 Detections,再用一套与模型无关的工具去处理它。官方关于文档指出,该库围绕一个统一的 Detections API 展开,并为 Ultralytics、Roboflow Inference、Hugging Face Transformers、SAM、Detectron2、MMDetection、YOLO-NAS、PaddleDet、NCNN、Azure AI Vision 以及 Florence-2、PaliGemma、Qwen VL、Gemini、DeepSeek VL 2、Moondream 等 VLM 解析器提供了转换器(converters)。
这种设计的直接收益是:团队更换检测/分割/视觉语言模型时,标注、过滤、跟踪、数据集处理与指标评估等下游代码无需重写——它们只消费 Detections。仓库 首页 进一步说明,与 RF-DETR 搭配时 model.predict() 会原生返回 Detections,连转换步骤都省掉。
Supervision 由 Roboflow 与开源贡献者社区共同维护,采用 MIT 许可证(见 LICENSE.md),在 GitHub 公开开发并发布到 PyPI。关于文档列出的核心维护与贡献者包括 Piotr Skalski、Borda、onuralpszr、Soumik Mandal 等;这一事实也可在 pyproject.toml 的元数据中得到印证——maintainers 字段登记了 Piotr Skalski(piotr@roboflow.com),authors 为 “Roboflow et al.”。
安装与环境要求
关于文档与 llms.txt 给出的安装方式非常简洁,核心是 pip:
pip install supervision
其中 metrics 为可选依赖,仅在需要指标相关功能时按需安装:
pip install supervision[metrics]
示例资产下载工具(sample asset utilities)包含在基础包内的 supervision.assets 模块中。
环境要求以仓库元数据为准。从 pyproject.toml 的 requires-python = ">=3.10" 可知最低 Python 版本为 3.10;classifiers(pyproject.toml)声明了 3.10 至 3.14 各版本,以及 macOS / Windows / Linux 三大平台。当前开发版本号为 pyproject.toml 中的 0.31.0.dev0。
基础依赖(pyproject.toml)包括 av、defusedxml、matplotlib、numpy、pillow、pydeprecate、pyyaml、requests、scipy、tqdm;可选依赖还有 geotiff(rasterio,用于地理栅格切片)与 metrics(pandas,用于指标计算)。
核心数据结构 Detections:库的“通用语言”
Detections 是整个库的枢纽:每一个连接器(connector)、标注器(annotator)、跟踪器(tracker)都以它为输入或输出。它实现于 src/supervision/detection/core.py,是一个 @dataclass,字段定义清晰地列出了它能携带的信息:
xyxy:形状(n, 4)的框坐标数组,格式为[x1, y1, x2, y2];mask:形状(n, H, W)的分割掩码(bool类型),无掩码时为None,也可为更紧凑的CompactMask;confidence:形状(n,)的置信度,缺失时为None;class_id:形状(n,)的类别 ID,缺失时为None;tracker_id:形状(n,)的跟踪器 ID,缺失时为None;data:字典,用于存放逐检测(per-detection)的任意附加元数据(如class_name),每个 key 对应一个 NumPy 数组或列表;metadata:字典,存放作用于整个检测集合的集合级元数据(如视频名、相机参数、时间戳)。
在对象构造时会通过 __post_init__ 调用 _validate_detections_fields 对各字段做一致性校验(core.py),保证各字段长度对齐。它实现了 __len__、__iter__(逐检测产出 (xyxy, mask, confidence, class_id, tracker_id, data) 元组)与 __eq__,并支持 NumPy 风格的布尔索引,可按类别、置信度、面积与空间区域进行过滤——这让“筛选检测”变成一行 NumPy 式表达式。
模型连接器:一套 from_* 类方法覆盖主流输出
关于文档强调的“支持多种模型转换器”,在源码层面落地为 Detections 上的一系列 from_* 类方法。以 core.py 中的定义为例:
from_ultralytics(core.py):接受 Ultralytics 检测与分割结果;from_inference(core.py):接受 Roboflow Inference 的检测与分割结果;from_transformers(core.py):接受 Hugging Face Transformers 输出,需传入id2label;from_sam(core.py)与from_sam3:接受 SAM 系列结果;from_detectron2、from_mmdetection、from_yolo_nas、from_paddledet、from_ncnn、from_azure_analyze_image、from_tensorflow、from_deepsparse、from_easyocr等。
core.py 顶部的 import 还引入了 from_florence_2、from_paligemma、from_qwen_2_5_vl、from_qwen_3_vl、from_google_gemini_*、from_deepseek_vl_2、from_moondream 等 VLM 解析器,与 from_lmm / from_vlm 类方法配套,覆盖视觉语言模型场景。
一个典型调用模式(来自 core.py 的文档示例):
from supervision import _cv2 as cv2
import supervision as sv
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
image = cv2.imread("<SOURCE_IMAGE_PATH>")
results = model(image)[0]
detections = sv.Detections.from_ultralytics(results)
一旦得到 Detections,后续所有工具都只与它打交道,模型来源的差异被隔离在 from_* 这一步之内——这正是“模型无关”的具体含义。
工具链全景:标注、跟踪、区域计数、数据集与指标
Detections 之上是一组围绕它构建的可组合工具。从 src/supervision/init.py 导出的公共 API(__all__)可以完整看到库的能力边界,按用途分组如下:
标注(annotators):BoxAnnotator、MaskAnnotator、LabelAnnotator、RichLabelAnnotator、TraceAnnotator、HeatMapAnnotator、PixelateAnnotator、BlurAnnotator、OrientedBoxAnnotator、RoundBoxAnnotator 等。标注器统一暴露 annotate(scene=..., detections=...),传入输入图像与 Detections 即可得到画好标注的输出。LabelAnnotator 可使用显式 labels,或回退到 detections["class_name"]、类别 ID、检测索引;颜色可按类别分配或手动指定。
跟踪(tracker):内置 sv.ByteTrack 通过 update_with_detections() 接受 Detections 并为跨帧对象分配持久 ID。需要注意:根据 llms.txt 的说明,该包装器已弃用(deprecated),转而推荐使用外部 trackers 包中的 ByteTrackTracker(对应方法名为 update())。在源码里可以印证这一点:ByteTrack 被放入 __all__,但实际通过模块级 __getattr__ 懒加载并附带弃用导出逻辑(见 init.py),实现位于 src/supervision/tracker/byte_tracker/core.py。跟踪后的 Detections 可与 sv.TraceAnnotator 配合可视化轨迹。
区域计数(zone):sv.PolygonZone 用于任意多边形区域,trigger(detections) 返回“当前在多边形内”的检测布尔掩码;sv.LineZone 用于线穿越计数,trigger(detections) 返回 (crossed_in, crossed_out) 数组,且依赖 detections.tracker_id 以跨帧匹配同一对象。两者通常搭配对应区域标注器使用。
数据集(datasets):sv.DetectionDataset 支持在 YOLO、COCO JSON、Pascal VOC、CreateML、LabelMe 五种格式间加载、合并、切分与转换(见 src/supervision/dataset/core.py,格式实现位于 src/supervision/dataset/formats/)。sv.ClassificationDataset 则通过 from_folder_structure() 导入、as_folder_structure() 导出文件夹结构数据集。
小目标检测:sv.InferenceSlicer 提供 SAHI 式推理切片——把高分辨率图像切成带重叠的瓦片、逐瓦片检测、再用 NMS 或 NMM(non-maximum merge)合并结果,瓦片重叠用像素单位的 overlap_wh 配置(实现见 src/supervision/detection/tools/inference_slicer.py)。
结果落盘:sv.CSVSink 与 sv.JSONSink 以上下文管理器方式使用,调用 sink.append(detections, custom_data=...) 后,每个检测写出一行/一个对象,包含框坐标、置信度、类别 ID、跟踪 ID 与 data 字段。
指标(metrics):用于基准测试。关于 mAP@0.5:0.95,官方建议从源码结构看使用 supervision.metrics.MeanAveragePrecision,通过 update(...) 累积预测与真值、再调用 compute(),而不是已弃用的顶层 sv.MeanAveragePrecision.from_detections();混淆矩阵则用 sv.ConfusionMatrix.from_detections(predictions=..., targets=..., classes=...) 生成(实现位于 src/supervision/metrics/)。
一个可运行的最小示例
仓库 首页 给出的快速示例展示了“模型 → Detections → 标注”的完整闭环,可直接复制运行(以 RF-DETR 为例,需另装 rfdetr):
import cv2
import supervision as sv
from rfdetr import RFDETRMedium
model = RFDETRMedium()
image = cv2.imread("image.jpg")
detections = model.predict(image[:, :, ::-1])
box_annotator = sv.BoxAnnotator()
label_annotator = sv.LabelAnnotator()
annotated_image = box_annotator.annotate(scene=image, detections=detections)
annotated_image = label_annotator.annotate(scene=annotated_image, detections=detections)
如果使用的是 Ultralytics / Inference / SAM 等模型,则把 model.predict(...) 换成对应模型的推理结果,再调用对应的 sv.Detections.from_* 得到 Detections 即可——标注器之后的流程完全一致。这正是关于文档所说的“更换模型而不重写下游代码”的直观体现。
仓库 examples/ 目录提供了多个贴近实战的完整脚本,可作参考:examples/tracking、examples/traffic_analysis、examples/count_people_in_zone、examples/heatmap_and_track、examples/speed_estimation、examples/time_in_zone 与 examples/compact_mask,均配套各自的 README 与 requirements。
文档与获取帮助
Supervision 的文档站点允许通用爬虫与部分 AI 爬虫访问,robots.txt 明确放行 GPTBot、ClaudeBot、PerplexityBot、CCBot、GoogleOther 等(见 llms.txt 的 “AI Access” 一节);llms.txt 同时整理了关键 API、How-To 指南、参考文档、Cookbooks 与 FAQ 的导航,可作为检索入口。
项目链接(来自关于文档):源码仓库 github.com/roboflow/supervision、PyPI 包 pypi.org/project/supervision、社区 Roboflow Discord 与 roboflow.com。
引用与许可证
如果 Supervision 用于研究或生产系统,可引用项目:仓库根目录提供了 CITATION.cff(cff-version 1.2.0,type: software,license: MIT,作者 Roboflow),以及 llms.txt 中给出的 BibTeX 引用块(@software{supervision, author={Roboflow}, title={Supervision: Computer Vision Toolkit}, url={...}, year={2023})。
许可证方面,Supervision 采用 MIT 许可证,完整条款见 LICENSE.md。
小结
Supervision 的价值在于把一个高度重复、且常被“换个模型就重写一遍”的环节——检测结果的表示与后处理——沉淀为一个稳定的核心数据结构 Detections(core.py)与一组只与它交互的通用工具。理解这一点,就抓住了 关于文档 的主线:统一表示(Detections 与各 from_* 连接器)是主体,标注、跟踪、区域计数、数据集转换、小目标切片与指标评估都是围绕它生长的可组合工具。对开发者而言,只要把模型输出落到 Detections,后续所有能力都能以一致、可复用的方式接入,这正是该库“模型无关”承诺的技术基础。
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