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)

zidane

zidane.jpg

image-20241023085012239

在调试中可以看到,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)

image-20241023125646791

如图,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)

image-20241023125728509

如图所示,原图已经标记好了标签,分别为对应的类名。下面将演示如何自定义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)

image-20241023125828248

可见,现在的图片中标签部分不仅包括了类名,还包括了置信度

(注:这里回答一个我自己的疑惑,按照前文的图,detections对象中的data属性才是一个字典,为什么可以直接用['class_name']的方式引用数据?原因是这个类里重写了__getitem__方法……)

其实还有更多的Annotator类,后续准备一起学习

posted on 2024-10-23 13:03  氿痕  阅读(111)  评论(0编辑  收藏  举报