首页 > 其他分享 >计算机视觉库supervision学习-day(1)-图像检测和标记

计算机视觉库supervision学习-day(1)-图像检测和标记

时间:2024-10-23 12:59:03浏览次数:1  
标签:标记 image cv2 sv supervision detections import day

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类,后续准备一起学习

标签:标记,image,cv2,sv,supervision,detections,import,day
From: https://www.cnblogs.com/WineMarks-Garden/p/18496141

相关文章

  • 黑马JavaWeb-day03
    目录Ajax前后端分离开发前端工程化环境准备Vue项目Vue项目开发流程Vue组件库ElementVue路由打包部署AjaxAjax:AsynchronousJavaScriptAndXML,异步的JavaScript和XML作用:数据交换:通过Ajax可以给服务器发送请求,并获取服务器相应的数据异步交互:可以在不重新加载整个页......
  • Day12 备战CCF-CSP练习
    Day12题目描述西西艾弗岛上共有\(n\)个仓库,依次编号为\(1∼n\)。每个仓库均有一个\(m\)维向量的位置编码,用来表示仓库间的物流运转关系。具体来说,每个仓库\(i\)均可能有一个上级仓库\(j\),满足:仓库\(j\)位置编码的每一维均大于仓库\(i\)位置编码的对应元素。比如......
  • 杭州集训 Day 2
    课前由于昨晚打了ABC很坐牢所以多睡了一会6:30才起,酒店的饭又贵又难吃于是我们选择点外卖,但是早上的外卖都是\(20\)元起送,很麻烦,所以和htdlz拼了一单。花十块钱买了粥,没吃完,最后吃的hanss6的榨菜才咽下去。今天hs_black没有迟到,但是讲的题很抽象,六个小时讲二十多个......
  • 杭州集训 Day 1
    杭州集训Day1课前早上很早很早就起了,大概5:40吧,然后就感觉肚子疼。因为昨天晚上吃的喷射战士。在厕所足足待到6:00才出来。然后听了一会崩铁的演唱会回放,一直没来得及看,听了几首大概6:30收拾东西准备吃饭了。30元一顿的早饭,必须好好看看,结果啥也没有,素包子,“正宗烧麦”是......
  • 杭州 Day 4 下午 简单数学
    数学问题初等数论\(a|b\):\(a\)整除\(b\),也就是\(a\)是\(b\)的因数,\(b\)是\(a\)的倍数,\(b=ka\)取模取整:\(b=ka+r\),其中\(0≤r<a\),则称\(⌊\frac{b}{a}⌋=k\),\(b\moda=r\)。整数唯一分解定理:每个整数\(n\)可以唯一的写成\(\prodp_i^{k_......
  • 杭州 Day 4 上午 状压 dp
    状压一类杂题P1896[SCOI2005]互不侵犯先预处理出一行的所有可能状态\(S\),应当满足\(S\&(S≫1)=0\),因为不能有相邻的国王。用\(f(i,S,j)\)表示考虑了前\(i\)行,第\(i\)行的状态是\(S\),当前已经放了$$个国王的方案数。转移直接枚举第\(i−1\)行的状态\(T......
  • 杭州集训 Day 3
    课前早饭htdlz帮忙买的,一碗粥和三个不知名的糕点,粥并不好喝,但是糕点好吃。早上到了机房把这儿的小破电脑换成了自己的笔记本,屏幕大一点舒服一些。hs_black走了,今天换syksykccc来讲,syk开朗幽默的多,上课和机房这群很有话题。而且他甚至把他讲的每个题对应的代码打了,然后课后......
  • C++入门Day5 ~ 6:简单变量 & 数据类型 part 1 <8000字长文带你初步理解数据类型>
    这是我在学习中的一个小问题,希望对你也有所帮助:        问:数据类型和简单变量属于oop的基本概念吗?        答:不是!数据类型和简单变量本身并不属于面向对象编程(OOP)的基本概念,但它们是编程中的基础概念,面向对象编程会基于这些基础概念来构建更复杂的结构。......
  • 代码随想录算法训练营day22和day23 | 77. 组合 216.组合总和III 17.电话号码的字母
    学习资料:https://programmercarl.com/回溯算法理论基础.html回溯法backtracking:for循环控制递归数量,暴力搜索:组合、切割、子集、排列、棋盘今天学了组合和切割可以画个N叉树的图来帮助理解回溯过程组合又包括1.单个数组(要加startIndex参数)或多个数组;2.数组内有无重复元素;3.数......
  • Day22--下标越界及小结
    Day22--下标越界及小结数组的四个基本特点:长度是确定的,一旦被创建,大小不可改变。元素必须是相同类型,不允许混合类型。元素可以是任何数据类型,包括基本类型和引用类型。在Java中,数组对象在堆中。数组边界数组边界特点如下:下标的合法区间为[0,length-1],如果越界就......