YOLOV4垃圾检测召回率提升

YOLOV4垃圾检测召回率提升

一. 目标检测中的mAP

1. mAP相关知识

1.1 IOU(交并比)

目标检测时,预测框和真实框的交并比,是个重要的参数。

在正负样本的划分和非极大抑制中起到关键作用

在这里插入图片描述

1.2 precision(准确率) / recall(召回率)

首先我们需要了解目标检测过程中正负样本的概念

在目标检测中,样本置信度大于一定阈值时,模型就认为检测到了该目标,否则不认为检测到目标

正样本指的是我们真实想要检测到的的目标(但未必检测到了),负样本指的是样本中除了正样本之外的,即不是我们真实需求的目标

以下有四个由True/False和Positive/Negative组合而成的参数,用来代表四种不同情况:

TP(True Positive):模型检测到且检测正确的样本,视为正样本

FP(False Positive):模型检测到但检测错误的样本,视为负样本

TN(True Negative):模型未检测到且确实不需要检测到的样本,无需考虑

FN(Fale Negative):模型未检测到但是其实需要检测到的样本,视为正样本

在这里插入图片描述

有了这四个参数,我们可以写出precision和recall的计算公式

precision=TP/(TP+FP) 通俗解释为:正确检测到的样本占所有被检测到的样本比例

recall=TP/(TP+FN) 通俗解释为:正确检测到的样本占所有希望被检测到的样本比例

其实放到真实的算法过程当中,每个预测框都会企图和交并比最大的真实框进行匹配,当满足一定条件时,它们就配对成功,配对成功了的不能和其他框再配对,这种能够找到配对对象的预测框就属于TP(说明真实框被检测到了),而找不到配对对象的预测框就属于FP,未配对的真实框就属于FN(说明真实框没有被检测到)

理解precision和recall的意义后,不难发现,他们之间其实存在着一定的制约关系,试想:当试图提升precision时,我们会提高置信度阈值,使得识别到的目标正确概率增大,但这样难免遗漏很多正确目标;当试图提升recall时,我们会降低置信度阈值,使得更多的目标可以被识别到,这样能够将很多正确目标囊括了进来,但也会识别到很多不正确的目标,准确率就难以维持较高水准。

1.3 AP / mAP

目标检测中,每个类别在不同的置信度阈值下,都会有不同的precision和recall,通过在坐标上刻画precision-recall曲线,得到曲线下方的面积来刻画模型性能的好坏。这个面积就是AP(average precision)。AP的出现是为了解决单一指标(precision或recall)对模型评估的局限性,从而能够综合评估模型好坏

在这里插入图片描述

而mAP就是对所有类的AP求平均值,作为多类别目标检测模型性能的衡量指标。

2. yolov4中mAP的具体算法

  1. 利用get_gt_txt.py得到测试集中真实框的种类与位置信息

  2. 通过get_dr_txt.py将测试集传入模型进行预测,得到各个预测框种类、置信度得分、位置等信息。在进行mAP的计算时,我们需要产生大量的预测框,因此在这里我们需要先将生成预测框的置信度阈值设置得非常小(0.05),就是说置信度>=0.05就可以生成预测框。这样做的目的是允许有大量不同置信度区间的预测框产生,而mAP的预测需要在不同置信度下得到对应的precision和recall,也就是为mAP的精准计算提供了条件。

    Tip: 预测框的具体生成方式在下文detect_image中提到

  3. 在get_map.py中进行具体的计算:

    1. 首先进行正负样本的划分。之前我们提到了IOU,现在它派上用场了。
    2. 假定现在有类别I,属于类别I的每个预测框都去找与它IOU值最大的真实框,记录为maxIOU,设定一个IOU_threshold门限(一般设定IOU_threshold为0.5)用于划分正负样本。当某个预测框的maxIOU<IOU_threshold时,判定该预测框为正样本;当某个预测框的maxIOU>=IOU_threshold时,又要分为两种情况,若预测框和真实框的类别也相同,那么判定该预测框为正样本,否则会寻找其他的真实框,直到找到IOU值最大且>=IOU_threshold且类别也相同的真实框,这样可以判定为正样本,若找不到,判定为负样本。最后对类别I的所有预测框按照置信度由大到小进行排序,便于取置信度阈值。
    3. 所有类别都进行2步骤,但要注意并不是一个一个类别进行的,比如并不是类别I的框筛选完了,才去筛选类别II的框,实际的逻辑应该是根据IOU由大到小进行筛选。被认定为TP的预测框会和与之匹配的真实框一起被剔除掉,不再参与和其他框的匹配过程。
    4. 对每个类别,根据已经统计好的预测框样本,通过设置不同的置信度阈值,得到相应的precision-recall,从而刻画各个类别的precision-recall曲线,求出各个类别的AP,再求得mAP

