2026/4/2 0:08:19
网站建设
项目流程
中国电信网站备案 流程,极简资讯网站开发,网站被k还能不能在百度做推广,大作设计网站官网登录入口YOLOv9推理结果可视化#xff1a;seaborn/matplotlib绘图实战
你有没有遇到过这种情况#xff1a;YOLOv9模型跑完了推理#xff0c;生成了一堆检测框和类别信息#xff0c;但除了看几张带框的图片外#xff0c;根本不知道模型到底“看见”了什么#xff1f;比如哪些类别…YOLOv9推理结果可视化seaborn/matplotlib绘图实战你有没有遇到过这种情况YOLOv9模型跑完了推理生成了一堆检测框和类别信息但除了看几张带框的图片外根本不知道模型到底“看见”了什么比如哪些类别最容易被识别哪些图像里目标最多误检集中在哪些场景别急——这正是我们今天要解决的问题。本文不讲训练、不谈部署专注一个实用又常被忽略的环节如何用matplotlib和seaborn把 YOLOv9 的推理结果变成清晰直观的图表让你一眼看懂模型的表现。我们将基于官方镜像环境从实际输出文件出发一步步带你解析检测日志、提取关键数据并绘制出柱状图、热力图、置信度分布图等常见可视化图表真正实现“让数据说话”。1. 镜像环境说明本镜像基于 YOLOv9 官方代码库构建预装了完整的深度学习开发环境集成了训练、推理及评估所需的所有依赖开箱即用。核心框架: pytorch1.10.0CUDA版本: 12.1Python版本: 3.8.5主要依赖: torchvision0.11.0torchaudio0.10.0cudatoolkit11.3, numpy, opencv-python, pandas, matplotlib, tqdm, seaborn 等代码位置:/root/yolov9这些常用的数据分析与可视化库尤其是pandasmatplotlibseaborn已经默认安装省去了手动配置的麻烦让我们可以直接进入数据分析阶段。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 conflabels_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. 数据准备从文本到DataFrame3.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(datadf, xclass_name, orderdf[class_name].value_counts().index) plt.title(各类别检测频次统计, fontsize16) plt.xlabel(类别名称) plt.ylabel(检测次数) plt.xticks(rotation45) plt.tight_layout() plt.savefig(class_distribution.png, dpi300) plt.show()提示使用seaborn.countplot()能自动排序并美化颜色比原生matplotlib.bar()更简洁专业。4.2 图表二置信度分布直方图模型有多“自信”看看置信度的整体分布就知道了。plt.figure(figsize(10, 6)) sns.histplot(df[confidence], bins50, kdeTrue, colorskyblue) plt.title(检测结果置信度分布, fontsize16) plt.xlabel(置信度) plt.ylabel(频次) plt.axvline(df[confidence].mean(), colorred, linestyle--, labelf平均值: {df[confidence].mean():.2f}) plt.legend() plt.tight_layout() plt.savefig(confidence_hist.png, dpi300) plt.show()你会发现大多数高置信度集中在 0.7~0.9 区间低于 0.3 的可能是噪声或误检。4.3 图表三不同图像中的目标数量对比哪张图最“热闹”我们可以统计每张图检测到的目标总数。img_counts df.groupby(image).size().reset_index(namedetection_count) plt.figure(figsize(10, 6)) sns.barplot(dataimg_counts, ximage, ydetection_count, paletteviridis) plt.title(各图像中检测到的目标数量, fontsize16) plt.xlabel(图像名称) plt.ylabel(目标数量) plt.xticks(rotation45) plt.tight_layout() plt.savefig(per_image_count.png, dpi300) plt.show()这对判断复杂场景下的模型表现很有帮助比如是否在密集场景漏检严重。4.4 图表四类别与置信度箱线图不同类别的置信度稳定性如何是否存在某些类别总是低分plt.figure(figsize(12, 6)) sns.boxplot(datadf, xclass_name, yconfidence) plt.title(各类别检测置信度分布箱线图, fontsize16) plt.xlabel(类别) plt.ylabel(置信度) plt.xticks(rotation45) plt.ylim(0, 1) plt.tight_layout() plt.savefig(confidence_boxplot.png, dpi300) 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(i1, 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, annotTrue, fmtg, xticklabels[class_names[c] for c in classes], yticklabels[class_names[c] for c in classes], cmapBlues) plt.title(类别共现热力图, fontsize16) plt.xlabel(类别) plt.ylabel(类别) plt.tight_layout() plt.savefig(co_occurrence_heatmap.png, dpi300) 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将非结构化检测结果转为结构化数据利用matplotlib和seaborn实现了五类核心图表类别频次柱状图置信度分布直方图每图目标数对比图类别置信度箱线图类别共现热力图提供了自动化脚本思路和进阶优化建议这些图表不仅能帮助你快速评估模型表现还能作为项目汇报中的有力支撑材料。6.2 下一步建议如果你在做特定场景检测如工地安全、零售货架可以定制自己的类别映射和配色方案结合 OpenCV 在原图上叠加统计信息实现“可视化标注”一体化输出将整个流程集成进 Web 页面Flask/Dash打造简易版 AI 分析仪表盘记住好的模型不仅要跑得快更要让人看得懂。掌握可视化技能是你从“会调参”迈向“懂业务”的关键一步。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。