YOLOv11训练中精准率召回率与mAP@0.5的动态变化分析

news2025/7/15 16:58:33

目标检测模型的训练过程涉及多个关键性能指标和损失函数的变化,这些数据能够直观反映模型的收敛速度、最终精度以及改进效果。本文旨在通过绘制YOLOv11模型在训练过程中的精准率(Precision)、召回率(Recall)、mAP@0.5 、mAP@0.5 :0.95以及各种损失的变化曲线,支持多文件数据对比,从而为论文中展示不同算法的性能差异提供直观依据。

1. results.csv 文件

在目标检测模型(如YOLO系列)的训练过程中,通常会生成一个记录训练和验证过程性能指标的日志文件。常见的日志文件格式为 .csv,例如 results.csv。该文件包含了模型在每个训练轮次(Epoch)中的关键性能指标和损失值,用于后续分析和可视化。

1.1 基本结构

results.csv 文件以逗号分隔的表格形式存储数据,每一行代表一个训练轮次(Epoch),每一列对应一个特定的指标或损失值。文件通常包含以下字段:

字段名称描述
epoch当前训练轮次编号,从1开始递增。
train/box_loss训练集上的定位损失(Bounding Box Loss),衡量预测框与真实框的位置偏差。在训练过程中,此值逐渐变小,越小表示模型预测的边界框与真实边界框之间的差异越小。
train/cls_loss训练集上的分类损失(Classification Loss),衡量目标类别预测的准确性。在训练过程中,此值逐渐变小,越小表示模型对目标类别的预测越准确。
train/dfl_loss训练集上的分布焦点损失(Distribution Focal Loss),用于优化边界框分布。将边界框的回归问题转化为对边界框四个边的分布预测问题,越小表示预测越准确。
metrics/precision验证集上的精准率(Precision),反映预测框的准确性。 用于衡量所有被预测为正类的样本中,真正的正类样本所占的比例。
metrics/recall验证集上的召回率(Recall),反映对真实目标的覆盖能力。 用于衡量所有实际为正类的样本中,被正确预测为正类的样本所占的比例。
metrics/mAP_0.5验证集上的mAP@0.5值,交并比(IoU)阈值为0.5时的平均精度。
metrics/mAP_0.5:0.95验证集上的mAP@0.5:0.95值,交并比(IoU)阈值从0.5到0.95范围内的平均精度。
val/box_loss验证集上的定位损失(Bounding Box Loss)。
val/cls_loss验证集上的分类损失(Classification Loss)。
val/dfl_loss验证集上的分布焦点损失(Distribution Focal Loss)。
x/lr0、x/lr1、x/lr2训练过程中的学习率变化。

示例数据

以下是一个典型的 results.csv 文件内容示例:

epoch,train/box_loss,train/cls_loss,train/dfl_loss,val/box_loss,val/cls_loss,val/dfl_loss,metrics/precision,metrics/recall,metrics/mAP_0.5,metrics/mAP_0.5:0.95
1,0.1234,0.0876,0.0543,0.1123,0.0987,0.0456,0.6543,0.7210,0.5821,0.3210
2,0.1123,0.0765,0.0432,0.1012,0.0876,0.0345,0.6789,0.7432,0.6012,0.3456
3,0.1012,0.0654,0.0321,0.0987,0.0765,0.0234,0.7012,0.7654,0.6234,0.3678
...

2. 使用方法

2.1 单个文件指标绘制

在这里插入图片描述
此处仅以metrics/mAP50(B)这一列的数据为例进行展示,其余指标的绘制流程,代码与此完全一致,自行修改列名。

import pandas as pd
import matplotlib.pyplot as plt
import logging
import sys
import matplotlib
matplotlib.use('TkAgg')
# 配置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

def load_data(csv_path):
    """
    加载 CSV 文件并清理列名中的多余空格。
    """
    try:
        data = pd.read_csv(csv_path)
        data.columns = data.columns.str.strip()  # 清理列名中的多余空格
        logging.info(f"成功加载数据文件: {csv_path}")
        return data
    except FileNotFoundError:
        logging.error(f"文件未找到: {csv_path}")
        sys.exit(1)
    except Exception as e:
        logging.error(f"加载数据时发生错误: {e}")
        sys.exit(1)

def extract_column(data, column_name):
    """
    提取指定列的数据。
    """
    if column_name in data.columns:
        logging.info(f"找到列: {column_name}")
        return data[column_name]
    else:
        logging.error(f"列名 '{column_name}' 未在数据中找到。可用列: {list(data.columns)}")
        sys.exit(1)

