当前位置: 首页 > news >正文

coco_eval 使用

参考

coco eval 解析
COCO目标检测比赛中的模型评价指标介绍!

coco 的评估函数对应的是 pycocotools 中的 cocoeval.py 文件。
从整体上来看,整个 COCOeval 类的框架如图:
在这里插入图片描述

基础的用法为

# The usage for CocoEval is as follows:
cocoGt=..., cocoDt=...       # load dataset and results
E = CocoEval(cocoGt,cocoDt); # initialize CocoEval object
E.params.recThrs = ...;      # set parameters as desired
E.evaluate();                # run per image evaluation
E.accumulate();              # accumulate per image results
E.summarize();               # display summary metrics of results

cocoGt, cocoDt 应该是什么格式?如果是COCO 格式,注意需要增加 score 值。(how?)

__init__ 初始化函数

参数解释如下:
在这里插入图片描述
注意几个字母的含义
N: 用于评估的img_id 的个数
K: 用于评估的cat_id 的个数
T: iouThrs 的个数
R: recThrs 的个数
A: 对象面积分段后的数量
M: maxDets 每张图片检测的最大检测框数量

_prepare

根据传入的初始化参数做一些前置化的处理

    def _prepare(self):'''Prepare ._gts and ._dts for evaluation based on params:return: None'''def _toMask(anns, coco):# modify ann['segmentation'] by referencefor ann in anns:rle = coco.annToRLE(ann)ann['segmentation'] = rlep = self.paramsif p.useCats:gts=self.cocoGt.loadAnns(self.cocoGt.getAnnIds(imgIds=p.imgIds, catIds=p.catIds))dts=self.cocoDt.loadAnns(self.cocoDt.getAnnIds(imgIds=p.imgIds, catIds=p.catIds))else:gts=self.cocoGt.loadAnns(self.cocoGt.getAnnIds(imgIds=p.imgIds))dts=self.cocoDt.loadAnns(self.cocoDt.getAnnIds(imgIds=p.imgIds))# convert ground truth to mask if iouType == 'segm'if p.iouType == 'segm':_toMask(gts, self.cocoGt)_toMask(dts, self.cocoDt)# set ignore flagfor gt in gts:gt['ignore'] = gt['ignore'] if 'ignore' in gt else 0gt['ignore'] = 'iscrowd' in gt and gt['iscrowd']if p.iouType == 'keypoints':gt['ignore'] = (gt['num_keypoints'] == 0) or gt['ignore']self._gts = defaultdict(list)       # gt for evaluationself._dts = defaultdict(list)       # dt for evaluationfor gt in gts:self._gts[gt['image_id'], gt['category_id']].append(gt)for dt in dts:self._dts[dt['image_id'], dt['category_id']].append(dt)self.evalImgs = defaultdict(list)   # per-image per-category evaluation resultsself.eval     = {}                  # accumulated evaluation results

computeIoU(self, imgId, catId):

根据image_id和cat_id计算这张图片里 cat_id 的所有GT、DT的iou矩阵,主要用于bbox和segmentation;
这里就是涉及到单张图片的单个类别的计算。

computeOks(self, imgId, catId):

根据image_id和cat_id计算这张图片里所有GT、DT的Oks矩阵,也就是Sec 1.2.里OKS的计算源码出处。这里OKS矩阵的维度是

OKS 矩阵是什么?

evaluateImg

对单张图片的单个类别做统计。
按照这个的话,我还是没有把预测结果转换为 coco json.

maxDets 每张图片的最大检测数
useCats 指定类别评估

cocoGt, cocoDt 都是 COCO API 数据

过程会计算每张图的结果吗?会的,每张图每个类别分别计算,最后汇总的。
在这里插入图片描述
evaluateImg来计算每一张图片、每一个类别在不同条件下的检测结果;

precision(T,R,K,A,M) recall(T,K,A,M)。
TKAM 分别是代表什么?什么意思?

cocoEval.evaluate() 只是每幅图的det和gt做了匹配,并将结果存在了self.evalImgs中。计算tp等指标需要cocoEval.accumulate()。

针对上述accumulate获得的precision、recall矩阵,在不同的维度上进行统计,然后再呈现结果。
函数内部会根据传入的具体的IoU阈值,面积阈值,最大检测数的值返回上述precision和recall中对应维的检测结果,我们就也可以自定义形式返回我们想要的各种参数下的AP与AR啦。

