✅ Ultralytics YOLO验证(Val)时自动输出COCO指标(AP):2025最新配置与代码详解 (小白友好 + B站视频)

✅ YOLO获取COCO指标(3):验证(Val) 启用 COCO API 评估(自动输出AP指标)| 发论文必看! | Ultralytics | 小白友好

文章目录

    • 一、问题定位
    • 二、原理分析
    • 三、解决方案与实践案例
      • 步骤 1: 触发 COCO JSON 保存
      • 步骤 2: 确保 `self.is_coco` 条件满足 (或理解其影响)
      • 步骤 3: 确保 Ground Truth JSON 文件路径正确
      • 步骤 4: (关键) 调整自定义数据集的类别映射
      • 步骤 5: (可选) 调整图像 ID 处理
    • 四、总结与展望
    • 参考文献:

重要说明: 本篇博客内容基于 YOLOv12 进行演示,但其核心原理和配置方法适用于所有基于 Ultralytics 框架开发的 YOLO 版本。在应用代码修改时,请注意核对你所使用的具体 Ultralytics 库版本中的文件路径和代码行号。

一、问题定位

在使用 Ultralytics YOLO 框架训练自定义目标检测数据集后,开发者通常希望在验证(Validation)阶段就能直接获取业界标准的 COCO 评估指标(尤其是 mAP)。然而,直接调用 model.val() 方法,即使数据集标注已转换为 COCO 格式,也未必能自动触发 COCO API 进行评估并输出结果。本文旨在解决这一问题,详细阐述如何通过正确配置和少量代码调整,在 model.val() 过程中无缝集成 COCO API 评估。

二、原理分析

Ultralytics YOLO 的 ultralytics/models/yolo/detect/val.py 脚本内置了使用 pycocotools (官方 COCO API) 进行评估的逻辑。该逻辑的触发和正确执行依赖于以下几个关键条件:

  1. 触发评估: 需要显式告知 model.val() 保存预测结果为 COCO JSON 格式,这是调用 COCO API 的前提。
  2. 数据集识别: 脚本需要判断当前验证的数据集是否为“COCO 类型”,以便加载对应的 COCO 格式 Ground Truth 标注文件。这通常基于数据集配置文件 (.yaml) 中的路径约定。
  3. 标注文件定位: 脚本需要根据约定的目录结构找到 COCO 格式的 Ground Truth JSON 文件 (如 instances_val2017.json)。
  4. 类别映射 (Class Mapping): 对于标准 COCO 数据集,代码默认会应用一个从 COCO 80 类到 COCO 91 类的映射。对于自定义数据集,这个映射通常是不必要的,甚至是有害的。
  5. 图像 ID 匹配: COCO API 评估时需要匹配预测结果和 Ground Truth 中的图像 ID。默认实现可能假设图像文件名是符合 COCO 规范的数字 ID。

当使用自定义数据集时,即使标注格式符合 COCO 标准,上述第 2、3、4、5 点的默认逻辑可能与用户的实际设置或数据情况不符,导致 COCO API 评估流程中断或出错。

三、解决方案与实践案例

以下步骤详细说明了如何在调用 model.val() 时成功启用 COCO API 评估。

步骤 1: 触发 COCO JSON 保存

在调用 model.val() 方法时,必须将参数 save_json 设置为 True。这会指示框架将模型的预测结果保存为 COCO 评估工具所需的 JSON 文件格式。

# --- 代码示例:调用 model.val() 并启用 save_json ---from ultralytics import YOLO				# 导入 YOLO 类# 加载模型
model = YOLO('path/to/your/best.pt') 		# 模型路径# 调用验证方法
metrics = model.val(# ... 其他训练参数 ...save_json=True,          				# 关键:设置为 True 以便后续调用 COCO API# ... 其他训练参数 ...
)

步骤 2: 确保 self.is_coco 条件满足 (或理解其影响)

ultralytics/models/yolo/detect/val.py 文件中,有一个 self.is_coco 标志位,它的设置决定了是否按 COCO 模式加载标注和执行评估。(注意:以下代码路径和行号基于文档提供的特定版本,请参考你使用的 Ultralytics 版本)

  • 代码位置 (仅供参考,请核对你的版本): ultralytics/models/yolo/detect/val.py L71 附近
