news 2026/4/2 4:01:07

YOLOv9推理结果保存路径解析:runs/detect输出说明

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOv9推理结果保存路径解析:runs/detect输出说明

YOLOv9推理结果保存路径解析:runs/detect输出说明

你刚跑完YOLOv9的推理命令,终端显示“Results saved to runs/detect/yolov9_s_640_detect”,但打开文件夹却只看到一堆带框的图片和一个labels子目录——这些文件到底怎么来的?命名规则是什么?哪些能直接用?哪些该删掉?为什么每次运行都会新建一个文件夹?如果你也曾在runs/detect/里翻来翻去却搞不清每个文件的作用,这篇文章就是为你写的。

我们不讲训练原理,不堆参数配置,就聚焦一个最实际的问题:YOLOv9推理后,它到底把结果存哪儿了、存成什么样、怎么快速找到你要的那一张图、那一行坐标、那一份统计信息?全文基于官方版YOLOv9训练与推理镜像实测整理,所有路径、结构、命名逻辑均来自真实运行环境,所见即所得。

1. 镜像基础环境与代码定位

在开始解析输出路径前,先确认你用的是哪个“家”。本镜像不是魔改版,也不是精简打包,而是严格基于WongKinYiu官方yolov9仓库构建的开箱即用环境。这意味着你看到的runs/detect结构,和你在GitHub上clone下来、自己配好环境后跑出来的结果,完全一致。

  • 核心框架:PyTorch 1.10.0(稳定兼容YOLOv9早期版本)
  • CUDA支持:12.1 + cudatoolkit 11.3(双版本共存,确保GPU加速无阻)
  • Python环境:3.8.5(避免高版本Python引发的torchvision兼容问题)
  • 关键依赖opencv-python用于图像读写与绘制,tqdm提供进度条反馈,seaborn支撑后续可视化分析
  • 代码根目录/root/yolov9—— 所有操作都以此为起点,runs/目录就诞生于这个路径下

记住这个位置:当你执行python detect_dual.py时,程序默认就在/root/yolov9下工作。它不会去你home目录找runs,也不会在当前shell路径下建文件夹——它认准的就是代码所在根目录。这是理解所有路径逻辑的第一把钥匙。

2. runs/detect 是什么?它不是临时缓存,而是标准输出根目录

runs/detect不是某个脚本随手创建的临时文件夹,它是YOLOv9官方定义的推理结果统一出口。只要调用detect_dual.pydetect.py,无论输入是单张图、多张图、视频还是摄像头流,只要没手动指定--project--name,结果就一定会落到/root/yolov9/runs/detect/下面。

这个路径由两部分组成:

  • runs/:YOLO系列一贯的顶层结果目录,训练日志在runs/train/,验证结果在runs/val/,而detect/专属于推理;
  • detect/:明确标识用途,避免和训练、评估结果混淆。

你可以把它理解成一个“快递分拣中心”——所有推理任务的包裹(图片、标签、统计)都先送到这里,再按规则分装进各自的子文件夹。

2.1 每次运行都新建文件夹?是的,而且有章法

你可能注意到,连续运行两次推理命令,会生成两个不同的文件夹,比如:

runs/detect/yolov9_s_640_detect/ runs/detect/yolov9_s_640_detect2/

这不是bug,是YOLOv9的防覆盖保护机制。系统会检查--name指定的文件夹是否存在:

  • 如果不存在,直接创建;
  • 如果已存在,自动追加数字后缀(2,3, …),确保历史结果永不丢失。

所以,yolov9_s_640_detect2里的内容,和第一次运行的yolov9_s_640_detect完全独立,互不影响。你想复现某次结果?只要记下那个文件夹名就行。

2.2 --name 参数:你才是路径的真正主人

上面提到的yolov9_s_640_detect名字从哪来?答案是:完全由你通过--name参数决定

回顾这条命令:

python detect_dual.py --source './data/images/horses.jpg' --img 640 --device 0 --weights './yolov9-s.pt' --name yolov9_s_640_detect

--name yolov9_s_640_detect这一段,就是告诉程序:“请把这次的结果,放进runs/detect/下的yolov9_s_640_detect文件夹里”。

你可以把它改成任何你喜欢的名字:

--name my_horse_test --name batch_20240520 --name final_demo_v1

生成的路径就会变成:

runs/detect/my_horse_test/ runs/detect/batch_20240520/ runs/detect/final_demo_v1/

这带来一个极其实用的技巧:--name做项目归档。比如你今天测试不同尺寸输入效果,可以这样跑:

python detect_dual.py --source img1.jpg --img 320 --name s320 python detect_dual.py --source img1.jpg --img 640 --name s640 python detect_dual.py --source img1.jpg --img 1280 --name s1280

结果自动分门别类,一目了然,再也不用靠手动重命名区分。

3. yolov9_s_640_detect 文件夹内部结构详解

现在,我们钻进runs/detect/yolov9_s_640_detect/,看看里面到底有什么。以一张输入图horses.jpg为例,完整结构如下:

yolov9_s_640_detect/ ├── horses.jpg ← 带检测框的可视化结果图(原图+红框+标签+置信度) ├── labels/ │ └── horses.txt ← 对应的预测坐标文本文件(YOLO格式) └── results.csv ← 全局统计汇总表(可选,需启用--save-csv)

3.1 可视化结果图:horses.jpg —— 最直观的交付物

这张图是你最常打开的文件。它不是原始图,也不是模型输出的特征图,而是经过后处理的最终呈现

  • 框的颜色:按类别自动分配(马是红色,人是绿色,车是蓝色…)
  • 框的粗细:固定2像素,清晰不遮挡
  • 标签文字:类别名 + 置信度(如horse 0.92),字体大小适中,背景半透明不刺眼
  • 保存格式:和输入图一致(JPG保持JPG,PNG保持PNG),无压缩失真

小贴士:如果输入是视频,这里会出现horses0001.jpg,horses0002.jpg… 逐帧截图;如果是摄像头流,则是stream001.jpg,stream002.jpg… 这种命名让你一眼识别数据来源。

3.2 labels/ 子目录:horses.txt —— 机器可读的核心数据

labels/horses.txt才是真正的“结果本体”。它不包含图像,只有一行行数字,每行代表一个检测到的目标,格式为:

class_id center_x center_y width height confidence

全部归一化到0~1范围,例如:

0 0.452 0.318 0.210 0.385 0.921 0 0.783 0.492 0.185 0.420 0.876

含义是:

  • 第1列0:类别ID(0=马,对应data.yaml中classes顺序)
  • 第2-3列0.452 0.318:边界框中心点x、y坐标(相对整图宽高的比例)
  • 第4-5列0.210 0.385:边界框宽、高(相对整图宽高的比例)
  • 第6列0.921:该目标的置信度分数

这个文件是后续做数据分析、批量处理、接入业务系统的唯一可靠数据源。可视化图只是“看”,而.txt文件才是“用”。

3.3 results.csv:全局统计的快捷入口(需显式启用)

默认情况下,这个文件不会生成。只有当你在命令中加入--save-csv参数时,YOLOv9才会在文件夹根目录下生成results.csv,内容类似:

imageclassconfidencex_centery_centerwidthheight
horses.jpghorse0.9210.4520.3180.2100.385
horses.jpghorse0.8760.7830.4920.1850.420

它把所有.txt里的信息扁平化成表格,方便Excel打开、Pandas读取、做批量筛选(比如“找出所有置信度>0.9的马”)。对需要做二次分析的用户,这是省去解析文本步骤的利器。

4. 实战场景:如何快速定位并提取你需要的信息?

光知道结构还不够,得会用。下面三个高频场景,给出最短路径操作法。

4.1 场景一:我只想保存带框图,不要labels和csv

很简单,加--save-txt--save-csv的反向开关:

python detect_dual.py --source './data/images/horses.jpg' --img 640 --device 0 --weights './yolov9-s.pt' --name only_images --nosave-txt --nosave-csv

--nosave-txt禁用labels生成,--nosave-csv禁用统计表,文件夹里只剩horses.jpg一张图。

4.2 场景二:我要把所有检测框坐标导出成Excel,用于人工复核