coco api 的 loadRes 怎么理解?
COCO API-COCO模块在det中的应用

结合 mmdet 中的 cocometric

mmdet/evaluation/metrics/coco_metric.py

result2json 将结果格式化为coco格式。

# convert predictions to coco format and dump to json file
result_files = self.results2json(preds, outfile_prefix)

/home/my_mmdet/demo/inference_demo.ipynb 已经给出了不同场景下的推理

  • 一张图片
  • 一个文件夹
    确认一下这两种情况是否经过了完整的 预处理?

确认 mmdet 预测的结果格式?
然后保留一份 json 作为 cocoeval 实验的example.

mmdet 中的 cocometric, 更像是一个过程评估器。
需要不断通过process的方式处理gt和pred?

先 process, 再 compute_metric?

模型在处理的过程中,会生成带有 metainfo,img_id 的预测结果。但是在自己调用 detinferencer 的时候却不会生成?为何?

  • 如何解决?让自己更容易简易调用数据结果?
  • dumpresult 为pkl是怎么实现的?

gt 也是在process 这个函数中的 data_batch 中加入的,额,不是,是在 datasamples 中返回的。

def process(self, data_batch: dict, data_samples: Sequence[dict]) -> None:"""Process one batch of data samples and predictions. The processedresults should be stored in ``self.results``, which will be used tocompute the metrics when all batches have been processed.Args:data_batch (dict): A batch of data from the dataloader.data_samples (Sequence[dict]): A batch of data samples thatcontain annotations and predictions."""for data_sample in data_samples:result = dict()pred = data_sample['pred_instances']result['img_id'] = data_sample['img_id']result['bboxes'] = pred['bboxes'].cpu().numpy()result['scores'] = pred['scores'].cpu().numpy()result['labels'] = pred['labels'].cpu().numpy()# encode mask to RLEif 'masks' in pred:result['masks'] = encode_mask_results(pred['masks'].detach().cpu().numpy()) if isinstance(pred['masks'], torch.Tensor) else pred['masks']# some detectors use different scores for bbox and maskif 'mask_scores' in pred:result['mask_scores'] = pred['mask_scores'].cpu().numpy()# parse gtgt = dict()gt['width'] = data_sample['ori_shape'][1]gt['height'] = data_sample['ori_shape'][0]gt['img_id'] = data_sample['img_id']if self._coco_api is None:# TODO: Need to refactor to support LoadAnnotationsassert 'instances' in data_sample, \'ground truth is required for evaluation when ' \'`ann_file` is not provided'gt['anns'] = data_sample['instances']# add converted result to the results listself.results.append((gt, result))

coco 接口

这两个接口是否可以帮助不通过json构造coco?

loadRes

将结果转换为 loadNumpyAnnotations 输入格式、

list:
ann 一定要求包括以下几个 key, score 以及别的key看你心情加?
- image_id
- segmentation
- bbox

- score??? 有score 吗?

loadNumpyAnnotations

def loadNumpyAnnotations(self, data):"""Convert result data from a numpy array [Nx7] where each row contains {imageID,x1,y1,w,h,score,class}:param  data (numpy.ndarray):return: annotations (python nested list)"""print('Converting ndarray to lists...')assert(type(data) == np.ndarray)print(data.shape)assert(data.shape[1] == 7)N = data.shape[0]ann = []for i in range(N):if i % 1000000 == 0:print('{}/{}'.format(i,N))ann += [{'image_id'  : int(data[i, 0]),'bbox'  : [ data[i, 1], data[i, 2], data[i, 3], data[i, 4] ],'score' : data[i, 5],'category_id': int(data[i, 6]),}]return ann

self.datasets

datasets 是个什么?

mask 这块是一个比较细节的地方

mmdet 返回的mask, 和我们输入的格式不同,一种是 polygon,还有一种?rle?
import pycocotools._mask as _mask

然后这个 mask 的解析, coco metrics 里已经给了一个案例了。
做了一个 annotation 出来而已。
下一步是写出来,然后是继续到最后,detect完整个逻辑(3小时?)

mAP 的计算中

其实有一个比较诡异的问题,边界case 是如何处理的?比如gt为0?dt为0?

