热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【深度学习】——模型评估指标MAP计算实例计算

目录一、知识储备1、IOU——交集面积与并集面积之比2、混淆矩阵(TP、FP、FN、TN)问题1:上面的TP等具体是如何计算得到的&#

目录

一、知识储备

1、IOU——交集面积与并集面积之比

 2、混淆矩阵(TP、FP、FN、TN)

 问题1:上面的TP等具体是如何计算得到的?

3、精度precision&召回率recall

 二、ap计算实战

1、计算流程

1)准备数据:

2)获取预测框:

3)获取标签框:

4)根据置信度对预测框排序:

5)统计TP和FP个数:

6)对整个测试集上的每一张图像的每一类进行TP,FP统计

7)分别对每一个类别进行ap曲线的绘制,这里以一类为例讲解,以类别1为例

8)计算不同置信度下的precision和recall

问题2:怎么求解不同置信度阈值下的precision,recall值

问题3:出现的两次预测有什么区别?

9)计算AP

10)计算map

三、学习笔记






一、知识储备:


睿智的目标检测20——利用mAP计算目标检测精确度https://blog.csdn.net/weixin_44791964/article/details/104695264?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162156782416780262569069%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162156782416780262569069&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-1-104695264.pc_search_result_hbase_insert&utm_term=map%E8%AE%A1%E7%AE%97&spm=1018.2226.3001.4187


IOU、FP、TP、TP、FN、Precision、recall



1、IOU——交集面积与并集面积之比

IOU(交并比)就是两个bounding box的交集与并集之比

理解目标检测当中的mAP_hsqyc的博客-CSDN博客_目标检测maphttps://blog.csdn.net/hsqyc/article/details/81702437


def box_iou(b1, b2):&#39;&#39;&#39;b1,b2均为[x1,y1,x2,y2]&#xff0c;左上角点&#xff0c;右下角点坐标&#39;&#39;&#39;x1_1, y1_1, x2_1, y2_1 &#61; b1x1_2, y1_2, x2_2, y2_2 &#61; b2x1 &#61; max(x1_1, x1_2) # 取左上角点最大y1 &#61; max(y1_1, y1_2)x2 &#61; min(x2_1, x2_2)y2 &#61; min(y2_1, y2_2)if x2 - x1 &#43; 1 <&#61; 0 or y2 - y1 &#43; 1 <&#61; 0:return 0else:inter &#61; (x2 - x1 &#43; 1) * (y2 - y1 &#43; 1)union &#61; (x2_1 - x1_1 &#43; 1) * (y2_1 - y1_1 &#43; 1) &#43; (x2_2 - x1_2 &#43; 1) * (y2_2 - y1_2 &#43; 1) - interiou &#61; inter / unionreturn iouif __name__ &#61;&#61; &#39;__main__&#39;:b1 &#61; [0,0,4,4]b2 &#61; [1,1,5,5]print(box_iou(b1,b2))b1 &#61; [1,1,4,4]b2 &#61; [2,0,5,5]print(box_iou(b1, b2))b1 &#61; [0,0,2,2]b2 &#61; [3,3,4,4]print(box_iou(b1,b2))


 0.47058823529411764
0.42857142857142855
0



 2、混淆矩阵&#xff08;TP、FP、FN、TN&#xff09;


TP TN FP FN里面一共出现了4个字母&#xff0c;分别是T F P N。
T是True&#xff1b;
F是False&#xff1b;
P是Positive&#xff1b;
N是Negative。

T或者F代表的是该样本 是否被正确分类。
P或者N代表的是该样本 被预测成了正样本还是负样本。

TP&#xff08;True Positives&#xff09;意思就是被分为了正样本&#xff0c;而且分对了。
TN&#xff08;True Negatives&#xff09;意思就是被分为了负样本&#xff0c;而且分对了。
FP&#xff08;False Positives&#xff09;意思是被分为了正样本&#xff0c;但是分错了&#xff08;事实上这个样本是负样本&#xff09;。
FN&#xff08;False Negatives&#xff09;意思是被分为了负样本&#xff0c;但是分错&#xff08;事实上这个样本是正样本&#xff09;。


