supervision介绍与使用

  做计算机视觉的人,大概都经历过这个阶段:模型跑出一堆检测框了,然后呢?

  想在画面上画框、画掩码、画轨迹——自己写一版;想统计某个路口过了多少辆车——再写一版;想算车速、做区域热力、把结果导出——又得从头造轮子。这些"模型之外"的脏活累活,每个项目都在重复。直到遇到了 supervision。

1. 标注器

  检测结果最直观的价值就是画在画面上。supervision 提供了一整套 Annotator:

image

   这些标注器可以组合调用。官方演示过一个商场俯拍人流场景,同时叠加轨迹线、热力图、标签、脚下椭圆四种标注——热力图把一段时间内人出现的位置累积起来,红黄绿一眼看出哪些区域最拥挤,做商业选址、客流分析时非常实用。

091601

 

091602

091603

 2. 代码实战

import supervision as sv
from ultralytics import YOLO

# 1. 加载 EasyChamp 模型
# model = YOLO('https://huggingface.co/aabyzov/easychamp-player-detection-yolov8/resolve/main/player_detection_best.pt')
model =YOLO("./weights/player_detection_best.pt")

# 2. 初始化追踪器和标注器
tracker = sv.ByteTrack()
box_annotator = sv.BoxAnnotator()
label_annotator = sv.LabelAnnotator()


def callback(frame, _):
    # 3. 对当前帧进行推理
    results = model(frame)[0]
    detections = sv.Detections.from_ultralytics(results)

    # 4. 用 ByteTrack 更新追踪,为每个检测框分配 tracker_id
    detections = tracker.update_with_detections(detections)

    # 5. 生成标签,格式如 "#1 player"(ID + 类别名)
    labels = [
        f"#{tracker_id} {model.names[class_id]}"
        for class_id, tracker_id in zip(detections.class_id, detections.tracker_id)
    ]

    # 6. 在原帧上绘制边界框和追踪 ID
    annotated_frame = box_annotator.annotate(frame.copy(), detections)
    annotated_frame = label_annotator.annotate(annotated_frame, detections, labels)
    return annotated_frame


# 7. 处理整个视频
sv.process_video(
    source_path="input_video.mp4",
    target_path="output_video.mp4",
    callback=callback
)

091604

 

  小结:supervision 几乎是"装了不亏"的那类库——它把视觉落地里最重复、最繁琐的那部分工程活标准化了。从标注到追踪,从计数到测速,从数据集处理到模型评估,它覆盖了模型落地后的完整链路。而这一切,都建立在 sv.Detections 这个统一的抽象之上——无论你用什么模型,输出都能变成同一种格式,后续的处理逻辑一行都不用改。

 

GitHub:https://github.com/roboflow/supervision
文档:https://supervision.roboflow.com

posted @ 2026-09-17 09:34  wancy  阅读(9)  评论(0)    收藏  举报