✅ Ultralytics YOLO 训练(Train)时实时获取 COCO 指标(AP):2025最新配置与代码详解 (小白友好 + B站视频)

news2025/4/12 17:12:25

✅ YOLO获取COCO指标(4): 训练(Train)启用COCO API评估(实时监控AP指标)| 发论文必看! | Ultralytics | 小白友好

文章目录

    • 一、问题定位
    • 二、原理分析
    • 三、解决方案与实践案例
      • 步骤 1: 在 `model.train()` 调用中设置 `save_json=True`
      • 步骤 2: 修改 `validator.py` 的 `__call__` 方法
    • 四、总结与展望
    • 五、参考文献

重要说明: 本篇博客内容基于 YOLOv12 进行演示,但其核心原理和配置方法适用于所有基于 Ultralytics 框架开发的 YOLO 版本。在应用代码修改时,请注意核对你所使用的具体 Ultralytics 库版本中的文件路径和代码行号,并确保已完成本系列教程前置步骤(特别是验证时启用 COCO API 的相关配置)。

一、问题定位

在使用 Ultralytics YOLO 进行模型训练时,标准的训练日志通常只展示损失函数(如 box_loss, cls_loss, dfl_loss)的变化。虽然这些损失值能反映训练趋势,但开发者往往更关心模型在验证集上的实际性能指标,特别是标准的 COCO 指标(如 mAP),以便:

  1. 实时评估模型效果: 了解每个 Epoch 后模型性能的真实提升。
  2. 指导超参数调优: 根据 mAP 的变化趋势调整学习率等参数。
  3. 实现基于 mAP 的早停 (Early Stopping): 在 mAP 不再提升时及时停止训练,节省资源。
  4. 选择最佳模型: 基于验证集上的最高 mAP 保存 best.pt 权重。

然而,默认的 model.train() 流程,即使配置了验证数据集,其在每个 Epoch 结束后的验证阶段,通常不直接计算和输出完整的 COCO 指标。本文旨在解决此问题,实现在训练过程中实时获取并监控 COCO mAP。

二、原理分析

Ultralytics YOLO 的训练流程 (model.train()) 内部会周期性地调用验证器 (Validator) 对模型在验证集上的性能进行评估。这个验证阶段与单独运行 model.val() 使用的是相似的逻辑,都涉及 ultralytics/engine/validator.py (或其子类,如 ultralytics/models/yolo/detect/val.py)。

要在训练的验证阶段计算 COCO 指标,需要克服以下关键点:

  1. 数据收集: 验证器在推理过程中需要收集所有预测框的信息,并将其整理成 COCO 格式的预测结果列表(通常存储在 self.jdict 变量中)。这需要 save_json=True 参数被传递给验证器。
  2. 触发 COCO API 调用: 在验证器完成对验证集的推理后,需要显式调用能够处理 self.jdict 并与 Ground Truth JSON 文件交互,最终调用 pycocotools 计算 COCO 指标的函数(如 self.eval_json())。
  3. 结果整合: 计算出的 COCO 指标需要被整合回训练过程的日志和结果记录中,例如更新 results 字典,并可能影响 fitness 值(用于判断是否为最佳模型)。

默认情况下,validator.py 在训练模式 (self.training = True) 下执行 __call__ 方法时,可能并未完整执行保存预测 JSON 文件并调用 self.eval_json() 的逻辑。因此,需要对 validator.py__call__ 方法进行修改,以确保在训练的验证阶段强制执行这一评估流程。

重要前提: 本文的修改依赖于 本系列教程前置步骤已正确完成。即,ultralytics/models/yolo/detect/val.py(或对应检测模型的验证器)中关于 is_coco 的判断、anno_json 路径的定位、以及关键的 self.class_map 针对自定义数据集的调整必须已经生效。否则,即使触发了 eval_json(),也可能因为找不到标注文件或类别映射错误而失败。

三、解决方案与实践案例

以下步骤展示了如何修改配置和代码,以在 model.train() 过程中启用实时的 COCO API 评估。

