Advertisement

深度学习项目十七:YOLOv8关键点pose训练自己的数据集

阅读量:

这里写自定义目录标题

    • YOLOv8关键点pose训练自己的数据集

复制代码
* 2.2 格式转换(非常重要)
* 2.3 数据集划分
  • 第三章 YOLOv8-Pose关键点数据集
    • 构建训练脚本

      • 数据集配置参数
      • 模型架构设置
      • 启动训练流程
    • 四、推理进行可视化

      • 4.1 推理脚本创建
      • 4.2 可视化显示结果

YOLOv8关键点pose训练自己的数据集

  • 部分没有写完成,两天内完善。

一、项目代码下载

YOLOv8模型可通过访问ultralytics GitHub官方仓库进行获取。无需复杂的步骤即可完成安装与部署:将压缩包解压至桌面文件夹中。建议选择不含中文路径的操作环境以避免潜在问题。至于环境配置问题,其他博主也提供了详细的安装指南和配置说明。

ultralytics连接此处, 一击即中

二、制作自己的关键点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.单类别检测框
  1. 首先进行检测框的标注(仅针对单一分类),随后输入分类名称并记录该分类对应的ground-id(用于标识关键点的位置信息)。具体来说,在当前画面中依次填写ground-id值即可完成标记操作。例如,在同一张图片中第一个检测框标记了"person"类目标签,则其ground-id为1;若在同一图像内再进行同类目标的标记,则下一个ground-id应设为2依此类推。以下是我自行完成的一组标记结果:在同一图像中"person"类别的目标均被单独用矩形框包围,并标明对应的地缘特征码编号(从1开始递增)。
  2. 在分类标定任务中,单类别与多类别处理方式基本一致,在形式上唯一的区别在于前者使用单一矩形框进行目标标记。

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"

4.2 可视化显示结果

全部评论 (0)

还没有任何评论哟~