目标检测,实例分割IOU,precision, recall, mAP详解
创始人
2025-05-29 18:11:47

经常在目标检测,分割的paper中看到mAP这样的评价标准,
那么mAP到底是什么呢?

AP(Average precision)是评价目标检测和分割的标准,有box mAP, mask mAP.
看名称Average precision, 就能猜到是计算precision的均值。

它其实计算的是大家熟知的precision, recall图中,不同recall对应的precision的均值(ROC curve下面积)。

所以要从precision, recall, IOU入手。

IOU

如果是目标框,计算的就是目标框的intersection / union

在这里插入图片描述

如果是mask, intersection计算的是点积(mask拉成一维,再点积)
上代码比较容易明白。

def mask_iou(masks_a, masks_b, iscrowd=False):"""Computes the pariwise mask IoU between two sets of masks of size [a, h, w] and [b, h, w].The output is of size [a, b]."""masks_a = masks_a.view(masks_a.size(0), -1)masks_b = masks_b.view(masks_b.size(0), -1)intersection = masks_a @ masks_b.t()area_a = masks_a.sum(dim=1).unsqueeze(1)area_b = masks_b.sum(dim=1).unsqueeze(0)return intersection / (area_a + area_b - intersection) if not iscrowd else intersection / area_a

precision, recall

直接上公式了
在这里插入图片描述
简单地说,precision就是在目前为止你预测的样本里面,预测正确的比例
recall就是目前为止你预测正确的个数,占总的正样本个数的比例
一个是目前预测的范围里面的正确率,一个是总的正确率。

如果想提高recall, 就拼命多预测,总能把正确的都揪出来,但是预测越多错的越多,precision就会降低。
如果想提高precision, 那么就保守点,预测对了就不预测了,但是这样就没法把所有的都预测出来,recall会降低。

而怎么判断你预测的是positive还是negative呢,这时候就需要IOU登场了,
计算IOU,然后根据不同的阈值(COCO AP标准中,阈值从0.5~0.95),
IOU > 阈值,那就是positive, 否则是negative.

前面说过了,precision是你预测的一堆positive里面,真正的positive的比例。
那你预测的时候肯定是一个一个预测的,不是一下子预测一堆的,
所以precision需要一个一个来。
而recall,正样本的个数是已知的,所以需要根据一个一个预测出的正确的positive除以这个正样本个数。

举个例子:
假设IOU阈值是0.5, 根据这个阈值来判断positive和negative.
假设正样本一共有5个苹果,把图像中所有的对苹果的预测按score降序排列。

下面来看看precision和recall怎么计算的。

预测是一个一个预测的,所以要一行一行看,
第1行,预测对了一个positive, 总共也就预测了这一个,所以precision = 1/1 = 1.0,
而正样本一共有5个,所以recall = 1/5 = 0.2
跳到第3行,现在已经预测了3个,其中预测正确的占俩,所以precision=2/3=0.67,
而正样本一共有5个,目前为止预测正确的有俩,所以recall = 2/5 = 0.4.

后面依次类推。
在这里插入图片描述

下面要说到AP了

AP

AP(Average Precision)定义为precision-recall曲线下的面积。
先看看precision-recall曲线吧,

把上面的每对(precision, recall) 画成一个点,然后把这些点连线,就得到下图。
在这里插入图片描述

precision-recall都是0~1的,所以
在这里插入图片描述
这个曲线不够平滑,需要先做平滑,
一般,是从右到左,当左边一格比右边一格的值小时,换成右边一格的值。
i : n ~ 0, precision[i] = max(precision[i], precision[i+1]),
所以平滑成如下绿色的曲线。

在这里插入图片描述

插值法AP

在Pascal VPC2008中,用的是11点插值法计算AP,
也就是在recall值的0~1.0中取11个点:0, 0.1, 0.2, …, 0.9, 1.0
然后把每个recall值对应的precision值加起来,再求平均
可以看到有precision中有5个1,4个0.57, 2个0.5,