步骤 1: 在 model.train() 调用中设置 save_json=True

在启动训练时,需要将 save_json 参数设置为 True。这将确保在每个 Epoch 结束后的验证阶段,验证器会收集预测结果并准备好生成 COCO 格式的 JSON 数据。

# --- 代码示例:调用 model.train() 并启用 save_json ---
from ultralytics import YOLO		# 导入 YOLO 类

# 加载预训练模型或从 YAML 构建新模型
model = YOLO('yolov12n.pt') 		# 或 yolov12n.yaml

# 调用训练方法
results = model.train(
    data='path/to/your/xxx.yaml', 	# 指向你的 COCO 格式数据集配置文件
    # ... 其他训练参数 ...
    save_json=True, 				# 关键:确保验证阶段收集预测结果以供 COCO API 使用
    # ... 其他训练参数 ...
)
  • 说明: save_json=True 本身并不直接计算 COCO 指标,但它是后续步骤中触发 COCO API 调用的必要条件。

步骤 2: 修改 validator.py__call__ 方法

需要修改基础验证器类 ultralytics/engine/validator.py 中的 __call__ 方法。在其 if self.training: 代码块内部,返回结果之前,添加强制保存预测 JSON 文件并调用 self.eval_json() 的逻辑。

  • 代码位置 (仅供参考,请核对你的版本): ultralytics/engine/validator.py L205 附近,在 if self.training: 块内,return {k: round(float(v), 5) for k, v in results.items()} 语句之前。
# --- validator.py __call__ 方法修改示例 ---

# ... 省略 __call__ 方法前面的代码 ...

        if self.training: # 判断当前是否在训练模式下的验证阶段
            model.float() # 确保模型在 float 模式
            
            # ------------- 新添加的核心逻辑 ------------ #
            if self.args.save_json and self.jdict:								# 检查 save_json 是否为 True 且 self.jdict (预测结果列表) 是否有内容
                pred_json_path = self.save_dir / "predictions.json"
                LOGGER.info(f"Saving training validation predictions to {pred_json_path}...")
                with open(str(pred_json_path), "w") as f:
                    json.dump(self.jdict, f) 									# 保存预测结果
                LOGGER.info(f"Calculating COCO metrics for epoch validation...")
                stats = self.eval_json(stats) 									# ★★★ 触发 COCO API 评估 ★★★
                stats['fitness'] = stats['metrics/mAP50-95(B)']		            # 更新 fitness 值,用于判断最佳模型 ('best.pt') ,这里默认使用 mAP50-95 作为 fitness
                # 你可以根据需要调整 fitness 的计算方式,例如结合 mAP50
                #    stats['fitness'] = 0.1 * stats['metrics/mAP50(B)'] + 0.9 * stats['metrics/mAP50-95(B)']
            # ------------- 新添加的核心逻辑结束 ------------ #

            results = {**stats, **trainer.label_loss_items(self.loss.cpu() / len(self.dataloader), prefix="val")}
            return {k: round(float(v), 5) for k, v in results.items()}
        else:
            # ... 省略后续代码 ...
  • 修改说明: 这个修改的核心是在训练的验证环节,强制执行 predictions.json 的保存和 eval_json() 的调用。eval_json() 会利用 pycocotools 计算 COCO 指标,并将 metrics/mAP50-95(B), metrics/mAP50(B) 等指标添加到 stats 字典中。随后,这些指标会被包含在返回给训练器的 results 中,并打印在训练日志里,同时 fitness 值(通常基于 mAP)也会被正确更新,用于模型选择。

四、总结与展望

通过在调用 model.train() 时设置 save_json=True,并对 ultralytics/engine/validator.py 中的 __call__ 方法进行适当修改,我们成功地在 Ultralytics YOLO 的训练过程中实现了每个 Epoch 验证阶段的实时 COCO API 评估。这使得开发者能够:

  • 实时监控关键性能指标 mAP 的变化。
  • 更有效地进行模型调优和选择。
  • 可能基于 mAP 实现更可靠的早停策略。

