一、提前准备python版本3.8.1或者使用conda不然可能有些库文件不支持其他版本目前没有尝试。conda环境安装condayolo源码源码获取此步骤不是必要步骤可以更具需要自行抉择。二、环境搭建CPU环境安装conda create -n YOLOv8 python3.8.1 #如果确认自己的python版本能够搭建环境此步骤可以省略 pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple #使用清华源安装ultralytics。GPU参考链接相关安装步骤下载官方预训练好的yolov8n.pt它属于通用目标检测模型。我们以该预训练模型为基础进行迁移学习微调训练后就能得到只适配自己项目、仅识别自定义类别的专属模型 best.pt。三、数据集准备1、先创建六个文件夹文件夹名称和结构如下注意项目所在的目录不能有中文文件夹名称也不能有中文训练图片→ mydata/images/train验证图片→ mydata/images/val训练标注→ mydata/labels/train验证标注→ mydata/labels/val2、图像分割标注软件介绍和使用2.1labellng然后就是枯燥的打标签环节如果只需要简单打框没有复杂的图形使用这个工具就够了使用以下命令安装pip install labelimg安装好后在cmd里输入labelimg出现一下界面打标签时需要创建好类被框住你要检测的物体上就可以其他工具类似使用指南open dir选择图片的文件夹Change Save Dir选择label保存的位置在View下选择auto save mode可以不用每次都要点击保存在File里面选择YOLO数据集的格式通过w来选择标注区域然后写上类别名 键盘输入a是上一张d是下一张 然后按照这种格式将图片和label进行分开2.2、labelmelabelme 是一款基于 Python 开发的免费开源跨平台图像标注工具操作简单、离线可用不仅能画矩形框做目标检测标注还支持多边形、关键点、语义分割等多种标注类型标注后生成 JSON 格式文件可通过脚本批量转换成 YOLO、VOC、COCO 等主流训练格式功能比 LabelImg 更全面适合深度学习目标检测、图像分割等各类数据集制作。安装pip install labelme -i https://pypi.tuna.tsinghua.edu.cn/simple/通过一下代码完成JSON 转 TXT → 自动划分数据集import os import json import glob import shutil import random import numpy as np # 1. 类别列表按标注顺序写 CLASS_NAMES [your_class1, your_class2] # 2. 原始文件夹放图片labelme标注json的目录 SRC_PATH ../dataset/labelme_dataset # 3. 生成最终YOLO数据集保存位置 DEST_PATH ../dataset/custom_dataset # 4. 划分比例验证集10% 测试集20% VAL_RATIO 0.1 TEST_RATIO 0.2 # 5. 图片后缀 jpg/png IMG_POSTFIX jpg # 1. 创建目标文件夹结构 os.makedirs(DEST_PATH, exist_okTrue) for split in [train, val, test]: os.makedirs(os.path.join(DEST_PATH, images, split), exist_okTrue) os.makedirs(os.path.join(DEST_PATH, labels, split), exist_okTrue) # 2. Labelme JSON 转 YOLO TXT 并存在原目录 json_files glob.glob(os.path.join(SRC_PATH, *.json)) print(f找到标注文件{len(json_files)} 个) for json_path in json_files: with open(json_path, r, encodingutf-8) as f: data json.load(f) img_w data[imageWidth] img_h data[imageHeight] base_name os.path.basename(json_path).replace(.json, ) txt_save_path os.path.join(SRC_PATH, f{base_name}.txt) with open(txt_save_path, w, encodingutf-8) as f_txt: for shape in data[shapes]: label shape[label] if label not in CLASS_NAMES: continue cls_id CLASS_NAMES.index(label) pts np.array(shape[points]) x1, y1 pts[0] x2, y2 pts[1] # 归一化转YOLO格式 cx (x1 x2) / 2.0 / img_w cy (y1 y2) / 2.0 / img_h w abs(x2 - x1) / img_w h abs(y2 - y1) / img_h f_txt.write(f{cls_id} {cx:.6f} {cy:.6f} {w:.6f} {h}\n) print( JSON 全部转换为 YOLO txt 完成) # 3. 自动划分 train / val / test txt_list np.array([i.split(.)[0] for i in os.listdir(SRC_PATH) if i.endswith(txt)]) random.shuffle(txt_list) total len(txt_list) val_num int(total * VAL_RATIO) test_num int(total * TEST_RATIO) train_num total - val_num - test_num train_list txt_list[:train_num] val_list txt_list[train_num : train_num val_num] test_list txt_list[train_num val_num :] # 复制文件 def copy_files(name_list, split): for name in name_list: # 复制图片 src_img os.path.join(SRC_PATH, f{name}.{IMG_POSTFIX}) dst_img os.path.join(DEST_PATH, images, split, f{name}.{IMG_POSTFIX}) shutil.copy(src_img, dst_img) # 复制txt src_txt os.path.join(SRC_PATH, f{name}.txt) dst_txt os.path.join(DEST_PATH, labels, split, f{name}.txt) shutil.copy(src_txt, dst_txt) copy_files(train_list, train) copy_files(val_list, val) copy_files(test_list, test) print(f 数据集划分完成) print(f训练集{len(train_list)} 张) print(f验证集{len(val_list)} 张) print(f测试集{len(test_list)} 张)四、训练分别创建XL.py以及gesture.yaml文件XL.py注意我这里使用的是cpu训练方法from ultralytics import YOLO model YOLO(yolov8n.pt) results model.train( dataC:/Users/cy/Desktop/ultralytics-main/gesture.yaml, # 指向新配置 epochs50, imgsz640, batch2, devicecpu, workers0, cacheram, projectruns/train, namegesture_yolov8 )gesture.yaml# 绝对路径指向数据集根目录 path: C:/Users/cy/Desktop/ultralytics-main # 训练、验证图片的相对路径相对于 path train: images/train val: images/val # 类别数量 nc: 10 # 类别名称顺序必须和标注文件中的 class id 一致 names: 0: fist 1: five 2: ok 3: one 4: two 5: three 6: four 7: six 8: eight 9: thumbup我的目录结构结果