【代码实验】YOLO V7利用pycocotools进行评估时的一些问题

news2024/11/13 8:59:28

文章目录

  • 一、无法使用pycocotools进行评估
  • 二、使用pycocotools计算的结果与YOLO自身的mAP差异较大的原因

一、无法使用pycocotools进行评估

yolov7有自己的计算mAP方式,但是在使用pycocotools进行test时,出现了pycocotools unable to run: Results do not correspond to current coco set


这个问题是因为yolo在保存json结果时,把image_id保存为了图片的文件名,而不是对应的图片ID。按照COCO数据集的annotation格式来说,每张图片都会有一个image_id,比如这里的task_0056_000000对应的image_id应该是0。在进行测试时,pycocotools找不到对应的image_id,所以报错。
但是coco数据集的图片命名是以纯数字命名的,所以图片的文件名即可作为ID,所以训练coco数据集不会有这个问题。
在这里插入图片描述
所以,应该把yolo保存的json文件中的image_id做一个转换,在test.py文件增加一段代码,来获取文件名和id的键值对。
在这里插入图片描述

with open(anno_json, "r") as f:
    anns = json.load(f)
imagenames2id = {ann["file_name"].split(".")[0]: ann["id"] for ann in anns["images"]}

for pre_ann in jdict:
    pre_ann["image_id"] = imagenames2id[pre_ann["image_id"]] 

增加代码后,即可获取正确的JSON格式数据。
在这里插入图片描述

其实这里可以更改anno_json,设置为自己保存验证集annotation的路径即可

二、使用pycocotools计算的结果与YOLO自身的mAP差异较大的原因

首先,强烈推荐在传命令行参数:--data data/coco.yaml 时,如果是训练自己的数据集,最好新建或者重命名改yaml文件并且不要以coco.yaml结尾

解决了问题一,可以计算出结果,但是pycocotools计算得到的结果与yolo计算的相差非常大。yolo计算得到mAP时27.3,但是此时调用coco的api计算得到的只有0.005
包括YOLO V7的github上也有人提issue,见:COCO eval produce wrong results

在这里插入图片描述
通过查看源码,判断应该是命令行参数:--data data/coco.yaml 的问题,不管是在训练时还是在测试时,都需要传入数据集的YAML文件,当时是直接修改项目中自带的 data/coco.yaml,没有新建一个YAML文件。
在这里插入图片描述
这时候问题来了,在test.py文件中,有这么一个判断(其实是不是改成 data == "coco.yaml"更合理):
在这里插入图片描述
如果命令行参数datacoco.yaml结尾,那么is_coco变量就为True。也就是默认你是在训练coco数据集,而众所周知,coco数据集里面的类别ID是不连续的,coco总共只有80类,但是ID最大值却为91,这时候问题就出现了,我们自己的数据集类别ID在转化成coco格式时是从0开始的,并且是连续的,所以在保存JSON文件时,如果你是coco数据集,会帮你做一个映射也就是,红框中的coco91class,会帮你把0-79的ID(即80类)映射成1-91

在这里插入图片描述


映射方式如下,即返回一个列表,进行索引,可以看出索引为0时,值已经变成1了。但我们的类别索引应该是不用映射的,但是我们传入:--data data/coco.yaml ,此时is_coco已经为True,所以自动帮我们进行了映射,映射以后类别信息就已经错了,所以导致mAP极低,与yolo计算的相差很大(虽然两者的计算方式不同本身会产生误差)。


在这里插入图片描述
在这里插入图片描述
在训练自己的数据集时,我们只需将is_coco = Fasle即可。更加推荐在传命令行参数:--data data/coco.yaml 时,如果是训练自己的数据集,最好新建或者重命名改yaml文件并且不要以coco.yaml结尾
即使自己标注的数据集类别ID也是从1开始,也推荐这样做,毕竟coco数据集里面有缺失值,与yolo计算的mAP误差较大可以考虑是由于映射造成的。