关键要点回顾:

  1. 训练启动时,设置 model.train(..., save_json=True, ...)
  2. 修改 validator.py__call__ 方法,在 if self.training: 分支内,当条件满足时调用 self.eval_json(stats)
  3. 确保 fitness 值基于计算出的 COCO 指标进行更新。

希望本教程能帮助你更深入地理解和控制 Ultralytics YOLO 的训练评估流程,获取更精确实时的模型性能反馈。


五、参考文献

  • Ultralytics YOLO 官方文档:
    • model.train() API 文档: https://docs.ultralytics.com/modes/train/
    • Validator Class (可能在 API 文档或源码注释中): 查阅 Ultralytics GitHub 仓库中的 ultralytics/engine/validator.py
  • 本系列教程前置文章 (重要依赖):
    • 教程(3): 验证(Val)时启用 COCO API 评估 (确保 val.py 修改已完成)
  • COCO Dataset 官网: https://cocodataset.org/#detection-eval
  • pycocotools GitHub Repository: https://github.com/cocodataset/cocoapi

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

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

相关文章

qwen-vl 实现OCR的测试

OCR 技术是数字化时代必不可少的实用工具。以前都依赖专业的公司的专业软件才能完成。成本很高。也正因为如此,我国纸质资料的数字化并不普及。基于大模型的ORC 也许会改变这样的现状。 文本识别,也称为光学字符识别 (OCR),可以将印刷文本或…

算法训练之动态规划(五)——简单多状态问题

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

SVMSPro分布式综合安防管理平台-->以S3存储革新,开启智能安防新纪元

SVMSPro分布式综合安防管理平台–>以S3存储革新,开启智能安防新纪元 在数字化转型浪潮下,企业安防管理正面临海量数据存储、跨区域协同以及数据安全的严峻挑战。如何实现高效、弹性、低成本的存储扩容?如何确保关键录像数据万无一失&…

脑科学与人工智能的交叉:未来智能科技的前沿与机遇

引言 随着科技的迅猛发展,脑科学与人工智能(AI)这两个看似独立的领域正在发生深刻的交汇。脑机接口、神经网络模型、智能机器人等前沿技术,正带来一场跨学科的革命。这种结合不仅推动了科技进步,也在医疗、教育、娱乐等…

docker 运行自定义化的服务-后端

docker 运行自定义化的服务-前端-CSDN博客 运行自定义化的后端服务 具体如下: ①打包后端项目,形成jar包 ②编写dockerfile文件,文件内容如下: # 使用官方 OpenJDK 镜像 FROM jdk8:1.8LABEL maintainer"ATB" version&…

NO.82十六届蓝桥杯备战|动态规划-从记忆化搜索到动态规划|下楼梯|数字三角形(C++)

记忆化搜索 在搜索的过程中,如果搜索树中有很多重复的结点,此时可以通过⼀个"备忘录",记录第⼀次搜索到的结果。当下⼀次搜索到这个结点时,直接在"备忘录"⾥⾯找结果。其中,搜索树中的⼀个⼀个结点…

【时时三省】(C语言基础)用switch语句实现多分支选择结构 例题

山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省 例题: 用switch语句处理菜单命令。在许多应用程序中,用菜单对流程进行控制,例如从键盘输入一个 A 或 a 字符,就会执行A操作,输入一…

全域数字化:从“智慧城市”到“数字生命体”的进化之路

一、国家战略下的城市数字化浪潮 2024年5月,国家四部委联合发布《关于深化智慧城市发展 推进城市全域数字化转型的指导意见》,明确提出以数据为引擎,系统性重塑城市技术架构与管理流程,推动城市治理迈向“全域协同、数实融合”的…

基于SSM的线上花店鲜花销售商城网站系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…

DAPP实战篇:使用web3.js连接合约

