导读
最近在搞yolo-pose姿态识别算法,现成的模型已经挺好用了,但是在某些特定的场景下,还是识别不准。所以想着自己搞搞数据,查了网上相关的博客,基本思路都是先按照coco格式来标,然后再转化成yolo格式。不废话,直接说咋干。
标注工具
这里推荐使用CVAT,好用,没啥说。GitHub链接:https://github.com/opencv/cvat, 官方说明文档:https://opencv.github.io/cvat/docs/。 部署安装不再多说,按照官网的文档复制粘贴命令就行了。
安装完成之后,在浏览器中登录CVAT 平台,如图:
CVAT的使用逻辑是, 先创建一个organization(组织), 再组织里创建一个project(项目),然后在project中创建一个task(任务),创建任务时,需要创建一个可以认为是模板的玩意,把人体的基本结构画出来,然后在标注的时候,直接通过挪动点的位置的方法,来进行标注。
在创建任务的时候,点击Setup skeleton。
在常规标签表单下方,可以先传一张正面人体全身照,做参照来设置关键点,因为是人体关键点,所以标签设置为“person”, 再选择点标注,然后在绘图区域把人体的点画出来。(我在下图中是随手把点画出来了,所以看不清楚是个人,这个不影响后续标注)。我们总共是标了17个点,按照coco keypoints的要求来标17个点,分别为:“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”。
这个设置好之后,点击done,完成。
然后就可以上传图片,发布任务了。点击 “+” 号, 可以一次创建一张图,可以一次创建多张图,或者视频,创建完之后,就可以在这个页面看到刚发布的任务了。
创建好的任务列表如下,点击OPEN按钮,就可以打开任务,进行标注:
点击Job,就可以进入到标注界面:
标注界面如下,如果非连续帧,可以选择shape按钮进行单帧标注。如果是视频连续帧,可以选择track按钮进行连续帧标注,按照coco数据集的顺序,把17个点按顺序进行标注,顺序不能错。如果点被遮挡了,可以在这个点上,右键,修改为遮挡属性,即coco数据集中V的值等于1,如果点被截断了,可以在这个点上,右键,修改为截断属性,即coco数据集中V的值等于0,其他可见的点V值都为2:
导出数据集
在标注完成之后,点击menu按钮-----> export job dataset, 选择 COCO Keypoints 1.0格式,点击ok即可。
导出的数据格式只有一个json文件,后续就可以拿这个数据集来搞自己的事情了。文章来源:https://www.toymoban.com/news/detail-503358.html
附上一个可视化的代码
网上搜到的代码,好多都有问题。。我也是参照别人的代码,改了改,遍历目录下所有的图片,逐个进行可视化。
文章来源地址https://www.toymoban.com/news/detail-503358.html
# -*- coding:utf-8 -*-
import os
import numpy as np
from pycocotools.coco import COCO
import cv2
def plow_show(imgIds):
img = coco.loadImgs(imgIds)[0]
matImg = cv2.imread('%s/%s' % (img_prefix, img['file_name']))
annIds = coco.getAnnIds(imgIds=img['id'], catIds=catIds, iscrowd=None)
# 通过注释的id,得到注释的信息
anns = coco.loadAnns(annIds)
for ann in anns:
kp = np.array(ann['keypoints'])
x = kp[0::3]
y = kp[1::3]
v = kp[2::3]
for sk in sks:
c = aColor[np.random.randint(0, 4)]
# 画连接线
if np.all(v[sk] > 0):
cv2.line(matImg, (round(x[sk][0]), round(y[sk][0])), (round(x[sk][1]), round(y[sk][1])), c, 1)
# 画关键点
for i in range(x.shape[0]):
c = aColor[np.random.randint(0, 4)]
if np.all(v[i] > 0):
cv2.circle(matImg, (int(x[i]), int(y[i])), 2, c, lineType=1)
cv2.imshow("show", cv2.resize(matImg, (1280, 720)))
cv2.waitKey(0)
if __name__ == '__main__':
annFile = r'C:\Users\37452\Downloads\123\annotations\person_keypoints_default.json'
img_prefix = r'C:\Users\37452\Downloads\123\images'
sks = np.array([[16, 14], [14, 12], [17, 15], [15, 13], [12, 13], [6, 12], [7, 13], [6, 7],
[6, 8], [7, 9], [8, 10], [9, 11], [2, 3], [1, 2], [1, 3], [2, 4], [3, 5], [4, 6], [5, 7]]) - 1
aColor = [(0, 255, 0, 0), (255, 0, 0, 0), (0, 0, 255, 0), (0, 255, 255, 0)]
coco = COCO(annFile)
# getCatIds(catNms=[], supNms=[], catIds=[])
catIds = coco.getCatIds(catNms=['person'])
# getImgIds(imgIds=[], catIds=catId
for imgIds in (range(1, len(os.listdir(img_prefix)) +1)):
plow_show(imgIds)
到了这里,关于yolov8-pose姿态估计数据集制作(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!