YOLOv8在自定义数据集训练分割任务记录||Json标签转YOLO标签||标签可视化

简介:使用YOLOv8在自定义数据集上进行分割任务训练记录。

数据集:已有JSON格式的标签,可用于目标检测和分割任务。在训练前转成YOLO格式的txt标签。

一、下载项目源码,配置虚拟环境

1、下载项目源码,项目链接:GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite

2、YOLOv8 的快速入门 :可以使用pip,conda,git clone等多种方式下载安装源码。

3、配置虚拟环境

目标:创建一个用于YOLOv8项目运行环境,并安装需要的库,如GPU版的PyTorch。

教程:按照习惯来,使用Conda或者PyCharm图形化创建环境都可以。参考博客【yolov8基础教程】Yolov8模型训练GPU环境配置保姆级教程(附安装包)-CSDN博客

4、在虚拟环境中安装依赖库:

pip install ultralytics

 5、测试是否能够正常运行:命令行加载到ultralytics路径 

yolo predict model=yolo8n.pt source='图片路径' imgsz=320

二、数据集格式整理

0、目标:最终数据集需要满足以下几个条件: 

0.1 文件夹结构如下放置:

 ├── ultralytics
 └── datasets
     └── mydatasets  ← 数据集名称
         └── images  ← 图片文件夹
             └── train  ← 训练集图片文件夹,存放所有训练集图片
             └── val    ← 验证集图片文件夹
         └── lables  ← 标签文件夹
             └── train  ← 训练集标签文件夹
             └── val    ← 验证集标签文件夹

0.2 标签格式:标签文件是txt,标签文件名与对应的图片文件名需要一致。

标签内容:每一行一个目标数据,第一列是类别ID,后面是坐标点。YOLO标签的类别ID需要从0开始。


1、我这里的数据集标签是JSON文件,分析其结构如图,且类别ID是从1开始:

2、注意:不同来源数据集的Json可能不完全一样,这里有个比较无脑的方法:把Json文件中与前几张照片对应的所有数据拿出,按照其在Json文件中原来的格式,做一个简化版的标签。然后把标签内容喂给GPT,让他转化成YOLO格式标签。

3、标签格式转换:针对我这里的Json结构使用Python脚本进行格式转换。

import json
import os


def convert_to_yolo_format(json_file_path, output_dir):
    # 读取 JSON 文件内容
    with open(json_file_path, 'r') as f:
        json_data = json.load(f)

    # 创建保存 YOLO 标签的目录
    os.makedirs(output_dir, exist_ok=True)

    # 获取图像字典 {image_id: (width, height, file_name)}
    image_dict = {img['id']: (img['width'], img['height'],img['file_name']) for img in json_data['images']}

    # 转换 annotation 为 YOLO 格式
    for annotation in json_data['annotations']:
        image_id = annotation['image_id']
        width, height, file_name = image_dict[image_id]
        category_id = annotation['category_id'] - 1  # YOLO 类别从 0 开始编号。我这里Json中从1开始,所以需要减1.
        segmentation = annotation['segmentation'][0]  # 获取 segmentation 列表

        # 归一化 segmentation 坐标
        normalized_segmentation = [(x / width, y / height) for x, y in zip(segmentation[::2], segmentation[1::2])]

        # 格式化为 YOLO 格式: class_id x1 y1 x2 y2 ... xn yn
        yolo_label = f"{category_id} " + " ".join([f"{x:.6f} {y:.6f}" for x, y in normalized_segmentation])

        # 写入文件(按 file_name 命名)
        txt_filename = os.path.join(output_dir, f"{os.path.splitext(file_name)[0]}.txt")
        with open(txt_filename, 'a') as f:
            f.write(yolo_label + '\n')

    print(f"转换完成,标签文件已保存在 '{output_dir}' 目录中。")


# 调用函数,传入 JSON 文件路径和输出目录
json_file_path = "instances_train.json"  # 需要转换的JSON 文件路径
output_dir = "datasets/MOCS/labels/train"  # 实际输出txt标签的保存路径
convert_to_yolo_format(json_file_path, output_dir)  # 执行转换

4、标签可视化:参考以下代码检查转化的txt标签与图片上的目标是否一致。

'''
def restore_masks_to_image 用于将分割任务的标签掩码数据还原到图像上,检查标签是否正确或者对应
'''

import cv2
import numpy as np
import os

def restore_masks_to_image(mask_data, image_path, output_path):
    # 读取图像
    img = cv2.imread(image_path)

    # 将掩码数据还原到图像上
    for mask in mask_data:
        values = list(map(float, mask.split()))
        class_id = int(values[0])
        mask_values = values[1:]

        # 将掩码数据转换为NumPy数组
        mask_array = np.array(mask_values, dtype=np.float32).reshape((int(len(mask_values) / 2), 2))

        # 将相对于图像大小的百分比转换为具体坐标值
        mask_array[:, 0] *= img.shape[1]  # 宽度
        mask_array[:, 1] *= img.shape[0]  # 高度

        # 将坐标值转换为整数
        mask_array = mask_array.astype(np.int32)

        # 在图像上绘制掩码
        cv2.polylines(img, [mask_array], isClosed=True, color=(0, 255, 0), thickness=2)

        # 在图像上绘制每个坐标点
        for point in mask_array:
            cv2.circle(img, tuple(point), 3, (255, 0, 0), -1)  # -1 表示填充圆

    # 保存带有掩码和坐标点的图像
    cv2.imwrite(output_path, img)

    # 显示最终的图像
    cv2.imshow("Result Image", img)

    # 按 q 键退出
    while True:
        if cv2.waitKey(1) & 0xFF == ord('q'):  # 等待按键按下,按下 q 键退出
            break

    # 关闭所有打开的窗口
    cv2.destroyAllWindows()


if __name__ == "__main__":
    # 需要检查的标签文件
    with open('demo/0015612.txt', 'r') as file: # txt标签路径
        mask_data = [line.strip() for line in file.readlines()]
   
    # 标签对应的原图
    image_path = "datasets/MOCS/images/train/0015612.jpg" # 标签对应的图片路径
    # 还原后保存的路径和文件名
    output_path = "0015612(6)_out.jpg"

    restore_masks_to_image(mask_data, image_path, output_path)    

5、转换后按照上述路径放置数据集图片和标签文件。

三、相关配置文件修改

1、数据集配置文件

数据集配置文件路径:ultralytics/cfg/datasets/

可以复制一份coco8.yaml文件并重命名为自己的配置文件。

文件内容,一是修改数据集路径;而是修改类别ID和名称。

path: ../datasets/mydatasets # 数据集根目录
train: images/train # 训练集图片文件夹路径(相对于'path')
val: images/val #   验证集图片文件夹路径(相对于'path')
test: # 测试集图片文件夹路径(相对于'path')(可选)

# Classes (根据自己项目需要更改类别名称和ID,ID和标签文件中的ID相对应)
names:
  0: person
  1: bicycle
  2: car
  3: motorcycle
  4: airplane

2、模型配置文件,根据需要改动。 

路径:ultralytics/cfg/models 

四、开始训练

1、YOLOv8支持在终端使用命令行和Python脚本的方式运行。

命令的基本格式:

yolo TASK MODE ARGS

其中,参数如下:
TASK (可选):detect, segment, classify, pose, obb中选一个
MODE (必须) :train, val, predict, export, track, benchmark,中选一个
ARGS (可选) :比如imgsz=640,epochs=300,lr0=0.01等等。

详细使用方法见官方文档

2、训练命令示例:

yolo train data=mydataste.yaml model=yolo8n-seg.pt epochs=300 lr0=0.01

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值