目标检测评测指标

news/2024/7/10 0:10:55 标签: 目标检测, mAP, ROC, AUC, PR曲线

准确率 (Accuracy),精确率(Precision),召回率(Recall),平均正确率(AP),mean Average Precision(mAP),ROC + AUC

1. 准确率 (Accuracy)

分对的样本数除以所有的样本数 ,即:准确(分类)率 = 正确预测的正反例数 / 总数。

准确率一般用来评估模型的全局准确程度,不能包含太多信息,无法全面评价一个模型性能。

2. 精确率(Precision)与召回率(Recall)

在这里插入图片描述
一些相关的定义。假设现在有这样一个测试集,测试集中的图片只由大雁和飞机两种图片组成,假设你的分类系统最终的目的是:能取出测试集中所有飞机的图片,而不是大雁的图片。

  • True positives : 正样本被正确识别为正样本,飞机的图片被正确的识别成了飞机。
  • True negatives: 负样本被正确识别为负样本,大雁的图片没有被识别出来,系统正确地认为它们是大雁。
  • False positives: 假的正样本,即负样本被错误识别为正样本,大雁的图片被错误地识别成了飞机。
  • False negatives: 假的负样本,即正样本被错误识别为负样本,飞机的图片没有被识别出来,系统错误地认为它们是大雁。

Precision其实就是在识别出来的图片中,True positives所占的比率。也就是本假设中,所有被识别出来的飞机中,真正的飞机所占的比例。
在这里插入图片描述
  Recall 是测试集中所有正样本样例中,被正确识别为正样本的比例。也就是本假设中,被正确识别出来的飞机个数与测试集中所有真实飞机的个数的比值。
在这里插入图片描述
  Precision-recall 曲线:改变识别阈值,使得系统依次能够识别前K张图片,阈值的变化同时会导致Precision与Recall值发生变化,从而得到曲线。

如果一个分类器的性能比较好,那么它应该有如下的表现:在Recall值增长的同时,Precision的值保持在一个很高的水平。而性能比较差的分类器可能会损失很多Precision值才能换来Recall值的提高。通常情况下,文章中都会使用Precision-recall曲线,来显示出分类器在Precision与Recall之间的权衡。

mAP_28">3. 平均精度(Average-Precision,AP)与 mean Average Precision(mAP)

AP就是Precision-recall 曲线下面的面积,通常来说一个越好的分类器,AP值越高。

mAP是多个类别AP的平均值。这个mean的意思是对每个类的AP再求平均,得到的就是mAP的值,mAP的大小一定在[0,1]区间,越大越好。该指标是目标检测算法中最重要的一个。

在正样本非常少的情况下,PR表现的效果会更好。
在这里插入图片描述

ROCReceiver_Operating_CharacteristicAUCArea_Under_Curve_35">4. ROC(Receiver Operating Characteristic)曲线与AUC(Area Under Curve)

在这里插入图片描述
ROC曲线:

  • 横坐标:假正率(False positive rate, FPR),FPR = FP / [ FP + TN] ,代表所有负样本中错误预测为正样本的概率,假警报率;
  • 纵坐标:真正率(True positive rate, TPR),TPR = TP / [ TP + FN] ,代表所有正样本中预测正确的概率,命中率。

对角线对应于随机猜测模型,而(0,1)对应于所有整理排在所有反例之前的理想模型。曲线越接近左上角,分类器的性能越好。

ROC曲线有个很好的特性:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。

ROC曲线绘制:

(1)根据每个测试样本属于正样本的概率值从大到小排序;

(2)从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本;

(3)每次选取一个不同的threshold,我们就可以得到一组FPR和TPR,即ROC曲线上的一点。

当我们将threshold设置为1和0时,分别可以得到ROC曲线上的(0,0)和(1,1)两个点。将这些(FPR,TPR)对连接起来,就得到了ROC曲线。当threshold取值越多,ROC曲线越平滑。
  
AUC(Area Under Curve)即为ROC曲线下的面积。AUC越接近于1,分类器性能越好。

物理意义:首先AUC值是一个概率值,当你随机挑选一个正样本以及一个负样本,当前的分类算法根据计算得到的Score值将这个正样本排在负样本前面的概率就是AUC值。当然,AUC值越大,当前的分类算法越有可能将正样本排在负样本前面,即能够更好的分类。

计算公式:就是求曲线下矩形面积。
  在这里插入图片描述

ROC_62">5. PR曲线ROC曲线比较

ROC曲线特点:

(1)优点:当测试集中的正负样本的分布变化的时候,ROC曲线能够保持不变。因为TPR聚焦于正例,FPR聚焦于与负例,使其成为一个比较均衡的评估方法。

在实际的数据集中经常会出现类不平衡(class imbalance)现象,即负样本比正样本多很多(或者相反),而且测试数据中的正负样本的分布也可能随着时间变化。

