新手零失败!YOLOv8自定义数据集训练全流程,标注工具手把手教,看完就能跑通
做YOLO目标检测的新手是不是都遇到过这个困境官方预训练模型玩得溜一到自己的业务场景就抓瞎想做PCB板缺陷检测、零件有无识别、宠物品种分类结果卡在自定义数据集训练这一步要么标注工具不会用要么数据集格式不对要么训练疯狂报错折腾一周都跑不通一个完整的流程。我带过很多新手学YOLOv890%的人卡的第一个坎不是模型原理而是数据标注和数据集格式匹配。其实YOLOv8的自定义训练超简单你只需要准备好图片剩下的标注、数据集划分、训练、验证我手把手一步一步教你全程零复杂操作看完这篇文章你就能跑通自己的自定义数据集训练做出专属的目标检测模型。一、先搞懂训练前你需要准备什么不用懂复杂的深度学习原理不用会复杂的代码你只需要准备好两样东西待标注的图片对应你的业务场景比如PCB缺陷、螺丝螺母、猫狗宠物单类目标建议至少200张图片多类目标每类至少100张图片格式为jpg/png分辨率建议640×640左右不要太大也不要太小基础Python环境Python 3.8~3.11版本这是YOLOv8兼容最好的版本别用太新的Python 3.12容易出现依赖兼容问题。整体训练全流程我把整个训练流程拆成了7步全程无复杂操作跟着走就能完成环境安装图片采集与文件夹搭建labelImg标注工具手把手教学数据集自动划分数据集配置文件编写YOLOv8模型训练结果验证与推理测试二、第一步30秒完成环境安装我们只需要安装两个库全程一行命令搞定ultralyticsYOLOv8官方库封装了训练、推理、验证的所有功能不用自己写复杂的训练代码labelImg最适合新手的图像标注工具可视化操作一键导出YOLO格式的标注文件。打开终端Windows用管理员PowerShell/CMDmacOS/Linux用Terminal执行以下命令国内用户推荐用清华镜像源下载速度拉满pipinstallultralytics labelImg-ihttps://pypi.tuna.tsinghua.edu.cn/simple安装完成后执行以下命令验证是否成功yolo version labelImg如果能正常输出版本号、弹出labelImg标注窗口说明环境安装成功。三、第二步搭建标准数据集文件夹很多新手训练报错90%是因为文件夹结构不对YOLOv8有严格的数据集格式要求我们直接按官方标准搭建一步到位避免后续踩坑。在你的电脑任意位置创建如下的文件夹结构全程不要用中文路径、空格、特殊符号这是新手最容易踩的坑my_yolo_dataset/ # 数据集根目录 ├── images/ # 存放所有图片 │ ├── 001.jpg │ ├── 002.jpg │ └── ... └── labels/ # 存放标注生成的txt文件标注完成后自动生成把你准备好的所有图片全部放到images文件夹里图片命名建议用数字序号不要用中文避免后续出现路径问题。四、第三步labelImg标注工具手把手教学这是整个流程的核心也是新手最容易卡壳的地方我拆成8个小步骤哪怕你是第一次用标注工具也能一步到位。步骤1打开labelImg并配置基础设置终端执行labelImg命令弹出标注工具窗口左侧菜单栏点击Change Save Dir选择我们刚才创建的labels文件夹这是标注文件的保存位置一定要选对左侧菜单栏点击Open Dir选择我们刚才创建的images文件夹此时右侧会显示所有图片的列表最关键的一步点击标注窗口下方的PascalVOC按钮把格式切换为YOLOYOLOv8只识别YOLO格式的txt标注文件这一步错了后面全白搭。步骤2开始标注目标按快捷键W调出矩形标注框鼠标变成十字光标在图片上按住鼠标左键框住你要检测的目标松开左键弹出标签输入框输入目标的类别名称比如defect、screw、cat点击OK完成一个目标的标注一张图片里的所有目标都标注完成后按快捷键CtrlS保存标注文件此时labels文件夹里会生成一个和图片同名的txt文件按快捷键D切换到下一张图片A切换到上一张图片重复上面的标注操作直到所有图片标注完成。标注核心技巧与避坑快捷键一定要用W画框、CtrlS保存、D下一张、A上一张、Delete删除标注框效率提升10倍标注框要贴紧目标不要留太多空白背景也不要截断目标的边缘不然模型学不到目标的完整特征类别名称要统一比如标注螺丝全程都用screw不要一会用螺丝、一会用luosi、一会用screw大小写也要统一漏标比多标更可怕图片里的目标一定要全部标注哪怕只漏了10%模型的召回率会暴跌标注完成后一定要检查随机抽查10%的图片看标注文件是否生成、类别是否正确、框是否准确避免后续训练出问题。五、第四步一键划分训练集/验证集标注完成后我们需要把数据集划分为训练集用来训练模型和验证集用来验证模型精度比例建议8:2新手不用单独划分测试集。很多新手手动复制粘贴划分不仅麻烦还容易出错我给你写了一个极简的Python脚本直接复制就能用一键完成划分。在数据集根目录my_yolo_dataset同级目录创建一个split_dataset.py文件内容如下importosimportrandomimportshutil# 配置参数dataset_pathmy_yolo_dataset# 数据集根目录train_ratio0.8# 训练集比例val_ratio0.2# 验证集比例# 创建划分后的文件夹train_images_dirf{dataset_path}/train/imagestrain_labels_dirf{dataset_path}/train/labelsval_images_dirf{dataset_path}/val/imagesval_labels_dirf{dataset_path}/val/labelsos.makedirs(train_images_dir,exist_okTrue)os.makedirs(train_labels_dir,exist_okTrue)os.makedirs(val_images_dir,exist_okTrue)os.makedirs(val_labels_dir,exist_okTrue)# 获取所有图片image_list[fforfinos.listdir(f{dataset_path}/images)iff.endswith((.jpg,.png,.jpeg))]random.shuffle(image_list)# 随机打乱# 划分数量train_numint(len(image_list)*train_ratio)train_imagesimage_list[:train_num]val_imagesimage_list[train_num:]# 复制训练集forimage_nameintrain_images:# 复制图片shutil.copy(f{dataset_path}/images/{image_name},f{train_images_dir}/{image_name})# 复制对应的标注文件label_nameos.path.splitext(image_name)[0].txtifos.path.exists(f{dataset_path}/labels/{label_name}):shutil.copy(f{dataset_path}/labels/{label_name},f{train_labels_dir}/{label_name})# 复制验证集forimage_nameinval_images:shutil.copy(f{dataset_path}/images/{image_name},f{val_images_dir}/{image_name})label_nameos.path.splitext(image_name)[0].txtifos.path.exists(f{dataset_path}/labels/{label_name}):shutil.copy(f{dataset_path}/labels/{label_name},f{val_labels_dir}/{label_name})print(f数据集划分完成训练集{len(train_images)}张验证集{len(val_images)}张)执行这个脚本终端会输出划分结果同时数据集根目录会生成train和val两个文件夹里面分别存放训练集和验证集的图片与标注完美符合YOLOv8的官方格式要求。六、第五步编写数据集配置yaml文件YOLOv8通过yaml文件读取数据集的路径、类别数量、类别名称这是训练的核心配置文件我们直接用极简模板改3个地方就能用。在数据集根目录my_yolo_dataset同级目录创建一个my_dataset.yaml文件内容如下# 数据集根目录路径改成你自己的绝对路径不要用中文path:D:/code/my_yolo_dataset# 训练集和验证集的相对路径相对于pathtrain:train/imagesval:val/images# 类别数量改成你自己的类别数比如1类就写1nc:2# 类别名称和你标注时的名称完全一致顺序不能错names:0:screw1:nut关键避坑提醒path一定要写绝对路径Windows系统用/或者\\不要用单个\不然会识别失败nc类别数量必须和names里的数量完全一致多一个少一个都会训练报错names里的类别名称必须和你标注时输入的名称完全一致大小写、拼写都不能错不然模型学不到对应类别的特征。七、第六步一行命令启动模型训练所有准备工作都完成了现在到了最激动人心的训练环节YOLOv8官方库已经把所有训练逻辑都封装好了我们只需要一行命令就能启动训练。在终端执行以下命令我把每个参数都给你解释清楚新手直接复制修改就能用yolo detect trainmodelyolov8n.ptdatamy_dataset.yamlepochs100imgsz640batch8device0参数解释新手必看参数作用新手建议model预训练模型yolov8n.pt是最轻量的版本适合新手和CPU训练新手优先用yolov8n.pt显存小的电脑别用yolov8x.ptdata我们刚才写的数据集配置yaml文件路径直接写文件名和终端执行路径一致即可epochs训练轮次模型会把所有训练集图片完整学习一遍为1轮新手建议100轮数据少的话可以设50轮imgsz训练的图片分辨率和模型输入尺寸一致固定640不要随便改batch批次大小一次训练加载的图片数量显存8G设84G设4CPU训练设2太大会显存溢出device训练设备0代表用第0张GPUcpu代表用CPU训练有NVIDIA显卡就写0没有就写cpu执行命令后YOLOv8会自动下载预训练模型、加载数据集、开始训练终端会实时显示训练进度、损失值、精度指标全程不用人工干预等着训练完成就行。小提示CPU训练会比较慢建议用NVIDIA显卡训练100轮训练大概30分钟就能完成CPU可能要几个小时。八、训练结果查看与推理验证8.1 训练结果解读训练完成后终端会输出训练结果的保存路径默认在runs/detect/train/文件夹里里面有几个核心文件新手一定要看results.png训练过程的损失曲线和精度曲线loss持续下降、mAP持续上升说明模型训练正常confusion_matrix.png混淆矩阵看模型对每个类别的识别准确率对角线数值越高越好weights/文件夹里面有两个模型文件best.pt是训练过程中精度最高的模型last.pt是最后一轮训练的模型我们后续推理用best.pt就行。8.2 用训练好的模型做推理测试模型训练好了我们来测试一下效果还是一行命令搞定yolo detect predictmodelruns/detect/train/weights/best.ptsourcetest.jpgconf0.5source你要测试的图片/视频路径也可以写文件夹路径批量测试conf置信度阈值只有模型认为置信度超过0.5的目标才会显示出来。执行完成后结果会保存在runs/detect/predict/文件夹里打开图片就能看到模型识别的目标框、类别和置信度是不是超有成就感九、新手高频踩坑避坑指南基于带新手的经验总结了80%的人都会踩的坑提前规避就能一次跑通路径绝对不能有中文/空格/特殊符号从数据集文件夹到yaml文件路径全程用英文和数字这是最常见的报错原因标注格式一定要是YOLOlabelImg默认是PascalVOC格式一定要切换成YOLO不然生成的xml文件YOLOv8识别不了类别数量和名称一定要匹配yaml文件里的nc、names和标注时的类别数量、名称必须完全一致不然模型精度会暴跌甚至训练报错显存溢出问题batch设太大导致显存不够把batch调小比如2、4或者用yolov8n.pt轻量模型图片和标签不对应标注文件的名称必须和图片名称完全一致比如001.jpg对应001.txt不然会出现“找不到标签”的警告模型学不到东西训练轮次太少不要只训10轮20轮模型还没收敛精度会非常差新手至少训50轮数据集数量太少单类目标至少100张图片数量太少模型会过拟合训练集精度很高实际测试完全没用。写在最后YOLOv8的自定义数据集训练真的没有你想的那么难核心就是做好标注、搭对数据集结构、写对配置文件剩下的训练、推理YOLOv8官方库都帮你封装好了一行命令就能搞定。很多人学YOLO总想着先搞懂模型原理、损失函数、反向传播其实完全没必要新手先跑通一个完整的训练流程看到自己的模型能识别出目标有了成就感再去深入学习原理效率会高10倍。本文的所有步骤和代码都经过实测新手跟着走就能一次跑通如果你在训练过程中遇到任何问题欢迎在评论区留言。