当前位置: 首页 > news >正文

YOLOv9推理结果可视化:seaborn/matplotlib绘图实战

YOLOv9推理结果可视化:seaborn/matplotlib绘图实战

你有没有遇到过这种情况:YOLOv9模型跑完了推理,生成了一堆检测框和类别信息,但除了看几张带框的图片外,根本不知道模型到底“看见”了什么?比如哪些类别最容易被识别?哪些图像里目标最多?误检集中在哪些场景?

别急——这正是我们今天要解决的问题。本文不讲训练、不谈部署,专注一个实用又常被忽略的环节:如何用matplotlibseaborn把 YOLOv9 的推理结果变成清晰直观的图表,让你一眼看懂模型的表现。

我们将基于官方镜像环境,从实际输出文件出发,一步步带你解析检测日志、提取关键数据,并绘制出柱状图、热力图、置信度分布图等常见可视化图表,真正实现“让数据说话”。


1. 镜像环境说明

本镜像基于 YOLOv9 官方代码库构建,预装了完整的深度学习开发环境,集成了训练、推理及评估所需的所有依赖,开箱即用。

  • 核心框架: pytorch==1.10.0
  • CUDA版本: 12.1
  • Python版本: 3.8.5
  • 主要依赖: torchvision==0.11.0,torchaudio==0.10.0,cudatoolkit=11.3, numpy, opencv-python, pandas, matplotlib, tqdm, seaborn 等
  • 代码位置:/root/yolov9

这些常用的数据分析与可视化库(尤其是pandas+matplotlib+seaborn)已经默认安装,省去了手动配置的麻烦,让我们可以直接进入数据分析阶段。


2. 推理结果结构解析

2.1 输出目录结构

当你运行如下命令进行推理:

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

