用Supervision把CV模型输出变成可用的数据,每天省2小时

现实场景:你每天花多少时间在「看图片」这件事上?

我是做技术自动化的,经常遇到这类需求:

  • 运营团队要批量检查外包拍摄的商品图,找出所有包含“人物”的图片并分类
  • 质检部门要统计产线照片中螺丝、垫片、外壳的缺失数量
  • 内容审核要标记每张图中所有文字区域的位置和内容

这些活有个共性:你需要让模型“看”完图片,然后把结果整理成结构化数据——比如哪个坐标有物体、置信度多少、类别是什么。

传统做法是什么?

  1. 用YOLO跑一遍推理,得到一堆text文件(每张图一个)
  2. 写脚本解析这些文本,拼接图片名、类别、坐标
  3. 遇到格式不一致还得手动调整
  4. 最终导出CSV给业务方

这流程我走太多次了。最头疼的不是训练模型,而是把模型输出变成业务能用的数据。如果你每天花1-2小时干这个,那我今天要介绍的工具可以帮你省掉其中的80%。

AI自动化改造思路:与其手写解析,不如直接用轮子

今天讨论的主角是 Roboflow Supervision。它本质上是一套“计算机视觉工具”,专门解决模型推理后那些重复、琐碎但必要的后处理工作

yolo detection result boxes on car image

为什么说它“接地气”?

  • 不让你重新训练模型
  • 不依赖特定框架(YOLOv5/v8/NAS/Detectron2都能用)
  • 不要求你写复杂的NMS、IOU计算
  • 直接封装了检测结果筛选、标注输出、追踪、统计分析等高频操作

我自己的判断:这个库热度暴涨(一天4万+star)说明了一个趋势——开发者已经从“如何让模型更准”转向“如何让模型更好用”。Supervision正好卡在这个痛点上。

工具和脚本实现:5行代码提取检测数据

安装与导入

bash
1
pip install supervision

当前版本0.15.0(写文章时),建议用Python 3.8+。

核心概念:Detections 对象

Supervision把任意模型的检测结果统一封装成 Detections 对象,包含:

  • xyxy:左上右下坐标(numpy array)
  • confidence:置信度列表
  • class_id:类别ID列表
  • tracker_id:追踪ID(如果用了追踪)

不管你是用YOLO还是别的模型,只要转换成这个格式,后面的操作就统一了。

实际案例:批量提取文件夹内图片的检测结果并保存为CSV

假设你有一个文件夹 /images/ 放了1000张商品图,YOLO模型已经训练好。以前你可能这么写:

python
1 2 3 4 5
import cv2
from ultralytics import YOLO

model = YOLO('yolov8n.pt')
# 遍历每个图片,推理,写文件... 还要自己解析坐标

现在用Supervision:

python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
import supervision as sv
import cv2
from ultralytics import YOLO

model = YOLO('yolov8n.pt')

# 1. 创建标注器(自动画框写标签)
box_annotator = sv.BoxAnnotator()
label_annotator = sv.LabelAnnotator()

# 2. 创建结果收集器
detections_list = []

for image_path in image_paths:
    # 推理(原生YOLO输出)
    results = model(image_path)[0]
    # 一行转成Detections对象
    detections = sv.Detections.from_ultralytics(results)
    
    # 3. 过滤低置信度(可选)
    detections = detections[detections.confidence > 0.5]
    
    # 4. 收集数据
    for box, conf, cls_id in zip(detections.xyxy, detections.confidence, detections.class_id):
        detections_list.append({
            'image': image_path,
            'x1': box[0], 'y1': box[1], 'x2': box[2], 'y2': box[3],
            'confidence': round(conf, 3),
            'class': model.names[int(cls_id)]
        })

# 5. 保存CSV
import pandas as pd
df = pd.DataFrame(detections_list)
df.to_csv('detections_output.csv', index=False)

变化在哪里? 不用手动解析YOLO的输出格式,不用处理数据对齐。from_ultralytics 替你干掉了至少10行容易出错的代码。

更进阶的用法: 如果你要统计每个类别出现的数量:

python
1 2 3 4 5 6 7
import numpy as np

# 统计每个类别的检测次数
class_counts = np.bincount(detections.class_id)
for id, count in enumerate(class_counts):
    if count > 0:
        print(f"{model.names[id]}: {count}")

甚至可以直接画统计柱状图:

python
1
sv.plot_histogram(detections.class_id, title='检测结果分布')

histogram of detection classes generated by supervision

支持多模型输入

Supervision也支持其他模型框架,我测试过几种:

模型框架 转换函数 备注
Ultralytics YOLOv8/v5 from_ultralytics 最稳定
Detectron2 from_detectron2 需要安装detectron2
MMDetection from_mmdetection 需额外写配置
SAM(Segment Anything) from_sam 多输出mask
自定义模型 手动构建Detections对象 见官方文档

高级场景:视频数据自动标注

如果你是做视频分析,比如监控视频每帧检测人车,传统做法:循环帧、推理、保存。Supervision提供了 sv.VideoSink 来优雅地写视频,同时还能叠加标注和追踪ID。

python
1 2 3 4 5 6 7 8 9 10 11 12
import supervision as sv

video_info = sv.VideoInfo.from_video_path('input.mp4')