# --- val.py 中 is_coco 的判断逻辑示例 (仅供理解) ---
# self.is_coco 通常基于 YAML 文件中 'val' 字段的路径字符串判断
# 它期望路径中包含 "coco" 并且以特定的文件名结尾 (如 val2017.txt)
self.is_coco = (isinstance(val, str) # val 是 YAML 中 'val' 键对应的值and "coco" in val    # 路径字符串需包含 "coco"# 并且以 /val2017.txt 或 /test-dev2017.txt 结尾and (val.endswith(f"{os.sep}val2017.txt") or val.endswith(f"{os.sep}test-dev2017.txt"))
)
  • 配置建议: 为了满足这个条件,你需要在你的数据集配置文件 (.yaml) 中,将 val 指向一个符合上述约定的路径。

    • 示例 YAML (PCB_COCO.yaml) 配置:

      path: E:/project/YOLOv12/dataset/PCB_DATASET # 数据集根目录
      train: train.txt # 训练集索引文件 (相对于 path)
      # 关键:val 路径需要满足 is_coco 的判断逻辑
      # 例如,创建一个名为 coco 的子目录,并在其中放置 val2017.txt
      val: coco/val2017.txt # 验证集索引文件 (相对于 path)
      test: # 测试集 (可选)names: # 你的类别名称列表0: class_01: class_1# ...
      
    • 文件结构建议 (对应 YAML):

      E:/project/YOLOv12/dataset/PCB_DATASET/
      ├── coco/
      │   └── val2017.txt  # 里面是验证集图片路径列表
      ├── train.txt
      └── # ... 其他文件和目录 (如 images, labels, annotations)
      

步骤 3: 确保 Ground Truth JSON 文件路径正确

val.py 会根据 self.data["path"] (即 YAML 文件中的 path) 和 self.is_coco 的状态来构建 Ground Truth JSON 文件的预期路径。

  • 代码位置 (仅供参考): ultralytics/models/yolo/detect/val.py L301 附近
# --- val.py 中 anno_json 的路径构建逻辑示例 ---
# 如果 is_coco 为 True,则期望的 JSON 文件是 'instances_val2017.json'
# 如果是 LVIS 数据集,则是 lvis_v1_{split}.json
anno_json = (self.data["path"] # 来自 YAML 的 'path'/ "annotations"    # 固定的 'annotations' 子目录/ ("instances_val2017.json" if self.is_coco else f"lvis_v1_{self.args.split}.json")
)
  • 配置建议: 确保你的 COCO 格式标注 JSON 文件(包含所有验证集图片的 Ground Truth)放置在 <数据集根目录>/annotations/instances_val2017.json
    示例路径: E:/project/YOLOv12/dataset/PCB_DATASET/annotations/instances_val2017.json

步骤 4: (关键) 调整自定义数据集的类别映射

对于自定义数据集,默认的 COCO 80 到 91 类映射 (coco80_to_coco91_class()) 是不适用的。需要注释掉这行代码,让 self.class_map 使用从 1 开始的连续整数,对应你模型 names 列表中的类别。

  • 代码位置 (仅供参考): ultralytics/models/yolo/detect/val.py L77 附近
# --- val.py 中 class_map 的修改 ---
# 原代码 (需要注释掉或修改条件)
# self.class_map = converter.coco80_to_coco91_class() if self.is_coco else list(range(1, len(model.names) + 1))# 修改后:无论 is_coco 如何,都使用模型自身的类别数生成从 1 开始的映射
# (注意:COCO API 的类别 ID 通常从 1 开始)
self.class_map = list(range(1, len(model.names) + 1)) # 直接使用模型类别生成映射
  • 修改说明: 这个修改确保了评估时使用的类别 ID 与你的模型和标注文件中的类别 ID 一致(假设你的 COCO JSON 中类别 ID 也是从 1 开始,如果不是,则需要相应调整这里的映射或你的 JSON 文件)。

步骤 5: (可选) 调整图像 ID 处理

默认实现可能假设验证集图片的文件名是数字 (如 000000123456.jpg),并以此作为 COCO API 评估时的图像 ID。如果你的文件名不是这种格式,可能会导致匹配失败。在这种情况下,需要注释掉相关代码。

  • 代码位置 (仅供参考): ultralytics/models/yolo/detect/val.py L325 附近
# --- val.py 中 imgIds 的处理 (如果需要修改) ---
# 如果你的验证集图片文件名不是纯数字 ID (如 'img_001.jpg'),
# 下面这行代码可能会出错或导致 ID 不匹配,可以考虑注释掉
# val.params.imgIds = [int(Path(x).stem) for x in self.dataloader.dataset.im_files]
  • 修改说明: 注释掉此行后,评估时可能会依赖于 COCO JSON 文件中提供的图像 ID。确保你的 predictions.jsoninstances_val2017.json 中的 image_id 能够对应上。