在这里插入图片描述

可以针对上面这个例子进行一下计算,如果置信度阈值设为0.95,那么precision=1/1=1,recall=1/3=0.3333

如果把置信度阈值设为0.35,那么precision=3/6=0.5,recall=3/3=1

二. yolov4的detect_image算法

1. anchors_box锚框

1.1 引入

在众多经典的目标检测模型中,均有先验框的说法,有的paper(如Faster RCNN)中称之为anchor(锚点),有的paper(如SSD)称之为prior bounding box(先验框),实际上是一个概念。

举个形象但不够恰当的例子说明:

由于目前污染比较严重,导致海洋中漂浮着许多垃圾,这些垃圾既污染环境,又不利于鱼类的生存。假设我们面前有一片海域,海域中零星地漂浮着很多不同类型的垃圾,这些垃圾有的大,有的小,有的是方形的,有的是长条形的。为了保护环境,我们需要将所有的垃圾打捞起来,还海洋生物一个美好家园。

为此,我们设计了一种打捞机器,该机器能够在一定范围内撒下网,进行垃圾打捞,且只有一定大小的网能够打捞到对应一定大小的垃圾,这里我们认为当网与垃圾的IoU小于0.5时,该区域不存在垃圾;网与垃圾的IoU大于0.5时,该区域存在垃圾,当然该机器能够对网进行后续的调整(调整网的位置,形状)。由于该机器有些简陋,无法智能识别该海域中哪个区域包含垃圾,为了能够尽可能的打捞到所有的垃圾,我们需要在这片海域的不同位置下网,进行垃圾的打捞,且为了打捞不同类型的垃圾,我们需要在同一位置下多个不同形状(不同大小,不同长宽比)的网。实际上,我们希望既能打捞到所有的垃圾,同时我们又希望能够下最少的网,减少工作量。

总结:对应到目标检测任务,海域相当于网络的输入图像;不同类型的垃圾,对应不同类型的目标类别;在海域上抛下的网相当于锚框,通过锚框来判断该区域中是否包含目标。预测框的前身就是各个锚框!

1.2 不同尺度的锚框

在引例我们说到,为了打捞不同类型的垃圾,我们需要在同一位置下多个不同形状(不同大小,不同长宽比)的网。同样在目标检测中,在图中的同一个位置,我们会设置几个不同尺度的锚框。

同一位置,不同尺度的锚框

1.3 先验框与特征图的对应

在引例我们说到,我们需要在海域的不同位置下网,进行垃圾的打捞。同样在目标检测中,需要在图片的不同位置上设置锚框。

但是实际上如果遍历原图每个像素,设置的锚框就太多了,完全没必要。假设一个224x224的图片,每个位置设置3个不同尺寸的锚框,那么就有224x224x3=150528个,但是如果我们不去遍历原图,而是去遍历原图对应的feature map呢?以vgg16的backbone为例,下采样了5次,得到7x7的feature map,那就只需要得到7x7x3=147个先验,这样的设置大大减少了锚框的数量,同时也能覆盖大多数情况。

