准确率(Precision),也叫正确预测率(positive predictive value),在模式识别、信息检索、机器学习等研究应用领域,准确率用来衡量模型预测的结果中相关或者正确的比例。而召回率(recall),也叫敏感度(sensitivity),即模型预测的结果中相关或正确的数量占样本中实际相关或正确的数量的比例。一般在计算机视觉领域物体分类检测任务中,检测出的物体轮廓框如果类别和ground truth的类别相同,并且两者之间IoU大于一个阈值(一般为0.5),那么该预测值是正确的。如果模型预测出数据集中有N个horse这一类的物体,并给出其轮廓框,而实际场景中有T个horse标签的ground truth。在2000个预测值中,有些是错误的,即和ground truth的IoU小于阈值,又或者IoU大于阈值,但是该ground truth已经有和其相关的预测值了,此时该预测值均为假正例(false positive,FP),有些和ground truth的IoU大于阈值,并且为唯一和ground truth相关的预测值,那么该预测值为真正例(true positive, TP)。那么此时准确率的计算为precision=TP/(TP+FP)。而召回率的计算则为recall=TP/T.

准确率和召回率是一对矛盾的度量尺度,一般来说,准确率高时,召回率往往很低,而召回率高时,准确率往往偏低。例如在物体分类检测任务中,一组预测轮廓框有两个指标,一个是分类的score,一组是轮廓框的坐标位置。若希望将找出更多的该类的预测轮廓框,则需要将分类score的阈值降低,输出更多的结果,此时必然会有些预测值为假,造成准确率下降,但是召回率会得以提高。但是如果想准确率高,则需要提高分类score,将分类得分很低的预测值丢弃,那么可能会漏掉很多和ground truth的IoU大于阈值的预测结果,造成召回率降低。

在很多情况中,需要对模型的预测结果进行排序,在物体分类检测中,一般是按照分类score进行排序,排在前面的预测结果一般被认为“最可能”为真正例的预测结果,排在后面的则是模型认为“可能性低”的真正例。按照此顺序逐个把预测结果进行分析,每个预测值均可以得到一个准确率和召回率,以召回率为横轴,准确率为纵轴作图,就得到了准确率-召回率曲线,一般称为precision-recall曲线。Precision-recall曲线图直观地显示了模型在数据集上的准确率、召回率详细分布情况。在进行模型选择时,直观上可以看到,如果模型A的precision-recall曲线将模型B的precision-recall曲线完全包住,则模型A的性能优于B。而若模型A的precision-recall曲线和模型C的precision-recall曲线有交点,则此时无法直观上判定模型的优劣,此时一般用precision-recall曲线下面积的大小来进行比较,这个面积在物体分类检测任务中是另外一项衡量模型优劣的指标ap(average precision)值。而如果数据集有多类,那么每个类计算得到ap后再平均所有类的ap即使mAP. mAP是评估模型在数据集上各个类上的整体表现性能,也是以各个数据集为基础举办各种物体检测竞赛的主要评估指标。

计算AP和mAP的代码,来自PASCAL VOC物体检测竞赛的devkit,是和数据集一起公开的测试评估代码,供参赛者提交代码前进行初步的模型性能评估。可以看到代码先计算了预测值和ground truth的IoU,再而计算tp, fp, precision和recall.而后根据precision和recall计算precision-recall曲线下的面积,即AP,并将每类的precision-recall曲线绘制。下图给出根据precision-recall曲线计算ap的结果。图中给出PASCAL VOC 2007数据检测结果其中两类的precision-recall曲线,从图中可以看出,car这类的曲线弧度比较大,因此ap值比较大。而chair这类的曲线则是直线下降的,因此ap值比较小。

工程上,我们一般要求recall很高,而precision也很高。那么上图中,对chair这一类的检测就无法达到这个目标,在recall很高时,precision就会很低,也就造成很高的误检率。这种时候,为了降低误检率,即tp,会将ap图从中间截断,根据工程需要,选择一个阈值,如图所示,蓝色红色绿色三条线分别对应不同的recall和precison,如果你想要大的precision,选择蓝色线处,如果想要大recall,选择绿色线处截断ap图。

比如在某次训练的检测器中,对类别car的检测结果如下,因为需要降低误检,此时选择了f1=2*precision*recall/(precision+recall)最高时的阈值,可以看到此时ap并不是很高,说明该检测器还有待提升。

至于map,那就是mean ap的缩写。即各个类的ap做个均值即可,那么就是各个类都高了,均值就高了,map也就大了。

附录是matlab代码,python版本的现在也一大堆,因为我最开始做检测是一句一句解读matlab代码开始的,所以附上,算作纪念:

function [rec,prec,ap] = VOCevaldet(VOCopts,id,cls,draw)

