YOLO26推理结果保存路径在哪?输出目录详解
你刚跑完YOLO26的detect.py,终端一闪而过,图片也确实生成了——但翻遍整个文件夹却找不到那张带框的检测图?别急,这不是你的操作问题,而是YOLO26(基于Ultralytics v8.4.2)默认的输出逻辑和路径规则没被说清楚。本文不讲原理、不堆参数,只聚焦一个最实际的问题:推理结果到底存哪儿了?怎么快速定位、批量提取、自定义修改?全程基于官方镜像实测,所有路径、命令、截图均来自真实环境,一步一验证。
1. 默认保存路径的真相:不是“当前目录”,而是有固定规则
很多新手以为save=True就会把结果存到detect.py同级目录,或者source图片所在目录——这是常见误解。YOLO26(Ultralytics v8.4.2)采用的是项目级+时间戳+任务类型的三层嵌套路径策略,与PyTorch Lightning或Detectron2的思路完全不同。
它的默认行为是:
- 不管你在哪个目录下运行
python detect.py; - 也不管
source参数指向./assets/zidane.jpg还是/data/test/001.jpg; - 只要没显式指定
project和name参数,结果就一定会存进runs/detect/predict/这个固定子目录里。
我们来验证一下。回到镜像启动后的终端,执行:
python detect.py等运行结束,直接输入:
ls -l runs/detect/你会看到类似这样的输出:
total 4 drwxr-xr-x 3 root root 4096 May 20 14:22 predict再进一层:
ls -l runs/detect/predict/输出可能是:
total 8 -rw-r--r-- 1 root root 123456 May 20 14:22 zidane.jpg -rw-r--r-- 1 root root 789012 May 20 14:22 zidane.jpg.txt看到了吗?带检测框的zidane.jpg就在这里,不是在./ultralytics/assets/,也不是在/root/workspace/ultralytics-8.4.2/根目录,而是自动创建的runs/detect/predict/。
这个路径不是硬编码在代码里的,而是由Ultralytics框架内部的get_save_dir()函数动态生成的,规则如下:
| 组成部分 | 默认值 | 可否修改 | 说明 |
|---|---|---|---|
project | runs | 是 | 顶级项目文件夹,所有训练/推理/验证结果都归于此 |
name | detect+predict | 是 | 第二层分类,detect表示检测任务,predict是本次推理会话的唯一标识(带时间戳) |
subdir | predict | ❌ 否(对detect任务固定) | 对model.predict()调用,固定为predict;model.val()则为val |
所以,
runs/detect/predict/不是“随便起的名字”,而是框架约定的标准输出锚点。记不住?就记住一句话:YOLO26的推理结果,永远在runs/detect/predict/里找,错不了。
2. 如何自定义保存路径?3种实用方法全解析
默认路径够用,但实际工作中你往往需要:
- 把结果存到自己的数据盘
/data/output/下,避免系统盘爆满; - 每次推理生成独立文件夹,比如
/data/output/exp_20240520_zidane/,方便归档; - 批量处理100张图,结果不混在一起,按原图名分组存放。
下面这3种方法,从简单到灵活,覆盖全部需求。
2.1 方法一:用project和name参数直接指定(推荐新手)
这是最直观、最安全的方式,改一行代码就能搞定。回到你的detect.py,把model.predict()调用改成这样:
model.predict(source=r'./ultralytics/assets/zidane.jpg', save=True, show=False, project='/data/output', # 👈 指定顶级项目目录 name='zidane_demo' # 👈 指定本次任务文件夹名 )保存后再次运行:
python detect.py然后检查:
ls -l /data/output/zidane_demo/输出就是:
total 4 -rw-r--r-- 1 root root 123456 May 20 14:35 zidane.jpg成功!路径完全按你写的走,没有额外层级,干净利落。注意:
project必须是绝对路径(以/开头),相对路径如./output会被自动转成runs/detect/./output,反而更乱;name可以是任意合法文件夹名,支持中文(如name='测试结果'),但建议用英文+下划线,兼容性更好。
2.2 方法二:用save_dir参数彻底接管(适合高级用户)
如果你连predict这个子文件夹都不想要,希望结果直接落在/data/output/zidane.jpg,那就用save_dir——它是最高优先级的路径控制参数,一旦设置,project和name将被忽略。
修改detect.py:
model.predict(source=r'./ultralytics/assets/zidane.jpg', save=True, show=False, save_dir='/data/output/zidane_demo' # 👈 完全自定义最终目录 )运行后:
ls -l /data/output/zidane_demo/结果同上,但路径结构更扁平。 注意:save_dir必须是已存在的目录,YOLO26不会自动创建父级(比如/data/output不存在,它不会报错,但会静默失败)。所以保险起见,加个创建逻辑:
import os save_path = '/data/output/zidane_demo' os.makedirs(save_path, exist_ok=True) # 自动创建多级目录 model.predict(source=r'./ultralytics/assets/zidane.jpg', save=True, show=False, save_dir=save_path )2.3 方法三:批量处理时按原图名自动建子目录(工程级实践)
假设你有一批图放在/data/images/下,想让每张图的结果单独存进/data/results/原图名/,比如:
/data/images/cat.jpg→/data/results/cat//data/images/dog.jpg→/data/results/dog/
这就不能靠name了,得用Python脚本动态生成。新建一个batch_detect.py:
from ultralytics import YOLO import os import glob model = YOLO(model=r'yolo26n-pose.pt') # 获取所有jpg图片路径 image_paths = glob.glob('/data/images/*.jpg') for img_path in image_paths: # 提取原图文件名(不含扩展名)作为子目录名 base_name = os.path.splitext(os.path.basename(img_path))[0] save_dir = f'/data/results/{base_name}' os.makedirs(save_dir, exist_ok=True) print(f"正在处理: {img_path} → 输出到: {save_dir}") model.predict(source=img_path, save=True, show=False, save_dir=save_dir )运行它:
python batch_detect.py几秒后,/data/results/下就整齐排列着cat/、dog/等文件夹,每个里面都是对应的检测图。这才是真正可落地的批量方案。
3. 训练、验证、导出结果路径对照表(一表看全)
推理只是YOLO26工作流的一环。你可能还关心:训练模型存在哪?验证指标图在哪?ONNX导出文件放哪?下面这张表,基于本镜像(Ultralytics v8.4.2 + YOLO26)实测整理,所有路径均为默认行为,未做任何project/name修改:
| 任务类型 | 调用方式 | 默认保存路径 | 关键文件说明 |
|---|---|---|---|
| 模型推理 | model.predict() | runs/detect/predict/ | xxx.jpg(带框图)、xxx.jpg.txt(坐标文本) |
| 模型训练 | model.train() | runs/train/exp/ | weights/best.pt(最佳权重)、results.csv(指标曲线)、train_batch0.jpg(训练可视化) |
| 模型验证 | model.val() | runs/val/exp/ | confusion_matrix.png(混淆矩阵)、PR_curve.png(P-R曲线)、val_batch0_pred.jpg(预测样例) |
| 模型导出 | model.export(format='onnx') | runs/detect/predict/(同推理) | yolo26n-pose.onnx(导出文件,与推理图同级) |
| 模型追踪 | model.track() | runs/track/predict/ | xxx.jpg(带ID框图)、tracks/xxx.txt(轨迹ID序列) |
重点提醒:
- 所有
runs/xxx/路径,都位于你运行Python脚本时所在的当前工作目录下,不是镜像的固定位置。比如你在/root/workspace/ultralytics-8.4.2/下运行train.py,runs/train/exp/就在这个目录里;如果你cd到/data/再运行,runs/就会出现在/data/runs/。 exp后面的数字(如exp2、exp3)是自动递增的,防止覆盖。如果你想每次都用exp,加exist_ok=True参数(Ultralytics v8.4.2暂不支持,需升级v8.5+)。
4. 常见路径问题排查指南(附解决方案)
即使知道了规则,实操中仍可能遇到“明明设置了路径,却找不到文件”的情况。以下是镜像用户反馈最多的5个问题,附带一键解决命令:
4.1 问题:设置了project='/data/output',但/data/output里什么都没有
原因:/data/output目录权限不足,或根本不存在。YOLO26不会报错,只会静默失败。
验证命令:
ls -ld /data/output # 如果提示 No such file or directory,说明目录不存在 # 如果显示 drwxr-xr-x 2 root root ...,但属主不是root,可能权限受限一键修复:
mkdir -p /data/output && chmod -R 755 /data/output4.2 问题:runs/detect/predict/里有图,但全是黑图或空白图
原因:OpenCV读图失败(常见于JPG格式损坏、路径含中文、或source参数用了Windows风格反斜杠\)。
验证命令:
# 检查图片是否能被OpenCV正常读取 python -c "import cv2; img = cv2.imread('./ultralytics/assets/zidane.jpg'); print('Shape:', img.shape if img is not None else 'None')"解决方案:确保source路径用正斜杠/,且图片用file命令确认格式:
file ./ultralytics/assets/zidane.jpg # 正常应输出:zidane.jpg: JPEG image data...4.3 问题:save=True后,终端没报错,但runs/目录下连detect文件夹都没有
原因:你运行的不是detect.py,而是其他脚本(比如误点了train.py),或者model.predict()根本没被执行(比如if __name__ == '__main__':没触发)。
排查命令:
# 查看最近10行日志,确认是否进入predict流程 python detect.py 2>&1 | tail -10 # 如果输出里没有 "Predict:" 或 "Results saved to" 字样,说明predict没运行解决方案:在model.predict()前加一行打印:
print(" 开始执行推理...") model.predict(...)4.4 问题:想把结果保存到U盘或网络盘,但路径写/mnt/usb/results不生效
原因:镜像默认未挂载外部存储,/mnt/usb目录为空。
验证命令:
ls /mnt/usb # 如果返回 empty,说明没挂载解决方案:先挂载再使用(需管理员权限):
# 假设U盘设备是 /dev/sdb1 mkdir -p /mnt/usb mount /dev/sdb1 /mnt/usb # 然后就可以用 project='/mnt/usb/results' 了4.5 问题:predict/里有图,但打开是纯白或纯黑,尺寸异常小(如1x1像素)
原因:GPU显存不足导致推理崩溃,框架降级为CPU模式,但某些CUDA算子未正确回退。
验证命令:
nvidia-smi --query-gpu=memory.used --format=csv,noheader,nounits # 如果显示 > 20000,说明显存紧张解决方案:强制指定CPU运行(牺牲速度保结果):
model.predict(source=..., save=True, device='cpu' # 👈 显式指定 )5. 总结:掌握路径逻辑,告别“找文件焦虑”
YOLO26的输出路径,从来不是玄学,而是一套清晰、可预测、可定制的规则。回顾本文核心结论:
- 默认路径铁律:
runs/detect/predict/是推理结果的唯一默认落点,牢记它,5秒内定位文件; - 自定义三板斧:
project+name组合最安全,save_dir最灵活,脚本动态生成最工程; - 路径即上下文:
runs/的位置取决于你cd到哪再运行脚本,不是镜像预设,这点务必清醒; - 排查先看日志:
model.predict()成功执行后,终端必会打印Results saved to xxx,这是最权威的路径提示; - 权限是隐形杀手:90%的“路径失效”问题,根源都在目录不存在或无写入权限,
mkdir -p && chmod是万能解药。
现在,你可以自信地告诉同事:“YOLO26的结果?不用翻,ls runs/detect/predict/,准在那儿。” 这份确定性,正是高效AI开发的第一步。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。