2. detect_image预测框算法

  1. 首先获得锚框尺度信息,用于在特征图上生成锚框

  2. 将图像传入网络模型进行预测

  3. 在特征图上生成锚框,每个锚框通过模型可以对每个类别都产生一个置信度,选择置信度最高的类别作为该锚框的类别

  4. 设置置信度阈值,保留置信度>=阈值的锚框

  5. 对留下的锚框进行非极大抑制(NMS),即需要删除一部分框,防止大量重叠框的出现,大致思路如下:

    从待检测目标中先按照分类置信度,找一个最可信的框。然后判断其他框和它的交并比(IoU),如果大于阈值TH,说明相似,抑制掉就好了。

    算法:1.按照置信度排序 2.判断其他框和得分最高的框的IoU,大于阈值则剔除得分较小的建议框 3.从没有处理的框中继续选择一个得分最高的,重复上述过程。 4.遍历所有的建议框,即所有物体种类都做一遍非极大值抑制。

    img

  6. 经过置信度阈值和NMS的双重筛选,剩下的就是需要的预测框了。

三. 召回率提升

1. 目前问题

  1. 对于各个类别,无论置信度阈值调整到什么位置都无法让recall达到95%,分析原因有两个方面:

    1. 预测框与真实框重合度不够,这样get_mAP.py就不认为检测到了目标

    2. 存在误检,即识别错了种类,把类别I识别成了类别II,那这样类别I的recall永远也到不到100%,因为已经有一个被识别为了其他种类,再怎么下降置信度阈值,也无法改变这个类别无法被完全正确识别的事实。

      image-20210902121034385

      以测试集中betel nut bags的置信度阈值-recall曲线举个例子,首先需要知道的是置信度阈值的设定方式,实际上这里的Score_Threhold以每个betel nut bags预测框的置信度都做一次置信度阈值,如果说这些预测框囊括了所有betel nut bags目标,那么以预测框中最低的置信度做阈值时,理论上recall将会达到100%。然而图像中并没有呈现这样的结果,说明这已经不是调整置信度阈值能解决的了,而是模型的性能存在问题,什么原因呢?大概就是以上两个原因。

  2. 我们需要的是整体的召回率>=95%还是每个类别的召回率都>=95%呢。相对而言整体召回率>=95%会更容易达到,而要求每个类别的召回率>=95%更加严苛,相信这个不难理解,因为某一个没达到并不代表整体无法达到

2. 提升策略

  1. 调整模型参数,例如Epoch/batch_size的调整,防止出现过拟合,当然也不能出现欠拟合
  2. 丰富数据集,一方面是要具有特征的多样性,另一方面是同种类别也要有足够的数量,主要的重点类别之间数量要均衡。这样训练出的模型具更广泛的检测识别能力,且可以减少误识类别的现象,对召回率的提升均有帮助
  3. 开启yolov4中Mosaic数据增强
  4. 继续自主的数据增强
  5. 在必要情况下增多anchors锚框的种类(只在存在一些刁钻比例垃圾时才使用)
  6. 以上将决定recall召回率的上限,只有上限达到95%,才能通过调整置信度阈值来使得recall>=95%,否则再怎么降低阈值都没用,因为上限不够。在上限足够的情况下,就可以通过调整判定与真实框匹配的IOU值和置信度阈值,再进一步提高recall

版权声明:本文为CSDN博主「阳天er」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/RGZNHH/article/details/120062842

阳天er

我还没有学会写个人说明!

暂无评论

发表评论

相关推荐

MMDETECTION微调模型

在 COCO 数据集上预训练的检测器可以作为其他数据集(例如 CityScapes 和 KITTI 数据集)的良好预训练模型。本教程指导用户将Model Zoo 中提供的模型用于其他数据集以获得更好的性能。 在新数