系统会在项目根目录下生成一个路径为runs/detect/yolov9_s_640_detect的文件夹,其中包含:

  • horses.jpg:原始图像
  • labels/:对应.txt标注文件(每行格式:class_id center_x center_y width height conf
  • labels_with_names/:如果启用了命名功能,则会保存含类名的文本
  • 日志或控制台输出中可能还会打印每张图的检测统计信息

我们要做的第一件事,就是把这些分散的.txt文件读取进来,整理成结构化数据。

2.2 检测结果字段含义

每个检测行由6个数值组成:

class_id x_center y_center width height confidence

例如:

0 0.45 0.67 0.2 0.3 0.93

表示:

  • 类别是0(假设为 'person')
  • 中心点位于图像水平方向 45%、垂直方向 67%
  • 占据图像宽度的 20%,高度的 30%
  • 模型对该预测的置信度为 93%

我们的目标是从大量这样的记录中提取出可分析的信息。


3. 数据准备:从文本到DataFrame

3.1 批量读取检测结果

我们先写一段脚本,遍历labels/目录下的所有.txt文件,将它们合并成一个统一的pandas.DataFrame

import os import pandas as pd # 定义类别映射(COCO数据集前10类为例) class_names = { 0: 'person', 1: 'bicycle', 2: 'car', 3: 'motorcycle', 4: 'airplane', 5: 'bus', 6: 'train', 7: 'truck', 8: 'boat', 9: 'traffic light' } def load_detection_results(label_dir): data = [] for file_name in os.listdir(label_dir): if not file_name.endswith('.txt'): continue image_name = file_name.replace('.txt', '') file_path = os.path.join(label_dir, file_name) with open(file_path, 'r') as f: for line in f.readlines(): parts = line.strip().split() if len(parts) == 6: cls_id, cx, cy, w, h, conf = map(float, parts) data.append({ 'image': image_name, 'class_id': int(cls_id), 'class_name': class_names.get(int(cls_id), 'unknown'), 'confidence': conf, 'bbox_area_ratio': w * h # 归一化面积比例 }) return pd.DataFrame(data) # 加载数据 df = load_detection_results('/root/yolov9/runs/detect/yolov9_s_640_detect/labels') print(f"共加载 {len(df)} 条检测记录")

这样我们就得到了一个结构化的数据表,可以开始做各种统计和绘图了。


4. 可视化实战:五种经典图表

4.1 图表一:各类别检测数量柱状图

想知道模型最常识别出哪些物体?这个图告诉你答案。

import matplotlib.pyplot as plt import seaborn as sns plt.figure(figsize=(10, 6)) sns.countplot(data=df, x='class_name', order=df['class_name'].value_counts().index) plt.title('各类别检测频次统计', fontsize=16) plt.xlabel('类别名称') plt.ylabel('检测次数') plt.xticks(rotation=45) plt.tight_layout() plt.savefig('class_distribution.png', dpi=300) plt.show()

提示:使用seaborn.countplot()能自动排序并美化颜色,比原生matplotlib.bar()更简洁专业。


4.2 图表二:置信度分布直方图

模型有多“自信”?看看置信度的整体分布就知道了。

plt.figure(figsize=(10, 6)) sns.histplot(df['confidence'], bins=50, kde=True, color='skyblue') plt.title('检测结果置信度分布', fontsize=16) plt.xlabel('置信度') plt.ylabel('频次') plt.axvline(df['confidence'].mean(), color='red', linestyle='--', label=f'平均值: {df["confidence"].mean():.2f}') plt.legend() plt.tight_layout() plt.savefig('confidence_hist.png', dpi=300) plt.show()

你会发现大多数高置信度集中在 0.7~0.9 区间,低于 0.3 的可能是噪声或误检。


4.3 图表三:不同图像中的目标数量对比

哪张图最“热闹”?我们可以统计每张图检测到的目标总数。

img_counts = df.groupby('image').size().reset_index(name='detection_count') plt.figure(figsize=(10, 6)) sns.barplot(data=img_counts, x='image', y='detection_count', palette='viridis') plt.title('各图像中检测到的目标数量', fontsize=16) plt.xlabel('图像名称') plt.ylabel('目标数量') plt.xticks(rotation=45) plt.tight_layout() plt.savefig('per_image_count.png', dpi=300) plt.show()

这对判断复杂场景下的模型表现很有帮助,比如是否在密集场景漏检严重。


4.4 图表四:类别与置信度箱线图

不同类别的置信度稳定性如何?是否存在某些类别总是低分?

plt.figure(figsize=(12, 6)) sns.boxplot(data=df, x='class_name', y='confidence') plt.title('各类别检测置信度分布(箱线图)', fontsize=16) plt.xlabel('类别') plt.ylabel('置信度') plt.xticks(rotation=45) plt.ylim(0, 1) plt.tight_layout() plt.savefig('confidence_boxplot.png', dpi=300) plt.show()

通过箱体和须线可以看出:

  • 分布集中程度(稳定性)
  • 是否存在大量低分异常值(如 'traffic light' 经常低置信)

4.5 图表五:类别共现热力图(同一图像中同时出现的频率)

两个物体经常一起出现吗?比如“人”和“自行车”,“车”和“红绿灯”。

from collections import defaultdict import numpy as np # 构建图像内类别组合 pair_counter = defaultdict(int) for img in df['image'].unique(): classes_in_img = df[df['image'] == img]['class_id'].tolist() for i in range(len(classes_in_img)): for j in range(i+1, len(classes_in_img)): a, b = sorted([classes_in_img[i], classes_in_img[j]]) pair_counter[(a, b)] += 1 # 创建共现矩阵 classes = sorted(class_names.keys()) co_matrix = np.zeros((len(classes), len(classes))) for (i, j), count in pair_counter.items(): if i in classes and j in classes: co_matrix[i][j] += count co_matrix[j][i] += count # 对称 # 绘图 plt.figure(figsize=(10, 8)) sns.heatmap(co_matrix, annot=True, fmt='g', xticklabels=[class_names[c] for c in classes], yticklabels=[class_names[c] for c in classes], cmap='Blues') plt.title('类别共现热力图', fontsize=16) plt.xlabel('类别') plt.ylabel('类别') plt.tight_layout() plt.savefig('co_occurrence_heatmap.png', dpi=300) plt.show()

这张图能帮你发现潜在的应用逻辑,比如:

  • “人”和“自行车”高频共现 → 可用于骑行行为分析
  • “车”和“红绿灯”关联强 → 适合交通监控场景

5. 进阶技巧:动态更新与批量处理

5.1 自动化脚本封装

你可以把上述流程打包成一个脚本,在每次推理后自动执行:

#!/bin/bash # run_visualization.sh cd /root/yolov9 python detect_dual.py --source ./data/images --weights yolov9-s.pt --name latest_run python visualize_results.py --run_name latest_run

配合定时任务或CI/CD流程,实现全自动分析。

5.2 添加过滤条件提升洞察力

比如只关注高置信度(>0.7)的结果,或者排除小目标(bbox_area_ratio < 0.01),可以让图表更聚焦真实有效信息。

filtered_df = df[(df['confidence'] > 0.7) & (df['bbox_area_ratio'] >= 0.01)]

再基于filtered_df做图,避免被噪声干扰。

5.3 导出统计报告

最后别忘了导出一份 CSV 报告,方便团队共享:

summary = df.groupby(['class_name']).agg( detection_count=('confidence', 'size'), avg_confidence=('confidence', 'mean'), min_confidence=('confidence', 'min'), max_confidence=('confidence', 'max') ).round(3) summary.to_csv('detection_summary.csv') print(summary)

6. 总结

6.1 关键收获回顾

本文带你完成了从 YOLOv9 推理结果到数据可视化的完整闭环:

  • 解析了detect_dual.py输出的文本格式
  • 使用pandas将非结构化检测结果转为结构化数据
  • 利用matplotlibseaborn实现了五类核心图表:
    • 类别频次柱状图
    • 置信度分布直方图
    • 每图目标数对比图
    • 类别置信度箱线图
    • 类别共现热力图
  • 提供了自动化脚本思路和进阶优化建议

这些图表不仅能帮助你快速评估模型表现,还能作为项目汇报中的有力支撑材料。

6.2 下一步建议

  • 如果你在做特定场景检测(如工地安全、零售货架),可以定制自己的类别映射和配色方案
  • 结合 OpenCV 在原图上叠加统计信息,实现“可视化+标注”一体化输出
  • 将整个流程集成进 Web 页面(Flask/Dash),打造简易版 AI 分析仪表盘

记住:好的模型不仅要跑得快,更要让人看得懂。掌握可视化技能,是你从“会调参”迈向“懂业务”的关键一步。


获取更多AI镜像

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

http://www.jsqmd.com/news/281106/

相关文章:

  • 从0开始学PDF解析:MinerU镜像保姆级入门教程
  • BSManager实战手册:轻松玩转Beat Saber版本管理与内容定制
  • Windows优化新纪元:ExplorerPatcher深度定制指南
  • 2026年武汉重型货架供应商综合评估:如何精准选择助力仓储升级
  • FactoryBluePrints:戴森球计划工厂蓝图库完整使用手册
  • 视频下载神器res-downloader:智能批量下载,彻底告别手动保存烦恼
  • Qwen-Image-Edit-2511实测功能:支持中英文混合指令
  • 广西定制水市场盘点:2026年值得关注的五家实力厂家深度解析
  • 专题三:【Android 架构】全栈性能优化与架构演进全书
  • 强力解锁微信读书助手wereader:从碎片阅读到系统知识管理的效率革命
  • Steam插件神器:让每个Steam玩家都成为游戏专家的秘密武器 [特殊字符]
  • 2026年第一季度,广西知名定制水销售厂家综合评估与精选推荐
  • 第一卷:【外设架构】嵌入式外设移植实战与连接性故障“考古级”排查全书
  • 3步转型法:用微信读书助手wereader实现从碎片化阅读到系统化知识管理的完美蜕变
  • FastAPI脚手架:从繁琐配置到一键生成的开发革命
  • Oracle Cloud ARM服务器免费获取全攻略:突破容量限制的自动化方案
  • TradingAgents-CN终极指南:从零搭建智能投资分析系统
  • LaWGPT完整部署教程:手把手教你搭建法律大模型
  • 社交媒体素材制作利器:麦橘超然快速产出广告图
  • UI-TARS桌面智能助手:3步实现自然语言控制计算机
  • WinFsp:打破Windows文件系统开发的技术壁垒
  • 5分钟部署Qwen3-Reranker-4B:vLLM+Gradio实现多语言检索服务
  • 如何提升推理效率?DeepSeek-R1-Distill-Qwen-1.5B GPU适配优化
  • Qwen3-1.7B推理测试全流程,结果可视化展示
  • React-Three-Fiber 3D开发革命:从代码到创意的魔法桥梁
  • Adobe Downloader:macOS平台专业级Adobe软件一键下载神器
  • Qwen3-4B代码生成不准?编程任务优化部署策略
  • 中国电缆知名品牌推荐:覆盖轨道交通电缆国内一线品牌推荐TOP榜单(2026年1月)
  • 2026年开年合肥口碑好的智能家居产品供货商怎么联系
  • 戴森球计划FactoryBluePrints蓝图仓库终极指南:新手快速构建高效工厂