说明 本系列内容目录:专栏:区块链入门到放弃查看目录 如果你还没有创建好项目请先查看:《DApp实战篇:先用前端起个项目》,如果你还不知道web3.js是什么请先查看:《DApp实战篇:前端技术栈一览》。 安装 点此查看web3.js官方文档 打开项目根目录,并唤起终端: 键入w…

K8S-证书过期更新

K8S证书过期问题 K8S证书过期处理方法 Unable to connect to the server: x509: certificate has expired or is not yet valid 1、查看证书有效期: # kubeadm certs check-expiration2、备份证书 # cp -rp /etc/kubernetes /etc/kubernetes.bak3、直接重建证书 …

蓝桥杯第十五届真题——握手问题

#include<bits/stdc.h> using namespace std; int main() {ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int sum0;for(int i7;i<49;i){sumi;}cout<<sum;return 0; }

5G_WiFi_CE_DFS

目录 一、规范要求 1、法规目录 2、定义 3、运行模式 4、主/从设备相关的运行行为及具体的动态频率选择&#xff08;DFS&#xff09;要求 5、产品角色确定测试项目 6、测试项目 测试项1&#xff1a;信道可用性检查&#xff08;Channel Availability Check&#xff09; …

springboot 处理编码的格式为opus的音频数据解决方案【java8】

opus编码的格式概念&#xff1a; Opus是一个有损声音编码的格式&#xff0c;由Xiph.Org基金会开发&#xff0c;之后由IETF&#xff08;互联网工程任务组&#xff09;进行标准化&#xff0c;目标是希望用单一格式包含声音和语音&#xff0c;取代Speex和Vorbis&#xff0c;且适用…

RK3568 基于Gstreamer的多媒体调试记录

文章目录 1、环境介绍2、概念理清3、提前准备4、GStreamer编译5、GStreamer基础介绍6、视频播放初体验7、视频硬编码7.1、h2647.2、h265 8、视频硬解码8.1、解码视频并播放8.2、解码视频并播放带音频 1、环境介绍 硬件&#xff1a;飞凌ok3568-c开发板 软件&#xff1a;原厂rk…

VS Code 的 .S 汇编文件里面的注释不显示绿色

1. 确认文件语言模式 打开 .S 文件后&#xff0c;查看 VS Code 右下角的状态栏&#xff0c;确认当前文件的识别模式&#xff08;如 Assembly、Plain Text 等&#xff09;。如果显示为 Plain Text 或其他非汇编模式&#xff1a; 点击状态栏中的语言模式&#xff08;如 Plain Te…

5分钟读懂ArgoCD:在Kubernetes中实现持续部署

Kubernetes中的Argo CD介绍 Argo CD是用于Kubernetes的声明式GitOps持续交付工具。它遵循GitOps模式&#xff0c;以Git仓库作为定义所需应用程序状态的唯一真实来源&#xff0c;能在指定的目标环境中自动部署应用程序&#xff0c;并持续监控应用程序的运行状态&#xff0c;确保…

cs224w课程学习笔记-第10课

cs224w课程学习笔记-第10课 异构图 前言一、异构图1、异构图定义2、异构图与同构图 二、异构图下的GNN1、GCN扩展至RGCN1.1 RGCN原理1.2 异构图的任务预测特点1.3 异构图任务预测基础案例 2、完整的异构图GCN三、异构图下的Transformer 前言 异构图的定义是节点内部存在类型不…

OpenCV 图形API(26)图像滤波-----方框滤波函数boxFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用方框滤波器模糊图像。 该函数使用以下内核来平滑图像&#xff1a; K α [ 1 1 … 1 1 1 … 1 ⋮ ⋮ ⋱ ⋮ 1 1 … 1 ] K \alpha \begin{b…

大模型上下文协议MCP详解(2)—核心功能

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 标准化上下文交互技术 1.1 实时数据接入能力 MCP(Model Context Protocol)通过标准化的接口,为 AI 模型提供了强大的实时数据接入能力,使其能够快速获取和处理来自不同数据源的实时信息。…