% load test set
[gtids,t]=textread(sprintf(VOCopts.imgsetpath,VOCopts.testset),'%s %d'); % load ground truth objects
tic;
npos=0;
gt(length(gtids))=struct('BB',[],'diff',[],'det',[]);
for i=1:length(gtids)
% display progress
if toc>1
fprintf('%s: pr: load: %d/%d\n',cls,i,length(gtids));
drawnow;
tic;
end % read annotation
rec=PASreadrecord(sprintf(VOCopts.annopath,gtids{i})); % extract objects of class
clsinds=strmatch(cls,{rec.objects(:).class},'exact');
gt(i).BB=cat(1,rec.objects(clsinds).bbox)';
gt(i).diff=[rec.objects(clsinds).difficult];
gt(i).det=false(length(clsinds),1);
npos=npos+sum(~gt(i).diff);
end % load results
[ids,confidence,b1,b2,b3,b4]=textread(sprintf(VOCopts.detrespath,id,cls),'%s %f %f %f %f %f');
BB=[b1 b2 b3 b4]'; % sort detections by decreasing confidence
[sc,si]=sort(-confidence);
ids=ids(si);
BB=BB(:,si); % assign detections to ground truth objects
nd=length(confidence);
tp=zeros(nd,1);
fp=zeros(nd,1);
tic;
for d=1:nd
% find ground truth image
i=strmatch(ids{d},gtids,'exact');
% assign detection to ground truth object if any
bb=BB(:,d); ovmax=-inf;
for j=1:size(gt(i).BB,2)
bbgt=gt(i).BB(:,j);
bi=[max(bb(1),bbgt(1)) ; max(bb(2),bbgt(2)) ; min(bb(3),bbgt(3)) ; min(bb(4),bbgt(4))];
iw=bi(3)-bi(1)+1; ih=bi(4)-bi(2)+1;
if iw>0 & ih>0
% compute overlap as area of intersection / area of union
ua=(bb(3)-bb(1)+1)*(bb(4)-bb(2)+1)+ (bbgt(3)-bbgt(1)+1)*(bbgt(4)-bbgt(2)+1)- iw*ih;
ov=iw*ih/ua;
if ov>ovmax
ovmax=ov; jmax=j;
end
end
end
% assign detection as true positive/don't care/false positive
if ovmax>=VOCopts.minoverlap
if ~gt(i).diff(jmax)
if ~gt(i).det(jmax)
tp(d)=1; % true positive
gt(i).det(jmax)=true;
else
fp(d)=1; % false positive (multiple detection)
end
end
else
fp(d)=1; % false positive
end
end
% compute precision/recall
fp=cumsum(fp); tp=cumsum(tp); rec=tp/npos; prec=tp./(fp+tp);
% compute average precision
ap=0;
for t=0:0.1:1
p=max(prec(rec>=t));
if isempty(p)
p=0;
end
ap=ap+p/11;
end
if draw
% plot precision/recall
plot(rec,prec,'-');
grid;
xlabel 'recall'
ylabel 'precision'
title(sprintf('class: %s, subset: %s, AP = %.3f',cls,VOCopts.testset,ap));
end

  

物体检测序列之一:ap, map的更多相关文章

  1. 评价目标检测(object detection)模型的参数:IOU,AP,mAP

    首先我们为什么要使用这些呢? 举个简单的例子,假设我们图像里面只有1个目标,但是定位出来10个框,1个正确的,9个错误的,那么你要按(识别出来的正确的目标/总的正确目标)来算,正确率100%,但是其实 ...

  2. 目标检测的评价标准mAP, Precision, Recall, Accuracy

    目录 metrics 评价方法 TP , FP , TN , FN 概念 计算流程 Accuracy , Precision ,Recall Average Precision PR曲线 AP计算 A ...

  3. 手把手教你用深度学习做物体检测(五):YOLOv1介绍

    "之前写物体检测系列文章的时候说过,关于YOLO算法,会在后续的文章中介绍,然而,由于YOLO历经3个版本,其论文也有3篇,想全面的讲述清楚还是太难了,本周终于能够抽出时间写一些YOLO算法 ...

  4. 目标检测评价标准(mAP, 精准度(Precision), 召回率(Recall), 准确率(Accuracy),交除并(IoU))

    1. TP , FP , TN , FN定义 TP(True Positive)是正样本预测为正样本的数量,即与Ground truth区域的IoU>=threshold的预测框 FP(Fals ...

  5. 物体检测之FPN及Mask R-CNN

    对比目前科研届普遍喜欢把问题搞复杂,通过复杂的算法尽量把审稿人搞蒙从而提高论文的接受率的思想,无论是著名的残差网络还是这篇Mask R-CNN,大神的论文尽量遵循著名的奥卡姆剃刀原理:即在所有能解决问 ...

  6. 物体检测丨Faster R-CNN详解

    这篇文章把Faster R-CNN的原理和实现阐述得非常清楚,于是我在读的时候顺便把他翻译成了中文,如果有错误的地方请大家指出. 原文:http://www.telesens.co/2018/03/1 ...

  7. Tensorflow 之物体检测

    1)安装Protobuf TensorFlow内部使用Protocol Buffers,物体检测需要特别安装一下. # yum info protobuf protobuf-compiler 2.5. ...

  8. cs231n---语义分割 物体定位 物体检测 物体分割

    1 语义分割 语义分割是对图像中每个像素作分类,不区分物体,只关心像素.如下: (1)完全的卷积网络架构 处理语义分割问题可以使用下面的模型: 其中我们经过多个卷积层处理,最终输出体的维度是C*H*W ...

  9. 手把手教你用深度学习做物体检测(六):YOLOv2介绍

    本文接着上一篇<手把手教你用深度学习做物体检测(五):YOLOv1介绍>文章,介绍YOLOv2在v1上的改进.有些性能度量指标术语看不懂没关系,后续会有通俗易懂的关于性能度量指标的介绍文章 ...

  10. 利用modelarts和物体检测方式识别验证码

    近来有朋友让老山帮忙识别验证码.在github上查看了下,目前开源社区中主要流行以下几种验证码识别方式: tesseract-ocr模块: 这是HP实验室开发由Google 维护的开源 OCR引擎,内 ...

