一、从一张报错截图说起

上周有个同事跑来找我,屏幕上赫然一行错误:

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
│           └── ...

注意几个细节:

  1. images和labels目录同级,且子目录名称必须对应(都是train、val)。
  2. 图片和标签文件一一对应,文件名除后缀外要完全相同(img001.jpg 对应 img001.txt)。
  3. 标签文件是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_min + x_max) / 2 / image_width  # 计算中心点x
# 这里要小心整数除法!如果x_min、x_max是整数,先转float再做除法,否则归一化结果全是0

另外,记得检查转换后的txt里有没有空文件。有些目标检测数据集中存在“无目标”的图片,这类图片在YOLO训练时需要保留图片文件,但标签文件可以不存在(或者留空txt)。但YOLOv5在加载时会跳过空标签,所以如果你发现图片数量对不上,先查是不是空标签被忽略了。


五、启动训练命令:参数别乱调

数据准备好后,终于可以训练了。基础命令长这样:

python train.py --img 640 --batch 16 --epochs 100 --data your_data.yaml --weights yolov5s.pt

看起来简单,但新手容易在几个参数上翻车:

  • --img 640:输入图片尺寸。如果不是640×640,需要提前把数据resize好,或者用 --rect 参数开启矩形训练(减少填充)。但矩形训练在自定义数据上有时会不稳定,建议先默认方形。
  • --batch 16:批次大小。如果显存不够,先调小batch,而不是盲目调小img。img太小会影响检测精度,尤其是小目标。
  • --weights yolov5s.pt:建议用预训练权重,从零训练(--weights '')需要大量数据和迭代,普通人玩不起。
  • --data:这里写你刚才准备的YAML路径。如果报错“找不到文件”,八成是路径问题,先用绝对路径试试。

六、训练过程中的监控与调试

训练启动后,别干等着。打开TensorBoard(训练会自动生成 runs/train/exp 目录):

tensorboard --logdir runs/train

重点看几个曲线:

  • train/box_loss, train/obj_loss, train/cls_loss:这三个loss应该稳步下降,如果震荡剧烈或者上升,可能是学习率太大或数据标签有问题。
  • metrics/mAP@0.5:验证集mAP,一般会随着训练上升。如果一直很低,检查标签是否正确、类别数是否匹配。

如果训练中途停了(比如断电),可以用 --resume 参数接续训练:

python train.py --resume runs/train/exp/weights/last.pt

七、个人经验与建议

  1. 数据质量比算法重要:第一次训练时,花70%时间在数据清洗和标注检查上都不为过。模糊图片、错误标注、类别不平衡,这些问题靠调参解决不了。

  2. 从小规模开始试跑:先用10张图片训练1个epoch,确保流程能跑通,再上全量数据。否则等了几小时报错,心态容易崩。

  3. 保存环境配置:YOLOv5版本更新快,不同版本之间可能有兼容问题。建议用 pip freeze > requirements.txt 保存环境,方便复现。

  4. 不要迷信默认参数:学习率、优化器这些参数,官方默认是针对COCO数据集调的。你的数据分布不同,适当调整学习率(--lr0)和热身轮数(--warmup_epochs)可能会有惊喜。

  5. 标签文件用相对路径存:避免把绝对路径硬编码到代码或配置里,换台机器又得重改。

最后,遇到报错先看错误信息最后几行,大概率是路径、格式或版本问题。YOLOv5的GitHub issue里几乎能搜到所有常见坑,善用搜索能省下大量时间。


训练自己的数据集就像第一次组装一台机器,螺丝拧不对,整个架子都晃。把数据准备这个地基打稳,后面调优才有意义。好了,命令已经跑起来了,接下来就是观察loss曲线,耐心等结果了。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