
yolov7训练时提示“dataset not found”,即使yaml中路径配置正确,也常因残留的旧缓存文件(如`.cache`)导致路径误读,本文提供完整排查与解决步骤。
在使用 YOLOv7 进行模型训练时,出现 Exception: Dataset not found 错误是一个高频问题。值得注意的是:该错误并非总源于 YAML 配置错误——即使你已准确填写 train、val、test 的绝对或相对路径(如 train: ./datasets/mydata/images/train),仍可能因缓存机制失效而触发异常。
根本原因分析
YOLOv7 在首次加载数据集时,会自动生成缓存文件(如 *.cache),其中记录了数据路径、图像尺寸、标签统计等元信息。若后续你修改了 custom_data.yaml 中的路径,但未清除旧缓存,check_dataset() 函数会优先读取 .cache 文件中的过期路径,进而校验失败并抛出 Dataset not found 异常。
解决步骤(推荐顺序执行)
-
清除所有 .cache 文件
在项目根目录及数据集目录下递归搜索并删除:# Windows(PowerShell) Get-ChildItem -Path . -Recurse -Filter "*.cache" | Remove-Item -Force # 或手动定位删除(常见位置): # - yolov7/ 项目根目录下 # - datasets/mydata/ 下 # - utils/ 或 data/ 子目录中
-
验证 YAML 路径格式规范
确保 custom_data.yaml 中路径为相对项目根目录的正确路径(非 Jupyter 工作目录):train: datasets/mydata/images/train # ✅ 推荐:相对路径(以train.py所在目录为基准) val: datasets/mydata/images/val test: datasets/mydata/images/test nc: 3 names: ['cat', 'dog', 'bird']
⚠️ 注意:避免使用 ./ 开头(部分版本解析不稳定),也不要用绝对路径(跨平台/环境易失效)。
-
检查路径实际存在性与权限
在训练前,于 Python 中快速验证:import os from pathlib import Path data_yaml = "custom_data.yaml" with open(data_yaml) as f: import yaml data = yaml.safe_load(f) for split in ['train', 'val', 'test']: p = Path(data[split]) print(f"{split}: {p} → exists? {p.exists()}")若输出 False,请检查路径拼写、大小写、是否遗漏 images/ 或 labels/ 子目录。
-
Jupyter Notebook 用户特别注意
- 确保 notebook 的当前工作目录与 train.py 所在目录一致(可通过 !pwd 或 os.getcwd() 查看);
- 不要直接在 notebook 中调用 !python train.py ...,建议改用终端运行,避免路径上下文混淆;
- 如必须在 notebook 中调试,先执行:
import os os.chdir("C:/Users/Nirajan/Desktop/Minor project/yoloV7") # 切换至项目根目录
补充建议
- 首次运行前,可临时添加日志到 utils/general.py 的 check_dataset() 函数中(第173行附近),打印 data_dict 内容,确认实际读取路径;
- 使用 --noautoanchor 或 --cache ram 参数不会绕过此检查,清缓存是必要前提;
- 若使用 WSL 或 Docker,还需确保路径在容器内外映射一致。
完成上述操作后重新启动训练,90% 以上的 “Dataset not found” 问题将被解决。记住:YOLOv7 的鲁棒性依赖于干净的环境与显式的路径约定——缓存不是敌人,但遗忘清理它,就是训练失败的第一步。










