supervision介绍与使用
做计算机视觉的人,大概都经历过这个阶段:模型跑出一堆检测框了,然后呢?
想在画面上画框、画掩码、画轨迹——自己写一版;想统计某个路口过了多少辆车——再写一版;想算车速、做区域热力、把结果导出——又得从头造轮子。这些"模型之外"的脏活累活,每个项目都在重复。直到遇到了 supervision。
1. 标注器
检测结果最直观的价值就是画在画面上。supervision 提供了一整套 Annotator:

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



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 )

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

浙公网安备 33010602011771号