上一次学习完了Detection和segmentation中的Utils,今天学习关键点检测相关的方法和类
-
KeyPoints类
用于图像关键点检测的一个类,使用方法与Detection类相似,对于不同的视觉库,提供了多种讲检测结果转为KeyPoints类的方法
-
属性:
- xy:形状为(n,m,2)的数组,n表示检测到n个对象,m表示该对象由m个大小相等的特征点构成,每个点用[x,y]的格式表示
- confidence:形状为(n,m)的数组,表示各关键点的置信度
- class_id:形状为(n,)的数组,表示检测到的对象的类id
- data:与Detection类的data一致,为一个字典,字典的键为"class_name",值为检测到的每个目标的类。同样,KeyPoints类重写了__getitem__方法,可以直接用类的对象使用["class_name"]来直接索引
-
重要方法:
-
_getitem_:被重写过,可以用来进行过滤操作,与Detection类使用方法一致
-
from_ultralytics:将yolo的检测结果转换成KeyPoints类的实例
import cv2 from ultralytics import YOLO import supervision as sv image = cv2.imread('images/zidane.jpg') model = YOLO('yolo11n-pose.pt') output=model(image)[0] keypoint=sv.KeyPoints.from_ultralytics(output)
-
-
-
Annotators
对于关键点检测,supervision提供了三个Annotator类,用于绘制不同的关键点样式
1.VertexAnnotator类
用点将关键点标注出来
-
构造函数参数:
- color:关键点的颜色,类型为supervision的Color,默认为ROBOFLOW,用默认值即可
- radius:关键点的半径大小,默认为4
-
annotate方法:
在指定图像上标注出关键点
- scene:要绘制的图像
- key_points:提供关键点的KeyPoints类的实例
- 返回值为绘制了标记的图片,但这个函数会默认更改传入的参数图像,因此可以不用返回值
import cv2 from ultralytics import YOLO import supervision as sv image = cv2.imread('images/zidane.jpg') model = YOLO('yolo11n-pose.pt') output=model(image)[0] keypoint=sv.KeyPoints.from_ultralytics(output) vertex_annotator=sv.VertexAnnotator() vertex_annotator.annotate(image,keypoint) cv2.imshow('img',image) cv2.waitKey(0)
2.EdgeAnnotator类
用线将相邻关键点连接出来
-
构造函数参数:
- color:关键点的颜色,类型为supervision的Color,默认为ROBOFLOW,用默认值即可
- thickness:线条的粗细,默认为2
- edges:要绘制的边缘,可以自己提供,格式为[List[Tuple[int, int]]],其中元组类型的数据表示点坐标。默认为None,表示自动选择
-
annotate方法:
在指定图像将关键点相连
- scene:要绘制的图像
- key_points:提供关键点的KeyPoints类的实例
- 返回值为绘制了标记的图片,但这个函数会默认更改传入的参数图像,因此可以不用返回值
import cv2 from ultralytics import YOLO import supervision as sv image = cv2.imread('images/zidane.jpg') model = YOLO('yolo11n-pose.pt') output=model(image)[0] keypoint=sv.KeyPoints.from_ultralytics(output) edge_annotator=sv.EdgeAnnotator() edge_annotator.annotate(image,keypoint) cv2.imshow('img',image) cv2.waitKey(0)
3.VertexLabelAnnotator类
在图像上绘制骨架顶点标签,每个关键点会对应有一个id值,如"nose"为0,"left eye"为1,它会将这个数字绘制在对应点上,具体顺序为:
"nose","left eye","right eye","left ear","right ear","left shoulder","right shoulder","left elbow","right elbow","left wrist","right wrist","left hip","right hip","left knee","right knee","left ankle","right ankle"
-
构造函数参数:
- color:关键点的颜色,类型为supervision的Color,默认为ROBOFLOW,用默认值即可
- text_color:标签的颜色,默认为WHITE
- text_scale:文字的比例,默认为0.5
- text_thickness:文字的粗细,默认为1
- text_padding:文本的外边距,默认为10
- border_radius:边框的圆角半径,数值高一点可生成圆,默认为0
-
annotate方法:
在指定图像上标注出关键点
- scene:要绘制的图像
- key_points:提供关键点的KeyPoints类的实例
- labels:自定义的标签列表,用法与Detection类的LabelAnnotator类的labels参数一样,不传入则默认使用关键点
- 返回值为绘制了标记的图片,但这个函数会默认更改传入的参数图像,因此可以不用返回值
import cv2 from ultralytics import YOLO import supervision as sv image = cv2.imread('images/zidane.jpg') model = YOLO('yolo11n-pose.pt') output=model(image)[0] keypoint=sv.KeyPoints.from_ultralytics(output) vertex_annotator=sv.VertexAnnotator() vertex_annotator.annotate(image,keypoint) cv2.imshow('img',image) cv2.waitKey(0)
下面一个是自定义labels的结果
import cv2 from ultralytics import YOLO import supervision as sv image = cv2.imread('images/zidane.jpg') model = YOLO('yolo11n-pose.pt') output=model(image)[0] keypoint=sv.KeyPoints.from_ultralytics(output) labels=[ "nose", "left eye", "right eye", "left ear", "right ear", "left shoulder", "right shoulder", "left elbow", "right elbow", "left wrist", "right wrist", "left hip", "right hip", "left knee", "right knee", "left ankle", "right ankle" ] vertex_label_annotator=sv.VertexLabelAnnotator() vertex_label_annotator.annotate(image,keypoint,labels=labels) cv2.imshow('img',image) cv2.waitKey(0)
-