supervision库是一款由roboflow开发的计算机视觉库提供了一系列方便的工具和功能,用于可视化和处理各种计算机视觉任务。它的目标是简化深度学习模型的可视化和后处理步骤,尤其适用于对象检测、图像分割、关键点检测等任务。
一、下载supervision库
1.在3.8版本及以上的python,使用pip指令即可下载,目前最新版是supervision-0.24.0
pip install supervision
2.在python中导入supervision库
import supervision as sv
二、运行一个检测
1.supervision给多个视觉库提供了接口,将其他模型产生的结果变为supervision自己的对象,以方便后续的处理,我使用的是ultralytics这个库
import cv2
import supervision as sv
from ultralytics import YOLO
model=YOLO('yolo11n.pt')
#这里用的是ultralytics库自带zidane图片,如下图
image=cv2.imread('zidane.jpg')
result=model(image)[0]
#supervision为ultralytics提供了接口,将其的结果转为Detections类的一个对象,方便后续操作与处理
detections=sv.Detections.from_ultralytics(result)
在调试中可以看到,detections这个对象中包含了很多内容:box_area区域面积、class_id类名索引以及confidence置信度和检测结果的xyxy值
三、添加标记
1.supervision库提供了方便的一系列方法为我们在图片上绘制方框标记和标签名
(1):使用BoxAnnotator类的annotate方法为我们绘制边框
(注:在早期版本中有使用BoundingBoxAnnotator,但这个类将在supervision-0.26.0版本弃用,因此建议使用BoxAnnotator)
import cv2
import supervision as sv
from ultralytics import YOLO
model=YOLO('yolo11n.pt')
image=cv2.imread('zidane.jpg')
result=model(image)[0]
detections=sv.Detections.from_ultralytics(result)
box_annotator=sv.BoxAnnotator() #构造函数中可选的参数有颜色和边框粗细,有默认值,可以不用填写
box_annotator.annotate(scene=image,detections=detections)
cv2.imshow('img1',image)
cv2.waitKey(0)
如图,annotate方法为我在图中绘制好了检测的边框,并且会使用不同的颜色为我们区分不同的类别。图中检测出来的应该是:person,tie,person
(2):使用LabelAnnotator类的annotate方法为我们绘制标签
import cv2
import supervision as sv
from ultralytics import YOLO
model=YOLO('yolo11n.pt')
image=cv2.imread('zidane.jpg')
result=model(image)[0]
detections=sv.Detections.from_ultralytics(result)
box_annotator=sv.BoxAnnotator()
box_annotator.annotate(scene=image,detections=detections)
label_annotator=sv.LabelAnnotator() #构造函数有一系列设置文字属性的带默认值的参数,可以不填写
label_annotator.annotate(scene=image,detections=detections) #还有一个参数labels,默认使用类名作为标签名,可以自己设置
cv2.imshow('img1',image)
cv2.waitKey(0)
如图所示,原图已经标记好了标签,分别为对应的类名。下面将演示如何自定义labels参数来实现自定义标签
import cv2
import supervision as sv
from ultralytics import YOLO
model=YOLO('yolo11n.pt')
image=cv2.imread('zidane.jpg')
result=model(image)[0]
detections=sv.Detections.from_ultralytics(result)
box_annotator=sv.BoxAnnotator()
box_annotator.annotate(scene=image,detections=detections)
#用推导式获取所有的检测结果的类名class_name和置信度confidence,具体有哪些内容可以看前文的detections的
labels=[
f'{class_name}{confidence:.2f}'
for class_name,confidence
in zip(detections['class_name'], detections.confidence)
]
label_annotator=sv.LabelAnnotator()
label_annotator.annotate(scene=image,detections=detections,labels=labels)
cv2.imshow('img1',image)
cv2.waitKey(0)
可见,现在的图片中标签部分不仅包括了类名,还包括了置信度
(注:这里回答一个我自己的疑惑,按照前文的图,detections对象中的data属性才是一个字典,为什么可以直接用['class_name']的方式引用数据?原因是这个类里重写了__getitem__方法……)
其实还有更多的Annotator类,后续准备一起学习