简介:使用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