(2)缺点:上文提到ROC曲线的优点是不会随着类别分布的改变而改变,但这在某种程度上也是其缺点。因为负例N增加了很多,而曲线却没变,这等于产生了大量FP。像信息检索中如果主要关心正例的预测准确性的话,这就不可接受了。在类别不平衡的背景下,负例的数目众多致使FPR的增长不明显,导致ROC曲线呈现一个过分乐观的效果估计。ROC曲线的横轴采用FPR,根据FPR ,当负例N的数量远超正例P时,FP的大幅增长只能换来FPR的微小改变。结果是虽然大量负例被错判成正例,在ROC曲线上却无法直观地看出来。(当然也可以只分析ROC曲线左边一小段)

PR曲线

(1)PR曲线使用了Precision,因此PR曲线的两个指标都聚焦于正例。类别不平衡问题中由于主要关心正例,所以在此情况下PR曲线被广泛认为优于ROC曲线。

使用场景:

  • ROC曲线由于兼顾正例与负例,所以适用于评估分类器的整体性能,相比而言PR曲线完全聚焦于正例。
  • 如果有多份数据且存在不同的类别分布,比如信用卡欺诈问题中每个月正例和负例的比例可能都不相同,这时候如果只想单纯地比较分类器的性能且剔除类别分布改变的影响,则ROC曲线比较适合,因为类别分布改变可能使得PR曲线发生变化时好时坏,这种时候难以进行模型比较;反之,如果想测试不同类别分布下对分类器的性能的影响,则PR曲线比较适合。
  • 如果想要评估在相同的类别分布下正例的预测情况,则宜选PR曲线
  • 类别不平衡问题中,ROC曲线通常会给出一个乐观的效果估计,所以大部分时候还是PR曲线更好。
  • 最后可以根据具体的应用,在曲线上找到最优的点,得到相对应的precision,recall,f1
    score等指标,去调整模型的阈值,从而得到一个符合具体应用的模型。

补充1:目标检测基础知识-IOU,NMS,Soft-NMS
补充2:人脸检测经典算法整理
补充3:目标检测经典算法整理

6. 最后

Sample


http://www.niftyadmin.cn/n/1715391.html

相关文章

java最长单调递增子序列_最长单调递增子序列问题

最长单调递增子序列问题题目:设计一个 O( n ^ 2 )复杂度的算法,找出由 n 个数组成的序列的最长单调递增子序列。import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);while …

java数据类型的选择_Java数据类型总结

Java数据类型总结Java语言是一种强类型语言,所谓强类型语言就是所有变量的使用都必须严格符合规定,所有变量都必须先定义后使用。既然有强类型语言,就一定存在弱类型语言弱类型语言的使用就跟强类型语言恰恰相反了,他不需要先定义…

hive 创建外部表产生java_Hive中的内部表以及外部表

Hive中的Managed Table以及External TableHive有两种类型的表:Managed Table 内部表External Table 外部表下面我们详细介绍这两种表.Managed Table这种表也被称作Internal Table.这是Hive中的默认的类型.如果你在创建表的时候没有指明Managed或者Extern…

NCNN简单入门及安装

1.在电脑端使用ncnn实现分类(alexnet) s1&#xff0c;安装g&#xff0c;cmake&#xff0c;protobuf&#xff0c;opencv s2&#xff0c;对源码进行编译 git clone https://github.com/Tencent/ncnn $ cd <ncnn-root-dir> $ mkdir -p build $ cd build $ cmake .. $ mak…

ImportError: No module named 通用解决方法

最近多个小伙伴儿问“ImportError: No module named xxx“&#xff0c;应该怎么样解决。 其实&#xff0c;问这个问题&#xff0c;还是因为你对python的基本方法没有掌握好&#xff0c;我也把这类问题的通用解决方法整理一下&#xff0c;希望对小伙伴儿们能够有帮助。 报错现…

java autocomplete ajax_jQuery中使用Ajax实现文本输入框的自动完成功能

当我们使用搜索引擎时发现会有自动提示的功能&#xff0c;那么&#xff0c;它是怎么实现的呢&#xff1f;在jQuery中结合Ajax可以很容易实现自动完成的功能。下面就在jQuery中使用Ajax提交post请求&#xff0c;让服务器端返回自动完成的数据显示在相应的div中。编写html文件主要…

ImportError: cannot import name ABC 解决方法

1. Python 3.5.2 测试可以运行 import sys from abc import ABC,abstractmethod class MyBase(ABC): …

怎么爬php网页_使用phpQuery轻松爬取网页内容

phpQuery是一个基于PHP的服务端开源项目&#xff0c;它可以让PHP开发人员轻松处理DOM文档内容&#xff0c;比如获取某新闻网站的头条信息。更有意思的是&#xff0c;它采用了jQuery的思想&#xff0c;你可以像使用jQuery一样处理页面内容&#xff0c;获取你想要的页面信息。采集…