def plot_curve(data, column_name, output_file):
    """
    绘制曲线图并保存到文件。
    """
    plt.style.use('ggplot')  # 使用 ggplot 样式提升图表美观度

    # 绘制曲线
    plt.plot(data, label='Model-1', color='red', linewidth=1)

    # 添加图例、标题和坐标轴标签
    plt.legend(loc='lower right')
    plt.xlabel('Epoch')
    plt.ylabel('mAP_0.5(%)')
    plt.title('mAP_0.5 Curve')

    # 添加网格线
    plt.grid(True)

    # 保存图像
    plt.savefig(output_file)
    logging.info(f"图表已保存到: {output_file}")

def main():
    # 定义输入输出路径
    csv_path = 'run/train1/exp/results.csv'  # 替换为实际的 CSV 文件路径
    output_file = 'mAP_05_curve.png'         # 输出图像文件名

    # 加载数据
    data = load_data(csv_path)

    # 提取目标列数据
    column_name = 'metrics/mAP50(B)'  # 替换为目标列名
    mAP_05_data = extract_column(data, column_name)

    # 绘制并保存图表
    plot_curve(mAP_05_data, column_name, output_file)

if __name__ == "__main__":
    main()

2.1.1 效果

在这里插入图片描述

2.2 多文件绘制

import pandas as pd
import matplotlib.pyplot as plt
import logging
import sys
import matplotlib
matplotlib.use('TkAgg')

# 配置日志记录
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

def load_data(csv_path):
    """
    加载 CSV 文件并清理列名中的多余空格。
    """
    try:
        data = pd.read_csv(csv_path)
        data.columns = data.columns.str.strip()  # 清理列名中的多余空格
        logging.info(f"成功加载数据文件: {csv_path}")
        return data
    except FileNotFoundError:
        logging.error(f"文件未找到: {csv_path}")
        sys.exit(1)
    except Exception as e:
        logging.error(f"加载数据时发生错误: {e}")
        sys.exit(1)

def extract_column(data, column_name):
    """
    提取指定列的数据。
    """
    if column_name in data.columns:
        logging.info(f"找到列: {column_name}")
        return data[column_name]
    else:
        logging.error(f"列名 '{column_name}' 未在数据中找到。可用列: {list(data.columns)}")
        sys.exit(1)

def plot_curves(data_list, labels, colors, output_file):
    """
    绘制多条曲线图并保存到文件。
    """
    plt.style.use('ggplot')  # 使用 ggplot 样式提升图表美观度

    for i, data in enumerate(data_list):
        plt.plot(data, label=labels[i], color=colors[i], linewidth=1)

    # 添加图例、标题和坐标轴标签
    plt.legend(loc='lower right')
    plt.xlabel('Epoch')
    plt.ylabel('mAP_0.5(%)')
    plt.title('mAP_0.5 Curve Comparison')

    # 添加网格线
    plt.grid(True)

    # 保存图像
    plt.savefig(output_file)
    logging.info(f"图表已保存到: {output_file}")

def main():
    # 定义输入输出路径
    csv_paths = [
        'run/train1/exp/results.csv',       # 替换为实际的 CSV 文件路径
        'run/train/exp3/results.csv',
        'run/refine_train1/exp/results.csv',
        'run/refine_train/exp14/results.csv'
    ]
    output_file = 'mAP_05_comparison_curve.png'  # 输出图像文件名

    # 目标列名
    column_name = 'metrics/mAP50(B)'  # 替换为目标列名

    # 加载数据并提取目标列
    data_list = []
    labels = ['Model-1', 'Model-2', 'Model-3', 'Model-4']  # 每个模型的标签
    colors = ['red', 'green', 'blue', 'orange']          # 每个模型的颜色

    for i, csv_path in enumerate(csv_paths):
        data = load_data(csv_path)
        mAP_05_data = extract_column(data, column_name)
        data_list.append(mAP_05_data)
        logging.info(f"成功提取数据: {labels[i]}")

    # 绘制并保存图表
    plot_curves(data_list, labels, colors, output_file)

if __name__ == "__main__":
    main()

在这里插入图片描述

2.2.1 效果

在这里插入图片描述
注:可以修改自己想要的列,分别指定文件路径,获取指定列名,绘制曲线

3. 数据分析与模型优化的意义

