资讯详情

单阶段目标检测重要论文总结

文章目录

  • 一、Yolov1
    • 1、论文简介
    • 2、检测原理
    • 3、结构设计
    • 4、疑难问题
    • 5、论文总结
  • 二、Yolov2
    • 1、论文简介
    • 2、更好、更快、更强
      • 为什么1)更好?
      • 为什么会更快?
      • 为什么3)更强? 此为YOLO9000内容
    • 3、Darknet-19代码实现
    • 4、论文总结
  • 三、Yolov3
    • 1、论文简介
    • 2、结构设计
      • Darknet-53
      • 整体结构
    • 3、Darknet-53代码实现
    • 4、论文总结
  • 四、Yolov4
    • 1、论文简介
    • 2、结构简介
      • a、Mosaic数据增强
      • b、CSPDarknet53
      • c、Dropblock正则化
      • d、SPP模块
      • e、FPN PAN
      • f、CIOU loss
      • g、DIOU-NMS
    • 3、论文总结
  • 五、SSD
    • 1、论文简介
    • 2、结构设计
      • SSD检测框架
      • SSD方法概述
    • 3、论文总结
  • 六、RetinaNet
    • 1、论文简介
    • 2、结构设计
      • Focal Loss
      • RetinaNet
    • 3、Focal loss pytorch实现
    • 4、论文总结
  • 七、YOLOF
    • 1、论文简介
    • 2、结构设计
    • 4、论文总结
  • 八、CornerNet
    • 1、论文简介
    • 2、结构设计
      • CornerNet总体框架
      • 沙漏网络
      • 预测模块
      • 角池化
      • loss函数
    • 3.训练测试细节
    • 4、论文总结
  • 九、CenterNet
    • 1、论文简介
    • 2、结构设计
      • CenterNet总体框架
      • backbone
      • 损失函数
      • Heatmaps生成步骤
      • 测试阶段的细节
    • 3、论文总结
  • 十、CenterNet
    • 1、论文简介
    • 2、结构设计
      • 如何使用三元组关键点
      • 中心池化
      • 级联角池化
      • LOSS函数
    • 3、测试细节
    • 4、论文总结
  • 十一、FCOS
    • 1、论文简介
    • 2、结构设计
      • 网络设计
      • 正样本制作
      • loss函数
      • 基于FPN的多层预测
      • Center-ness
    • 3、实验结果
    • 4、论文总结
  • 十二、YOLOX
    • 1、论文简介
    • 2、结构设计
      • Baseline
      • 解耦头
      • 测试训练中的策略
    • 3、论文总结
  • 引用
  • 总结
单阶段目标检测重要论文总结

常见的目标检测结构:

image-20220415103203365

:从图像中提取必要的特征,然后利用这些特征进行分类和定位。常使用ImageNet Pretrained model,减少训练时间。常见的有VGG-16,ResNet-50,ResNet-101,ResNeXT,ResNet DCN,DarkNet,CSPResNet,Mobile-Net,ShuffleNet。

:将backbone提取的信息集成。FPN,SPP,RFB,ASPP,SAM,PAN。

:输出分类与定位结果。这一模块通常就是普通的卷积。

一、Yolov1

1、论文简介

论文名称:You Only Look Once: Unified, Real-Time Object Detection

论文链接:yolov1

论文源码:yolov1的简单复现

我注释了一部分,实现了demo

加强版yolov1

yolo官方实现网站

摘要:我们提出了一种新的目标检测方法YOLO。过去,目标检测的工作是重新使用分类器进行检测,我们将目标检测视为空间分离BBox与相关类概率的回归问题。YOLO 只通过输入图像 神经网络可以直接获得 bounding boxes 以及每个 bounding box 类别的概率。由于整个检测管道是一个单一的网络,检测性能可以直接端到端优化。由于整个检测过程只有一个网络,因此可以直接优化检测性能。 我们的统一结构非常快。基本YOLO模型可以以每秒45帧的速度实时处理图像。这个网络的小版本Fast YOLO图像处理速度可达每秒155帧,与其他实施检测器相比mAP两倍。但与之前的目标检测相比,SOTA相比,YOLO定位物体时更容易出错,但在背景上预测假阳性(不存在物体)的情况会更少。最后要说的是YOLO比DPM、R-CNN物体检测系统可以学习更抽象的物体特征,这使得YOLO它可以从真实的图像领域转移到其他领域,如艺术。

