導讀
最近在搞yolo-pose姿態(tài)識別算法,現(xiàn)成的模型已經(jīng)挺好用了,但是在某些特定的場景下,還是識別不準。所以想著自己搞搞數(shù)據(jù),查了網(wǎng)上相關的博客,基本思路都是先按照coco格式來標,然后再轉(zhuǎn)化成yolo格式。不廢話,直接說咋干。
標注工具
這里推薦使用CVAT,好用,沒啥說。GitHub鏈接:https://github.com/opencv/cvat, 官方說明文檔:https://opencv.github.io/cvat/docs/。 部署安裝不再多說,按照官網(wǎng)的文檔復制粘貼命令就行了。
安裝完成之后,在瀏覽器中登錄CVAT 平臺,如圖:
CVAT的使用邏輯是, 先創(chuàng)建一個organization(組織), 再組織里創(chuàng)建一個project(項目),然后在project中創(chuàng)建一個task(任務),創(chuàng)建任務時,需要創(chuàng)建一個可以認為是模板的玩意,把人體的基本結構畫出來,然后在標注的時候,直接通過挪動點的位置的方法,來進行標注。
在創(chuàng)建任務的時候,點擊Setup skeleton。
在常規(guī)標簽表單下方,可以先傳一張正面人體全身照,做參照來設置關鍵點,因為是人體關鍵點,所以標簽設置為“person”, 再選擇點標注,然后在繪圖區(qū)域把人體的點畫出來。(我在下圖中是隨手把點畫出來了,所以看不清楚是個人,這個不影響后續(xù)標注)。我們總共是標了17個點,按照coco keypoints的要求來標17個點,分別為:“nose”,“l(fā)eft_eye”, “right_eye”,“l(fā)eft_ear”, “right_ear”,“l(fā)eft_shoulder”, “right_shoulder”,“l(fā)eft_elbow”, “right_elbow”,“l(fā)eft_wrist”, “right_wrist”,“l(fā)eft_hip”, “right_hip”,“l(fā)eft_knee”, “right_knee”,“l(fā)eft_ankle”, “right_ankle”。
這個設置好之后,點擊done,完成。
然后就可以上傳圖片,發(fā)布任務了。點擊 “+” 號, 可以一次創(chuàng)建一張圖,可以一次創(chuàng)建多張圖,或者視頻,創(chuàng)建完之后,就可以在這個頁面看到剛發(fā)布的任務了。
創(chuàng)建好的任務列表如下,點擊OPEN按鈕,就可以打開任務,進行標注:
點擊Job,就可以進入到標注界面:
標注界面如下,如果非連續(xù)幀,可以選擇shape按鈕進行單幀標注。如果是視頻連續(xù)幀,可以選擇track按鈕進行連續(xù)幀標注,按照coco數(shù)據(jù)集的順序,把17個點按順序進行標注,順序不能錯。如果點被遮擋了,可以在這個點上,右鍵,修改為遮擋屬性,即coco數(shù)據(jù)集中V的值等于1,如果點被截斷了,可以在這個點上,右鍵,修改為截斷屬性,即coco數(shù)據(jù)集中V的值等于0,其他可見的點V值都為2:
導出數(shù)據(jù)集
在標注完成之后,點擊menu按鈕-----> export job dataset, 選擇 COCO Keypoints 1.0格式,點擊ok即可。
導出的數(shù)據(jù)格式只有一個json文件,后續(xù)就可以拿這個數(shù)據(jù)集來搞自己的事情了。文章來源:http://www.zghlxwxcb.cn/news/detail-503358.html
附上一個可視化的代碼
網(wǎng)上搜到的代碼,好多都有問題。。我也是參照別人的代碼,改了改,遍歷目錄下所有的圖片,逐個進行可視化。文章來源地址http://www.zghlxwxcb.cn/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姿態(tài)估計數(shù)據(jù)集制作(一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!