计算每张图片的 mAP

# 计算每张图像的 mAPper_image_mAPs = []for img_id in coco_api.getImgIds():coco_eval.params.imgIds = [img_id]coco_eval.evaluate()coco_eval.accumulate()coco_eval.summarize()# 获取每张图像的 mAP 值per_image_mAPs.append(coco_eval.stats[1])# 打印每张图像的 mAP 值for i, mAP in enumerate(per_image_mAPs):print(f"mAP for image {i + 1}: {mAP}")

问题

  • iouType to ‘segm’, ‘bbox’ or ‘keypoints’ 有什么区别?
  • maxDets - [1 10 100] M=3 thresholds on max detections per image 这个需要根据实际情况调整吗?

相关文章:

coco_eval 使用

参考 coco eval 解析 COCO目标检测比赛中的模型评价指标介绍! coco 的评估函数对应的是 pycocotools 中的 cocoeval.py 文件。 从整体上来看,整个 COCOeval 类的框架如图: 基础的用法为 # The usage for CocoEval is as follows: cocoGt…...

国产精品ORM框架-SqlSugar详解 进阶功能 集成整合 脚手架应用 专题二

国产精品ORM框架-SqlSugar详解 SqlSugar初识 专题一-CSDN博客 sqlsugar 官网-CSDN博客 4、进阶功能 5、集成整合 6、脚手架应用 4、进阶功能 4.1、生命周期 Queryable 什么时候操作库 Queryable是一个引用类型 Queryable拷贝机制 4.2、执行Sql 方法列表 方法名 描述 返…...

el-table 动态添加删除 -- 鼠标移入移出显隐删除图标

<el-table class"list-box" :data"replaceDataList" border><el-table-column label"原始值" prop"original" align"center" ><template slot-scope"scope"><div mouseenter"showClick…...

Kafka接收消息

文章目录 Acknowledgment读消息指定分区批量消费消息拦截 // 采用监听得方式接收 Payload标记消息体内容. KafkaListener(topics {"test"},groupId "hello") public void onEvent(Payload String event,Header(value KafkaHeaders.RECEIVED_TOPIC) Stri…...

C语言 | Leetcode C语言题解之第233题数字1的个数

题目&#xff1a; 题解&#xff1a; int countDigitOne(int n) {// mulk 表示 10^k// 在下面的代码中&#xff0c;可以发现 k 并没有被直接使用到&#xff08;都是使用 10^k&#xff09;// 但为了让代码看起来更加直观&#xff0c;这里保留了 klong long mulk 1;int ans 0;f…...

简谈设计模式之原型模式

原型模式是一种创建型设计模式, 用于创建对象, 而不必指定它们所属的具体类. 它通过复制现有对象 (即原型) 来创建新对象. 原型模式适用于当创建新对象的过程代价较高或复杂时, 通过克隆现有对象来提高性能 原型模式结构 原型接口. 声明一个克隆自身的接口具体原型. 实现克隆…...

CentOS7.X系统部署Zabbix6.0版本(可跟做)

文章目录 一、部署环境说明二、基本环境部署步骤1、环境初始化操作2、部署并配置Nginx3、部署并配置PHP4、测试NginxPHP环境5、部署并配置MariaDB 三、Zabbix-Server部署步骤1、编译安装Zabbix-Server2、导入Zabbix初始化库3、配置Zabbix前端UI4、启动Zabbix-Server5、WEB页面配…...

QT文件生成可执行的exe程序

将qt项目生成可执行的exe程序可按照以下步骤进行&#xff1a; 1、在qt中构建运行生成.exe文件&#xff1b; 2、从自定义的路径中取出exe文件放在一个单独的空文件夹中&#xff08;exe文件在该文件夹中的release文件夹中&#xff09;&#xff1b; 3、从开始程序中搜索qt&#xf…...

【ZooKeeper学习笔记】

1. ZooKeeper基本概念 Zookeeper官网&#xff1a;https://zookeeper.apache.org/index.html Zookeeper是Apache Hadoop项目中的一个子项目&#xff0c;是一个树形目录服务Zookeeper翻译过来就是动物园管理员&#xff0c;用来管理Hadoop&#xff08;大象&#xff09;、Hive&…...

220V降5V芯片输出电压电流封装选型WT