提出的问题:DPM,RCNN等目标检测器太慢又不好优化,RCNN太慢是因为要经过生成RP和分类RP这两个阶段,又要经过NMS后处理,难以优化是因为两阶段所用模型要分开训练。那么怎么解决这种太慢有不好优化的问题?

解决方案:将目标检测重建为一个单回归问题,直接从图像像素输出BBox坐标和分类概率。提出YOLO框架。

YOLO检测系统运作流程: ①将输入图resize到448×448; ②将resize后的图像喂到单个CNN中运作; ③根据模型的置信度对得到的检测结果进行阈值化。

YOLO优点:

①单个网络可以同时预测多个BBox和这些BBox的分类概率; ②在整张图片上训练且可以直接优化检测性能; ③速度快,可以做到实时检测。 ④mAP较其他实时检测器提升了两倍之多。 ⑤在做预测时YOLO 使用的是全局图像。YOLO在训练和测试时都是“看”的整张图,所以它可以将各类别的整体信息和外观信息进行编码。(Fast R-CNN较容易误将图像中的背景的一个小块看成是物体,因为它“看”的范围比较小,而YOLO犯的背景错误比 Fast R-CNN 少一半多) ⑥能够学到物体更泛化的特征表示。(当在自然场景图像上训练 YOLO,再在艺术图像上去测试 YOLO 时,YOLO 的表现要优于 DPM、R-CNN) ⑦仅使用一个卷积神经网络就可以端到端地实现检测物体的目的

YOLO缺点:较目标检测的SOTA系统定位精度欠缺,尤其对于小物体

2、检测原理

YOLO工作原理: ( x , y ) (x,y) (x,y)坐标代表BBox的中心与网格边界的相对值, ( w , h ) (w,h) (w,h)代表相对于整张图像来说BBox的宽高。注意:实际训练过程中, ( w , h ) (w,h) (w,h)的值使用图像的宽度和高度进行归一化到[0,1]区间内; ( x , y ) (x,y) (x,y)是BBox中心位置相对于当前网格位置的偏移值,并且被归一化到[0,1]。置信分数代表BBox和GT之间的IOU,这个IOU可看做是是正样本的标签。其中 S = 输 入 图 像 尺 寸 网 络 最 大 的 s t r i d e S=\frac{输入图像尺寸}{网络最大的stride} S=网络最大的stride输入图像尺寸​。

本文使用S=7, B=2, VOC数据集的类别数C=20的配置,因此预测数有7 × 7 × 30。

本文的置信分数计算公式:

若BBox包含物体,则P(object) = 1;否则P(object) = 0。IOU(intersection over union)为预测BBox与GT之间的交集面积。object是一个二分类,即有物体还是无物体,也就是“边框的置信度”,没物体的标签显然就是0,而有物体的标签可以直接给1,也可以计算当前预测的bbox与GT之间的IoU作为有物体的标签,

测试时的置信分数计算公式:

这对每个BBox来说是一个特定类别的置信分数,这些分数对该类出现在框中的概率以及预测框与目标物体的匹配程度进行编码。

问题:对于这个公式最大的问题就在于IOU,因为测试阶段根本就没有真实框能够让我们去计算IoU。但是YOLO的objectness的学习标签就是预测框和GT之间的IoU,所以在测试阶段,这个IOU其实就是指YOLO预测的object-ness,它的物理意义就是:这个网格是否有物体。所以可以认为objectness隐含了IoU的概念,但本质就是有无物体的预测。基于这种问题,上面的置信分数公式可以写作:

这个IoU就是objectness预测,因为objectness在训练过程中的正样本标签就是IoU。

