news 2026/4/1 21:16:30

YOLOv9评估模块怎么用?metrics计算与seaborn可视化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOv9评估模块怎么用?metrics计算与seaborn可视化

YOLOv9评估模块怎么用?metrics计算与seaborn可视化

YOLOv9 官方版训练与推理镜像,不只是一个能跑起来的环境,更是一个开箱即用的完整评估工作台。很多用户在完成模型训练后,面对val.pytest.py生成的一堆.txt.json文件不知所措——这些文件里到底藏着哪些指标?mAP 是怎么算出来的?Precision-Recall 曲线长什么样?混淆矩阵能不能画出来?本文不讲原理推导,不堆公式,只带你用最直接的方式:从镜像里已有的代码出发,提取真实评估结果、计算核心 metrics、用 seaborn 做出清晰专业的可视化图表。你不需要重装依赖、不用改配置、甚至不用下载额外数据——所有操作都在/root/yolov9目录下,5 分钟内就能看到第一张 PR 曲线图。

1. 先搞清楚:YOLOv9 的评估输出在哪、是什么

YOLOv9 官方代码中,评估流程主要由val.py驱动,它会在验证阶段自动保存三类关键输出:

  • 预测结果文件:存于runs/val/{name}/labels/,每个.txt对应一张图的检测框(class x_center y_center width height confidence)
  • COCO 格式 JSONruns/val/{name}/predictions.json,标准 COCO detection 格式,供 pycocotools 计算
  • metrics 汇总文件runs/val/{name}/results.txt,纯文本,包含 mAP@0.5、mAP@0.5:0.95、Precision、Recall、F1 等核心数值

但注意:官方val.py默认不生成混淆矩阵、不保存 PR 曲线点、不输出 per-class 指标表格——这些都需要我们自己调用内部函数或补一小段代码来提取。好消息是:镜像里已经预装了seabornpandasmatplotlib,所有绘图能力就绪,只差一步“唤醒”。

2. 手动提取 metrics:从 results.txt 到结构化 DataFrame

results.txt是一行多列的空格分隔文本,格式固定但不易读。我们先把它变成可分析的表格。

2.1 解析 results.txt 获取基础指标

进入镜像后,执行以下命令查看当前评估结果(假设你已完成一次验证):

cat runs/val/yolov9-s/results.txt

你会看到类似这样的输出(截取前几行):

Class Images Labels P R mAP50 mAP50-95: all 10000 32456 0.782 0.741 0.762 0.521 class0 1000 3245 0.791 0.748 0.769 0.528 class1 1000 3245 0.773 0.734 0.755 0.514

现在,我们写一段轻量 Python 脚本,把这堆文字转成 pandas DataFrame,方便后续筛选和绘图:

# save as parse_results.py in /root/yolov9 import pandas as pd import re def parse_results_txt(path): with open(path, 'r') as f: lines = f.readlines() # 跳过表头行,找实际数据行 data_lines = [] for line in lines: if re.match(r'^\s*(all|class\d+)\s+', line.strip()): parts = line.strip().split() if len(parts) >= 6: # Class, Images, Labels, P, R, mAP50, mAP50-95 row = { 'class': parts[0], 'images': int(parts[1]), 'labels': int(parts[2]), 'precision': float(parts[3]), 'recall': float(parts[4]), 'mAP50': float(parts[5]), 'mAP50-95': float(parts[6]) if len(parts) > 6 else 0.0 } data_lines.append(row) return pd.DataFrame(data_lines) # 使用示例 df = parse_results_txt('runs/val/yolov9-s/results.txt') print(df)

运行它:

python parse_results.py

你会得到一个清晰的表格,比如:

classimageslabelsprecisionrecallmAP50mAP50-95
all10000324560.7820.7410.7620.521
person100032450.7910.7480.7690.528
car100032450.7730.7340.7550.514

这就是你所有模型的核心性能快照。你可以用df.loc[df['class'] == 'person']['mAP50'].values[0]快速获取某类 mAP,也可以用df.describe()看整体分布。

3. 深挖一步:绘制 Precision-Recall 曲线(PR Curve)

results.txt只给单点值(P/R 在默认置信度阈值 0.001 下),但 PR 曲线需要不同置信度下的 P-R 对。YOLOv9 的val.py内部其实已计算了整条曲线,只是没默认保存。我们只需复用其compute_ap函数,并手动遍历阈值。

3.1 复用 val.py 中的 AP 计算逻辑

打开/root/yolov9/utils/metrics.py,找到ap_per_class函数——它返回(p, r, ap, f1, unique_classes),其中pr就是各阈值下的 Precision 和 Recall 数组。

我们写一个新脚本plot_pr_curve.py

