yolov8pose(8.2.10版本)训练自己的关键点检测数据集(windows10)

一 数据标注与处理

(一)数据标注

   使用labelme标注数据 

先标注框,把框标注完再标注关键点(关键点不要一张图片全部类别标完,现把所有图片的某一类关键点标注完,再回来标注另一类,依次类推。。。原因(快且不易错))

1.标注框

2.标注关键点

标注完后在图片文件夹李会有对应的json文件(如图)

使用此代码可视化检查数据

# 导入工具包
import os
import cv2
import numpy as np
import json

import matplotlib.pyplot as plt

""""注意:把图片与标签(json)放在同一个文件夹里 """
"""使用:  只需要修改files_path路径 与 kpt_color_map就行。 kpt_color_map是关键点类别的配置,我的是三个关键点类别,分别叫angle_30, angle_60, angle_90
          你把这里改成自己的类别即可,如果类别小于3个就减少配置,如果大于3个就按照格式增加配置 """

num = 0
# 图片与标签json的文件夹路径
files_path = r"D:\Myself_project\YOLOV8pose\data_me\pose_data\Set_Square3\images"
for file in os.listdir(files_path):
    if file.endswith(".jpg"):
        img_path = os.path.join(files_path, file)
        img_bgr = cv2.imread(img_path)

        file_profix = os.path.splitext(file)[0]
        labelme_name = file_profix + '.json'                                  # DSC_0219.json
        labelme_path = os.path.join(files_path, labelme_name)
        # 载入labelme格式的json标注文件
        with open(labelme_path, 'r', encoding='utf-8') as f:
            labelme = json.load(f)

        # <<<<<<<<<<<<<<<<<<可视化框(rectangle)标注>>>>>>>>>>>>>>>>>>>>>
        # 框可视化配置
        bbox_color = (255, 129, 0)  # 框的颜色
        bbox_thickness = 5  # 框的线宽

        # 框类别文字
        bbox_labelstr = {
            'font_size': 6,  # 字体大小
            'font_thickness': 14,  # 字体粗细
            'offset_x': 0,  # X 方向,文字偏移距离,向右为正
            'offset_y': -80,  # Y 方向,文字偏移距离,向下为正
        }
        # 画框
        for each_ann in labelme['shapes']:  # 遍历每一个标注
            if each_ann['shape_type'] == 'rectangle':  # 筛选出框标注
                # 框的类别
                bbox_label = each_ann['label']
                # 框的两点坐标
                bbox_keypoints = each_ann['points']
                bbox_keypoint_A_xy = bbox_keypoints[0]
                bbox_keypoint_B_xy = bbox_keypoints[1]
                # 左上角坐标
                bbox_top_left_x = int(min(bbox_keypoint_A_xy[0], bbox_keypoint_B_xy[0]))
                bbox_top_left_y = int(min(bbox_keypoint_A_xy[1], bbox_keypoint_B_xy[1]))
                # 右下角坐标
                bbox_bottom_right_x = int(max(bbox_keypoint_A_xy[0], bbox_keypoint_B_xy[0]))
                bbox_bottom_right_y = int(max(bbox_keypoint_A_xy[1], bbox_keypoint_B_xy[1]))

                # 画矩形:画框
                img_bgr = cv2.rectangle(img_bgr, (bbox_top_left_x, bbox_top_left_y), (bbox_bottom_right_x, bbox_bottom_right_y),
                                        bbox_color, bbox_thickness)
                # 写框类别文字:图片,文字字符串,文字左上角坐标,字体,字体大小,颜色,字体粗细
                img_bgr = cv2.putText(img_bgr, bbox_label, (
                    bbox_top_left_x + bbox_labelstr['offset_x'],
                    bbox_top_left_y + bbox_labelstr['offset_y']),
                                      cv2.FONT_HERSHEY_SIMPLEX, bbox_labelstr['font_size'], bbox_color,
                                      bbox_labelstr['font_thickness'])
        # # 可视化
        # plt.imshow(img_bgr[:, :, ::-1])  # 将bgr通道转换成rgb通道
        # plt.show()

        # <<<<<<<<<<<<<<<<<<可视化关键点(keypoint)标注>>>>>>>>>>>>>>>>>>>>>
        # 关键点的可视化配置
        # 关键点配色
        kpt_color_map = {
            'angle_30': {'id': 0, 'color': [255, 0, 0], 'radius': 30, 'thickness': -1},
            'angle_60': {'id': 1, 'color': [0, 255, 0], 'radius': 30, 'thickness': -1},
            'angle_90': {'id': 2, 'color': [0, 0, 255], 'radius': 30, 'thickness': -1}
        }

        # 点类别文字
        kpt_labelstr = {
            'font_size': 4,  # 字体大小
            'font_thickness': 12,  # 字体粗细
            'offset_x': 30,  # X 方向,文字偏移距离,向右为正
            'offset_y': 100,  # Y 方向,文字偏移距离,向下为正
        }

        # 画点
        for each_ann in labelme['shapes']:  # 遍历每一个标注
            if each_ann['shape_type'] == 'point':  # 筛选出关键点标注
                kpt_label = each_ann['label']  # 该点的类别
                # 该点的 XY 坐标
                kpt_xy = each_ann['points'][0]
                kpt_x, kpt_y = int(kpt_xy[0]), int(kpt_xy[1])

                # 该点的可视化配置
                kpt_color = kpt_color_map[kpt_label]['color']  # 颜色
                kpt_radius = kpt_color_map[kpt_label]['radius']  # 半径
                kpt_thickness = kpt_color_map[kpt_label]['thickness']  # 线宽(-1代表填充)
                # 画圆:画该关键点
                img_bgr = cv2.circle(img_bgr, (kpt_x, kpt_y), kpt_radius, kpt_color, kpt_thickness)
                # 写该点类别文字:图片,文字字符串,文字左上角坐标,字体,字体大小,颜色,字体粗细
                img_bgr = cv2.putText(img_bgr, kpt_label, (kpt_x + kpt_labelstr['offset_x'], kpt_y + kpt_labelstr['offset_y']),
                                      cv2.FONT_HERSHEY_SIMPLEX, kpt_labelstr['font_size'], kpt_color,
                                      kpt_labelstr['font_thickness'])


        # 可视化
        # plt.imshow(img_bgr[:, :, ::-1])  # 将bgr通道转换成rgb通道
        # plt.show()
        # 当前目录下保存可视化结果
        cv2.imwrite(f'data_me/inspect_label_data/{num}.jpg', img_bgr)
        num += 1
print('=========================ok========================')

运行结果:

(二)数据处理

   用下面代码把上面文件夹下的图片与json标签分开

import os
import shutil

# 图片与json标签的同一文件夹路径
source_folder = 'images'
# 分出后用来只存放图片的路径
out_img_folder = 'data_me/images'
# 分出后用来只存放json标签的路径
out_json_folder = "data_me/label_json"

# 确保目标文件夹存在,如果不存在则创建
os.makedirs(out_img_folder, exist_ok=True)
os.makedirs(out_json_folder, exist_ok=True)

for file_name in os.listdir(source_folder):
    source_file_path = os.path.join(source_folder, file_name)
    if file_name.endswith('.jpg'):
        source_img_file_path = os.path.join(source_folder, file_name)
        desti
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值