所以AP = (5 × 1.0 + 4 × 0.57 + 2 × 0.5)/11
在这里插入图片描述
如果AP变得很小了,那么剩余项就不需要再加上求平均了,假设剩余项都是0,因为加上的还不够平均的。不需要非要加到recall=1.0的地方。
也就是说precision降到可忽略的程度,就可以不用再加了。
PASCAL VOC中有20个不同的classes, 那么就对每一个class计算AP,最后计算20个AP的平均值。

为什么是11点插值呢?

The intention in interpolating the precision/recall curve in this way is to
reduce the impact of the “wiggles” in the precision/recall curve, caused by
small variations in the ranking of examples.

插值法AP有2个缺点:
1.不够precise
2.如果是low AP的情况,这种方法就不能很好地区分不同的methods.

所以,在PASCAL VOC 2008之后又有了不同的AP计算方法。

AP(AUC曲线下的面积)

在VOC2010 ~ 2012中,每当precision值下降,都会采样对应的unique recall值,
根据precision值,和r2 - r1, 就能计算对应区域的面积,
这些面积加起来,就是AUC曲线下的面积。

在这里插入图片描述

所以不需要插值,也不是固定地采样11个点,而是每当precision下降,就采样对应的recall值,
计算对应矩形的面积。

在这里插入图片描述

看下面的例子,11点插值法没有捕捉到第一个precision下降的地方,所以两种方法会有不同。
插值法AP = (4 * 1 + 5 * 0.57 + 2 * 0.5) / 11 = 0.7136
AUC法AP = 1*(0.36-0)+0.57*(0.8-0.36)+0.5*(1-0.8) = 0.7108

在这里插入图片描述

COCO mAP

对于COCO数据集,COCO mAP用的是101个点的插值来计算的。
且AP是对多个IOU的平均,例如AP[0.5:0.95]就是把IOU阈值在[0.5, 0.95]之间每隔0.05取值(一共10个阈值),
算出来10个阈值下的AP,那么COCO数据集有80个class,
所以计算的是10个IOU阈值下,每个class的AP,最后的mAP,就是这10x80个AP的平均值。

看下COCO数据集的其他metrics。

在这里插入图片描述

下面两个图分别是yolov3的AP和yolact的AP。
在这里插入图片描述

在这里插入图片描述

最后说下,mAP(mean average precision) 就是AP的均值,计算每个class的AP然后取平均值。
有时候,mAP和AP是一个东西。例如在COCO中,它们就是一样的。

AP is averaged over all categories. Traditionally, this is called “mean average precision” (mAP).
We make no distinction between AP and mAP (and likewise AR and mAR) and assume
the difference is clear from context.

参考文章链接

相关内容

热门资讯