注意&#xff1a;对于多目标检测中&#xff0c;每一个类别都会有一个混淆矩阵。因此每一个类别都会产生一个ap曲线

深度学习-目标检测评估指标P-R曲线、AP、mAP_‘Atlas’的博客-CSDN博客_ap值基本概念P-R曲线中&#xff0c;P为图中precision&#xff0c;即精准度&#xff0c;R为图中recall&#xff0c;即召回率。Example下面通过具体例子说明。首先用训练好的模型得到所有测试样本的confidence score&#xff0c;每一类&#xff08;如car&#xff09;的confidence score保存到一个文件中&#xff08;如comp1_cls_test_car.txt&#xff09;。假设共有20个测试样本&#xff0c;每个的id&#xff0c;confide...


 问题1&#xff1a;上面的TP等具体是如何计算得到的&#xff1f;


在目标检测中&#xff0c;混淆矩阵是针对一个类别来说的&#xff0c;利用训练模型对测试集进行预测&#xff0c;此时会得到预测框和标签框。每个预测框会有置信度、预测标签、boxes&#xff08;坐标&#xff09;等信息;

1、若这个预测框被预测为正样本计算这个预测框和真实标签等于这个预测框的预测标签的所有标签框的IOU值&#xff1a;

1&#xff09;当最大的iou值大于设定的阈值时&#xff0c;此时这个预测框就认为属于TP样本&#xff08;预测和实际一致&#xff09;&#xff1b;

2&#xff09;若iou最大值小于设定的阈值&#xff0c;则认为这个预测框为FP样本&#xff08;预测为该类的正样本&#xff0c;实际不是&#xff09;&#xff1b;

2、若这个预测框被预测为负样本&#xff0c;即背景框&#xff0c;计算这个预测框和所有标签框的IOU值&#xff1a;

3&#xff09;若iou值最大值小于阈值&#xff0c;则说明被正确预测为负样本&#xff0c;即TN

4&#xff09;若iou值最大值大于阈值&#xff0c;则说明被错误预测为负样本&#xff0c;即FN

注意&#xff1a;在计算每一类ap的时候&#xff0c;一般只考虑预测为当前类的所有样本&#xff0c;不考虑预测为背景的样本



3、精度precision&召回率recall





TP是分类器认为是正样本而且确实是正样本的例子&#xff0c;FP是分类器认为是正样本但实际上不是正样本的例子&#xff0c;Precision翻译成中文就是“分类器认为是正类并且确实是正类的部分占所有分类器认为是正类的比例”。


 



TP是分类器认为是正样本而且确实是正样本的例子&#xff0c;FN是分类器认为是负样本但实际上不是负样本的例子&#xff0c;Recall翻译成中文就是“分类器认为是正类并且确实是正类的部分占所有确实是正类的比例”。



 二、ap计算实战


1、计算流程


  • 准备数据&#xff1a;

  • 测试集数据集&#xff08;带标签框&#xff09;、训练好的深度学习模型、nms算法&#xff08;iou阈值&#xff09;&#xff08;两个重叠框iou大于阈值将低分的预测框去掉&#xff09;
  • 获取预测框&#xff1a;

  • 将测试数据集输入到训练好的深度学习模型当中&#xff0c;得到每张图像的预测框&#xff0c;再利用nms算法去掉重复和重叠大的框后&#xff0c;记录剩下预测框的信息&#xff08;坐标信息——对角顶点坐标、类别、置信度&#xff09;&#xff08;boxes&#xff0c;label&#xff0c;confidence&#xff09;——未排序
  • 获取标签框&#xff1a;

  • 根据测试数据集的xml文件得到真实标签框的信息&#xff08;groudtruth&#xff09;,包含每张图像的标签框信息&#xff08;boxes&#xff0c;label&#xff09;,如下表所示&#xff1a;这里以两类为例&#xff0c;标签1,2表示不同的两个目标类&#xff0c;0表示背景