总的来说,yolov1一共有三部分输出,分别是object、class以及BBox:

  • object就是框的置信度,用于表征该网格是否有物体;
  • class就是类别预测;
  • BBox就是Bounding Box

3、结构设计

YOLO的backbone:仿照GoogLeNet,但是没有Inception模块,而是替换成1×1和3×3卷积。24层卷积层+2个FC层,网络在最后的卷积层中将输出特征图做flatten操作,得到一个一维向量然后再接2个全连接层做预测。

以下就是YOLOv1的整体工作流程:

4、疑难问题

①训练阶段和测试阶段各做了些什么?

训练阶段:标签GT框中心点落在哪个网格,就由哪个网格预测这个物体,每个网格预测B个BBox,与GT的IOU最大的BBox负责预测这个物体,每个网格只能检测一个物体,包含/不包含GT的网格/BBox依损失函数分别处理。

测试阶段:直接获得 ( 5 B + C ) × S × S (5B+C)×S×S (5B+C)×S×S向量进行NMS后处理,得到目标检测结果。

②BBox怎么产生的?

答:是通过GT标签中的[xmin,xmax,ymin,ymax]计算得到GT的中心点坐标 ( b x , b y ) (b_x,b_y) (bx​,by​)和宽高,现通过这四个参数回归学习得到BBox的中心点坐标以及宽高。

③如何通过卷积操作将置信度+类别概率+位置偏移映射到卷积输出通道上?

答:因为CNN前向传播的同时要进行loss的反向传播,然后根据loss更新前向传播的这些预测值,因为这些预测值和反向传播的loss通道是一一对应的,所以是将预测值一一映射到卷积输出通道上了。至于为什么更新loss会对预测值产生影响:因为loss的计算离不开ground truth里的值和预测值,通用优化器如SGD根据loss对预测值进行更新,直到设置的epoch结束就可以输出预测值了。

5、论文总结

本文贡献:

①实现了使用单个卷积神经网络就可以端到端地实现检测物体的目的; ②提出的YOLO能够在整张图片上训练且可以直接优化检测性能; ③YOLO可以做到实时检测,mAP较其他实时检测器提升巨大; ④在做预测时YOLO 使用的是全局图像,使得检测器犯背景错误概率降低; ⑤能够学到物体更泛化的特征表示。

YOLOv1缺点:

①较目标检测的SOTA系统定位精度欠缺,召回率较低,尤其对于小物体; ②使用flatten操作破坏特征的空间结构信息; ③没有使用BN层(因为当时BN还不火)。

二、Yolov2

1、论文简介

论文名称:《YOLO9000: Better, Faster, Stronger》

论文链接:yolov2

论文源码:yolov2的简单复现

​ yolov2实现+自己理解

摘要:我们引进了YOLO9000,这是一个SOTA实时目标检测系统,可以检测9000多个目标类别。首先对YOLO检测方法提出了各种改进,在以前的工作上用了些创新点。yoov2模型在VOC和COCO数据集上已经达到SOTA。其次使用了一种新的多尺度训练方法,同样的一个YOLOv2模型可以在不同尺寸图片下运行,权衡了速度及精度。最后提出了一种联合训练目标检测和分类任务的方法,利用这种方法我们在COCO检测数据集和ImageNet分类数据集上同时对YOLO9000进行训练。联合训练允许YOLO9000预测那些没有检测数据标签的目标类别的检测。YOLO只能检测200多个类别,而YOLO9-000可以预测9000多个类别且可以实时运行。

本文提出的问题:检测数据集不会像分类数据集一样拥有很多类别,因此要怎么使得检测任务能够在有限类别的检测数据集上训练出能够检测更多类别的检测器呢?

解决方案:利用分类数据集且提出联合训练方案。(在YOLO中,边界框的预测其实并不依赖于物体的标签,所以YOLO可以实现在分类和检测数据集上的联合训练) 对于检测数据集,可以用来学习预测物体的边界框、置信度以及为物体分类;而对于分类数据集可以仅用来学习分类,但是其可以极大扩充模型所能检测的物体种类。