更新代码后,mAP计算应该是正常了,与yolo计算的有0.3的误差。
在这里插入图片描述

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

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

相关文章

Java关键词synchronized

目录 一、通过卖票系统观察多线程的安全隐患 二、synchronized的基本知识 1.使用synchronized的原因 2.synchronized的作用 3.synchronized的基本格式 a.synchronized加在方法名前 b.synchronized用在方法中 4. Java锁机制 5.synchronized注意事项 三、使用synchronize…

【可变参数列表如何可变?】

可变参数列表 本章重点 学会使用可变参数列表的使用与原理 函数传参补充知识 如果函数没有形式参数,仍然可以给函数传递参数。在c语言中,只要发生了函数调用并且传递了函数,必定形成临时变量。所谓的临时拷贝本质就是在栈帧内部形成的&#…

Tcl常用命令备忘录-基础篇

一、置换 1、变量置换 在Tcl中,$符号可以用来引用变量。变量置换可以用来将变量的值嵌入到代码中。例如: set name "Tom" puts "Hello, $name!"这个示例中,变量$name的值会在输出语句中被替换为"Tom"。 2…

腾讯云服务器镜像市场快速搭建WordPress博客网站教程

通过腾讯云服务器的镜像市场搭建WordPress网站非常简单,不需要手动配置WP所需的Web环境,一键即可安装WordPress博客,腾讯云百科使用腾讯云服务器通过镜像市场的WordPress镜像搭建WP网站教程: 目录 腾讯云服务器通过市场镜像安装…

SpringMvc拦截器和手写模拟SpringMvc工作流程源码详解

目录 1. SpringMvc简介 1.1 什么是MVC 1.2 什么是SpringMvc 1.3 SpringMvc 能干什么 1.4 SpringMvc 工作流程 2. SpringMvc拦截器和过滤器 2.1 拦截器 2.1.1 拦截器作用 2.1.2 拦截器和过滤器的区别 2.1.3 拦截器方法说明 2.1.4 多个拦截器执行顺序 2.1.5 自定义拦…

29 虚拟地址到物理地址的转换

前言 呵呵 这是 linux 中内存管理中很基础的一环 用户程序 操作的地址都是虚拟地址, 虚拟地址通过 mmu 转换为物理地址 用户程序 看到的地址都是一个完整的世界, 只有具体需要使用的时候 产生缺页中断, 然后 分配具体的物理页 这里 要说的就是 虚拟地址 到 物理地址 的转…

1001router6-react

文章目录 1 一级路由2 Navigate3 NavLink 自定义高亮样式4 useRoutes()5 嵌套路由6 路由传参6.1 传递params参数6.2 传递search参数6.3 传递state参数 7 编程式导航7.1 路由跳转7.2 前进、后退 8 钩子函数8.1 useInRouterContext()8.2 useNavigationType()8.3 useOutlet()8.4 u…

手写Spring框架---AOP实现

目录 容器是OOP的高级工具 系统需求 关注点分离Concern Separation 原有实现 AOP的成员 Advice的种类 单个Aspect的执行顺序 多个Aspect的执行顺序 Introduction-引入型Advice 代理模式 JDK动态代理 Spring AOP的实现原理之JDK动态代理 Spring AOP的实现原理之CGL…

CSS基础学习--19 下拉菜单

一、基本下拉菜单 当鼠标移动到指定元素上时&#xff0c;会出现下拉菜单 <!DOCTYPE html> <html> <head> <title>下拉菜单实例</title> <meta charset"utf-8"> <style> .dropdown {position: relative;display: inline-…

UnityVR-项目的管理阶层

目录 概述 项目的总体架构 单例基类 继承MonoBehaviour的单例基类 概述 一个具备一定规模的项目&#xff0c;一般都需要由不同人员合作完成&#xff0c;每个人的想法风格不相同&#xff0c;如果一开始没有定下基本的框架&#xff0c;会让实现时混乱不堪&#xff0c;而且无法…

【CesiumJS入门】(5)GooJSON的加载、更新、监听与销毁——GeoJsonDataSource应用