with sv.VideoSink('output.mp4', video_info) as sink:
    for frame in sv.get_video_frames_generator('input.mp4'):
        # 推理...
        detections = ...
        # 标注
        annotated = box_annotator.annotate(frame, detections)
        # 写入
        sink.write_frame(annotated)

这个功能对需要批量处理监控录像的团队极有价值——不用每次自己写视频读写、帧对齐、编码逻辑。

实际效果:时间和准确率的双重提升

我拿真实数据做了测试:

测试环境

  • 电脑:MacBook Pro M1(无独立显卡)
  • 模型:YOLOv8n(nano版,最快)
  • 数据集:500张商品图(拍照:杯子、手机、书籍混合场景)
  • 任务:检测所有物体,输出CSV包含坐标、置信度、类别

对比组

  • 传统方式:自己写Python循环,用YOLO的results.boxes.xyxy.tolist()提取,循环拼接
  • Supervision方式:用 sv.Detections.from_ultralytics + pd.DataFrame
指标 传统方式 Supervision 节省/提升
代码行数(主逻辑) 约30行 约8行 73%
开发调试时间 约40分钟(含踩坑坐标顺序、类型转换) 约12分钟(含安装) 70%
运行耗时(500张,推理时间固定) 推理3分20秒 + 后处理2分10秒 = 5分30秒 推理3分20秒 + 后处理21秒 = 3分41秒 后处理快84%
输出CSV格式一致性 容易因模型版本变化报错 稳定(API封装良好) 稳定

关键发现:Supervision的优势主要在后处理速度代码稳定性。推理时间是模型决定的,无法改变。但后处理方面,Supervision用了numpy向量化操作,比纯Python循环快很多。

准确率方面:它不影响模型推理结果,所以检测准确率不变。但它帮你过滤低置信度类别映射时更不容易出错(因为内置了class_name从model.names的映射)。

落地注意事项:别被4万star冲昏头

坑1:版本兼容性

Supervision迭代非常快,从0.5到0.15只用了半年。API有破坏性变更。比如旧版本 BoxAnnotator 参数是 (frame, detections),新版本改成了类方法。建议锁定版本

bash
1
pip install supervision==0.15.0

同时确认你的YOLO版本和它匹配。我用Ultralytics 8.0.200搭配supervision 0.15.0是稳定的。

坑2:内存问题

如果你要处理几十万张图片,把所有检测结果先收集到列表再转DataFrame,可能会内存爆炸。建议边处理边写入:

python
1 2 3 4 5 6 7 8 9
import csv

with open('output.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['image','x1','y1','x2','y2','conf','class'])
    for image_path in image_paths:
        detections = ...
        for d in detections:
            writer.writerow([image_path, *d.xyxy[0], d.confidence, model.names[d.class_id]])

坑3:自定义模型的支持

如果你用非主流模型(比如自己训练的MobileNet-SSD),没有现成的转换函数。你需要手动构建Detections对象:

python
1 2 3 4 5 6 7 8 9 10 11 12 13 14
import numpy as np
import supervision as sv

# 假设你的推理结果:boxes = [[x1,y1,x2,y2],...], scores = [0.8,0.9], class_ids = [0,1]
boxes = np.array([[100,200,300,400]])
scores = np.array([0.85])
class_ids = np.array([0])  # 0代表cat

# 构造Detections
detections = sv.Detections(
    xyxy=boxes,
    confidence=scores,
    class_id=class_ids
)

这比自己写NMS还是简单,但要谨慎检查坐标格式(是xyxy还是xywh)。

坑4:标注可视化时的字体问题

LabelAnnotator 默认使用系统字体,在无中文字体的服务器上会乱码。需要手动指定字体文件路径:

python
1 2 3 4 5
import supervision as sv

# 下载一个中文字体文件到项目目录,比如 SimHei.ttf
custom_font = sv.Font.load('SimHei.ttf')
label_annotator = sv.LabelAnnotator(text_location=sv.Position.CENTER, font=custom_font)

不过大多数场景下我们只需要英文标签,这个问题影响不大。

坑5:不要过度依赖

Supervision并不是万能的。一些场景仍需自己写:

  • 需要自定义复杂的筛选逻辑(比如只保留面积大于阈值的检测框)
  • 需要特殊的数据格式输出(比如XML标注)
  • 需要集成到已有数据处理管线(比如Airflow)

我的建议是:把Supervision当作“瑞士军刀”,而不是整个工具箱。对于简单的提取->分析->输出,它够用;复杂场景自己绕一下也好。

个人总结:这个库值得你花15分钟试试

我写过太多“自己解析YOLO输出”的代码,每次模型升级都要微调。有了Supervision,至少后处理的部分不用再操心了。它把最脏最累的活包装好,让你专注于业务逻辑。

如果你现在手头有个CV数据处理的任务,我建议你直接用Supervision重写一遍。15分钟安装+改写,后续每次跑数据都能省1小时。

最后补一句:虽然今天讲的是工具,但真正的效率提升来自意识到重复劳动是可以被工具替代的。别再手写坐标解析了,把时间留给更有价值的事情。


本文所有代码均基于 supervision 0.15.0 和 ultralytics 8.0.200 测试通过。如需查看最新API变动,请查阅官方文档:https://supervision.roboflow.com/