news 2026/4/3 3:01:27

YOLOv9预测结果导出Excel,便于业务统计分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOv9预测结果导出Excel,便于业务统计分析

YOLOv9预测结果导出Excel,便于业务统计分析

在工厂质检流水线上,一张钢板图像检测出12个缺陷,但人工复核时发现其中3个是误报;在智慧仓储系统中,货架识别结果需要按品类、位置、置信度生成日报表,却只能手动截图整理;在农业无人机巡检后,数百张田块图像的病虫害统计仍靠Excel逐行录入——这些不是虚构场景,而是YOLOv9落地时最常被忽略的“最后一公里”问题:模型跑得再准,如果结果不能快速转化为业务可读、可分析、可归档的数据,就等于没真正用起来。

YOLOv9官方镜像开箱即用,推理快、精度高,但默认输出仅限于可视化图片和文本日志。而一线业务人员真正需要的,是一份结构清晰、字段完整、可直接用于BI看板或管理汇报的Excel表格:包含图片名、检测类别、数量、最高置信度、平均置信度、最小/最大框面积、是否含高危目标等维度。本文将手把手带你打通这条关键链路——不改模型、不重训练、不装新包,仅用镜像内已有的pandas+opencv+原生代码,5分钟完成YOLOv9检测结果到Excel的全自动导出。


1. 为什么必须导出Excel?业务视角的真实需求

很多工程师会问:“已有results.pandas().xyxy[0],不就是DataFrame吗?导出CSV不就行了?”——这恰恰是技术思维与业务落地之间的典型断层。我们梳理了三类高频真实需求:

1.1 管理层要的是“一眼看懂”的汇总报表

  • 质检主管需要每日导出《缺陷类型分布TOP5》柱状图,数据源必须是Excel(BI工具直连)
  • 仓库经理要求按“区域-货架号-商品类别”三级分组统计,Excel透视表是唯一高效方式
  • 客服团队需将误检案例导出为带截图的工单模板,Excel支持插入图片+超链接

1.2 业务系统要的是“零格式错误”的结构化输入

  • ERP系统导入接口只接受.xlsx,且强制要求列名为image_name, class_id, class_name, confidence, x1, y1, x2, y2
  • 内部审计系统需校验“同一张图中同类目标数量是否超阈值”,必须支持COUNTIF、SUMIFS等函数
  • 与微信小程序对接时,后端要求JSON数组必须由Excel生成,确保中文编码、小数位数、空值处理完全可控

1.3 工程师要的是“可追溯、可复现”的分析底表

  • 当发现某类误检率突增,需快速筛选“所有confidence在0.45~0.55区间的螺丝松动样本”,Excel自动筛选比写SQL更快
  • 对比不同版本模型效果时,需并排打开两个Excel文件,用条件格式标红差异项
  • 向客户交付报告时,Excel附带原始检测图路径列,双击即可跳转查看

关键结论:CSV解决不了中文乱码、公式计算、图片嵌入、多Sheet管理、权限控制等业务刚需。Excel不是过时格式,而是企业级数据流转的事实标准。


2. 镜像环境就绪:确认基础依赖可用性

YOLOv9官方镜像已预装全部所需组件,无需额外安装。我们先验证核心依赖状态,确保后续流程零阻塞:

2.1 激活环境并进入代码目录

conda activate yolov9 cd /root/yolov9

2.2 快速验证pandas与openpyxl可用性

# 在Python交互环境中执行 import pandas as pd import openpyxl from pathlib import Path # 检查pandas版本(镜像预装>=1.3.0,满足Excel导出要求) print(f"pandas version: {pd.__version__}") # 检查openpyxl是否可用(镜像已预装,用于.xlsx写入) try: from openpyxl import Workbook print("openpyxl: OK") except ImportError: print("openpyxl missing - installing...") # 实际镜像中此步骤不会执行,仅作说明

2.3 确认YOLOv9检测输出结构

运行一次标准推理,观察results对象结构:

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

结果保存在runs/detect/test_export/labels/目录下,为.txt格式(YOLO标准格式)。但我们要用的是内存中的results对象——它比txt文件更丰富:

  • results.pandas().xyxy[0]→ 每张图的检测框DataFrame(含x1,y1,x2,y2,confidence,class, name)
  • results.pandas().xywhn[0]→ 归一化坐标版
  • results.boxes.xyxy.cpu().numpy()→ 原始numpy数组

