YOLOv8使用COCO评测,解决AssertionError: Results do not correspond to current coco set.

本文主要是介绍YOLOv8使用COCO评测,解决AssertionError: Results do not correspond to current coco set.,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

YOLO评测指标和COCO评测指标还是有些区别的,通过数据表明YOLO评测指标要比COCO评测指标高2,3个点都是正常的。
跟着流程走吧!!

yolo设置

yolo.eval()评估的时候,需要设置save_json = True保存结果json文件

model = YOLO("weight/best.pt")
model.val(data="data.yaml",imgsz=640, save_json=True)

结果默认保存在runs/detect/val/predictions.json

Id转化

coco格式id是从0-n,一个序列。而yolo的id是文件名称,字符。需要借助标签文件进行映射,写到新文件中

def cover_pred_json_id(anno_json_path, pred_json_path):with open(anno_json_path, "r") as f:ann_json = json.load(f)with open(pred_json_path, "r") as f:pred_json = json.load(f)for pred_item in pred_json:img_id = pred_item["image_id"]ann_id = [ann_item["id"] for ann_item in ann_json["images"] if ann_item["file_name"][:-4] == img_id]try:pred_item["image_id"] = ann_id[0]except IndexError:print(img_id)out_json_path = os.path.join(os.path.dirname(pred_json_path),"newpred.json")with open(out_json_path, 'w') as file:json.dump(pred_json, file, indent=4)return out_json_path

评测

完整代码


def parse_opt():parser = argparse.ArgumentParser()parser.add_argument('--anno_json', type=str, default='datasets/annotations/instances_val2017.json', help='training model path')parser.add_argument('--pred_json', type=str, default='utils/json_files/newcocopred.json', help='data yaml path')return parser.parse_known_args()[0]def cover_pred_json_id(anno_json_path, pred_json_path):with open(anno_json_path, "r") as f:ann_json = json.load(f)with open(pred_json_path, "r") as f:pred_json = json.load(f)for pred_item in pred_json:img_id = pred_item["image_id"]ann_id = [ann_item["id"] for ann_item in ann_json["images"] if ann_item["file_name"][:-4] == img_id]try:pred_item["image_id"] = ann_id[0]except IndexError:print(img_id)out_json_path = os.path.join(os.path.dirname(pred_json_path),"newpred.json")with open(out_json_path, 'w') as file:json.dump(pred_json, file, indent=4)return out_json_pathif __name__ == '__main__':opt = parse_opt()anno_json = opt.anno_jsonpred_json = opt.pred_jsonpred_json = cover_pred_json_bbox(anno_json, pred_json) # cover yolo id to coco idanno = COCO(anno_json)  # init annotations apiprint(pred_json)pred = anno.loadRes(pred_json)  # init predictions apieval = COCOeval(anno, pred, 'bbox')eval.evaluate()eval.accumulate()eval.summarize()

如果不出意外的话,会正确打印结果:
coco result

错误

  1. 如果出现评测指标为0的时候,说明category_id都没对应上,coco是从1开始计算, 而yolo是0开始
    更改ultralytics/models/yolo/detect/val.py设置self.is_coco = True
    def init_metrics(self, model):"""Initialize evaluation metrics for YOLO."""val = self.data.get(self.args.split, "")  # validation pathself.is_coco = True # isinstance(val, str) and "coco" in val and val.endswith(f"{os.sep}val2017.txt")  # is COCOself.class_map = converter.coco80_to_coco91_class() if self.is_coco else list(range(1000))self.args.save_json |= self.is_coco  # run on final val if training COCOself.names = model.namesself.nc = len(model.names)self.metrics.names = self.namesself.metrics.plot = self.args.plotsself.confusion_matrix = ConfusionMatrix(nc=self.nc, conf=self.args.conf)self.seen = 0self.jdict = []self.stats = dict(tp=[], conf=[], pred_cls=[], target_cls=[])
  1. 如果出现AssertionError: Results do not correspond to current coco set的错误通常是预测文件和标签中的id值不对应,这时候就要查看预测的文件中是不是少了或者多了哪个文件。

这篇关于YOLOv8使用COCO评测,解决AssertionError: Results do not correspond to current coco set.的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1036753

相关文章

Mysql如何解决死锁问题

《Mysql如何解决死锁问题》:本文主要介绍Mysql如何解决死锁问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录【一】mysql中锁分类和加锁情况【1】按锁的粒度分类全局锁表级锁行级锁【2】按锁的模式分类【二】加锁方式的影响因素【三】Mysql的死锁情况【1

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

Python中__init__方法使用的深度解析

《Python中__init__方法使用的深度解析》在Python的面向对象编程(OOP)体系中,__init__方法如同建造房屋时的奠基仪式——它定义了对象诞生时的初始状态,下面我们就来深入了解下_... 目录一、__init__的基因图谱二、初始化过程的魔法时刻继承链中的初始化顺序self参数的奥秘默认

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr

Spring Boot 集成 Quartz并使用Cron 表达式实现定时任务

《SpringBoot集成Quartz并使用Cron表达式实现定时任务》本篇文章介绍了如何在SpringBoot中集成Quartz进行定时任务调度,并通过Cron表达式控制任务... 目录前言1. 添加 Quartz 依赖2. 创建 Quartz 任务3. 配置 Quartz 任务调度4. 启动 Sprin

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

使用Python实现一个优雅的异步定时器

《使用Python实现一个优雅的异步定时器》在Python中实现定时器功能是一个常见需求,尤其是在需要周期性执行任务的场景下,本文给大家介绍了基于asyncio和threading模块,可扩展的异步定... 目录需求背景代码1. 单例事件循环的实现2. 事件循环的运行与关闭3. 定时器核心逻辑4. 启动与停