深度学习项目十七:YOLOv8关键点pose训练自己的数据集
这里写自定义目录标题
-
- YOLOv8关键点pose训练自己的数据集
一
一
二
二
二
* 2.2 格式转换(非常重要)
* 2.3 数据集划分
- 第三章 YOLOv8-Pose关键点数据集
-
构建训练脚本
- 数据集配置参数
- 模型架构设置
- 启动训练流程
-
四、推理进行可视化
-
- 4.1 推理脚本创建
- 4.2 可视化显示结果
-
YOLOv8关键点pose训练自己的数据集
- 部分没有写完成,两天内完善。
一、项目代码下载
YOLOv8模型可通过访问ultralytics GitHub官方仓库进行获取。无需复杂的步骤即可完成安装与部署:将压缩包解压至桌面文件夹中。建议选择不含中文路径的操作环境以避免潜在问题。至于环境配置问题,其他博主也提供了详细的安装指南和配置说明。
二、制作自己的关键点pose数据集
2.1 标注(非常重要)
2.1.1 标注软件
pip install labelme
代码解读
- 通过LabelMe进行标注工作。在终端的命令行界面切换至目标环境后,无需额外配置即可直接运行该工具并进入主界面对应的场景。

2.1.2 标注注意事项
a.多类别检测框
首先,在一张图片上标出目标检测框(仅单一类别)→ 输入目标分类名称 → 在目标区域填写目标分类标签ground-id(用于后续匹配关键点时参考),此操作中第一个目标区域标记为ground-id 1;在同幅图像上依次标出其余目标区域(每个区域对应一个连续编号),即第二个目标区域标记为ground-id 2以此类推。例如,在我的实验结果中展示了一幅经过标记的目标区域示意图:其中包含4个不同类别的矩形区域(对应ground-id 1至6)。

可以看到右边的四类,后边的ground-id为6个。

为了便于对物体的关键部位进行标记,请选择一个红笔作为代表对象。我们仅需对头端和末端进行标记。这是因为该红笔对应的ground-id编号为1,在实际操作中该红笔的关键点标记结果将直接对应到ground-id 1的数据集里。通过点击编辑按钮并创建控制点的操作即可完成关键点的标注。以上操作将帮助我们高效完成目标物体的关键部位标记任务。


右侧可以看出head, tail均属于ground-id为1中。

继续下一个ground-id为2的关键点进行标注。


右侧可以看出ground-id为2的head和tail的关键点已经标注好了。

按照这种方式将这张图片所有检测框里的关键点进行全部标注后……