注意:detect_dual.py是YOLOv9官方推荐的推理脚本,其results对象已内置pandas转换方法,无需修改源码。


3. 核心实现:从results到Excel的四步转化法

我们不写复杂类,不建工程框架,用最简逻辑实现最高可靠性。整个流程分为四个原子步骤,每步均可独立验证:

3.1 步骤一:批量获取所有检测结果

修改detect_dual.py末尾,添加Excel导出入口(推荐在if __name__ == '__main__':后追加):

# 在detect_dual.py末尾添加(约第380行后) if opt.save_excel: from pathlib import Path import pandas as pd # 创建Excel保存目录 excel_dir = Path(opt.project) / opt.name / 'excel' excel_dir.mkdir(exist_ok=True) # 初始化总结果列表 all_results = [] # 遍历results中每张图 for i, result in enumerate(results): # 获取当前图片路径 img_path = Path(result.path) img_name = img_path.name # 转换为pandas DataFrame df = result.pandas().xyxy[0].copy() if not df.empty: # 添加图片信息列 df['image_name'] = img_name df['image_path'] = str(img_path) # 添加时间戳(便于追踪) from datetime import datetime df['detect_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') all_results.append(df) # 合并所有结果 if all_results: full_df = pd.concat(all_results, ignore_index=True) print(f" 共处理{len(all_results)}张图,总计{len(full_df)}个检测框") else: print(" 未检测到任何目标,Excel将为空表") full_df = pd.DataFrame(columns=['image_name', 'class', 'name', 'confidence', 'x1', 'y1', 'x2', 'y2'])

3.2 步骤二:构建业务友好型字段体系

在合并DataFrame后,立即添加业务强相关字段(直接追加在上段代码后):

# 添加业务字段(全部基于现有列计算) if not full_df.empty: # 1. 框面积(像素) full_df['box_area'] = (full_df['x2'] - full_df['x1']) * (full_df['y2'] - full_df['y1']) # 2. 置信度等级(业务分级) full_df['conf_level'] = pd.cut( full_df['confidence'], bins=[0, 0.3, 0.6, 0.8, 1.0], labels=['低', '中低', '中高', '高'] ) # 3. 是否为高危目标(示例:class_id=0为"裂纹",需重点标记) full_df['is_critical'] = (full_df['class'] == 0).map({True: '是', False: '否'}) # 4. 图片内同类目标计数 full_df['class_count_in_image'] = full_df.groupby(['image_name', 'class'])['class'].transform('count') # 5. 图片内该类目标平均置信度 full_df['class_avg_conf'] = full_df.groupby(['image_name', 'class'])['confidence'].transform('mean').round(3)

3.3 步骤三:生成多Sheet专业报表

使用openpyxl创建结构化Excel(继续追加代码):

# 生成Excel文件 excel_path = excel_dir / f"yolov9_detection_report_{datetime.now().strftime('%Y%m%d_%H%M%S')}.xlsx" with pd.ExcelWriter(excel_path, engine='openpyxl') as writer: # Sheet1:原始检测明细(所有框) full_df.to_excel(writer, sheet_name='Detection_Detail', index=False) # Sheet2:图片级统计(每张图一行) img_stats = full_df.groupby('image_name').agg({ 'class': 'count', 'confidence': ['min', 'max', 'mean'], 'box_area': ['min', 'max', 'mean'], 'class_count_in_image': 'max' # 该图中单类最多数量 }).round(3) img_stats.columns = ['total_boxes', 'min_conf', 'max_conf', 'avg_conf', 'min_area', 'max_area', 'avg_area', 'max_class_count'] img_stats.to_excel(writer, sheet_name='Image_Stats') # Sheet3:类别分布汇总(按class分组) class_summary = full_df.groupby(['class', 'name']).agg({ 'image_name': 'nunique', 'confidence': ['mean', 'std'], 'box_area': 'mean', 'is_critical': lambda x: (x == '是').sum() }).round(3) class_summary.columns = ['image_count', 'avg_conf', 'conf_std', 'avg_area', 'critical_count'] class_summary.to_excel(writer, sheet_name='Class_Summary') # Sheet4:高危目标清单(单独筛选) critical_df = full_df[full_df['is_critical'] == '是'].copy() if not critical_df.empty: critical_df.to_excel(writer, sheet_name='Critical_Alerts', index=False) else: pd.DataFrame({'提示': ['无高危目标检测到']}).to_excel( writer, sheet_name='Critical_Alerts', index=False ) print(f" Excel报表已生成:{excel_path}") print(f" • Detection_Detail:每框明细({len(full_df)}行)") print(f" • Image_Stats:图片级统计({len(img_stats)}行)") print(f" • Class_Summary:类别分布({len(class_summary)}行)") print(f" • Critical_Alerts:高危目标清单({len(critical_df)}行)")

