• 目标检测的置信度和NMS


    1. 置信度(confidence)

      还存在一个很关键的问题:在训练中我们挑选哪个bounding box的准则是选择预测的box与ground truth box的IOU最大的bounding box做为最优的box,但是在预测中并没有ground truth box,怎么才能挑选最优的bounding box呢?这就需要另外的参数了,那就是下面要说到的置信度。

      置信度是每个bounding box输出的其中一个重要参数,作者对他的作用定义有两重:
      一重是:代表当前box是否有对象的概率 Pr​(Object),注意,是对象,不是某个类别的对象,也就是说它用来说明当前box内只是个背景(backgroud)还是有某个物体(对象);
      另一重:表示当前的box有对象时,它自己预测的box与物体真实的box可能的 I O U p r e d t r u t h IOU_{pred}^{truth} IOUpredtruth的值,注意,这里所说的物体真实的box实际是不存在的,这只是模型表达自己框出了物体的自信程度。
      以上所述,也就不难理解作者为什么将其称之为置信度了,因为不管哪重含义,都表示一种自信程度:框出的box内确实有物体的自信程度和框出的box将整个物体的所有特征都包括进来的自信程度。经过以上的解释,其实我们也就可以用数学形式表示置信度的定义了:
      C i j = P r ( O b j e c t ) ∗ I O U p r e d t r u t h C_{i}^{j}=P_{r}(Object)*IOU^{_{pred}^{truth}} Cij=Pr(Object)IOUpredtruth
      其中, C i j C_{i}^{j} Cij表示第i个grid cell的第j个bounding box的置信度。
      那么如何训练 C i j C_{i}^{j} Cij​?

      训练中, C i j ^ \hat{C^{_{i}^{j}}} Cij^表示真实值, C i j ^ \hat{C^{_{i}^{j}}} Cij^的取值是由grid cell的bounding box有没有负责预测某个对象决定的。如果负责,那么 C i j ^ \hat{C^{_{i}^{j}}} Cij^ = 1 ,否则, C i j ^ \hat{C^{_{i}^{j}}} Cij^=0。
      下面我们来说明如何确定某个grid cell的bounding box是否负责预测该grid cell中的对象:前面在说明anchor box的时候提到每个bounding box负责预测的形状是依据与其对应的anchor box(bounding box prior)相关的,那这个anchor box与该对象的ground truth box的IOU在所有的anchor box(与一个grid cell中所有bounding box对应,COCO数据集中是9个)与ground truth box的IOU中最大,那它就负责预测这个对象,因为这个形状、尺寸最符合当前这个对象,这时 C i j ^ \hat{C^{_{i}^{j}}} Cij^ = 1 ,其他情况下 C i j ^ \hat{C^{_{i}^{j}}} Cij^ = 0 。注意,你没有看错,就是所有anchor box与某个ground truth box的IOU最大的那个anchor box对应的bounding box负责预测该对象,与该bounding box预测的box没有关系。

    2. 类别置信度:
      分类器返回某个目标的类别置信度,即该目标属于A的概率,属于B的概率。即分类器最后softmax得到的结果。

      具体地,描述为对象条件类别概率(conditional class probabilities)

      对象条件类别概率是一组概率的数组,数组的长度为当前模型检测的类别种类数量,它的意义是当bounding box认为当前box中有对象时,要检测的所有类别中每种类别的概率.
      其实这个和分类模型最后使用softmax函数输出的一组类别概率是类似的,只是二者存在两点不同:

      YOLO的对象类别概率中没有background一项,也不需要,因为对background的预测已经交给置信度了,所以它的输出是有条件的,那就是在置信度表示当前box有对象的前提下,所以条件概率的数学形式为 P r ( c l a s s i ∣ O b j e c t ) P_{r}(class_{i}|Object) Pr(classiObject);

      分类模型中最后输出之前使用softmax求出每个类别的概率,也就是说各个类别之间是互斥的,而YOLOv3算法的每个类别概率是单独用逻辑回归函数(sigmoid函数)计算得出了,所以每个类别不必是互斥的,也就是说一个对象可以被预测出多个类别。这个想法其实是有一些YOLO9000的意思的,因为YOLOv3已经有9000类似的功能,不同只是不能像9000一样,同时使用分类数据集和对象检测数据集,且类别之间的词性是有从属关系的。

    3. NMS 非极大值抑制
      非极大值抑制用在最后阶段,即所有边界框都已经回归调整过后,对图片每一类使用NMS防止一个目标出现多个边界框。
      1、非极大值抑制需要设置一个阈值
      2、使用时间是最后调整完预测框位置后
      3、多少个类就使用多少次非极大值抑制
      4、每一类使用非极大值抑制后找到所有这类的边界框

      yolov3中NMS在训练过程中不执行。正是因为不需要训练,所以也就不需要保留梯度。所以可以在代码中看到tensor一会儿加载到cpu一会儿加载到GPU上的操作。这种操作在训练过程中是不允许出现的。

      在目标检测网络中,会生成许多重复地目标框,使用NMS去除冗余的目标框,保留置信度高的目标框。

      (1)在Bounding Box列表中,首先选择置信度最高的目标框A。
      (2)将与A的IoU超过阈值的目标框从Bounding Box中去除,并将A标记并移入保留框列表中。
      (3)重复(1)和(2),知道Bounding Box列表清空为止。
      对每个分类,都需要使用一次上述流程,直到Bounding Box清空为止。

      然而,单纯使用NMS去选取目标框,可能会导致两个相同类别的重合度高的物体,由于IoU较大,较小置信度的目标框被删除而导致漏检。

      Soft-NMS就是针对这种情况出现的。

      原NMS算法中,当IoU较大时,小置信度的框的置信度会直接置零:
      在这里插入图片描述
      Soft-NMS算法中,当IoU较大时,小置信度的目标框的得分,会被重置,重置方法有两种:

      线性加权法:

      float
      高斯加权法:
      在这里插入图片描述
      当目标框与当前选定的最大置信度的目标框重合度越高,分数被扣除的越多。
      这样,当选取的阈值合适时,就会降低同类目标由于IoU较大而被误删的概率。

    参考:
    1、https://blog.csdn.net/weixin_43384257/article/details/100974776

  • 相关阅读:
    Leetcode494. 目标和
    JavaScript 防抖 (vue中写法总结)
    Dubbo实战
    布尔盲注(原因找不到报错和联合)
    (c语言)万字详解字符函数,字符串函数,内存函数--内含所有模拟实现方法
    Threads and Locks
    [2022CISCN]初赛 复现
    Python装饰器与面向切面编程
    一次不完整的渗透
    Maven发布自己项目到maven中央仓库
  • 原文地址:https://blog.csdn.net/zml194849/article/details/123420586