四、总结与展望

通过以上配置和代码调整(主要是 save_json=True 参数,满足 is_coco 的路径约定,确保 anno_json 路径正确,以及为自定义数据集修改 class_map),你可以在 Ultralytics YOLO 的 model.val() 流程中成功启用 COCO API,自动计算并获取标准的 mAP 等评估指标。

关键要点回顾:

  1. 调用 model.val() 时设置 save_json=True
  2. 确保数据集 YAML 文件中的 val 路径符合 is_coco 判断约定(或理解其逻辑并适配)。
  3. 确保 Ground Truth COCO JSON 文件位于 path/annotations/instances_val2017.json
  4. 对于自定义数据集,务必修改 val.py 中的 self.class_map 逻辑,避免错误的 COCO 类别映射。
  5. 根据需要,可能要注释掉 val.params.imgIds 的默认生成逻辑。

参考文献:

  • Ultralytics YOLO 官方文档:
    • model.val() API 文档: https://docs.ultralytics.com/modes/val/ (请查找对应版本的文档)
    • 数据集配置 (.yaml) 文档: https://docs.ultralytics.com/datasets/
  • COCO Dataset 官网: https://cocodataset.org/#detection-eval (了解 COCO 评估指标定义)
  • pycocotools GitHub Repository: https://github.com/cocodataset/cocoapi (COCO API 官方库)

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

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

相关文章

【嵌入式学习3】基于python的tcp客户端、服务器

目录 1、tcp客户端 2、tcp服务器 3、服务器多次连接客户端、多次接收信息 1、tcp客户端 """ tcp:客户端 1. 导入socket模块 2. 创建socket套接字 3. 建立tcp连接(和服务端建立连接) 4. 开始发送数据(到服务端) 5. 关闭套接字 """ import soc…

Linux: network: 两台直连的主机业务不通

前提环境,有一个产品的设定是两个主机之间必须是拿网线直连。但是设备管理者可能误将设置配错,不是直连。 最近遇到一个问题,说一个主机发的包,没有到对端,一开始怀疑设定的bond设备的问题,检查了bond的设置状态,发现没有问题,就感觉非常的奇怪。后来就开始怀疑两个主机…

COMSOL固体力学接触

目录 一、接触非线性及接触面积计算 一、接触非线性及接触面积计算 COMSOL接触非线性及接触面积计算_哔哩哔哩_bilibili 形成联合体&#xff0c;在定义处右键选择“建立接触对” 位移dz使用参数化扫描。 接触选择定义中设置的接触对&#xff0c;选择罚函数&#xff0c;摩擦设置…

22.OpenCV轮廓匹配原理介绍与使用

OpenCV轮廓匹配原理介绍与使用 1. 轮廓匹配的基本概念 轮廓匹配&#xff08;Contour Matching&#xff09;是计算机视觉中的一种重要方法&#xff0c;主要用于比较两个轮廓的相似性。它广泛应用于目标识别、形状分析、手势识别等领域。 在 OpenCV 中&#xff0c;轮廓匹配主要…

oracle 快速创建表结构

在 Oracle 中快速创建表结构&#xff08;仅复制表结构&#xff0c;不复制数据&#xff09;可以通过以下方法实现&#xff0c;适用于需要快速复制表定义或生成空表的场景 1. 使用 CREATE TABLE AS SELECT (CTAS) 方法 -- 复制源表的全部列和数据类型&#xff0c;但不复制数据 C…

若依原理笔记

代码生成器 源码分析 查询数据库列表 导入表结构 生成代码 修改generator.yml配置文件 代码生成器增强 Velocity模版引擎 基础语法-变量 Lombok集成 E:\javaProject\dkd-parent\dkd-generator\src\main\resources\vm\java\domain.java.vm package ${packageName}.domain;#fo…

Ansible的使用

##### Ansible使用环境 - 控制节点 - 安装Ansible软件 - Python环境支持&#xff1a;Python>2.6 - 必要的模块&#xff1a;如PyYAML等 - 被控节点 - 启用SSH服务 - 允许控制节点登录&#xff0c;通常设置免密登录 - Python环境支持 http://www.ansible.com/ …

C++ 提高编程:模板与 STL 深度剖析

摘要&#xff1a;本文深入探讨 C 提高编程中的模板编程与标准模板库&#xff08;STL&#xff09;相关内容。详细阐述模板编程中函数模板和类模板的概念、语法、特性及应用案例&#xff1b;对 STL 的诞生背景、基本概念、六大组件进行剖析&#xff0c;并对常用容器、函数对象、常…