b.单类别检测框
- 首先进行检测框的标注(仅针对单一分类),随后输入分类名称并记录该分类对应的ground-id(用于标识关键点的位置信息)。具体来说,在当前画面中依次填写ground-id值即可完成标记操作。例如,在同一张图片中第一个检测框标记了"person"类目标签,则其ground-id为1;若在同一图像内再进行同类目标的标记,则下一个ground-id应设为2依此类推。以下是我自行完成的一组标记结果:在同一图像中"person"类别的目标均被单独用矩形框包围,并标明对应的地缘特征码编号(从1开始递增)。
- 在分类标定任务中,单类别与多类别处理方式基本一致,在形式上唯一的区别在于前者使用单一矩形框进行目标标记。
2.2 格式转换(非常重要)
将json格式转换为yolo格式的过程中可能会出现错误信息,请注意检查标注部分是否存在问题。例如标注的关键点未正确设置ground-id属性会导致系统无法识别目标定位信息。
# 将labelme标注的json文件转为yolo格式
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
import glob
import json
import tqdm
# 物体类别
class_list = ["hongbi", "luosi", "qianbi", "makebi"]
# 关键点的顺序
keypoint_list = ["head", "tail"]
def json_to_yolo(img_data,json_data):
h,w = img_data.shape[:2]
# 步骤:
# 1. 找出所有的矩形,记录下矩形的坐标,以及对应group_id
# 2. 遍历所有的head和tail,记下点的坐标,以及对应group_id,加入到对应的矩形中
# 3. 转为yolo格式
rectangles = {}
# 遍历初始化
for shape in json_data["shapes"]:
label = shape["label"] # pen, head, tail
group_id = shape["group_id"] # 0, 1, 2, ...
points = shape["points"] # x,y coordinates
shape_type = shape["shape_type"]
# 只处理矩形
if shape_type == "rectangle":
if group_id not in rectangles:
rectangles[group_id] = {
"label": label,
"rect": points[0] + points[1], # Rectangle [x1, y1, x2, y2]
"keypoints_list": []
}
# 遍历更新,将点加入对应group_id的矩形中
for keypoint in keypoint_list:
for shape in json_data["shapes"]:
label = shape["label"]
group_id = shape["group_id"]
points = shape["points"]
# 如果匹配到了对应的keypoint
if label == keypoint:
rectangles[group_id]["keypoints_list"].append(points[0])
# 转为yolo格式
yolo_list = []
for id, rectangle in rectangles.items():
result_list = []
label_id = class_list.index(rectangle["label"])
# x1,y1,x2,y2
x1,y1,x2,y2 = rectangle["rect"]
# center_x, center_y, width, height
center_x = (x1+x2)/2
center_y = (y1+y2)/2
width = abs(x1-x2)
height = abs(y1-y2)
# normalize
center_x /= w
center_y /= h
width /= w
height /= h
# 保留6位小数
center_x = round(center_x, 6)
center_y = round(center_y, 6)
width = round(width, 6)
height = round(height, 6)
# 添加 label_id, center_x, center_y, width, height
result_list = [label_id, center_x, center_y, width, height]
# 添加 p1_x, p1_y, p1_v, p2_x, p2_y, p2_v
for point in rectangle["keypoints_list"]:
x,y = point
x,y = int(x), int(y)
# normalize
x /= w
y /= h
# 保留6位小数
x = round(x, 6)
y = round(y, 6)
result_list.extend([x,y,2])
yolo_list.append(result_list)
return yolo_list
# 获取所有的图片
img_list = glob.glob("./auto_labeled/*.jpg")
for img_path in tqdm.tqdm( img_list ):
img = cv2.imread(img_path)
json_file = img_path.replace('jpg', 'json')
with open(json_file) as json_file:
json_data = json.load(json_file)
yolo_list = json_to_yolo(img, json_data)
yolo_txt_path = img_path.replace('jpg', 'txt')
with open(yolo_txt_path, "w") as f:
for yolo in yolo_list:
for i in range(len(yolo)):
if i == 0:
f.write(str(yolo[i]))
else:
f.write(" " + str(yolo[i]))
f.write("\n")
代码解读
2.3 数据集划分
我有一组大量图片需要标注整理工作。为了提高效率,在完成标注任务后会自动完成数据集的划分工作。
注:此处未对原文进行翻译或添加任何解释性内容
三、YOLOv8-pose训练关键点数据集
3.1 训练脚本创建
ultralytics-main下面创建一个train-pose.py文件
from ultralytics import YOLO
# Load a model
model = YOLO("/home/xiao/ultralytics-main/ultralytics/cfg/models/v8/yolov8-pose.yaml")
model = YOLO("/home/xiao/ultralytics-main/weights/yolov8s-pose.pt")
model = YOLO("/home/xiao/ultralytics-main/ultralytics/cfg/models/v8/yolov8-pose.yaml").load("/home/xiao/ultralytics-main/weights/yolov8s-pose.pt")
# Train the model
results = model.train(data="/home/xiao/ultralytics-main/ultralytics/cfg/datasets/fks-pose.yaml", epochs=300, imgsz=1280, batch=2)
代码解读
3.2 数据集配置文件
位于ultralytics-main/ultralytics/cfg/datasets位置上新建一个pose.yaml文件,并具体配置内容如下
train: /home/xiao/dataset/fks14-24/images/train
val: /home/xiao/dataset/fks14-24/images/val
# Keypoints
kpt_shape: [4, 3] # number of keypoints, number of dims (2 for x,y or 3 for x,y,visible)
# flip_idx: [0, 1, 2, 3]
# Classes
names:
0: hongbi
1: luosi
2: qianbi
3: makebi
代码解读
3.3 网络结构配置文件
请参考详细位置:$ultralytics-main/ultralytics/cfg/models/v8/yolov8-pose.yaml进行配置修改

修改的kpt_shape: [2, 3]中的2为自己关键点的数量即可
kpt_shape: [2, 3] # number of keypoints, number of dims (2 for x,y or 3 for x,y,visible)
代码解读
3.4 进行训练
运行train-pose.py文件就进行了
四、推理进行可视化
4.1 推理脚本创建
建立一个脚本推理的文件,在/ultralytics-main/下建立一个pre-pose.py
from ultralytics import YOLO
# Load a model
model = YOLO("/home/xiao/ultralytics-main/weights/yolov8s-pose.pt") # load an official model
model = YOLO("/home/xiao/ultralytics-main/runs/pose/train6/weights/best.pt") # load a custom model
# Predict with the model
results = model("/home/xiao/ultralytics-main/6-25test/", save=True) # predict on an image
代码解读
相关解释:
- 官方预训练权重:"/home/xiao/ultralytics-main/weights/yolov8s-pose.pt"
- 训练自己数据集得到的最佳权重文件:"/home/xiao/ultralytics-main/runs/pose/train6(weights)/best.pt"
- 检测图片路径:"/home/xiao/ultralytics-main(6-25test)/25test images"