2、更好、更快、更强

1)为什么更好?

答:在提升召回率和定位精度做了提升,不改变分类精度。

①添加BN层

②高分辨率分类器

YOLOv2做法:将已在224×224的低分辨率图像上训练好的分类网络在448×448的高分辨率图像上进行微调10个epoch。微调完之后再去掉最后的GAP层和softmax层作为最后的检测backbone网络。

YOLOv1做法:backbone网络先在ImageNet上进行预训练,预训练时所输入的图像尺寸是224×224,而做检测任务时,YOLOv1所接收的输入图像尺寸是448×448,不难想到,训练过程中,网络必须要先克服由分辨率尺寸的剧变所带来的问题。

③anchor box机制

从YOLOv1中移除FC层并用anchor框去预测BBox。移除一个池化层使得网络卷积层(32倍下采样)后的输出具有更高分辨率(13×13),再将输入图像缩小到416使得特征图有奇数个位置且仅有一个中心点。为每个anchor分别预测类别和置信分数(objec-tness),这两种预测遵从YOLOv1。

缺点:mAP下降且生成BBox数量过多。 优点:recall提升(意味着有更多提升的空间)

Faster RCNN中RPN的原理:RPN网络在这些预先放置好的锚框上去为后续的预测提供ROI区域。每个网格处设定了k个不同尺寸、不同宽高比的anchor box,RPN网络会为每一个anchor box学习若干偏移量:中心点的偏移量和宽高的偏移量。用这些偏移量去调整每一个anchor box,得到最终的边界框。

anchor box是预设的,用来作为参照框,得到与GT框的IOU,然后让CNN输出物体相对于anchor box的中心点偏移以及长宽比例,用来做位置形状预测。

BBox是根据CNN输出的相对于anchor box中心点偏移以及长宽比例计算出的框,是后面产生的框,用来做分类预测。

训练标注阶段:把anchor box作为训练样本,为了训练样本我们需要为每个锚框标注两类标签:一是锚框所含目标的类别,简称类别;二是真实边界框相对锚框的偏移量,简称偏移量(offset)。找出与每个anchor box交并比最大的GT框,然后GT框的标签作为anchor box的标签,然后计算anchor box相对于GT框的偏移量。在目标检测时,我们首先生成多个锚框,然后为每个锚框预测类别以及偏移量,接着根据预测的偏移量调整锚框位置从而得到预测边界框,最后筛选需要输出的预测边界框。

训练阶段触发anchor box:在经过一系列卷积和池化之后,在feature map层使用anchor box,如下图所示,经过一系列的特征提取,最后针对3×3的网格会得到一个3×3×2×8的特征层,其中2是anchor box的个数,8代表每个anchor box包含的变量数,分别是4个位置偏移量、3个类别(one-hot标注方式)、1个anchor box标注(如果anchor box与真实边框的交并比最大则为1,否则为0)。到了特征层之后对每个cell映射到原图中,找到预先标注的anchor box,然后计算这个anchor box与ground truth之间的损失,训练的主要目的就是训练出用anchor box去拟合GT框的模型参数。

预测阶段:首先在图像中生成多个anchor box,然后根据训练好的模型参数去预测这些anchor box的类别和偏移量,进而得到预测的边界框。由于阈值和anchor box数量选择的问题,同一个目标可能会输出多个相似的预测边界框,这样不仅不简洁,而且会增加计算量,为了解决这个问题,常用的措施是使用NMS。

④维度聚类

不需要人工设计先验框的参数(先验框的数量和大小),在训练集上的BBox做K-means聚类得到好的先验框。聚类的目标是数据集中所有检测框的宽和高,与类别无关。使用IoU作为聚类的衡量指标,如下公式所示:

优点:得到的结果要比手动设置先验框参数好。 缺点:聚类效果依赖于数据集。倘若数据集规模过小、样本不够丰富,那么由聚类得到的先验框也未必会提供足够好的尺寸先验信息。

⑤定位预测