前言 本篇&#xff0c;我们将较完整得介绍Cesium中GeoJSON/TopoJSON相关的方法。 GeoJSON规范地址&#xff1a;RFC 7946: The GeoJSON Format (rfc-editor.org) GeoJSON在线绘制&#xff1a;geojson.io CesiumJS提供了一个名为DataSource的类&#xff0c;它主要是用来加载和展…

Java-API简析_java.util.UUID类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意&#xff0c;谢绝转载&#xff01;&#xff08;请尊重原创&#xff0c;博主保留追究权&#xff09; https://blog.csdn.net/m0_69908381/article/details/131270140 出自【进步*于辰的博客】 其实我的【Java-API】专栏内的博文对大家来说意义是不大的。…

《计算之魂》读书笔记——递归与堆栈的关系

进入梅雨季节&#xff0c;一周末雨水连绵不绝&#xff0c;空气中泛着潮湿的凉爽。这个天气最适合找个角落&#xff0c;安安静静地读书写字。 继续读《计算之魂》&#xff0c;前次读到递归&#xff0c;今天则了解递归地数据结构实现。递归算法的层层实现&#xff0c;需要保留从…

大数据周会-本周学习内容总结018

开会时间&#xff1a;2023.06.18 15:00 线下会议 01【调研-数据分析&#xff08;质量、ETL、可视化&#xff09;】 ETL&#xff0c;是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;extract&#xff09;、转换&#xff08;transform…

Tcl常用命令备忘录-正则命令篇

正则表达式是一种用于匹配、查找、替换文本中特定模式的工具。在Tcl脚本中&#xff0c;可以使用正则表达式对字符串进行匹配、查找和替换。 regexp 语法&#xff1a; regexp ?选项? 正则表达式 字符串 ?变量1 变量2 ...? 其中&#xff0c;?选项?为可选项&#xff0c;…

基于蒙特卡洛法的规模化电动汽车充电负荷预测(PythonMatlab实现)

目录 0 概述 1 蒙特卡洛模拟方法介绍 2 规模化电动汽车充电负荷预测计算方法 3 完整代码 0 概述 对于本文的研究,依据不同用途电动汽车影响因素的分布函数和设定参数&#xff0c;采用蒙特卡洛法,对各用途电动汽车的日行驶里程、起始充电时间概率分布参数进行随机抽样&#xff0…

linuxOPS系统服务_Linux下软件的安装方式之源码安装

Linux下有哪些软件安装方式 ① RPM软件包管理&#xff08;软件名称.rpm&#xff09; ② YUM软件包管理&#xff08;使用yum命令install 软件名称&#xff09; > 下载 安装一体化 ③ 源码编译安装&#xff08;相对来说是最复杂的一种方式&#xff09; 软件包类型 ☆ 二…

十二、docker学习-docker核心docker网络之bridge网络(2)

bridge网络 bridge网络表现形式就是docker0这个网络接口。容器默认都是通过docker0这个接口进行通信。也可以通过docker0去和本机的以太网接口连接&#xff0c;这样容器内部才能访问互联网。 # 查看docker0网络&#xff0c;在默认环境中&#xff0c;一个名为docker0的linux b…

Go语言的TCP和HTTP网络服务基础

目录 【TCP Socket 编程模型】 Socket读操作 【HTTP网络服务】 HTTP客户端 HTTP服务端 TCP/IP 网络模型实现了两种传输层协议&#xff1a;TCP 和 UDP&#xff0c;其中TCP 是面向连接的流协议&#xff0c;为通信的两端提供稳定可靠的数据传输服务&#xff1b;UDP 提供了一种…

NodeJSMongodbMVC管理开发⑨

文章目录 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c;请点三连一波&#xff0c;蟹蟹支持&#x1f618;前言MVC思想开发 服务器代码演示 M层 Services 或 Model V层 Views C层 Controllers总结 ✨文章有误请指正&#xff0c;如果觉得对你有用&#xff0c…