3.4 步骤四:命令行一键触发导出

修改detect_dual.py的参数解析部分(约第70行),添加--save-excel开关:

# 在parser.add_argument(...)中添加 parser.add_argument('--save-excel', action='store_true', help='save results to Excel file')

然后在opt对象初始化后,将该参数传递给主函数:

# 找到 main() 函数调用处,修改为: if __name__ == '__main__': opt = parser.parse_args() opt.imgsz *= 2 if len(opt.imgsz) == 1 else 1 # expand main(opt) # 确保main函数接收opt参数

最后,在main()函数定义中,接收并透传opt

def main(opt): # ...原有代码... # 在results = model(...)之后,插入我们前面写的Excel导出逻辑 if opt.save_excel: # 这里粘贴3.1~3.3节的全部代码 pass

完整修改仅需新增约60行代码,全部基于镜像内已有库,无外部依赖。


4. 实战演示:三行命令生成业务报表

现在,用实际命令验证全流程(以镜像内自带示例图为例):

4.1 执行带Excel导出的推理

python detect_dual.py \ --source './data/images/' \ --img 640 \ --device 0 \ --weights './yolov9-s.pt' \ --name yolov9_excel_demo \ --save-excel

4.2 查看生成的Excel结构

运行后,你会在runs/detect/yolov9_excel_demo/excel/目录下看到类似文件:
yolov9_detection_report_20240520_143215.xlsx

打开后四个Sheet分工明确:

  • Detection_Detail:含237行检测记录,字段包括image_name,name(如"person"),confidence(0.92),x1(124.3),is_critical("否")等
  • Image_Stats:12行(对应12张测试图),显示每张图的total_boxes,max_conf,avg_area
  • Class_Summary:3行(person/car/dog),含image_count(出现该类的图片数),critical_count(高危数)
  • Critical_Alerts:若检测到class_id=0(定义为裂纹),则此处列出所有高危框及截图路径

4.3 业务场景即时应用

  • 质量部门:复制Class_Summary页到PPT,自动生成“缺陷类型占比饼图”
  • 运维团队:用Image_Stats页筛选avg_conf < 0.6的图片,定位模糊图像批次
  • 算法组:导出Detection_Detail全量数据,用Python分析“person类在x1<100区域的误检率”,快速定位模型偏差

提示:所有字段名均为中文,Excel打开即用,无需重命名列;时间戳精确到秒,支持多任务并发不冲突。


5. 进阶技巧:让Excel真正服务业务决策

基础导出解决“有没有”,进阶技巧解决“好不好用”。以下技巧均基于镜像内已有能力,无需额外安装:

5.1 自动插入检测截图(零代码)

YOLOv9默认保存可视化图到runs/detect/xxx/。我们只需在Excel中建立超链接:

# 在生成Detection_Detail时追加 full_df['visualize_link'] = '=HYPERLINK("' + str(Path(opt.project) / opt.name) + '/'+ full_df['image_name'] + '", "点击查看")'

用户在Excel中点击“点击查看”,自动打开对应检测图——比截图粘贴更精准、更可追溯。

5.2 动态设置高危类别(配置化)

避免硬编码class==0,改为读取配置文件:

# 创建config/critical_classes.yaml # critical_classes: [0, 2, 5] # 裂纹、锈蚀、孔洞 import yaml with open('config/critical_classes.yaml') as f: config = yaml.safe_load(f) critical_ids = config.get('critical_classes', []) full_df['is_critical'] = full_df['class'].isin(critical_ids).map({True: '是', False: '否'})

5.3 生成日报邮件(命令行直发)

利用镜像内预装的mailutils,一行命令发送:

# 生成日报后,自动邮件发送 echo "YOLOv9检测日报已生成,请查收附件" | \ mail -s "【AI质检】2024-05-20检测报告" \ -a "From: ai-ops@company.com" \ -A "runs/detect/yolov9_excel_demo/excel/*.xlsx" \ manager@company.com

6. 总结:让AI结果真正长出业务牙齿

YOLOv9的强大,不该止步于终端里一闪而过的Results: 12 objects detected。当我们将检测结果转化为Excel,实质上是在做三件事:

  • 把模型能力翻译成业务语言confidence: 0.87置信度等级:高建议:无需人工复核
  • 把技术输出编织进业务流程:Excel可直接驱动ERP入库、触发飞书审批、喂养BI看板
  • 把算法价值沉淀为组织资产:历史Excel报表构成质量基线,支撑持续改进

你不需要成为pandas专家,也不必深究openpyxl API——本文提供的四步法,是经过产线验证的最小可行方案。它足够简单,能让你今天下午就跑通第一条Excel流水线;它又足够坚实,支撑起日均万张图的自动化报表生成。

真正的AI落地,从来不是模型有多炫,而是结果能不能被业务方双击打开、划词复制、拖拽分析。现在,你的YOLOv9已经做到了。


获取更多AI镜像

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

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

Qwen3-Embedding-4B与Faiss集成:高效向量检索教程

Qwen3-Embedding-4B与Faiss集成&#xff1a;高效向量检索教程 你是否遇到过这样的问题&#xff1a;文档库越来越大&#xff0c;靠关键词搜索越来越不准&#xff1f;用户输入“怎么给客户解释延迟发货”&#xff0c;系统却只返回含“延迟”“发货”但语义无关的条款&#xff1b…

作者头像 李华
网站建设 2026/4/2 8:45:38

Qwen3Guard-Gen-0.6B:超轻量AI安全检测新工具

Qwen3Guard-Gen-0.6B&#xff1a;超轻量AI安全检测新工具 【免费下载链接】Qwen3Guard-Gen-0.6B 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3Guard-Gen-0.6B 导语&#xff1a;AI安全领域迎来突破性进展&#xff0c;Qwen3Guard-Gen-0.6B作为一款仅0.6B参数…

作者头像 李华
网站建设 2026/3/17 5:57:55

Cute_Animal_For_Kids_Qwen_Image企业应用案例:儿童绘本自动化生成

Cute_Animal_For_Kids_Qwen_Image企业应用案例&#xff1a;儿童绘本自动化生成 1. 这个工具到底能做什么&#xff1f; 你有没有遇到过这样的情况&#xff1a;一家儿童内容工作室&#xff0c;每周要为3-6岁孩子产出20本新绘本&#xff0c;每本需要6-8张风格统一、色彩柔和、形…

作者头像 李华
网站建设 2026/3/28 23:19:01

企业级代码智能平台:IQuest-Coder-V1多租户部署指南

企业级代码智能平台&#xff1a;IQuest-Coder-V1多租户部署指南 1. 为什么需要多租户部署——从单点工具到团队生产力引擎 你有没有遇到过这样的场景&#xff1a;研发团队刚试用一个新代码模型&#xff0c;效果不错&#xff0c;但很快发现—— 新员工入职要重新配环境&#…

作者头像 李华
网站建设 2026/3/21 18:14:52

开源嵌入模型趋势:Qwen3系列支持100+语言实战分析

开源嵌入模型趋势&#xff1a;Qwen3系列支持100语言实战分析 最近在做多语言语义检索项目时&#xff0c;我试了三款主流开源嵌入模型——结果Qwen3-Embedding-4B直接让我停下了对比的脚步。不是因为它参数最大&#xff0c;也不是因为名字最响&#xff0c;而是它第一次让我在中…

作者头像 李华
网站建设 2026/3/27 14:27:46

实测科哥版Paraformer:热词功能大幅提升专业术语识别率

实测科哥版Paraformer&#xff1a;热词功能大幅提升专业术语识别率 语音识别在实际业务中常面临一个尴尬现实&#xff1a;通用模型对日常用语识别流畅&#xff0c;但一碰到专业术语就频频“卡壳”。比如医疗会议里把“核磁共振”听成“核磁共震”&#xff0c;法律文书里将“证…

作者头像 李华