换上新先验框之后,又对BBox的预测方法做了一些调整:首先对每一个BBox,YO LO仍旧去学习中心点偏移量 t x t_x tx​和 t y t_y ty​,YOLOv1中是直接用线性函数输出的,而现在改用sigmoid函数使得网络对偏移量的预测是处在0~1范围内的;其次对每个BBox ,。假设某个先验框的宽高分别为: p w p_w pw​和 p h p_h ph​,网络输出宽高的偏移量为 t w t_w tw​和 t h t_h th​,则使用下面公式可以算出BBox的宽和高。

⑥使用更高分辨率的特征

在前面的改进中,YOLOv1都是在最后一张大小为13×13×1024的特征图上进行检测,为了引入更多的细节信息,作者将backbone的第17层卷积输出的26×26×512特征图拿出来,做一次特殊的降采样操作,得到一个13×13×2048特征图,然后将二者在通道的维度上进行拼接,最后在这张融合了更多信息的特征图上去做检测。

特殊下采样操作:类似pixelshuffle的逆操作:passthrough。这种特殊降采样操作的好处就在于降低分辨率的同时,没丢掉任何细节信息,信息总量保持不变

⑦多尺度训练

使用图像金字塔。通过使用图像金字塔的操作,网络能够在不同尺寸下去感知同一目标,从而增强了其本身对目标尺寸变化的鲁棒性,提升了YOLO对物体的尺度变化的适应能力。

2)为什么更快?

①全卷积网络结构

网络的输入图像尺寸从448改为416,去掉了YOLOv1网络中的最后一个池化层和所有的全连接层,修改后的网络的最大降采样倍数为32,最终得到的也就是13×13的网格,不再是7×7。每个网格处都预设了k个anchor box。

原先的YOLOv1中,每个网格处的B个边界框都有一个置信度,但是类别是共享的,因此每个网格处最终只会有一个输出,而不是B个输出(YOLOv1只输出置信度最高的那一个),倘若一个网格包含了两个以上的物体,那必然会出现漏检问题。加入anchor box后,YOLOv1改为每一个anchor box都预测一个类别和置信度,即每个网格处会有多个边界框的预测输出。YOLOv2的输出张量大小是S×S×k×(1+4+C),每个边界框的预测都包含1个置信度、4个边界框的位置参数和C个类别预测。

②Darknet-19

网络结构:

卷积层有19层:包括线性卷积、BN层以及LeakyReLU激活函数。

做法:首先将DarkNet19在ImageNet上进行预训练,预训练完毕后,去掉最后一层卷积层(与此同时添加3个大小为3×3卷积核数量为1024的卷积层,其中每个3×3卷积层之后都跟一个大小为1×1且数量同检测的输出数量的卷积核的卷积层,还从最后一个卷积层中添加了从最后一个3×3×512的层到第二个3×3×512的层的passthro-ugh层)、GAP层以及softmax层,然后换掉原先的backbone网络。

3)为什么更强? 此为YOLO9000内容

①在分类、检测数据集上联合训练

原理:使用专门为检测贴标签的图像去学习特定的检测信息(BBox坐标预测和object-ness置信分数),使用专门为分类贴标签的图像去扩展可检测的目标类别。

做法:混合检测、分类数据集,当网络看到检测标签图时,网络反向传播YOLOv2的全部loss;当网络看到分类标签图时,网络仅反向传播特定的分类loss。

问题:检测数据集仅有常见标签,而ImageNet类别太细化,怎么去融合标签?

解决方案:使用多标签模型组合标签不互斥的数据集。

②建立分类层级树:WordTree

结合分类数据集和检测数据集标签。计算类别概率就可以用条件概率/全概率来计算,如: P r ( N o r f o l k t e r r i e r ) = P r ( N o r f o l k t e r r i e r ∣ t e r r i e r ) ∗ P r ( t e r r i e r ∣ h u n t i n g d o g ) ∗ … … ∗ P r ( m a m m a l ∣ a n i m a l ) ∗ P r ( a n i m a l ∣ p y s i c a l o b j e c t ) Pr(Norfolk terrier)=Pr(Norfolk terrier|terrier)*Pr(terrier|hunting dog)*……*Pr(mammal|animal)*Pr(animal|pysical object) Pr(Norfolkterrier)=Pr(Norfolkterrier∣terrier)∗Pr(terrier∣huntingdog)∗……∗Pr(mammal∣animal)∗Pr(animal∣pysicalobject)