C++(类模板的运用)

使用vector实现一个简单的本地注册登录系统 注册&#xff1a;将账号密码存入vector里面&#xff0c;注意防重复判断 登录&#xff1a;判断登录的账号密码是否正确 #include <iostream> #include <vector> #include <fstream> #include <sstream> usi…

【大模型】DeepSeek+蓝耕MaaS平台+海螺AI生成高质量视频实战详解

目录 一、前言 二、蓝耘智能云MaaS平台介绍 2.1 蓝耘智算平台是什么 2.2 平台优势 2.3 平台核心能力 三、海螺AI视频介绍 3.1 海螺AI视频是什么 3.2 海螺AI视频主要功能 3.3 海螺AI视频应用场景 3.4 海螺AI视频核心优势 3.5 项目git地址 四、蓝耘MaaS平台DeepSeek海…

接口自动化学习二:session自动管理cookie

session自动管理cookie&#xff1a; cookie中的数据&#xff0c;都是session提供的 实现步骤&#xff1a; 1.创建session对象&#xff1b;my_sessionrequests.Session() 2.使用session实例&#xff0c;调用get方法&#xff0c;发送获取验证码请求&#xff08;不需要提取cookie&…

C++类型转换详解

目录 一、内置 转 内置 二、内置 转 自定义 三、自定义 转 内置 四、自定义 转 自定义 五、类型转换规范化 1.static_case 2.reinterpret_cast 3.const_cast 4.dynamic_cast 六、RTTI 一、内置 转 内置 C兼容C语言&#xff0c;在内置类型之间转换规则和C语言一样的&am…

QEMU源码全解析 —— 块设备虚拟化(17)

接前一篇文章:QEMU源码全解析 —— 块设备虚拟化(16) 本文内容参考: 《趣谈Linux操作系统》 —— 刘超,极客时间 《QEMU/KVM源码解析与应用》 —— 李强,机械工业出版社 《KVM实战 —— 原理、进阶与性能调优》—— 任永杰 程舟,机械工业出版社

mac 卸载流氓软件安全助手

之前个人电脑在公司使用过一段时间&#xff0c;为了使用网线联网安装了公司指定的 联软上网助手&#xff0c;谁知安装容易卸载难&#xff0c;后来找运维来卸载&#xff0c;输入管理员密码后&#xff0c;也无反应&#xff0c;最后不了了之了&#xff0c;这个毒瘤软件长期在后台驻…

Java 大视界 -- Java 大数据机器学习模型在智能客服多轮对话系统中的优化策略(179)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

极氪汽车云原生架构落地实践

云原生架构落地实践的背景 随着极氪数字业务的飞速发展&#xff0c;背后的 IT 技术也在不断更新迭代。极氪极为重视客户对服务的体验&#xff0c;并将系统稳定性、业务功能的迭代效率、问题的快速定位和解决视为构建核心竞争力的基石。 为快速响应用户的需求&#xff0c;例如…

Python•判断循环

ʕ⸝⸝⸝˙Ⱉ˙ʔ ♡ 判断🍰常用的判断符号(比较运算符)andor括号notin 和 not inif-elif-else循环🍭计数循环 forrange()函数简易倒计时enumerate()函数zip()函数遍历列表遍历元组遍历字符串遍历字典条件循环 while提前跳转 continue跳出循环 break能量站😚判断🍰 …

FreeRTOS与RT-Thread深度对比:从入门到精通的全面解析

FreeRTOS与RT-Thread深度对比&#xff1a;从入门到精通的全面解析 在嵌入式系统开发领域&#xff0c;实时操作系统(RTOS)扮演着至关重要的角色。FreeRTOS和RT-Thread作为两款主流的开源RTOS&#xff0c;各有特色&#xff0c;适用于不同的应用场景。本文将从小白到大神的角度&a…

OpenCV 图形API(18)用于执行两个矩阵(或数组)的逐元素减法操作函数sub()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 计算两个矩阵之间的逐元素差值。 sub 函数计算两个矩阵之间的差值&#xff0c;要求这两个矩阵具有相同的尺寸和通道数&#xff1a; dst ( I ) src…

LeetCode刷题SQL笔记

系列博客目录 文章目录 系列博客目录1.distinct关键字 去除重复2.char_length()3.group by 与 count()连用4.date类型有个函数datediff()5.mod 函数6.join和left join的区别1. **JOIN&#xff08;内连接&#xff0c;INNER JOIN&#xff09;**示例&#xff1a; 2. **LEFT JOIN&a…