目标检测模型的训练过程本质上是一个优化问题,通过不断调整模型参数以最小化损失函数并最大化性能指标。results.csv 文件中的数据记录了这一动态过程的关键信息,为研究人员提供了深入分析模型行为的重要依据。

  1. 收敛速度分析
    损失曲线(如 train/box_lossval/box_loss)的变化趋势能够直观反映模型的收敛速度。快速收敛通常表明模型在训练初期已经掌握了数据的基本特征,而缓慢收敛可能暗示模型复杂度不足或学习率设置不当。通过对多文件数据的对比,可以评估不同算法或超参数配置对收敛速度的影响。

  2. 最终精度评估
    验证集上的性能指标(如 metrics/mAP_0.5metrics/mAP_0.5:0.95)是衡量模型最终精度的核心标准。mAP@0.5 更注重宽松条件下的检测能力,适合评估模型在实际应用中的表现;而 mAP@0.5:0.95 则反映了模型在高精度要求下的综合性能。通过绘制这些指标的变化曲线,可以清晰地观察模型在训练后期的性能提升情况。

  3. 改进效果验证
    当引入新的算法或优化策略时,借助多文件数据对比功能,可以直观展示改进前后的性能差异。例如,通过比较两个模型的 mAP 曲线,可以验证新策略是否有效提升了模型的检测能力。这种定量分析方法为学术论文中的实验结果提供了强有力的支撑。

  4. 过拟合与欠拟合检测
    训练集和验证集的损失值变化曲线可以帮助识别模型是否存在过拟合或欠拟合问题。如果训练损失持续下降而验证损失开始上升,则表明模型可能出现了过拟合;反之,如果两者均较高且下降缓慢,则可能存在欠拟合。结合精准率和召回率的变化,可以进一步判断模型在不同阶段的表现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2331647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java常用工具算法-6--秘钥托管云服务AWS KMS

前言: 之前我们介绍了一些常用的加密算法(如:对称加密AES,非对称加密RSA,ECC等),不论是哪一种都需要涉及到秘钥的管理。通常的做法都是把秘钥放到配置文件中进行配置,但是对于一些高…

11. Langchain输出解析(Output Parsers):从自由文本到结构化数据

引言:从"自由发挥"到"规整输出" 2025年某金融机构的合同分析系统升级前,AI生成的合同摘要需人工二次处理达47分钟/份。引入LangChain结构化解析后,处理时间缩短至3分钟。本文将详解如何用LangChain的解析器,…

python reportlab模块----操作PDF文件

reportlab模块----操作PDF文件 一. 安装模块二. reportlab相关介绍三. 扩展canvas类四. 水平写入完整代码五. 垂直写入完整代码 一. 安装模块 pip install reportlab二. reportlab相关介绍 # 1. letter 生成A4纸张尺寸 from reportlab.lib.pagesizes import letter print(let…

解锁基因密码之重测序(从测序到分析)

在生命科学的奇妙世界中,基因恰似一本记录着生命奥秘的“天书”,它承载着生物体生长、发育、衰老乃至疾病等一切生命现象的关键信息。而重测序技术,则是开启基因“天书”奥秘的一把神奇钥匙。 试想,你手中有一本经典书籍的通用版…

TQTT_KU5P开发板教程---QSFP25G光口回环测试