3、Darknet-19代码实现

class Conv_BN_LeakyReLU(nn.Module):
    def __init__(self, in_channels, out_channels, ksize, padding=0, dilation=1):
        super(Conv_BN_LeakyReLU, self).__init__()
        self.convs = nn.Sequential(
            nn.Conv2d(in_channels, out_channels, ksize, padding=padding, dilation=dilation),
            nn.BatchNorm2d(out_channels),
            nn.LeakyReLU(0.1, inplace=True)
        )

    def forward(self, x):
        return self.convs(x)

class DarkNet_19(nn.Module):
    def __init__(self, num_classes=1000):
        print("Initializing the darknet19 network ......")
        
        super(DarkNet_19, self).__init__()
        # backbone network : DarkNet-19
        # output : stride = 2, c = 32
        self.conv_1 = nn.Sequential(
            Conv_BN_LeakyReLU(3, 32, 3, 1),
            nn.MaxPool2d((2,2), 2),
        )

        # output : stride = 4, c = 64
        self.conv_2 = nn.Sequential(
            Conv_BN_LeakyReLU(32, 64, 3, 1),
            nn.MaxPool2d((2,2), 2)
        )

        # output : stride = 8, c = 128
        self.conv_3 = nn.Sequential(
            Conv_BN_LeakyReLU(64, 128, 3, 1),
            Conv_BN_LeakyReLU(128, 64, 1),
            Conv_BN_LeakyReLU(64, 128, 3, 1),
            nn.MaxPool2d((2,2), 2)
        )

        # output : stride = 16, c = 256
        self.conv_4 = nn.Sequential(
            Conv_BN_LeakyReLU(128, 256, 3, 1),
            Conv_BN_LeakyReLU(256, 128, 1),
            Conv_BN_LeakyReLU(128, 256, 3, 1),
            nn.MaxPool2d((2,2), 2)
        )

        # output : stride = 32, c = 512
        self.conv_5 = nn.Sequential(
            Conv_BN_LeakyReLU(256, 512, 3, 1),
            Conv_BN_LeakyReLU(512, 256, 1),
            Conv_BN_LeakyReLU(256, 512, 3, 1),
            Conv_BN_LeakyReLU(512, 256, 1),
            Conv_BN_LeakyReLU(256, 512, 3, 1),
            nn.MaxPool2d((2,2), 2)
        )

        # output : stride = 32, c = 1024
        self.conv_6 = nn.Sequential(
            Conv_BN_LeakyReLU(512, 1024, 3, 1),
            Conv_BN_LeakyReLU(1024, 512, 1),
            Conv_BN_LeakyReLU(512, 1024, 3, 1),
            Conv_BN_LeakyReLU(1024, 512, 1),
            Conv_BN_LeakyReLU(512, 1024, 3, 1)
        )

        self.conv_7 = nn.Conv2d(1024, 1000, 1)
        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))

    def forward(self, x):
        x = self.conv_1(x)
        x = self.conv_2(x)
        x = self.conv_3(x)
        x = self.conv_4(x)
        x = self.conv_5(x)
        x = self.conv_6(x)

        x = self.conv_7(x)
        x = self.avgpool(x)
        x = x.view(x.size(0), -1)
        return x

4、论文总结

本文较YOLOv1改进点:只说YOLOv2

①移除了FC层,在卷积层上添加了BN层。 ②在低分辨率图像上训练好的网络再放到高分辨率图像中微调,使得检测网络能够对高分辨率图像做出较快适应。 ③用anchor box机制生成BBox,对BBox预测方法做了改进。 ④使用多尺度训练,具体表现在使用图金字塔。 ⑤将类似GoogLeNet

标签: eak系列连接器的分类

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台