220V降5V芯片输出电压电流封装选型WT 220V降5V恒压推荐&#xff1a;非隔离芯片选型及其应用方案 在考虑220V转低压应用方案时&#xff0c;以下非隔离芯片型号及其封装形式提供了不同的电压电流输出能力&#xff1a; 1. WT5101A&#xff08;SOT23-3封装&#xff09;适用于将2…...

AWS S3 基本概念

AWS S3 基本概念 引言什么是 AWS S3S3 应用S3 的核心概念 引言 最近工作中有接触到 S3&#xff0c;往 S3 写入数据&#xff0c;从 S3 访问数据&#xff0c;所以花点时间整理一下有关 S3 的基本概念。 什么是 AWS S3 AWS S3 (Amazon Simple Storage Service) 是一个由 Amazon…...

[XCUITest] 处理iOS权限点击授权 有哪些权限?

位置权限 (Location Permission) app.addUIInterruptionMonitor(withDescription: "Location Permission Dialog") { (alert) -> Bool in if alert.buttons["Allow While Using App"].exists { alert.buttons["Allow While Using App"].tap(…...

宪法学学习笔记(个人向) Part.5

宪法学学习笔记(个人向) Part.5 4. 公民基本权利和义务 4.1 公民&#x1f338; 概念 是指具有某个国家国籍的自然人&#xff1b; 【拓展】国籍&#xff1a;在宪法上是指一个人隶属于某个国家的法律上的身份&#x1f338; &#xff1b; 取得方式 出生国籍 因出生而获得的国籍&a…...

C语言的指针与数组

函数定义 参考书籍章节9.7 无论函数定义的参数是数组还是指针&#xff0c;在编译的时候&#xff0c;编译器都将在栈上开辟一个空间存放入参的地址&#xff0c;换句话说&#xff0c;也就是在函数内部都当做指针处理。 #include <stdio.h> #include <stdlib.h>char g…...

计算机图形学入门28:相机、透镜和光场

1.前言 相机(Cameras)、透镜(Lenses)和光场(Light Fields)都是图形学中重要的组成部分。在之前的学习中&#xff0c;都是默认它们的存在&#xff0c;所以现在也需要单独拿出来学习下。 2.成像方法 计算机图形学有两种成像方法&#xff0c;即合成(Synthesis)和捕捉(Capture)。前…...

Swift 基于Codable协议使用

Codable协议 继承自 Decodable & Encodable // // Test1.swift // TestDemo // // Created by admin on 2024/7/9. // import Foundationstruct Player{var name:Stringvar highScore:Int 0var history:[Int] []var address:Address?var birthday:Date?init(name: St…...

conda激活的虚拟环境的python版本不对应

这个大坑&#xff0c;要看看虚拟环境下envs下有没有bin文件夹 python -Vecho $PATH镜像源的问题&#xff0c;参考...

深度学习概览

引言 深度学习的定义与背景 深度学习是机器学习的一个子领域&#xff0c;涉及使用多层神经网络分析和学习复杂的数据模式。深度学习的基础可以追溯到20世纪80年代&#xff0c;但真正的发展和广泛应用是在21世纪初。计算能力的提升和大数据的可用性使得深度学习在许多领域取得…...

什么是白盒测试中的静态测试?其包含哪些过程和方法?

文章目录 前言一、文档审查二、软件静态分析1.编码规范检查2.软件质量度量 三、代码审查与代码走查1.代码审查2.代码走查 总结 前言 软件白盒测试中的静态测试是指不运行被测软件&#xff0c;仅通过分析或检查等手段达到检测的目的。在软件白盒测试中&#xff0c;静态测试常通…...

搭建一个高并发的Web商品推荐系统,如何涉及软件架构?

搭建一个高并发的Web商品推荐系统&#xff0c;如何涉及软件架构 在搭建一个高并发的Web商品推荐系统时&#xff1a; 微服务架构&#xff1a; 为了支持高并发&#xff0c;我们可以采用微服务架构&#xff0c;将系统拆分成小型、独立的服务&#xff0c;每个服务专注于特定的功…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读&#xff0c;综合法规核心要求、最新修正及企业合规要点&#xff1a; 一、法规背景与目标 生效与强制时间 发布于2023年8月31日&#xff08;OJ公报&…...