文档实现功能介绍 本文档通过一个叫做ibert的IP,实现25G光口回环测试例子。工程新建方法请参考文档《流水灯》,其中只是将文件名进行修改。 Vivado 起始页(或 file-->Project-->New 创建新工程(Create New Project) 向导起始页面 点…

JVM虚拟机篇(七):JVM垃圾回收器全面解析与G1深度探秘及四种引用详解

JVM垃圾回收器全面解析与G1深度探秘及四种引用详解 JVM虚拟机(七):JVM垃圾回收器全面解析与G1深度探秘及四种引用详解一、JVM有哪些垃圾回收器1. Serial回收器2. ParNew回收器3. Parallel Scavenge回收器4. Serial Old回收器5. Parallel Old回…

柑橘病虫害图像分类数据集OrangeFruitDaatset-8600

文章目录 1. 前言2. 数据类别介绍3. 数据集地址 1. 前言 柑橘,作为水果界的 “宠儿”,不仅以其酸甜可口的味道深受大众喜爱,更是在全球水果产业中占据着举足轻重的地位。无论是早餐中的一杯橙汁,还是下午茶里的柑橘甜点&#xff…

深度学习总结(4)

张量积 张量积(tensor product)或点积(dot product)是最常见且最有用的张量运算之一。注意,不要将其与逐元素乘积(*运算符)弄混。在NumPy中,使用np.dot函数来实现张量积&#xff0c…

利用CST Microwave Studio设计贴片天线

利用CST Microwave Studio设计贴片天线的步骤如下,分为几个关键阶段: --- ### **1. 初始设置** - **新建项目**:打开CST,创建新项目(File > New),选择“Antenna (Planar)”或“Microwave &…

STM32之SG90舵机控制(附视频讲解)

目录 前言: 一、硬件准备与接线 1.1 硬件清单 1.2 接线 二、 SG90舵机简介 1.1 外观 1.2 基本参数 1.3 引脚说明 1.4 控制原理 1.5 特点 1.6 常见问题 三、 单片机简介 四、 程序设计 4.1 定时器配置 4.2 角度控制函数 4.3 主函数调用 五、 总结 …

(1)英特尔 RealSense T265(三)

文章目录 前言 4.4 地面测试 4.5 飞行测试 4.6 室内外实验 4.7 数据闪存记录 4.8 启动时自动运行 4.9 使用 OpticalFlow 进行 EKF3 光源转换 前言 Realsense T265 通过 librealsense 支持 Windows 和 Linux 系统。不同系统的安装过程差异很大,因此请参阅 gi…

多模态大语言模型arxiv论文略读(七)

MLLM-DataEngine: An Iterative Refinement Approach for MLLM ➡️ 论文标题:MLLM-DataEngine: An Iterative Refinement Approach for MLLM ➡️ 论文作者:Zhiyuan Zhao, Linke Ouyang, Bin Wang, Siyuan Huang, Pan Zhang, Xiaoyi Dong, Jiaqi Wang,…

SQL ③-基本语法

SQL基本语法 表操作 创建表 CREATE TABLE table_name (column1 datatype constraint,column2 datatype constraint,column3 datatype constraint,... );删除表 DROP [TEMPORARY] TABLE [IF EXISTS] table_name [, table_name...];TEMPORARY:表示临时表&#xff…

esp32cam -> 服务器 | 手机 -> 服务器 直接服务器传输图片

服务器先下载python : 一、Python环境搭建(CentOS/Ubuntu通用) 一条一条执行 安装基础依赖 # CentOS sudo yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel # Ubuntu sudo apt update && sudo apt install b…

豆浆机语音提示芯片方案:基于可远程在线更换语音的WT2003H-16S芯片

随着智能家居概念的普及,消费者对家电产品的智能化、便捷性提出了更高要求。豆浆机作为厨房常用电器,其操作便捷性和用户体验直接影响市场竞争力。传统豆浆机多依赖指示灯或简单蜂鸣器提示用户操作状态,信息传递单一且无法满足个性化需求。 在…

解密工业控制柜:认识关键硬件(PLC)

前言 作为一名视觉开发工程师,我们不仅要做到做好自己的工作,我们更需要在工业现场学习更多知识,最近网上流传很多,“教会徒弟,饿死师傅”;在自动化行业中,在项目下来很忙的时候,我们…

【嵌入式系统设计师】知识点:第11 章 嵌入式系统设计案例分析

提示:“软考通关秘籍” 专栏围绕软考展开,全面涵盖了如嵌入式系统设计师、数据库系统工程师、信息系统管理工程师等多个软考方向的知识点。从计算机体系结构、存储系统等基础知识,到程序语言概述、算法、数据库技术(包括关系数据库、非关系型数据库、SQL 语言、数据仓库等)…

【深度解析】SkyWalking 10.2.0版本安全优化与性能提升实战指南

前言 Apache SkyWalking 作为云原生可观测性领域的佼佼者,在微服务架构监控中扮演着至关重要的角色。然而,官方版本在安全性、镜像体积和功能扩展方面仍有优化空间。本文将分享一套完整的 SkyWalking 10.2.0 版本优化方案,从安全漏洞修复到镜…

面向大模型的开发框架LangChain

这篇文章会带给你 如何使用 LangChain:一套在大模型能力上封装的工具框架如何用几行代码实现一个复杂的 AI 应用面向大模型的流程开发的过程抽象 文章目录 这篇文章会带给你写在前面LangChain 的核心组件文档(以 Python 版为例)模型 I/O 封装…

Easysearch VS Opensearch 数据写入与存储性能对比

本文记录 Easysearch 和 Opensearch 数据写入和数据存储方面的性能对比。 准备 压测工具:INFINI Loadgen 对比版本: Easysearch 1.11.1(lucene 8.11.4)Opensearch 2.19.1(lucene 9.12.1) 节点 JVM 配置…