序号&#xff08;id&#xff09;对角顶点坐标&#xff08;boxes&#xff09;真实类别&#xff08;label&#xff09;
1【x1_1*,y1_1*,x1_2*,y1_2*】1
2【x2_1*,y2_1*,x2_2*,y2_2*】1
3【x3_1*,y3_1*,x3_2*,y3_2*】2
4【x4_1*,y4_1*,x4_2*,y4_2*】2
  • 根据置信度对预测框排序&#xff1a;

  • 对每张图像的预测框每一个类别按照置信度&#xff08;分类得分&#xff09;从高到低分别排序&#xff0c;得到类似与下列表格的信息
序号&#xff08;id&#xff09;对角顶点坐标&#xff08;boxes&#xff09;置信度&#xff08;confidence&#xff09;预测类别&#xff08;label&#xff09;
1【x1_1,y1_1,x1_2,y1_2】0.982
2【x2_1,y2_1,x2_2,y2_2】0.901
3【x3_1,y3_1,x3_2,y3_2】0.881
4【x4_1,y4_1,x4_2,y4_2】0.862
5【x5_1,y5_1,x5_2,y5_2】0.671
6【x6_1,y6_1,x6_2,y6_2】0.512

预测为类别1&#xff1a;

序号&#xff08;id&#xff09;对角顶点坐标&#xff08;boxes&#xff09;置信度&#xff08;confidence&#xff09;预测类别&#xff08;label&#xff09;
2【x2_1,y2_1,x2_2,y2_2】0.901
3【x3_1,y3_1,x3_2,y3_2】0.881
5【x5_1,y5_1,x5_2,y5_2】0.671

预测为类别2&#xff1a;

序号&#xff08;id&#xff09;对角顶点坐标&#xff08;boxes&#xff09;置信度&#xff08;confidence&#xff09;预测类别&#xff08;label&#xff09;
1【x1_1,y1_1,x1_2,y1_2】0.982
4【x4_1,y4_1,x4_2,y4_2】0.862
6【x6_1,y6_1,x6_2,y6_2】0.512


  •  统计TP和FP个数&#xff1a;

  • 对每张图像中的每一类进行TP和FP个数统计&#xff0c;假设一个预测框预测为类别2&#xff0c;则计算这个预测框和该图像中所有类别为2的标签框的iou&#xff0c;若iou大于设定的阈值&#xff08;一般默认阈值为0.5&#xff09;&#xff0c;则认为该预测框为TP&#xff0c;否则认为是FP&#xff0c;以下以一张图像中的类别为例&#xff1a;&#xff08;gtid表示序号为id的标签框,preid表示序号为id的预测框&#xff09;,maxiou(preid,gtid(3,4))表示序号为id的预测框和所有类别为2的标签框的最大iou值,tp/fp表示预测框预测的正确与否&#xff0c;正确则为tp,否则为fp&#xff0c;为了方便&#xff0c;这里tp记为1&#xff0c;fp记为0
序号idmax iou(preid,gtid(3,4))置信度预测labeltp/fp
10.650.9821
40.680.8621
60.450.5120
序号idmax iou(preid,gtid(1,2))置信度预测labeltp/fp
20.510.9011
30.40.8810
50.90.6711

由上表可以看到&#xff0c;在类别2预测框当中&#xff0c;2个预测正确&#xff0c;1个预测错误&#xff0c;在类别1预测框当中&#xff0c;2个预测正确&#xff0c;1个预测错误。

  • 对单张图像的每一类进行TP&#xff0c;FP统计&#xff0c;最后汇总到成一张表格&#xff0c;别处摘的图&#xff0c;这里是3类

参考&#xff1a;目标检测中的AP计算_lppfwl的博客-CSDN博客_目标检测ap计算

  • 对整个测试集上的每一张图像的每一类进行TP&#xff0c;FP统计

  • 最后汇总到成一张表格&#xff0c;表格和上面表格一样&#xff0c;只是数量上增加了而已&#xff0c;为了方便讲解这里以一张图像的为例进行讲解

  • 分别对每一个类别进行ap曲线的绘制&#xff0c;这里以一类为例讲解&#xff0c;以类别1为例

  • 计算不同置信度下的precision和recall

--------------------------------------------------------------------------------------------------------------------------

问题2&#xff1a;怎么求解不同置信度阈值下的precision&#xff0c;recall值