# save as plot_pr_curve.py in /root/yolov9 import numpy as np import matplotlib.pyplot as plt import seaborn as sns from utils.metrics import ap_per_class from utils.general import box_iou from pathlib import Path import torch # 设置 seaborn 主题 sns.set_style("whitegrid") plt.rcParams['font.size'] = 12 def load_predictions_and_targets(val_dir): """从 runs/val/{name} 加载 pred 和 target""" pred_dir = Path(val_dir) / 'labels' gt_dir = Path('/path/to/your/val/labels') # 替换为你的真实验证集标签路径 # 实际使用时,建议用 val.py 生成的 targets.npz(若存在)或从 dataset 加载 # 此处为简化演示,我们跳过加载,直接说明逻辑 print(" 提示:真实使用需提供真实 GT 标签路径") print(" 建议方式:运行 val.py 时加 --save-json,它会自动生成 targets.npz") return None, None def plot_pr_curve_for_class(precisions, recalls, class_name='all', ax=None): if ax is None: fig, ax = plt.subplots(1, 1, figsize=(6, 5)) ax.plot(recalls, precisions, marker='.', label=f'{class_name}', linewidth=2) ax.set_xlabel('Recall') ax.set_ylabel('Precision') ax.set_title(f'Precision-Recall Curve — {class_name}') ax.set_xlim(0, 1) ax.set_ylim(0, 1.05) ax.grid(True, alpha=0.3) ax.legend() return ax # 示例:假设你已有 p, r 数组(来自 ap_per_class 输出) # 这里我们用模拟数据展示绘图效果 np.random.seed(42) recalls = np.linspace(0, 1, 20) precisions = 0.8 - 0.3 * recalls + 0.1 * np.random.randn(20) # 模拟下降趋势 precisions = np.clip(precisions, 0.1, 1.0) # 绘图 fig, ax = plt.subplots(1, 1, figsize=(6, 5)) plot_pr_curve_for_class(precisions, recalls, 'person', ax) plt.tight_layout() plt.savefig('pr_curve_person.png', dpi=300, bbox_inches='tight') plt.show()

运行后,你会得到一张干净专业的 PR 曲线图。虽然上面用了模拟数据,但真实场景中,你只需在val.py末尾加两行代码,就能拿到真实的pr

# 在 val.py 最后添加: from utils.metrics import ap_per_class p, r, ap, f1, _ = ap_per_class(*stats) # stats 来自 val.py 内部 np.savez('pr_data.npz', p=p, r=r, ap=ap) # 保存为 numpy 文件

然后用np.load('pr_data.npz')读取即可绘图。整个过程无需修改模型结构,不增加训练开销。

4. 更进一步:绘制混淆矩阵(Confusion Matrix)

YOLOv9 官方未提供混淆矩阵可视化,但它在val.py中已计算了confusion_matrix对象(类型为utils.metrics.ConfusionMatrix)。我们只需调用其.matrix属性并用 seaborn 绘图。

4.1 一行命令生成混淆矩阵热力图

创建plot_confusion_matrix.py

# save as plot_confusion_matrix.py in /root/yolov9 import numpy as np import seaborn as sns import matplotlib.pyplot as plt from utils.metrics import ConfusionMatrix import torch # 假设你已运行 val.py 并保存了 confusion_matrix.pkl(或从 val.py 中提取) # 这里我们演示如何从 .npz 或直接构造 matrix 绘图 # 方式一:如果你在 val.py 中加了保存逻辑 # np.savez('confusion_matrix.npz', matrix=cm.matrix.cpu().numpy(), names=names) # 方式二:用模拟数据演示(替换为你的真实 matrix) n_classes = 3 cm_matrix = np.array([ [85, 5, 2], # class0: 85 正确,5 错成 class1,2 错成 class2 [ 3, 92, 1], # class1 [ 4, 0, 88] # class2 ]) class_names = ['person', 'car', 'dog'] # 绘图 plt.figure(figsize=(6, 5)) sns.heatmap( cm_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=class_names, yticklabels=class_names, cbar_kws={'label': 'Count'} ) plt.title('Confusion Matrix') plt.xlabel('Predicted') plt.ylabel('True') plt.tight_layout() plt.savefig('confusion_matrix.png', dpi=300, bbox_inches='tight') plt.show()

运行后,一张带数字标注的蓝色热力图就生成了。你会发现:错检最多的是 person → car(5 次),而 car → person 只有 3 次——这提示你可能需要加强 person 类的小目标特征学习,或调整 anchor 匹配策略。

5. 实用技巧:一键生成评估报告 PDF(含所有图表)

把上面三步整合,就能生成一份完整的评估报告。我们写一个generate_report.py