SLAM中后端优化的技术细节总... SLAM中后端优化的技术细节 本文档主要收集总结了一些SLAM大佬们讲解后端优化中偏理论的技术细节...
C语言结构体 本节主要讲解下结构体的一些易错点和重要内容 结构体变量定义 (使用typedef起别...
快手快闪特效如何做的,手机快手... 快手快闪特效如何做的目录快手快闪特效如何做的为什么我的快手里没有快闪这个功能?快手快闪视频制作技巧有...
祖宗十九代票房多少,祖宗19代... 祖宗十九代票房多少目录祖宗十九代票房多少祖宗19代总票房赚了吗为什么祖宗十九代的排片那么少,票房也很...
h5具体是什么,h5是什么意思... h5具体是什么目录h5具体是什么h5是什么意思h5是什么意思?什么是H5?h5具体是什么 H5...
HBase高手之路4-Shel... 文章目录HBase高手之路3—HBase的shell操作一、hbase的shell命令汇总二、需求三...
尽的拼音是什么,尽怎么读拼音尽... 尽的拼音是什么目录尽的拼音是什么尽怎么读拼音尽的读音尽管的尽。读音。尽的拼音怎么拼?尽的拼音是什么 ...
C++ , STL常用容器 STLSTL初识STL的诞生STL基本概念STL六大组件STL中的容器、算法、迭代器容器算法迭代器初...
开发环境的搭建(MacOS下学... 准备 硬件:单片机最小系统及电源,CH340芯片的usb-ttl线&#x...
西门子smart line 7... 西门子smart line 700 IE V3与温湿度变送器进行MODBUS RTU通信的具体方法示...
请问北京什么地方有卖宠物狗的,... 请问北京什么地方有卖宠物狗的目录请问北京什么地方有卖宠物狗的北京哪里有卖宠物狗的,北京正规卖狗宠物店...
常见的蘑菇的种类都包括哪些,蘑... 常见的蘑菇的种类都包括哪些目录常见的蘑菇的种类都包括哪些蘑菇有哪些种类分别是什么种类的蘑菇?蘑菇的种...
木乃伊什么意思啊,mummy什... 木乃伊什么意思啊目录木乃伊什么意思啊mummy什么意思啊木乃伊在希腊语中是什么意思木乃伊是什么意思 ...
储蓄卡不用了怎么办,储蓄卡怎么... 储蓄卡不用了怎么办目录储蓄卡不用了怎么办储蓄卡怎么注销不想用那张银行卡了,怎么办?普通储蓄卡不用了需...
使用uni.saveFile,... 需求:下载网络图片到系统相册问题:找不到uni.saveFile保存的临...
【华为OD机试 2023最新 ... 文章目录 题目描述输入描述输出描述用例C++ 题目描述 给定两个字符串string1和str...
学习Java开发可以做什么?到... Java工程师干什么?到底值不值得学Java? 不难发现,...
疯马皮是什么皮,疯马皮是什么材... 疯马皮是什么皮目录疯马皮是什么皮疯马皮是什么材料?防水吗?什么是疯马皮疯马皮是什么皮疯马皮是什么皮 ...
什么是麻辣烫,麻辣烫什么意思 ... 什么是麻辣烫目录什么是麻辣烫麻辣烫什么意思麻辣烫吃多了有什么坏处吗?麻辣烫是什么意思啊什么是麻辣烫 ...
10万左右公认最好的车(10万... 本篇文章极速百科给大家谈谈10万左右公认最好的车,以及10万左右公认最好的车最新款对应的知识点,希望...
华为双系统怎么切换辨别,华为手... 华为双系统怎么切换辨别目录华为双系统怎么切换辨别华为p9双系统怎么切换华为双系统怎么切换设置华为双系...
day11-函数 1. 函数作用 在实现某个功能对应的代码的时候,如果将实现功能对应的函数放到函数中&#...
Cadence :OrCAD命... 由于AD支持Multiple Names,最近用OrCAD画原理图,犯了...
巴黎圣母院讲的是什么内容啊,巴... 巴黎圣母院讲的是什么内容啊目录巴黎圣母院讲的是什么内容啊巴黎圣母院的内容简介有哪些?莎士比亚的《巴黎...
如何在我的世界里做床,手机我的... 如何在我的世界里做床目录如何在我的世界里做床我的世界生存模式怎么做床我的世界床怎么做如何在我的世界里...
苹果6s的电池容量是多少毫安,... 苹果6s的电池容量是多少毫安目录苹果6s的电池容量是多少毫安苹果6s电池容量iPhone 6S和iP...
vulnhub之XXE靶机详解 vulnhub之XXE靶机详解前言一、靶机安装二、信息收集阶段1. 环境2. 探测局域网主机3. 信...
5克等于多少毫升,一点五克是多... 5克等于多少毫升目录5克等于多少毫升一点五克是多少毫升做果冻碰到的问题:5克等于多少毫升,用2.5毫...
【Selenium自动化测试】... 在Web自动化测试过程中,有时会遇到类似下面的情景。 这就是下拉框,...
动态库的制作与使用 对于动态库,GCC进行链接时,动态库的代码不会被打包到可执行程序中。程序...