随机推荐

  1. SpringBoot自定义全局异常返回页面

    返回自定义异常界面,需要引入thymeleaf依赖(非必须,如果是简单的html界面则不用) <dependency> <groupId>org.springframework ...

  2. 解决方案 | 1分钟快速解决 win10 任务管理器性能不显示GPU?

    1 问题 环境:win10 22h2 2 解决方法 win+r输入dxdiag回车,查看下面信息: (1)确认你的Windows10版本号大于1909,如果确认,在任务管理器进程页右键名称一栏,将GP ...

  3. RS232转PN协议网关模块连接PLC和霍尼韦尔条码扫描器通信

    为了更快地输入信息,许多设备都配备了条码扫描器,但条码扫描器不能直接与CPU通信.最直接和方便的方法是加RS232转PN协议网关模块(BT-PNR20).本文将深入研究如何利用巴图自动化的RS232转 ...

  4. 单细胞测序最好的教程(十):细胞类型注释迁移|万能的Transformer

    作者按 本章节主要讲解了基于transformer的迁移注释方法TOSICA,该算法在迁移注释上达到了SOTA的水平,在注释这么卷的赛道愣是杀出了一条血路.本教程首发于单细胞最好的中文教程,未经授权许 ...

  5. Python threading实现多线程 基础篇

    讲多线程前,先要了解什么是进程,什么是线程,已经知道的请略过. 一.进程与线程: 进程是资源分配的最小单位,一个程序至少有一个进程. 线程是程序执行的最小单位,一个进程至少有一个线程. 进程都有自己独 ...

  6. 这才是 PHP 高性能框架 Workerman 的立命之本

    大家好,我是码农先森. 在这个大家都崇尚高性能的时代,程序员的谈笑间句句都离不开高性能,仿佛嘴角边不挂着「高性能」三个字都会显得自己很 Low,其中众所皆知的 Nginx 就是高性能的代表.有些朋友可 ...

  7. 【转载】 NCCL(Nvidia Collective multi-GPU Communication Library) Nvidia英伟达的Multi-GPU多卡通信框架NCCL 学习;PCIe 速率调研

    原文地址: https://www.cnblogs.com/xuyaowen/p/nccl-learning.html ---------------------------------------- ...

  8. 作为电脑屏幕的补光灯,到底是应该选Led灯还是荧光灯

    现在的台灯灯具市场基本被Led灯给霸占,这就无形之中要大家买台灯的时候只能选择Led等,我也是如此,手上有一款20年前上高中时候的"孩视宝"荧光灯的台灯,然后还有一款刚刚购入的Le ...

  9. ubuntu22.04 终端显示数字剑雨

    数字剑雨是读大学时候常用的屏保,这些年基本也再没有用过,不经意间想到了这个曾经的屏保,发现Ubuntu原版的桌面系统是没有屏保的,又不想换桌面系统,想想还是单独安装一下这个数字剑雨吧. 在Ubuntu ...

  10. [COCI 2023/2024 #3] Slučajna Cesta 题解

    前言 期望套期望,很有意思.来一发考场首 A,近 \(\Theta(n)\) 的算法. 题目链接:洛谷. 题意简述 一棵树,每条边随机设有方向.对于所有 \(i\),从 \(i\) 开始随机游走,直到 ...