yolov8-pose姿态估计数据集制作(一)

全网最详细yolo-pose数据集制作

导读

最近在搞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文件,后续就可以拿这个数据集来搞自己的事情了。

附上一个可视化的代码

网上搜到的代码,好多都有问题。。我也是参照别人的代码,改了改,遍历目录下所有的图片,逐个进行可视化。
在这里插入图片描述

# -*- 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)

猜你喜欢

转载自blog.csdn.net/weixin_39274106/article/details/130405600