015.YOLOv5训练自己的数据集:从数据准备到启动训练命令
一、从一张报错截图说起上周有个同事跑来找我屏幕上赫然一行错误RuntimeError: No labels found in /your/path/train.cache他一脸困惑“数据明明放好了YOLOv5的脚本也跑了怎么连标签都找不到” 我扫了一眼他的目录结构心里大概有数了——又是YAML文件里路径没改对或者图片和标签根本没对应上。这类问题在第一次用YOLOv5训练自定义数据时几乎人人都会遇到。今天我们就从数据准备这个最基础的环节开始把整个流程走通顺便把常见的坑填平。二、数据准备别急着跑代码先理清结构YOLOv5对数据目录结构有固定要求很多人一上来就照搬官方示例结果路径一改就乱。建议你先在本地把目录树建好像这样datasets/ ├── your_project/ │ ├── images/ │ │ ├── train/ │ │ │ ├── img001.jpg │ │ │ └── ... │ │ └── val/ │ │ ├── img101.jpg │ │ └── ... │ └── labels/ │ ├── train/ │ │ ├── img001.txt │ │ └── ... │ └── val/ │ ├── img101.txt │ └── ...注意几个细节images和labels目录同级且子目录名称必须对应都是train、val。图片和标签文件一一对应文件名除后缀外要完全相同img001.jpg 对应 img001.txt。标签文件是txt格式每行内容为class_id x_center y_center width height坐标是归一化后的0-1之间。这里经常有人忘了归一化直接填像素值结果训练时loss直接爆炸。三、写YAML配置文件路径是最大的坑数据放好后需要写一个数据集配置文件比如your_data.yaml。官方例子喜欢用绝对路径但实际项目中绝对路径一换机器就挂。建议用相对路径并且把YAML文件放在项目根目录下。# 这样写容易移植path:../datasets/your_project# 数据集根目录相对路径更安全train:images/train# 相对path的路径val:images/val# 类别数nc:2# 类别名称列表注意顺序从0开始names:[cat,dog]重点提醒path是相对于YOLOv5代码根目录的如果你把YAML放在别处这里大概率会报路径错误。我习惯把数据集放在项目外用../引用避免代码和数据集混在一起。四、标签格式转换常见脚本坑点如果你的标签原来是VOC XML或者COCO JSON格式需要转成YOLO格式。网上脚本很多但有几个地方容易出错# 转换脚本里经常看到这样的代码x_center(x_minx_max)/2/image_width# 计算中心点x# 这里要小心整数除法如果x_min、x_max是整数先转float再做除法否则归一化结果全是0另外记得检查转换后的txt里有没有空文件。有些目标检测数据集中存在“无目标”的图片这类图片在YOLO训练时需要保留图片文件但标签文件可以不存在或者留空txt。但YOLOv5在加载时会跳过空标签所以如果你发现图片数量对不上先查是不是空标签被忽略了。五、启动训练命令参数别乱调数据准备好后终于可以训练了。基础命令长这样python train.py--img640--batch16--epochs100--datayour_data.yaml--weightsyolov5s.pt看起来简单但新手容易在几个参数上翻车--img 640输入图片尺寸。如果不是640×640需要提前把数据resize好或者用--rect参数开启矩形训练减少填充。但矩形训练在自定义数据上有时会不稳定建议先默认方形。--batch 16批次大小。如果显存不够先调小batch而不是盲目调小img。img太小会影响检测精度尤其是小目标。--weights yolov5s.pt建议用预训练权重从零训练--weights 需要大量数据和迭代普通人玩不起。--data这里写你刚才准备的YAML路径。如果报错“找不到文件”八成是路径问题先用绝对路径试试。六、训练过程中的监控与调试训练启动后别干等着。打开TensorBoard训练会自动生成runs/train/exp目录tensorboard--logdirruns/train重点看几个曲线train/box_loss,train/obj_loss,train/cls_loss这三个loss应该稳步下降如果震荡剧烈或者上升可能是学习率太大或数据标签有问题。metrics/mAP0.5验证集mAP一般会随着训练上升。如果一直很低检查标签是否正确、类别数是否匹配。如果训练中途停了比如断电可以用--resume参数接续训练python train.py--resumeruns/train/exp/weights/last.pt七、个人经验与建议数据质量比算法重要第一次训练时花70%时间在数据清洗和标注检查上都不为过。模糊图片、错误标注、类别不平衡这些问题靠调参解决不了。从小规模开始试跑先用10张图片训练1个epoch确保流程能跑通再上全量数据。否则等了几小时报错心态容易崩。保存环境配置YOLOv5版本更新快不同版本之间可能有兼容问题。建议用pip freeze requirements.txt保存环境方便复现。不要迷信默认参数学习率、优化器这些参数官方默认是针对COCO数据集调的。你的数据分布不同适当调整学习率--lr0和热身轮数--warmup_epochs可能会有惊喜。标签文件用相对路径存避免把绝对路径硬编码到代码或配置里换台机器又得重改。最后遇到报错先看错误信息最后几行大概率是路径、格式或版本问题。YOLOv5的GitHub issue里几乎能搜到所有常见坑善用搜索能省下大量时间。训练自己的数据集就像第一次组装一台机器螺丝拧不对整个架子都晃。把数据准备这个地基打稳后面调优才有意义。好了命令已经跑起来了接下来就是观察loss曲线耐心等结果了。