YOLO26推理保存路径?predict结果输出指南
你刚拉起YOLO26官方镜像,运行完python detect.py,却没在当前目录看到任何结果图?终端里只刷了一堆日志,runs/detect/predict/在哪?为什么save=True却没生成文件?别急——这不是代码写错了,而是你还没摸清YOLO26(基于Ultralytics v8.4.2)默认的输出逻辑和路径规则。
本文不讲原理、不堆参数,只聚焦一个工程师最常卡住的问题:YOLO26的model.predict()结果到底存在哪?怎么改才能存到你想要的位置?怎么快速验证是否成功保存?全程基于你手头这个开箱即用的官方镜像环境,所有操作可直接复现,无需额外安装或配置。
1. 镜像环境与YOLO26基础认知
先明确一个关键前提:你正在使用的,是基于Ultralytics 官方代码库 v8.4.2构建的 YOLO26 专用镜像。它不是魔改版,也不是精简版,而是完整保留了 Ultralytics 标准行为逻辑的生产级环境。这意味着它的predict输出路径、命名规则、目录结构,完全遵循 Ultralytics 的默认约定——而这个约定,恰恰是新手最容易忽略的“隐形开关”。
1.1 环境核心配置(确认无误再动手)
| 组件 | 版本 | 说明 |
|---|---|---|
| PyTorch | 1.10.0 | 与 CUDA 12.1 兼容稳定,支持 YOLO26 所有算子 |
| CUDA | 12.1 | 镜像已预装驱动与 toolkit,无需手动配置 |
| Python | 3.9.5 | Ultralytics v8.4.2 官方推荐版本,避免兼容问题 |
| Ultralytics | v8.4.2 | YOLO26 官方适配分支,predict行为以此为准 |
注意:镜像启动后默认进入
torch25环境,但YOLO26依赖的包全部安装在yolo环境中。必须先执行conda activate yolo,否则import ultralytics会报错或加载旧版本。
1.2 为什么save=True却找不到图片?
这是最典型的误解来源。Ultralytics 的predict方法从不把结果保存在你运行脚本的当前目录,也不会覆盖你指定的source路径。它严格遵循一套自动生成的、带时间戳的嵌套目录规则:
runs/ └── detect/ └── predict/ ← 第一次运行 ├── image1.jpg ├── image2.jpg └── ... └── predict2/ ← 第二次运行(自动编号) ├── image1.jpg └── ...这个runs/detect/目录,永远生成在你执行python detect.py命令时所在的那个工作目录下,而不是代码文件所在目录,更不是/root/ultralytics-8.4.2/根目录。
所以,如果你在/root/workspace/ultralytics-8.4.2/下运行命令,结果就在/root/workspace/ultralytics-8.4.2/runs/detect/;
如果你在/root/下运行,结果就在/root/runs/detect/——路径由你的终端当前位置决定,而非代码位置。
2. predict结果保存路径详解与实操验证
现在,我们一步步拆解model.predict()的保存逻辑,并用最短路径验证结果是否真的生成了。
2.1 默认保存路径的生成规则
当你调用:
model.predict(source='./ultralytics/assets/zidane.jpg', save=True)Ultralytics 会做三件事:
- 自动创建顶级目录:
runs/detect/(固定前缀 + 任务类型) - 智能生成子目录名:
predict→predict2→predict3…(按存在顺序递增,不重置) - 严格保持原始文件名:
zidane.jpg→runs/detect/predict/zidane.jpg(不加前缀、不改后缀)
关键结论:只要终端显示
Results saved to ...,就代表保存成功。路径一定在runs/detect/下,且子目录名一定是predict或其变体(如predict2)。
2.2 三步定位你的结果图(零失败)
别再满系统find / -name "zidane.jpg"了。按这个流程,10秒内找到:
第一步:确认你运行脚本时的当前路径
在终端输入:
pwd假设输出是/root/workspace/ultralytics-8.4.2。
第二步:直接跳转到预测结果根目录
cd runs/detect/ ls -l你会看到类似:
total 4 drwxr-xr-x 2 root root 4096 Jun 15 10:22 predict进入它:
cd predict ls -l输出应为:
-rw-r--r-- 1 root root 123456 Jun 15 10:22 zidane.jpg第三步:用OpenCV快速验证图片内容(防空文件)
在Python中执行:
import cv2 img = cv2.imread('zidane.jpg') print("图片尺寸:", img.shape) # 应输出 (1080, 1920, 3) 类似值 cv2.imshow('result', img) cv2.waitKey(0)如果窗口弹出并显示带检测框的图片,恭喜,路径完全正确。
2.3 如何自定义保存路径?(两种可靠方案)
方案一:用project+name参数(推荐,最干净)
修改你的detect.py:
model.predict( source='./ultralytics/assets/zidane.jpg', save=True, project='/root/my_results', # 指定父目录 name='my_detection' # 指定子目录名(不再自动编号) )运行后,结果将严格保存在:
/root/my_results/my_detection/zidane.jpg优势:路径完全可控,无歧义,适合批量处理或项目归档。
方案二:用save_dir参数(绝对路径,最直接)
from pathlib import Path model.predict( source='./ultralytics/assets/zidane.jpg', save=True, save_dir=Path('/root/output/images') # 必须是 Path 对象 )结果将保存在:
/root/output/images/zidane.jpg注意:save_dir会忽略project和name,且必须确保父目录/root/output/images已存在(可用mkdir -p /root/output/images创建)。
3. 视频与摄像头推理的保存路径特殊说明
图片是单文件,视频和摄像头流则是整个文件夹。路径规则一致,但内容不同:
3.1 视频推理(source='video.mp4')
- 结果保存为同名MP4文件,但存放在
runs/detect/下的对应子目录中 - 例如:
source='data/test.mp4'→ 输出为runs/detect/predict/test.mp4 - 验证方法:
ls runs/detect/predict/ && ffprobe test.mp4(检查是否为有效视频)
3.2 摄像头实时推理(source='0')
- 默认不保存!因为
source=0是流式输入,没有“文件名”可继承 - 必须显式指定
save_txt=False, save_conf=True等参数,并配合stream=True使用 - 更实用的做法:先录屏保存为MP4,再用YOLO26处理该MP4文件(路径规则同上)
4. 训练输出路径与推理路径的关联性
你可能注意到:训练时指定了project='runs/train',而推理默认是runs/detect/。它们是完全独立的两个目录树,互不影响。
runs/train/exp/weights/best.pt→ 训练好的模型权重runs/detect/predict/zidane.jpg→ 推理结果图片
但二者可以联动:
将训练得到的best.pt直接用于推理:
model = YOLO('/root/workspace/ultralytics-8.4.2/runs/train/exp/weights/best.pt') model.predict(source='test.jpg', save=True, project='/root/inference_results')路径清晰,职责分明。
5. 常见陷阱与避坑指南
| 问题现象 | 根本原因 | 一招解决 |
|---|---|---|
runs/detect/目录不存在 | 从未成功运行过predict(save=True),或终端报错中断 | 运行一次最简代码:model.predict('zidane.jpg', save=True),看是否生成 |
找到predict目录但里面是空的 | source路径写错(如文件不存在),YOLO静默失败 | 先用ls ./ultralytics/assets/zidane.jpg确认文件真实存在 |
| 图片有检测框但颜色异常(全黑/全白) | OpenCV 读取BGR格式,YOLO26输出RGB,显示时未转换 | 用cv2.cvtColor(img, cv2.COLOR_RGB2BGR)再显示 |
多次运行后出现predict2,predict3 | Ultralytics 为避免覆盖,自动递增目录名 | 删除旧目录:rm -rf runs/detect/predict*,再运行即可重置为predict |
| Xftp下载时提示“权限拒绝” | runs/目录属主是root,Xftp默认以普通用户连接 | 在Xftp中右键连接 → “属性” → “高级” → 勾选“使用root用户登录” |
6. 总结:记住这三条铁律
1. 路径由终端位置定,不由代码位置定
执行python detect.py时你在哪个目录,runs/detect/就建在哪个目录下。pwd是你最好的朋友。
2.save=True必然生成runs/detect/predict*/,绝不在当前目录平铺
看到Results saved to ...日志,立刻cd runs/detect/ && ls,99%的问题当场解决。
3. 自定义路径只用两个参数:project(父目录)+name(子目录名)
组合使用,路径完全可控,告别猜测和搜索。
现在,打开你的终端,cd 到/root/workspace/ultralytics-8.4.2,运行一次python detect.py,然后ls runs/detect/—— 你亲手生成的第一个 YOLO26 检测结果,正安静地躺在那里,等着你打开查看。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。