✅ 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) 进行评估的逻辑。该逻辑的触发和正确执行依赖于以下几个关键条件:
- 触发评估: 需要显式告知
model.val()保存预测结果为 COCO JSON 格式,这是调用 COCO API 的前提。 - 数据集识别: 脚本需要判断当前验证的数据集是否为“COCO 类型”,以便加载对应的 COCO 格式 Ground Truth 标注文件。这通常基于数据集配置文件 (
.yaml) 中的路径约定。 - 标注文件定位: 脚本需要根据约定的目录结构找到 COCO 格式的 Ground Truth JSON 文件 (如
instances_val2017.json)。 - 类别映射 (Class Mapping): 对于标准 COCO 数据集,代码默认会应用一个从 COCO 80 类到 COCO 91 类的映射。对于自定义数据集,这个映射通常是不必要的,甚至是有害的。
- 图像 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.pyL71 附近
# --- 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.pyL301 附近
# --- 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.pyL77 附近
# --- 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.pyL325 附近
# --- 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.json和instances_val2017.json中的image_id能够对应上。
四、总结与展望
通过以上配置和代码调整(主要是 save_json=True 参数,满足 is_coco 的路径约定,确保 anno_json 路径正确,以及为自定义数据集修改 class_map),你可以在 Ultralytics YOLO 的 model.val() 流程中成功启用 COCO API,自动计算并获取标准的 mAP 等评估指标。
关键要点回顾:
- 调用
model.val()时设置save_json=True。 - 确保数据集 YAML 文件中的
val路径符合is_coco判断约定(或理解其逻辑并适配)。 - 确保 Ground Truth COCO JSON 文件位于
path/annotations/instances_val2017.json。 - 对于自定义数据集,务必修改
val.py中的self.class_map逻辑,避免错误的 COCO 类别映射。 - 根据需要,可能要注释掉
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 评估指标定义)
pycocotoolsGitHub Repository: https://github.com/cocodataset/cocoapi (COCO API 官方库)
相关文章:
✅ Ultralytics YOLO验证(Val)时自动输出COCO指标(AP):2025最新配置与代码详解 (小白友好 + B站视频)
✅ YOLO获取COCO指标(3):验证(Val) 启用 COCO API 评估(自动输出AP指标)| 发论文必看! | Ultralytics | 小白友好 文章目录 一、问题定位二、原理分析三、解决方案与实践案例步骤 1: 触发 COCO JSON 保存步骤 2: 确保 self.is_coc…...
MySql表达式中字符串类型与整型的隐式转换
隐式转换 当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。某些转换是隐式发生的。例如,MySQL 会根据需要自动将字符串转换为数字,反之亦然。 mysql> SELECT 11;-> 2 mysql> SELECT CONCAT(2, test);-> 2…...
拍摄的婚庆视频有些DAT的视频文件打不开怎么办
3-12 现在的婚庆公司大多提供结婚的拍摄服务,或者有一些第三方公司做这方面业务,对于视频拍摄来说,有时候会遇到这样一种问题,就是拍摄下来的视频文件,然后会有一两个视频文件是损坏的,播放不了࿰…...
Zephyr与Linux核心区别及适用领域分析
一、核心定位与目标场景 特性Zephyr RTOSLinux目标领域物联网终端、实时控制系统(资源受限设备)服务器、桌面系统、复杂嵌入式设备(如路由器)典型硬件MCU(ARM Cortex-M, RISC-V),内存<1MBMP…...
图灵逆向——题一-动态数据采集
目录列表 过程分析代码实现 过程分析 第一题比较简单,直接抓包即可,没有任何反爬(好像头都不用加。。。) 代码实现 答案代码如下: """ -*- coding: utf-8 -*- File : .py author : 鲨鱼爱兜兜 T…...
【新人系列】Golang 入门(十二):指针和结构体 - 上
✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12898955.html 📣 专栏定位:为 0 基础刚入门 Golang 的小伙伴提供详细的讲解,也欢迎大佬们…...
Day20 -实例:红蓝队优秀集成式信息打点工具的配置使用
一、自动化-企业查询 ----ENScan 原理:集成企查查、爱企查、chinaz等,剑指hw/src。 1)首次使用先创建config文件 确认一下生成了 2)配置cookie 各个平台不一样,根据github作者的教程来【放入github收藏夹了】 我这…...
MySQL学习笔记五
第七章数据过滤 7.1组合WHERE子句 7.1.1AND操作符 输入: SELECT first_name, last_name, salary FROM employees WHERE salary < 4800 AND department_id 60; 输出: 说明:MySQL允许使用多个WHERE子句,可以以AND子句或OR…...
Python爬虫第5节-urllib的异常处理、链接解析及 Robots 协议分析
目录 一、处理异常 1.1 URLError 1.2 HTTPError 二、解析链接 2.1 urlparse() 2.2 urlunparse() 2.3 urlsplit() 2.4 urlunsplit() 2.5 urljoin() 2.6 urlencode() 2.7 parse_qs() 2.8 parse_qsl() 2.9 quote() 2.10 unquote() 三、分析网站Robots协议 3.1 R…...
26届Java暑期实习面经,腾讯视频一面
短链接的生成原理 如何解决短链接生成的哈希冲突问题 如何加快从短链接到原链接的重定向过程 TCP 和 UDP 协议 如何理解 TCP 是面向连接的 为什么 TCP 的握手是 3 次 IO 模式 是否有真正写过一个底层的 Socket 通信 MySQL 的事务隔离级别 MVCC 机制 什么叫服务的并行 为什么能基…...
Kafka负载均衡挑战解决
本文为 How We Solve Load Balancing Challenges in Apache Kafka 阅读笔记 kafka通过利用分区来在多个队列中分配消息来实现并行性。然而每条消息都有不同的处理负载,也具有不同的消费速率,这样就有可能负载不均衡,从而使得瓶颈、延迟问题和…...
前端性能优化的全方位方案【待进一步结合项目】
以下是前端性能优化的全方位方案,结合代码配置和最佳实践,涵盖从代码编写到部署的全流程优化: 一、代码层面优化 1. HTML结构优化 <!-- 语义化标签减少嵌套 --> <header><nav>...</nav> </header> <main&…...
2025年第二期PMP考试中文报名时间定了!
近日,官方发布了《关于2025年6月15日PMI认证考试的报名通知》。根据通知,中国大陆地区2025年第二期PMI认证考试将于6月15日举行,中文报名将于4月17日正式开始。 一、报名安排 为缓解报名高峰期的网络拥堵,本次考试将采取分地区、…...
LiT and Lean: Distilling Listwise Rerankers intoEncoder-Decoder Models
文章:ECIR 2025会议 一、动机 背景:利用LLMs强大的能力,将一个查询(query)和一组候选段落作为输入,整体考虑这些段落的相关性,并对它们进行排序。 先前的研究基础上进行扩展 [14,15],…...
【Java面试系列】Spring Boot微服务架构下的分布式事务处理与Seata框架实现原理详解 - 3-5年Java开发必备知识
【Java面试系列】Spring Boot微服务架构下的分布式事务处理与Seata框架实现原理详解 - 3-5年Java开发必备知识 1. 引言 在微服务架构中,分布式事务处理是一个不可避免的挑战。随着业务复杂度的提升,单体应用逐渐演变为微服务架构,而分布式事…...
源码分析之Leaflet图层控制控件Control.Layers实现原理
概述 本文将介绍Leaflet库中最后一个组件,即图层控制组件 Control.Layers。 源码实现 export var Layers Control.extend({options: {collapsed: true,position: "topright",autoZIndex: true,hideSingleBase: false,sortLayers: false,sortFunction:…...
嵌入式软硬件开发,常见通信总线
嵌入式通信总线分类与应用指南 一、片上/板级通信接口(内部互联) I2C总线 核心特性 同步半双工传输,SCL时钟线SDA数据线7/10位地址寻址,支持多主多从架构标准模式100kbps,高速模式3.4Mbps,超高速模式5Mbps…...
[ERROR] Some problems were encountered while processing the POMs
记录一次maven的错误 问题复现: 我在ruoyi-vue-plus项目的ruoyi-modules中新建了一个子项目ruoyi-network-telphonem,然后某一次编译的时候提示SysTenantServiceImpl找不到无参的构造函数,检查了很久都没发现问题,于是我想着删掉本地maven仓…...
Ubuntu 服务器上运行相关命令,关闭终端就停止服务,怎么才能启动后在后台运行?
环境: Ubuntu 20.04 LTS 问题描述: Ubuntu 服务器上运行相关命令,关闭终端就停止服务,怎么才能启动后在后台运行? bash docker/entrypoint.sh解决方案: bash docker/entrypoint.sh 脚本在后台运行&…...
前端工具方法整理
文章目录 1.在数组中找到匹配项,然后创建新对象2.对象转JSON字符串3.JSON字符串转JSON对象4.有个响应式对象,然后想清空所有属性5.判断参数不为空6.格式化字符串7.解析数组内容用逗号拼接 1.在数组中找到匹配项,然后创建新对象 const modifi…...
关于Deepseek本地AI知识文档库被联网访问方法的探索
背景: 根据前面的文章,我们使用了anythingLLM搭建了本地知识库,这个虽然基本可以用了,但是你只能在anythingLLM的界面里面进行提问,自能自己用,那么能否让其他人也可以使用我们搭建的本地知识库呢根据我的…...
一个简单的跨平台Python GUI自动化 AutoPy
象一下,你坐在电脑前,手指轻轻一点,鼠标自己动了起来,键盘仿佛被无形的手操控,屏幕上的任务自动完成——这一切不需要你费力,只靠几行代码就能实现。这就是AutoPy的魅力,一个简单却强大的跨平台…...
面试题汇总06-场景题线上问题排查难点亮点
面试题汇总06-场景题&线上问题排查&难点亮点 【一】场景题【1】订单到期关闭如何实现【2】每天100w次登录请求,4C8G机器如何做JVM调优?(1)问题描述和分析(2)堆内存设置(3)垃圾收集器选择(4)各区大小设置(5)添加必要的日志【3】如果你的业务量突然提升100倍…...
【嵌入式系统设计师】知识点:第4章 嵌入式系统软件基础知识
提示:“软考通关秘籍” 专栏围绕软考展开,全面涵盖了如嵌入式系统设计师、数据库系统工程师、信息系统管理工程师等多个软考方向的知识点。从计算机体系结构、存储系统等基础知识,到程序语言概述、算法、数据库技术(包括关系数据库、非关系型数据库、SQL 语言、数据仓库等)…...
基于RDK X3的“校史通“机器人:SLAM导航+智能交互,让校史馆活起来!
视频标题: 【校史馆の新晋顶流】RDK X3机器人:导览员看了直呼内卷 视频文案: 跑得贼稳团队用RDK X3整了个大活——给校史馆造了个"社牛"机器人! 基于RDK X3开发板实现智能导航与语音交互SLAM技术让机器人自主避障不…...
春芽儿智能跳绳:以创新技术引领运动健康新潮流
在全球运动健康产业蓬勃发展的浪潮中,智能健身器材正成为连接科技与生活的重要纽带。据《中国体育用品产业发展报告》显示,2023年中国智能运动装备市场规模突破千亿元,其中跳绳类目因兼具大众普及性与技术升级空间,年均增速超30%。…...
复活之我会二分
文章目录 整数二分模板模板1:满足条件的第一个数模板2:满足条件的最后一个数 浮点数二分模板一、Building an Aquarium思路分析具体代码 二、Tracking Segments思路分析具体代码 三、Wooden Toy Festival思路分析具体代码 四、路标设置思路分析具体代码 …...
NOA是什么?国内自动驾驶技术的现状是怎么样的?
国内自动驾驶技术的现状如何? 汽车的NOA指的是“Navigate on Autopilot”,即导航辅助驾驶或领航辅助驾驶。这是一种高级驾驶辅助系统(ADAS)的功能,它允许车辆在设定好起点和终点后,自动完成行驶、超车、变…...
秒杀系统的性能优化
秒杀任务总体QPS预期是每秒几十万,对tomcat、redis、JVM参数进行优化。 tomcat线程数 4核8G的机器,一般就是开200-300个工作线程,这是个经验值。每秒一个线程处理3-5个请求,200多个线程的QPS可以达到1000左右。线程不能太多&…...
Linux 指令初探:开启终端世界的大门
前言 当我们初次接触 Linux,往往会被一串串在黑底屏幕中跳动的字符震撼甚至吓退。然而,正是这些看似晦涩的命令,构建了服务器、嵌入式系统乃至云计算的世界。 本篇将带你从最基础的 Linux 指令开始,逐步揭开命令行的神秘面纱。从…...