答&#xff1a;假设置信度阈值为thre,则当预测框的置信度大于等于thre时&#xff0c;将预测框视为正样本&#xff0c;小于阈值thre时&#xff0c;将预测框视为负样本。前面利用iou得到的tp/fp则作为当前预测框的真实标签&#xff0c;1表示实际为正样本&#xff0c;0表示实际为负样本。这样又有预测框的真实标签、预测标签、置信度、置信度阈值就可以求解出当前类的TP.FP.FN.TN&#xff0c;进而求解precision和recall

问题3&#xff1a;出现的两次预测有什么区别&#xff1f;

答&#xff1a;仔细看可以发现&#xff0c;在前面出现了两次预测框的标签预测&#xff0c;

1&#xff09;第一次确定预测框的预测类别是否正确根据预测框和当前预测类的所有标签框进行iou计算&#xff0c;然后判断是否预测成功&#xff0c;这里其实就是将预测为同一类的预测框分为两类&#xff0c;预测正确和不正确两类&#xff0c;正确为1&#xff0c;不正确为0&#xff0c;这个就作为这个预测框在预测类中的真实标签&#xff1b;

2&#xff09;第二次是人为划分了置信度阈值&#xff0c;根据阈值来决定预测框的正负性&#xff0c;当预测框的置信度大于等于thre时&#xff0c;将预测框视为正样本&#xff0c;小于阈值thre时&#xff0c;将预测框视为负样本。这个作为当前置信度阈值下的预测标签。

根据预测标签和真实标签就能够计算在当前置信度阈值下的混淆矩阵&#xff0c;从而得到precision和recall

--------------------------------------------------------------------------------------------------------------------------

序号id置信度conference预测标签tp/fp
50.6611
100.5510
20.4511
80.3410
10.2310

 将置信度从1到0依次取点会得到一系列的&#xff08;precision&#xff0c;recall&#xff09;的坐标点&#xff0c;初始坐标点为&#xff08;0,1&#xff09;&#xff0c;结束点为&#xff08;1,0&#xff09;&#xff0c;置信度的取点我们可以根据预测框的置信度进行取点&#xff0c;比如conferences &#61; 【0.66,0.55,0.45,0.34,0.23】,当置信度阈值分别等于这些值时&#xff0c;precision和recall取值是不一样的
 

     

序号id置信度conference置信度阈值tp/fpprecisionrecall
50.660.6611/(1&#43;0) &#61; 11/(1&#43;1)&#61;1/2
100.550.5501/(1&#43;1)&#61;1/21/(1&#43;1)&#61;1/2
20.450.4512/(2&#43;1) &#61; 2/32/(2&#43;0) &#61; 1
80.340.3402/(2&#43;2) &#61; 1/22/(2&#43;0) &#61; 1
10.230.2302/(2&#43;3) &#61; 2/52/(2&#43;0) &#61; 1

由上表可以看出&#xff0c;这样我们就得到了precision和recall的点对&#xff0c;注意&#xff0c;当一个recall对应多个precision时&#xff0c;取最大的precision即可&#xff0c;例如在recall&#61;1时&#xff0c;对应precision&#61;2/3、1/2、2/5、0,这时候我们取2/3即可

点对如下&#xff1a;&#xff08;recall&#xff0c;precision&#xff09;

【&#xff08;0,1&#xff09;&#xff0c;&#xff08;1/2,1&#xff09;&#xff0c;(1,2/3)&#xff0c;(1,1/2)&#xff0c;&#xff08;1,2/5&#xff09;,&#xff08;1,0&#xff09;】最终根据这些点就可以绘制出ap曲线图

  • 计算AP

AP&#xff08;average precision&#xff09;&#61; 曲线面积

比如上图&#xff1a;

AP &#61; 1/2 &#43; &#xff08;1/2&#43;2/3&#xff09;*1/2*1/2 &#61; 19/24

  • 计算map

map指的就是所有类的平均ap值&#xff0c;map &#61; (ap1&#43;ap2&#43;...&#43;apn)/n,其中n为标签类别号



三、学习笔记


推荐阅读
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
author-avatar
jiangzh
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有