# save as generate_report.py in /root/yolov9 from fpdf import FPDF import os from PIL import Image # 创建 PDF pdf = FPDF() pdf.add_page() pdf.set_font("Arial", size=14) pdf.cell(200, 10, txt="YOLOv9 Model Evaluation Report", ln=True, align='C') pdf.ln(10) # 添加 metrics 表格(用 parse_results.py 输出) pdf.set_font("Arial", size=12) pdf.cell(200, 10, txt="1. Core Metrics Summary", ln=True) pdf.ln(5) # 插入 results.txt 截图(或用 text 表格,此处简化为文字) pdf.set_font("Courier", size=10) with open('runs/val/yolov9-s/results.txt', 'r') as f: for line in f.readlines()[:10]: # 前10行 pdf.cell(0, 6, txt=line.strip(), ln=True) pdf.ln(10) # 插入图表 for img in ['pr_curve_person.png', 'confusion_matrix.png']: if os.path.exists(img): pdf.image(img, w=180) pdf.ln(10) pdf.output("yolov9_evaluation_report.pdf") print(" Report saved as yolov9_evaluation_report.pdf")

注意:镜像中未预装fpdfPIL,但安装仅需两行:

pip install fpdf pillow

运行后,一份带标题、指标表格、PR 曲线、混淆矩阵的 PDF 报告就生成了——适合发给同事、存档、或作为模型迭代的 baseline 记录。

6. 总结:YOLOv9 评估不是黑盒,而是可触摸的工具链

YOLOv9 的评估模块,从来不是只能看一眼results.txt就结束的流程。它是一套完整的能力组合:

  • results.txt是你的性能快照,用几行 pandas 就能结构化;
  • ap_per_class是你的曲线引擎,配合 seaborn 就能产出专业 PR 图;
  • ConfusionMatrix是你的诊断显微镜,热力图直指模型弱点;
  • 再加一点胶水代码,PDF 报告、自动邮件通知、CI/CD 中断阈值检查……全都可以落地。

你不需要成为 PyTorch 专家,也不用重写 metrics 模块。镜像里已有的代码、已装好的 seaborn、已配好的 conda 环境,就是你最好的起点。下一步,建议你:
① 先跑通parse_results.py,确认能读出自己的 mAP;
② 修改val.py加一行np.savez('pr_data.npz', ...),拿到真实 PR 数据;
③ 用plot_confusion_matrix.py查看哪两类最容易混淆;
④ 最后,把三个脚本打包成eval_all.sh,一键生成全部结果。

评估的价值,不在于数字多高,而在于你能否快速定位问题、验证改进、形成闭环。YOLOv9 已经把门推开,剩下的路,你来走。


获取更多AI镜像

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

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

Whisky技术探索指南:在macOS上构建Windows应用兼容环境

Whisky技术探索指南:在macOS上构建Windows应用兼容环境 【免费下载链接】Whisky A modern Wine wrapper for macOS built with SwiftUI 项目地址: https://gitcode.com/gh_mirrors/wh/Whisky 核心功能解析:探索Whisky的跨平台魔法 Wine兼容层工作…

作者头像 李华
网站建设 2026/3/29 3:34:39

Qwen3-0.6B如何启用思维链?extra_body参数配置详解

Qwen3-0.6B如何启用思维链?extra_body参数配置详解 1. 什么是Qwen3-0.6B Qwen3-0.6B是通义千问系列中轻量但能力扎实的入门级模型,参数量为6亿,专为在资源受限环境下实现高质量推理而设计。它不是简单的小模型“缩水版”,而是在…

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

Qwen-Image-2512与Flux对比:本地部署易用性实战评测

Qwen-Image-2512与Flux对比:本地部署易用性实战评测 1. 为什么这次对比聚焦“本地部署的易用性” 你是不是也经历过这样的场景: 花一小时配环境,两小时调依赖,三小时查报错,最后生成一张图——结果显存爆了&#xff…

作者头像 李华
网站建设 2026/3/28 6:02:50

Hunyuan语音能力揭秘:对标SenseVoiceSmall的部署优化方案

Hunyuan语音能力揭秘:对标SenseVoiceSmall的部署优化方案 1. 为什么需要一个更轻快、更实用的语音理解方案? 你有没有遇到过这样的场景:想快速把一段会议录音转成带情绪标记的文字,却发现主流语音模型要么只支持中文、要么识别完…

作者头像 李华
网站建设 2026/4/1 13:23:41

手把手教你启动Z-Image-Turbo模型,UI界面使用超简单

手把手教你启动Z-Image-Turbo模型,UI界面使用超简单 你是不是也试过下载一堆AI绘图工具,结果卡在环境配置、依赖冲突、端口报错上,折腾半天连界面都没打开?Z-Image-Turbo_UI界面镜像就是为“不想折腾”的人准备的——它已经把所有…

作者头像 李华
网站建设 2026/4/2 7:54:33

cv_resnet18_ocr-detection版权说明:开源使用注意事项必看

cv_resnet18_ocr-detection OCR文字检测模型版权说明:开源使用注意事项必看 1. 模型与工具简介 1.1 什么是 cv_resnet18_ocr-detection? cv_resnet18_ocr-detection 是一个轻量级、高可用的 OCR 文字检测专用模型,基于 ResNet-18 主干网络…

作者头像 李华