不用写脚本,两步搞定:

  1. 先确保生成了labels/results.csv(加--save-txt --save-csv
  2. 直接用Excel打开results.csv,Ctrl+A全选,复制粘贴到新Sheet即可。字段清晰,无需清洗。

4.3 场景三:我跑了100张图,想快速知道哪几张没检出目标(漏检)

labels/目录下的文件数量。假设输入是img1.jpgimg100.jpg

  • ls labels/ | wc -l输出92→ 说明有8张图的labels/*.txt为空(YOLOv9对零检测仍会创建空txt文件)
  • 再用find labels/ -size 0c | wc -l输出8→ 精确锁定这8个空文件
  • 对应的文件名就是imgXX.txt,去掉.txt就是漏检的原图名imgXX.jpg

整个过程不到10秒,比一张张打开可视化图快100倍。

5. 常见误区与避坑指南

有些问题看似小,却让新手卡半天。这里列出实测中最常踩的坑:

  • 误区1:“我把图片放到了/home/user/pics,结果图却在/root/yolov9/runs/detect/”
    → 原因:YOLOv9永远以代码根目录(/root/yolov9)为基准,和你的当前shell路径无关。解决方法:要么把图片软链接到/root/yolov9/data/images/,要么用绝对路径--source '/home/user/pics/horses.jpg'

  • 误区2:“我改了--name,但还是生成了yolov9_s_640_detect2”
    → 原因:你之前运行过同名任务,系统检测到文件夹存在,自动加了后缀。解决方法:手动删除旧文件夹,或换一个全新的--name

  • 误区3:“labels/horses.txt里的坐标,画到原图上框不对”
    → 原因:YOLOv9默认对输入图做了letterbox缩放(保持长宽比,四周填灰),.txt里的坐标是针对缩放后图像计算的。解决方法:用--no-letterbox禁用缩放(适合已知图尺寸统一的场景),或在后处理时用scale_coords()函数还原(需读取原图尺寸)。

  • 误区4:“results.csv里confidence列全是0.000”
    → 原因:你用了老版本的detect.py,新版本detect_dual.py才支持正确写入置信度。解决方法:确认命令中调用的是detect_dual.py,且镜像版本为2024年5月后更新。

6. 总结:掌握runs/detect,就是掌握YOLOv9推理的主动权

YOLOv9的runs/detect不是一个黑盒输出目录,而是一套设计清晰、命名规范、高度可控的结果管理体系。它把“人要看的图”、“程序要读的数”、“业务要分析的表”分层存放,各司其职。

  • 记住三个核心路径runs/detect/是总闸门,--name是你的自定义门牌号,labels/是数据金矿;
  • 理解两个关键机制:自动编号防覆盖,letterbox缩放影响坐标;
  • 善用三个实用参数--name做归档,--nosave-txt减冗余,--save-csv提效率。

下次再看到终端里那行Results saved to runs/detect/xxx,你不会再犹豫点开哪个文件——因为你知道,.jpg是答卷,.txt是答案,results.csv是成绩单,而你自己,才是这份结果的真正阅卷人。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/18 16:22:06

3步突破黑苹果配置难关:零基础适用的EFI自动生成工具指南

3步突破黑苹果配置难关:零基础适用的EFI自动生成工具指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 你是否曾因OpenCore配置文件的复…

作者头像 李华
网站建设 2026/3/24 2:40:10

7个技巧让你的MacBook显卡性能提升30%:双显卡切换完全指南

7个技巧让你的MacBook显卡性能提升30%:双显卡切换完全指南 【免费下载链接】gfxCardStatus gfxCardStatus is an open-source menu bar application that keeps track of which graphics card your unibody, dual-GPU MacBook Pro is using at any given time, and …

作者头像 李华
网站建设 2026/4/1 19:18:38

小白福音!一键部署人像卡通化Web工具

小白福音!一键部署人像卡通化Web工具 你是否试过把自拍变成动漫主角?是否想给朋友圈配图加点艺术感却苦于不会PS?是否想批量处理几十张客户照片却卡在复杂的代码和环境配置上?别再折腾了——今天介绍的这个工具,真的能…

作者头像 李华
网站建设 2026/3/25 15:28:11

Z-Image-Base模型融合尝试:与其他文生图模型结合使用

Z-Image-Base模型融合尝试:与其他文生图模型结合使用 1. 为什么Z-Image-Base值得被“拆开用” 很多人第一次看到Z-Image系列,注意力会立刻被Turbo版本吸引——亚秒级生成、16G显存就能跑、中英文双语渲染,确实够抓眼球。但真正让技术老手多…

作者头像 李华
网站建设 2026/3/13 23:20:47

Qwen-Image-2512真实测评:如何用AI生成堪比专业摄影的作品

Qwen-Image-2512真实测评:如何用AI生成堪比专业摄影的作品 1. 不是“画得像”,而是“拍得真”:一场关于真实感的重新定义 你有没有过这样的体验? 输入一段精心打磨的提示词,点击生成,等几秒后——画面出来…

作者头像 李华
网站建设 2026/3/23 17:14:29

Baritone自动化导航全攻略:从入门到精通的实用指南

Baritone自动化导航全攻略:从入门到精通的实用指南 【免费下载链接】baritone cabaletta/baritone: 是一个用于 Minecraft 的开源 Java 客户端,具有多样的游戏模式和游戏修改功能,可以用于 Minecraft 游戏的自定义和修改。 项目地址: https…

作者头像 李华