YOLO26结果保存路径:runs/detect输出结构说明
你刚跑完YOLO26的推理命令,终端一闪而过,屏幕上只留下一行“Results saved to runs/detect/exp”,然后就没了?打开runs/detect文件夹,里面却有exp、exp2、exp3……甚至还有exp10?这些文件夹里到底存了什么?图片在哪?标注框坐标怎么导出?JSON结果怎么读?别急——这篇文章不讲训练原理、不堆参数配置,就专门带你一层层扒开runs/detect这个目录的真实结构,搞清楚每一份输出从哪来、长什么样、怎么用。
我们用的是最新发布的YOLO26官方版训练与推理镜像,所有路径、命名规则、文件格式都基于该镜像实测验证。你不需要重装环境、不用查文档翻源码,照着这篇往下看,5分钟内就能精准定位你要的结果。
1. YOLO26镜像基础环境确认
在深入runs/detect之前,先确认你正在使用的确实是标准YOLO26镜像环境。这不是可选项——路径行为高度依赖底层框架版本和Ultralytics代码结构。本镜像严格对齐YOLO26官方发布规范,所有输出逻辑均源自ultralytics==8.4.2主干代码。
- 核心框架:
pytorch == 1.10.0 - CUDA版本:
12.1(兼容cudatoolkit=11.3) - Python版本:
3.9.5 - 关键依赖:
torchvision==0.11.0、opencv-python>=4.8.0、numpy>=1.23.0
注意:如果你手动升级了
ultralytics到8.5+或降级到8.3以下,runs/detect下的子目录命名规则、JSON字段结构、图像后缀名都可能发生变化。本文所有说明均以镜像内置的ultralytics-8.4.2为准。
2.runs/detect目录生成机制详解
YOLO26的predict()方法执行后,只要设置了save=True(默认为False),就会自动创建runs/detect/目录,并在其下生成一个唯一实验文件夹。这个过程不是随机的,而是有一套清晰的生成逻辑:
2.1 实验文件夹命名规则
每次运行model.predict(),系统会按顺序尝试创建:
runs/detect/exp→runs/detect/exp2→runs/detect/exp3……- 如果
exp存在且非空,则跳过;如果exp为空(比如你手动清空了但没删文件夹),则复用exp - 不会覆盖已有内容:即使你重复运行同一段代码,新结果也一定写入新文件夹(如
exp4),旧结果毫发无损
你可以通过project和name参数完全控制路径:
model.predict( source='./ultralytics/assets/zidane.jpg', save=True, project='my_results', # 自定义父目录 → my_results/detect/exp name='person_demo' # 自定义实验名 → my_results/detect/person_demo )但镜像默认未设置这两项,所以你看到的永远是runs/detect/exp*。
2.2 目录层级与核心文件构成
进入任意一个exp*文件夹(例如runs/detect/exp3),你会看到如下固定结构:
exp3/ ├── zidane.jpg ← 原图(若source是单张图) ├── zidane.png ← 带检测框的可视化结果(PNG格式,非JPG!) ├── zidane.txt ← 对应的YOLO格式预测框(class x_center y_center width height confidence) ├── labels/ ← 所有预测结果的TXT标签集(仅当source为文件夹时出现) │ ├── image1.txt │ └── image2.txt ├── predictions.json ← 全量结构化结果(含坐标、类别、置信度、框ID等) └── results.csv ← 汇总统计表(每行一条检测框,含文件名、类别、置信度、归一化坐标)关键事实:YOLO26默认不保存原图副本(除非你传入的是视频帧或批量图片),
zidane.jpg只是因为source参数直接指向它才被复制进来;而zidane.png是唯一带可视化框的图像,注意后缀是.png——这是为了保证Alpha通道和抗锯齿质量,不是笔误。
3. 四类核心输出文件深度解析
3.1 可视化图像(.png):一眼看效果
- 文件名:与输入
source中文件名一致,但强制转为.png - 内容:原始图像 + 彩色边界框 + 类别标签 + 置信度(如
person 0.92) - 坐标系:像素坐标(左上角为原点),框宽高为绝对像素值
- 字体与颜色:使用OpenCV默认字体,框颜色按类别自动分配(person→蓝色,car→绿色等)
- 实用技巧:想快速查看全部结果?直接在终端执行:
ls runs/detect/exp*/zidane.png | xargs -I {} eog {} # Linux图形界面 # 或 Windows 下用 explorer.exe 批量打开
3.2 YOLO格式预测文本(.txt):对接下游训练/评估
以zidane.txt为例,内容类似:
0 0.524 0.478 0.215 0.389 0.921 0 0.287 0.312 0.142 0.265 0.873 2 0.763 0.621 0.189 0.224 0.795每行6个值,含义依次为:
class_id:整数类别索引(0=person, 1=bicycle, 2=car...)x_center,y_center:归一化中心坐标(0~1)width,height:归一化宽高(0~1)confidence:该框的置信度(0~1)
提示:这个格式与YOLO训练时的标签格式完全一致。如果你要做半监督学习或主动学习,可直接将此文件作为伪标签输入训练流程。
3.3 结构化JSON结果(predictions.json):程序化处理首选
这是最完整、最易解析的输出。打开predictions.json,你会看到一个标准JSON数组,每个元素对应一张输入图像:
[ { "image": "zidane.jpg", "boxes": [ { "class_id": 0, "class_name": "person", "confidence": 0.921, "x1": 212.5, "y1": 189.2, "x2": 342.1, "y2": 321.8, "box_id": "b001" } ], "speed": { "preprocess": 12.4, "inference": 38.7, "postprocess": 5.2 } } ]关键字段说明:
x1/y1/x2/y2:绝对像素坐标(非归一化!),可直接用于OpenCV绘图或坐标计算box_id:唯一框ID,便于跨帧跟踪或去重speed:各阶段耗时(毫秒),调试性能瓶颈时直接看这里class_name:字符串类别名,比class_id更友好
推荐Python读取方式:
import json with open('runs/detect/exp3/predictions.json') as f: data = json.load(f) for img in data: for box in img['boxes']: print(f"检测到{box['class_name']},置信度{box['confidence']:.3f},位置({box['x1']:.1f},{box['y1']:.1f})")3.4 汇总CSV表格(results.csv):Excel友好型分析
results.csv是面向业务人员的友好格式,用Excel双击即可打开。表头包含:
im_file:图像文件名class:类别IDclass_name:类别名称confidence:置信度x_center,y_center,width,height:归一化坐标(与.txt一致)x1,y1,x2,y2:绝对像素坐标(与JSON一致)
场景示例:你想统计“所有置信度>0.85的car检测框在图像中的平均位置”,直接在Excel里筛选+求平均,30秒搞定。
4. 多输入场景下的输出差异
runs/detect的行为会根据source类型动态调整。你必须知道这三种情况的区别:
| source类型 | 示例 | runs/detect/exp*/内典型内容 | 特别注意 |
|---|---|---|---|
| 单张图片 | './zidane.jpg' | zidane.png,zidane.txt,predictions.json | .jpg原图被复制,但.png才是带框结果 |
| 图片文件夹 | './dataset/images' | labels/文件夹(含所有.txt)、predictions.json、results.csv | 不生成任何可视化PNG!需自行调用plot()方法 |
| 视频文件 | './video.mp4' | video.mp4(带框视频)、predictions.json、results.csv | 视频帧率、编码参数继承自输入,无需额外设置 |
如果你传入的是文件夹但想要每张图的可视化结果,必须显式启用save=True并确保show=False(否则会弹窗阻塞):
model.predict(source='./images', save=True, show=False) # 此时会在exp*/下生成每张图的.png5. 实用技巧与避坑指南
5.1 快速清理历史结果
反复测试会产生大量exp*文件夹。安全清理命令(保留最新的3个):
cd runs/detect && ls -t exp* | tail -n +4 | xargs rm -rf5.2 修改默认保存路径(永久生效)
不想每次改project/name?直接修改Ultralytics配置:
echo "default_save_dir: /root/workspace/results" >> /root/workspace/ultralytics-8.4.2/ultralytics/cfg/default.yaml之后所有predict()调用将默认写入/root/workspace/results/detect/。
5.3 导出为COCO格式(对接其他工具)
YOLO26原生不支持COCO JSON导出,但可用两行代码转换:
from ultralytics.utils.ops import non_max_suppression from ultralytics.data.converter import convert_yolo_to_coco convert_yolo_to_coco('runs/detect/exp3/labels', 'coco_annotations.json')5.4 常见误区澄清
- ❌ “
runs/detect/exp/weights里有模型” → 错!权重只在训练时保存于runs/train/,detect下只有结果 - ❌ “
zidane.txt里的坐标可以直接画在zidane.jpg上” → 错!zidane.txt是归一化坐标,需乘以原图宽高;而zidane.png已自动完成绘制 - ❌ “
predictions.json里没有时间戳,无法做实时分析” → 错!speed字段提供各阶段毫秒级耗时,结合系统时间即可推算
6. 总结:掌握runs/detect就是掌握YOLO26的输出主权
你不需要记住所有API参数,但必须清楚runs/detect里每个文件的来龙去脉。它不是一堆杂乱的输出,而是一套设计严谨的“结果交付包”:
- 要快速验证效果?打开
.png文件 - 要喂给下游系统?用
.txt或predictions.json - 要做数据统计?
results.csv开箱即用 - 要调试性能瓶颈?
predictions.json里的speed字段一目了然
下次再看到Results saved to runs/detect/exp7,别再盲目点开又关掉。现在你知道——那里藏着你模型能力的全部证据。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。