01- 综述 (目标检测)

news2024/11/23 8:42:04

要点:

  • 区分One-stage detector 和 Two-stage detector

参考链接:深度学习目标检测最全综述 - 爱码网

详细模型解读参考:目标检测简介 - 知乎


一 目标检测分类

1.1 发展历程

检测网络发布历程:

 1.2 检测模型分类

2014年后目标检测主要分为两个方向发展:

  • One-stage detector:仅一次前向传递一步到位,直接对图像进行分类和边界框回归,而不需要先生成候选区域。
    • OverFeat、YOLOv1、YOLOv2、YOLOv3、SSD和RetinaNet等。
  • Two-stage detector :生成候选区域+分类和边界框回归,首先生成候选区域,然后对这些候选区域进行分类和边界框回归。
    • R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN和R-FCN等

1.3 Two-stage detector

  • RCNN

    RCNN由SS算法(selective search)得到proposals,然后每一个proposal被送到CNN中提取特征,最后有SVM分类器去预测目标种类,RCNN将VOC07的mAP从33.7%(DPM保持的)上升到58.5%。

  • SPPNet

    进一步提升精度,从58.5%到59.2%,并且其推理速度相比SPPNet快了20倍

  • Fast RCNN

    VOC07精度提升到70.0%,然后其推理速度相比SPPNet又快了10倍

  • Faster RCNN

    首次可以将two-stage的网络进行end2end的训练,并且在VOC07上精度达到73.2%,同时其运行速度达到了几乎实时。

  • FPN

    2017年在Faster RCNN基础上提出FPN,在[email protected]上达到59.1%的精度。

1.4 One-stage detector

  • YOLO

    YOLO在2015年被首次提出,是深度学习领域的第一个One-Stage的目标检测算法,在VOC07上精度在52.7%的同时,速度可以达到155fps,可谓逆天!由于精度原因后来发布了YOLOV2,其成绩为45fps with VOC07 mAP=63.4%,后来在2018年发布了YOLOV3,吊打同期目标检测方法,直到现在YOLOV3的方法仍然不过时。

  • SSD

    SSD方法是在2015年被提出来的,它是深度学习领域第二个One-Stage的检测器。同时兼顾了速度和精度,对后面的目标检测算法有着深远的影响。其成绩为(VOC07 mAP=76.8%, VOC12 mAP=74.9%, COCO [email protected]=46.5%, [email protected][.5,.95]=26.8%),基于SSD的方法的目标检测算法非常地多。

  • RetinaNet

    FocalLoss在这篇文章被提出来,主要解决的是类别不平衡的问题。FocalLoss使OneSatge的方法在精度上可以和twoSatge的方法进行抗衡了。(COCO [email protected]=59.1%, [email protected][.5, .95]=39.1%).


二 特定算法详细解读

2.1 R-CNN系列

2.1.1 R-CNN

2014年,R-CNN(全称Regions with CNN features) ,是R-CNN系列的第一代算法,其实没有过多的使用“深度学习”思想,而是将“深度学习”和传统的“计算机视觉”的知识相结合。比如R-CNN pipeline中的第二步和第四步其实就属于传统的“计算机视觉”技术。使用selective search提取region proposals,使用SVM实现分类

 思路方法:

  • 给定一张图片,从图片中选出2000个独立的候选区域(Region Proposal)。
  • 将每个候选区域输入到预训练好的AlexNet中,提取一个固定长度(4096)的特征向量。
  • 对每个目标(类别)训练一SVM分类器,识别该区域是否包含目标。
  • 训练一个回归器,修正候选区域中目标的位置:对于每个类,训练一个线性回归模型判断当前框定位是否准确。

训练方法:

  • 使用区域生成算法,生成2000个候选区域,这里使用的是Selective search。
  • 对生成的2000个候选区域,使用预训练好的AlexNet网络进行特征提取。将候选区域变换到网络需要的尺寸(227×227)。 在进行变换的时候,在每个区域的边缘添加p个像素(即添加边框,设置p=16)。同时,改造预训练好的AlexNet网络,将其最后的全连接层去掉,并将类别设置为21(20个类别,另外一个类别代表背景)。每个候选区域输入到网络中,最终得到4096×21个特征。
  • 利用上面提取到的候选区域的特征,对每个类别训练一个SVM分类器(二分类),判断候选框中物体的类别,输出Positive/Negative。如果该区域与Ground truth的IOU低于某个阈值,就将给区域设置为Negative(阈值设置为0.3)。如下图所示:

效果查看:

  • R-CNN在VOC 2007测试集上mAP达到58.5%,打败当时所有的目标检测算法。

算法缺陷:

  • 重复计算,训练耗时,每个region proposal,都需要经过一个AlexNet特征提取,为所有的RoI(region of interest)提取特征大约花费47秒。
  • 训练占用空间,特征文件需要保存到文件,5000张的图片会生成几百G的特征文件。
  • selective search方法生成region proposal,对一帧图像,需要花费2秒。
  • 三个模块(提取、分类、回归)是分别训练的,并且在训练时候,对于存储空间消耗较大。

2.1.2 Fast R-CNN

2015年,Fast R-CNN是基于R-CNN和SPPnets进行的改进。SPPnets,其创新点在于只进行一次图像特征提取(而不是每个候选区域计算一次),然后根据算法,将候选区域特征图映射到整张图片特征图中。

算法流程:

  • 使用selective search生成region proposal,大约2000个左右区域候选框
  • 使用CNN对图像进行卷积运算,得到整个图像的特征图
  • 对于每个候选框,通过RoI Projection映射算法取出该候选框的特征图,再通过RoI池化层形成固定长度的特征向量
  • 每个特征向量被送入一系列全连接(fc)层中,最终分支成两个同级输出层 :一个输出个类别加上1个背景类别的Softmax概率估计,另一个为个类别的每一个类别输出4个定位信息

进步点:

  • 和RCNN相比,训练时间从84小时减少为9.5小时,测试时间从47秒减少为0.32秒。在VGG16上,Fast RCNN训练速度是RCNN的9倍,测试速度是RCNN的213倍;训练速度是SPP-net的3倍,测试速度是SPP-net的3倍
  • Fast RCNN在PASCAL VOC 2007上准确率相差无几,约在66~67%之间
  • 加入RoI Pooling,采用一个神经网络对全图提取特征
  • 在网络中加入了多任务函数边框回归,实现了端到端的训练

算法缺陷:

  • 依旧采用selective search提取region proposal(耗时2~3秒,特征提取耗时0.32秒)
  • 无法满足实时应用,没有真正实现端到端训练测试
  • 利用了GPU,但是region proposal方法是在CPU上实现的

2.1.3 Faster RCNN

2016年,经过R-CNN和Fast-RCNN的积淀,Ross B.Girshick在2016年提出了新的Faster RCNN,在结构上将特征抽取、region proposal提取, bbox regression,分类都整合到了一个网络中,使得综合性能有较大提高,在检测速度方面尤为明显

整体流程:

  • Conv Layers。作为一种CNN网络目标检测方法,Faster RCNN首先使用一组基础的卷积/激活/池化层提取图像的特征,形成一个特征图,用于后续的RPN层和全连接层。
  • Region Proposal Networks(RPN)。RPN网络用于生成候选区域,该层通过softmax判断锚点(anchors)属于前景还是背景,在利用bounding box regression(包围边框回归)获得精确的候选区域。
  • RoI Pooling。该层收集输入的特征图和候选区域,综合这些信息提取候选区特征图(proposal feature maps),送入后续全连接层判定目标的类别。
  • Classification。利用取候选区特征图计算所属类别,并再次使用边框回归算法获得边框最终的精确位置。

RPN网络:

RPN网络全称Region Proposal Network(区域提议网络),是专门用来从特征图生成候选区域的网络

流程步骤:

(1)输入:通过主干网卷积得到的特征图

(2)对于特征图上的每一个点(称之为anchor point,锚点),生成具有不同尺度和宽高比的锚点框,这个锚点框的坐标(x,y,w,h)是在原图上的坐标

(3)然后将这些锚点框输入到两个网络层中去,一个(rpn_cls_score )用来分类,即这个锚点框里面的特征图是否属于前景;另外一个(rpn_bbox_pred)输出四个位置坐标(相对于真实物体框的偏移)

(4)将锚点框与Ground Truth中的标签框进行 IoU 对比,如果其 IoU 高于某个阈值,则该锚点框标定为前景框,否则属于背景框;对于前景框,还要计算其与真实标签框的4个位置偏移;将这个标注好的锚点框(带有 前背景类别 和 位置偏移 标注)与3中卷积网络层的两个输出进行loss比较(类别:CrossEntrpy loss 和 位置回归:smooth L1 loss),从而学习到如何提取前景框

(5)学习到如何提取前景框后,就根据 rpn_cls_score 层的输出概率值确定前景框;位置偏移值则被整合到锚点框的坐标中以得到实际的框的坐标;这样子就得到了前景框,起到了selective search的作用。RPN生成的proposal就称为 Region of Interest.由于他们具有不同的尺度和长度,因此需要通过一个 ROI pooling层获得统一的大小

Anchors:

Anchors(锚点)指由一组矩阵,每个矩阵对应不同的检测尺度大小。

其中每行4个值(x_1, y_1, x_2, y_2 ),对应矩形框左上角、右下角相对于中心点的偏移量。9个矩形共有三种形状,即1:1, 1:2, 2:1,即进行多尺度检测。

例如,一张800*600的原始图片,经过VGG下采样后(生成特征矩阵)16倍大小,大小变为50*38,每个点设置9个anchor,则总数为:

ceil(800 / 16) * ceil(600 / 16) * 9 = 50 * 38 * 9 = 17100

Bounding box regression:

物体识别完成后,通过一种方式对外围框进行调整,使得和目标物体更加接近

损失函数:

对一个图像的损失函数,是一个分类损失函数与回归损失函数的叠加

改进点:

  • 在VOC2007测试集测试mAP达到73.2%,目标检测速度可达5帧/秒
  • 提出Region Proposal Network(RPN),取代selective search,生成待检测区域,时间从2秒缩减到了10毫秒
  • 真正实现了一个完全的End-To-End的CNN目标检测模型
  • 共享RPN与Fast RCNN的特征

算法缺陷:

  • 还是无法达到实时检测目标
  • 获取region proposal, 再对每个proposal分类计算量还是较大

2.2 YOLO系列

2.2.1 YOLOv1(2015)

YOLO(You Only Look Once )是继RCNN,fast-RCNN和faster-RCNN之后,Ross Girshick针对DL目标检测速度问题提出的另一种框架,其核心思想是生成RoI+目标检测两阶段(two-stage)算法用一套网络的一阶段(one-stage)算法替代,直接在输出层回归bounding box的位置和所属类别

之前的物体检测方法首先需要产生大量可能包含待检测物体的先验框, 然后用分类器判断每个先验框对应的边界框里是否包含待检测物体,以及物体所属类别的概率或者置信度,同时需要后处理修正边界框,最后基于一些准则过滤掉置信度不高和重叠度较高的边界框,进而得到检测结果。这种基于先产生候选区再检测的方法虽然有相对较高的检测准确率,但运行速度较慢

YOLO创造性的将物体检测任务直接当作回归问题(regression problem)来处理,将候选区和检测两个阶段合二为一。只需一眼就能知道每张图像中有哪些物体以及物体的位置。下图展示了各物体检测系统的流程图。

实际上,YOLO并没有真正去掉候选区,而是采用了预定义候选区的方法,也就是将图片划分为7*7个网格,每个网格允许预测出2个边框,总共49*2个bounding box,可以理解为98个候选区域,它们很粗略地覆盖了图片的整个区域。YOLO以降低mAP为代价,大幅提升了时间效率

网络结构:

YOLOv1网络有24个卷积层,后面是2个全连接层。我们只使用 降维层,后面是 卷积层。

为了快速实现快速目标检测,YOLOV1还训练了快速版本。快速YOLO使用具有较少卷积层(9层而不是24层)的神经网络,在这些层中使用较少的滤波器。除了网络规模之外,YOLO和快速YOLO的所有训练和测试参数都是相同的。网络的最终输出是7*7*30(1470)的预测张量

 训练过程和细节:

(1)预训练。采用前20个卷积层、平均池化层、全连接层进行了大约一周的预训练;

(2)输入。输入数据为224*224和448*448大小的图像

(3)采用相对坐标。通过图像宽度和高度来规范边界框的宽度和高度,使它们落在0和1之间;边界框 x 和 y 坐标参数化为特定网格单元位置的偏移量,边界也在0和1之间;

(4)损失函数

优点和缺陷:

(1)优点 - YOLO检测物体速度非常快,其增强版GPU中能跑45fps(frame per second),简化版155fps - YOLO在训练和测试时都能看到一整张图的信息(而不像其它算法看到局部图片信息),因此YOLO在检测物体是能很好利用上下文信息,从而不容易在背景上预测出错误的物体信息 - YOLO可以学到物体泛化特征

(2)缺点 - 精度低于其它state-of-the-art的物体检测系统 - 容易产生定位错误 - 对小物体检测效果不好,尤其是密集的小物体,因为一个栅格只能检测2个物体 - 由于损失函数的问题,定位误差是影响检测效果的主要原因,尤其是大小物体处理上还有待加强

2.2.2 YOLOv2(2016)

Ross Girshick吸收fast-RCNN和SSD算法,设计了YOLOv2(论文原名《YOLO9000: Better, Faster, Stronger 》),在精度上利用一些列训练技巧,在速度上应用了新的网络模型DarkNet19,在分类任务上采用联合训练方法,结合wordtree等方法,使YOLOv2的检测种类扩充到了上千种,作者在论文中称可以检测超过9000个目标类别,所以也称YOLO9000. YOLOv2模型可以以不同的尺寸运行,从而在速度和准确性之间提供了一个简单的折衷,在67FPS时,YOLOv2在VOC 2007上获得了76.8 mAP。在40FPS时,YOLOv2获得了78.6 mAP,比使用ResNet的Faster R-CNN和SSD等先进方法表现更出色,同时仍然运行速度显著更快。

① 改进策略

YOLOv2对YOLOv1采取了很多改进措施,以提高模型mAP,如下图所示:

(1)Batch Normalization(批量正则化。YOLOv2中在每个卷积层后加Batch Normalization(BN)层,去掉dropout. BN层可以起到一定的正则化效果,能提升模型收敛速度,防止模型过拟合。YOLOv2通过使用BN层使得mAP提高了2%。

(2)High Resolution Classifier(高分辨率分类器。原来的YOLO网络在预训练的时候采用的是224*224的输入(这是因为一般预训练的分类模型都是在ImageNet数据集上进行的),然后在detection的时候采用448*448的输入,这会导致从分类模型切换到检测模型的时候,模型还要适应图像分辨率的改变。而YOLOv2则将预训练分成两步:先用224*224的输入从头开始训练网络,大概160个epoch(表示将所有训练数据循环跑160次),然后再将输入调整到448*448,再训练10个epoch。注意这两步都是在ImageNet数据集上操作。最后再在检测的数据集上fine-tuning,也就是detection的时候用448*448的图像作为输入就可以顺利过渡了。作者的实验表明这样可以提高几乎4%的mAP。

(3)Convolutional With Anchor Boxes(带Anchor Boxes的卷积。 YOLOv1利用全连接层直接对边界框进行预测,导致丢失较多空间信息,定位不准。YOLOv2去掉了YOLOv1中的全连接层,使用Anchor Boxes预测边界框,同时为了得到更高分辨率的特征图,YOLOv2还去掉了一个池化层。由于图片中的物体都倾向于出现在图片的中心位置,若特征图恰好有一个中心位置,利用这个中心位置预测中心点落入该位置的物体,对这些物体的检测会更容易。所以总希望得到的特征图的宽高都为奇数。YOLOv2通过缩减网络,使用416*416的输入,模型下采样的总步长为32,最后得到13*13的特征图,然后对13*13的特征图的每个cell预测5个anchor boxes,对每个anchor box预测边界框的位置信息、置信度和一套分类概率值。使用anchor boxes之后,YOLOv2可以预测13*13*5=845个边界框,模型的召回率由原来的81%提升到88%,mAP由原来的69.5%降低到69.2%.召回率提升了7%,准确率下降了0.3%。

(4)Dimension Clusters(维度聚类。在Faster R-CNN和SSD中,先验框都是手动设定的,带有一定的主观性。YOLOv2采用k-means聚类算法对训练集中的边界框做了聚类分析,选用boxes之间的IOU值作为聚类指标。综合考虑模型复杂度和召回率,最终选择5个聚类中心,得到5个先验框,发现其中中扁长的框较少,而瘦高的框更多,更符合行人特征。通过对比实验,发现用聚类分析得到的先验框比手动选择的先验框有更高的平均IOU值,这使得模型更容易训练学习。

VOC和COCO的聚类边界框尺寸。我们对边界框的维度进行k-means聚类,以获得我们模型的良好先验。左图显示了我们通过对k的各种选择得到的平均IOU。我们发现k=5给出了一个很好的召回率与模型复杂度的权衡。右图显示了VOC和COCO的相对中心。这两种先验都赞成更薄更高的边界框,而COCO比VOC在尺寸上有更大的变化。

(5)New Network(新的网络YOLOv2采用Darknet-19,其网络结构如下图所示,包括19个卷积层和5个max pooling层,主要采用3*3卷积和1*1卷积,这里1*1卷积可以压缩特征图通道数以降低模型计算量和参数,每个卷积层后使用BN层以加快模型收敛同时防止过拟合。最终采用global avg pool 做预测。采用YOLOv2,模型的mAP值没有显著提升,但计算量减少了。

 (6)直接定位预测(Direct location Prediction)。 Faster R-CNN使用anchor boxes预测边界框相对先验框的偏移量,由于没有对偏移量进行约束,每个位置预测的边界框可以落在图片任何位置,会导致模型不稳定,加长训练时间。YOLOv2沿用YOLOv1的方法,根据所在网格单元的位置来预测坐标,则Ground Truth的值介于0到1之间。网络中将得到的网络预测结果再输入sigmoid函数中,让输出结果介于0到1之间。设一个网格相对于图片左上角的偏移量是 , 。先验框的宽度和高度分别是 和 ,则预测的边界框相对于特征图的中心坐标 , 和宽高 , 的计算公式如下图所示。

(7)细粒度特征(Fine-Grained Features)。 YOLOv2借鉴SSD使用多尺度的特征图做检测,提出pass through层将高分辨率的特征图与低分辨率的特征图联系在一起,从而实现多尺度检测。YOLOv2提取Darknet-19最后一个max pool层的输入,得到26*26*512的特征图。经过1*1*64的卷积以降低特征图的维度,得到26*26*64的特征图,然后经过pass through层的处理变成13*13*256的特征图(抽取原特征图每个2*2的局部区域组成新的channel,即原特征图大小降低4倍,channel增加4倍),再与13*13*1024大小的特征图连接,变成13*13*1280的特征图,最后在这些特征图上做预测。使用Fine-Grained Features,YOLOv2的性能提升了1%。

(8)多尺度训练(Multi-Scale Training)。 YOLOv2中使用的Darknet-19网络结构中只有卷积层和池化层,所以其对输入图片的大小没有限制。YOLOv2采用多尺度输入的方式训练,在训练过程中每隔10个batches,重新随机选择输入图片的尺寸,由于Darknet-19下采样总步长为32,输入图片的尺寸一般选择32的倍数{320,352,…,608}(最小的选项是320×320,最大的是608×608。我们调整网络的尺寸并继续训练)。采用Multi-Scale Training, 可以适应不同大小的图片输入,当采用低分辨率的图片输入时,mAP值略有下降,但速度更快,当采用高分辨率的图片输入时,能得到较高mAP值,但速度有所下降

YOLOv2比先前的检测方法更快,更准确。它也可以以不同的分辨率运行,以便在速度和准确性之间进行简单折衷

② 训练过程

  • 第一阶段:现在ImageNet分类数据集上训练Darknet-19,此时模型输入为224*224,共训练160轮
  • 第二阶段:将网络输入调整为448*448,继续在ImageNet分类数据集上训练细调模型,共10轮,此时分类模型top-1准确率为76.5%,而top-5准确度为93.3%
  • 第三阶段:修改Darknet-19分类模型为检测模型,并在检测数据集上继续细调网络

③ 优点与缺点

(1)优点

  • YOLOv2使用了一个新的分类器作为特征提取部分较多使用了3*3卷积核,在每次池化后操作后把通道数翻倍。网络使用了全局平均池化,把1*1卷积核置于3*3卷积核之间,用来压缩特征。也用了batch normalization稳定模型训练
  • 最终得出的基础模型就是Darknet-19,包含19个卷积层,5个最大池化层,运算次数55.8亿次,top-1图片分类准确率72.9%,top-5准确率91.2%
  • YOLOv2比VGG16更快,精度略低于VGG16

(2)缺点

  • YOLOv2检测准确率不够,比SSD稍差
  • 不擅长检测小物体
  • 对近距离物体准确率较低

2.2.3 YOLOv3(2018)

YOLOv3总结了自己在YOLOv2的基础上做的一些尝试性改进,有的尝试取得了成功,而有的尝试并没有提升模型性能。其中有两个值得一提的亮点,一个是使用残差模型,进一步加深了网络结构;另一个是使用FPN架构实现多尺度检测

① 改进

  • 新网络结构:DarkNet-53
  • 用逻辑回归替代softmax作为分类器;
  • 融合FPN(特征金字塔网络),实现多尺度检测。

② 多尺度预测

YOLOv3在基本特征提取器上添加几个卷积层,其中最后一个卷积层预测了一个三维张量——边界框,目标和类别预测。 在COCO实验中,为每个尺度预测3个框,所以对于4个边界框偏移量,1个目标预测和80个类别预测,张量的大小为N×N×[3 *(4 + 1 + 80)]。接下来,从前面的2个层中取得特征图,并将其上采样2倍。

YOLOv3还从网络中的较前的层中获取特征图,并使用按元素相加的方式将其与上采样特征图进行合并。这种方法使得能够从上采样的特征图中获得更有意义的语义信息,同时可以从更前的层中获取更细粒度的信息。然后,再添加几个卷积层来处理这个组合的特征图,并最终预测出一个类似的张量,虽然其尺寸是之前的两倍。

最后,再次使用相同的设计来预测最终尺寸的边界框。因此,第三个尺寸的预测将既能从所有先前的计算,又能从网络前面的层中的细粒度的特征中获益。

③ 网络结构

YOLOv3在之前Darknet-19的基础上引入了残差块,并进一步加深了网络,改进后的网络有53个卷积层,取名为Darknet-53。

从YOLOv1到YOLOv2再到YOLO9000、YOLOv3, YOLO经历三代变革,在保持速度优势的同时,不断改进网络结构,同时汲取其它优秀的目标检测算法的各种trick,先后引入anchor box机制、引入FPN实现多尺度检测等。

不同backbone的各种网络在准确度,billions of operations,billion floating point operations per second和FPS上的比较 每个网络都使用相同的设置进行训练,并在256×256的图像上进行单精度测试。 运行时间是在Titan X上用256×256图像进行测量的。因此,Darknet-53可与最先进的分类器相媲美,但浮点运算更少,速度更快。 Darknet-53比ResNet-101更好,且速度快1.5倍。 Darknet-53与ResNet-152具有相似的性能,但速度快2倍。

Darknet-53也实现了最高的每秒浮点运算测量。 这意味着网络结构可以更好地利用GPU,使它的评测更加高效,更快。 这主要是因为ResNet的层数太多,效率不高。

④ 效果

(1)兼顾速度与准确率。在COCO数据机上,mAP指标与SSD模型相当,但速度提高了3倍;mAP指标比RetinaNet模型差些,但速度要高3.8倍。

(2)小目标检测有所提升,但中等和更大尺寸的物体上的表现相对较差。

2.2.4 YOLOv4(2020)

YOLOv4 将最近几年 CV 界大量的研究成果集中在一套模型中,从检测速度、精度、定位准确率上有了明显改善(相对于YOLOv3,AP值和FPS分别上涨了10%和12%)。YOLOv4主要改进点有:

  • 输入端。采用更大的输入图像,采用新的样本增强方法
  • 骨干网。采用新的、改进的骨干网CSPDarknet53;新的激活函数和dropout策略
  • 特征融合部分。插入SPP,FPN+PAN等新的结构;
  • 输出端。采用改进的损失函数

① Backbone, Neck, Head

首先,作者提出了一个目标检测的通用框架,将一个目标检测框架分为Input,Backbone,Neck,Head几个部分:

  • Input(输入):输入部分,如图像、批次样本、图像金字塔
  • Backbone(骨干网):各类CNN,主要作用是对图像中的特征做初步提取
  • Neck(脖子):特征融合部分,主要作用是实现多尺度检测
  • Head(头):产生预测结果

YOLOv4从以上几个结构部分均进行了优化和改进,取得了较好的综合效果。

② 模型结构

YOLOv4模型结构如下图所示:

③ 主要改进

  • 输入端

(1)Mosaic数据增强。Mosaic是参考2019年提出的CutMix数据增强的方式,但CutMix只使用了两张图片进行拼接,而Mosaic数据增强则采用了4张图片,随机缩放,随机裁剪,随机排布的方式进行拼接 。这样使得模型更获得更多相关或不相关的上下文信息,学习到更加鲁棒的特征。

(2)自对抗训练(SAT,Self Adversarial Trainning)。自对抗训练代表了一种新的数据增强技术,操作在两个向前后阶段。在第一阶段,神经网络改变原始图像而不是网络权值。通过这种方式,神经网络对自己进行了对抗性的攻击,改变原始图像来制造图像上没有需要的对象的假象。在第二阶段,训练神经网络以正常的方式在修改后的图像上检测目标

(3)CmBN(交叉小批量归一化)。BN策略可以缓解梯度消失、过拟合,增加模型稳定性。BN在计算时仅仅利用当前迭代批次样本进行计算,而CBN在计算当前时刻统计量时候会考虑前k个时刻统计量,从而实现扩大batch size操作。CmBN是CBN的修改版,CBN在第t时刻,也会考虑前3个时刻的统计量进行汇合。

  • Backbone部分

(1)CSPDarknet53。CSPDarknet53是在YOLOv3主干网络Darknet53的基础上,借鉴2019年的CSPNet的经验,产生的Backbone结构,其中包含了5个CSP模块。 其结构如下图所示:

CSPNet(Cross Stage Partial Network,跨阶段局部网络)主要用来提高学习能力同时,降低模型对资源的消耗。每个CSPX中包含3+2 × X个卷积层,因此整个主干网络Backbone中一共包含 2+(3+2×1)+2+(3+2×2)+2+(3+2×8)+2+(3+2×8)+2+(3+2×4)+1=72 个卷积层。每个CSP模块前面的卷积核大小都是3x3,步长为2,因此可以起到下采样的作用。因为Backbone有5个CSP模块,输入图像是608 x 608,所以特征图的变化规律是:608->304->152->76->38->19经过5次CSP模块后得到19*19大小的特征图。Backbone采用Mish激活函数。

(2)Mish激活函数。一种新的、非单调、平滑激活函数,其表达式为f(x) = x*tanh(log(1+e^x)),更适合于深度模型。根据论文实验,精度比ReLU略高。

 

 (3)Dropblock策略。Dropblock是一种针对卷积层的正则化方法,实验在ImageNet分类任务上,使用Resnet-50结构,能够将分类精度提高1.6%,在COCO检测任务上,精度提升1.6%。其原理是在特征图上通过dropout一部分相邻的区域,使得模型学习别的部位的特征,从而表现出更好的泛化能力

Dropblock模块主要有两个参数,block_size和γ。其中,block_size表示区域的大小,正常可以取3,5, 7,当block_size=1时,dropout退化为传统的dropout。

  • Neck部分

(1)SPP模块。SPP模块位于Backbone网络之后,使用k={1x1, 5 x 5, 9 x 9, 13 x 13}最大池化操作,再将不同尺度的特征图进行Concat融合。

 (2)FPN + PAN。FTP指特征金字塔,其思想是将高层次卷积得到的较小特征图进行上采样,和低层次较大的特征图进行特征融合(自顶向下),这样做的优点是将高层次较强的语义特征传递下来。而PAN结构借鉴2018年图像分割领域PANet(Path Aggregation Network,路径聚合网络)的创新点,FPN的后面添加一个自底向上的特征金字塔,将低层次强定位特征传递上来(自底向上),从而形成对FPN的补充。

  • Head部分

(1)CIOU_loss。IOU用来度量预测定位是否准确,但存在一定的问题,

针对以上问题,出现了几个IOU的改进策略:

GIOU_loss:在IOU的基础上,解决了边界框不重合的问题

DIOU_loss:在IOU和GIOU的基础上,考虑了边界框中心点距离的信息

CLOU_Loss: 在DIOU的基础上,考虑边界框宽高比的尺度信息

(2)DIOU_NMS。NMS主要用于预测框的筛选,YOLOv4使用DIOU来进行NMS(即选择DIOU最大的值),实验证明在重叠目标的检测中,DIOU_NMS的效果优于传统的NMS。如下图所示:

④ 效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/500568.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C嘎嘎~~ [类 下篇之运算符重载]

类 下篇 之运算符重载 5.赋值运算符重载5.1运算符重载5.1.1 运算符的概念5..1.2 重载运费符的位置5.1.3运算符重载的实质 5.2 赋值运算符重载5.2.1深刻理解---编译器生成的默认赋值运算符重载5.2.2深刻理解---拷贝构造和赋值运算符重载5.2.3深刻理解---传参和返回值用引用修饰…

CUDA error: device-side assert triggered CUDA kernel errors might be asynchronously reported at some

问题描述: 在修改代码时,出现入下报错。 发生异常: RuntimeError CUDA error: device-side assert triggered CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect. For debuggi…

Android Switch开关按钮使用和自定义样式(系列教程五)

Switch开关按钮简介 Switch开关按钮是Android中的基本控件之一&#xff0c;其本质上也是一个按钮&#xff0c;具有开和关两种展示状态。 Switch开关按钮基本使用 在布局文件中定义开关按钮&#xff1a; <LinearLayoutandroid:layout_width"300dp"android:layo…

Vivado安装后添加器件库

1.前言 通常安装Vivado时&#xff0c;由于软件完整安装的空间需求过于庞大&#xff0c;一般只会选择一部分器件进行安装。而随着学习和工作的进展&#xff0c;遇到新的赛灵思朋友是成长的里程碑&#xff0c;也是综合不能通过的绊脚石。 今天有幸认识了一位新的赛灵思朋友——…

云原生: istio+dapr构建多运行时服务网格

2020 年&#xff0c;Bilgin Ibryam 提出了 Multi-Runtime&#xff08;多运行时&#xff09;的理念&#xff0c;对基于 Sidecar 模式的各种产品形态进行了实践总结和理论升华。那到底什么是多运行时呢&#xff1f;首先还是得从分布式应用的四大类基本需求讲起。简单来讲任何分布…

刷题练习3

文章目录 题目一分析题解 题目二分析第一种第二种 题解第一种方法代码第二种方法代码 题目一 题目链接 描述 读入一个字符串str&#xff0c;输出字符串str中的连续最长的数字串 输入描述&#xff1a; 个测试输入包含1个测试用例&#xff0c;一个字符串str&#xff0c;长度不超…

牛顿迭代法解超越方程

牛顿迭代法解超越方程 L g T 2 2 π t a n h ( 2 π L d ) L\frac{gT^2}{2\pi}tanh(\frac{2\pi}{L}d) L2πgT2​tanh(L2π​d) 方程&#xff1a; f ( L ) L − g T 2 2 π t a n h ( 2 π L d ) 0 f(L)L-\frac{gT^2}{2\pi}tanh(\frac{2\pi}{L}d)0 f(L)L−2πgT2​tanh(L2π…

~项目启动~

rmq是什么&#xff1f; "rmq" 可能指的是 "RabbitMQ"&#xff0c;它是一种开源消息队列软件&#xff0c;采用 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;协议&#xff0c;可以用于支持异步处理、任务分发、解耦合等应用场景。Rabbit…

仪表检测与读数(一):仪表检测

基于YOLOv4的仪表检测 前言YOLOv4源码下载数据集处理与模型训练模型性能测试 前言 本系列是想记录一下自己实现的一种用于仪表检测与读数的方法&#xff0c;首先方法仅针对于单指针仪表和单行显示的数字仪表进行了检测与读数方法的设计。方法的整体思路是&#xff1a;第一步对拍…

[ 云计算 | Azure ] Chapter 06 | 计算服务之虚拟机、虚拟机规模集、Azure 容器、Azure App 与 Azure Functions

本系列已经更新文章列表&#xff08;已更新&#xff09;&#xff1a; [ Azure 云计算从业者 ] Chapter 03 | 描述云计算运营中的 CapEx 与 OpEx&#xff0c;如何区分 CapEx 与 OpEx[ Azure 云计算从业者 ] Chapter 04 | Azure核心体系结构组件之数据中心、区域与区域对、可用区…

【Qt】插件Plugin入门之Q_PLUGIN_METADATA()宏【2023.05.07】

摘要 分析Q_PLUGIN_METADATA宏的设计意图&#xff0c;站在设计者的意图进行插件的高屋建瓴式学习。 Meta-Object Compiler 简称MOC Qt 的 Meta-Object Compiler&#xff08;MOC&#xff09;是一个预处理器&#xff0c;用于处理带有特殊关键字的 C 文件&#xff0c;并生成用于…

Linux命令·netstat

netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据&#xff0c;一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序&#xff0c;它能提供TCP连接&#xff0c;TCP和UDP监听&#xff0c;进程内存管理的相关报告。 如果你的计算机有时候…

详细版简单易学版TypeScript各类型声明

假如本地新建了一个b.ts文件 安装TypeScript&#xff1a;npm install -g typescript 编译代码&#xff1a;tsc b.ts 运行js&#xff1a;node b.js 在终端输入 tsc -init 生成 tsconfig.json 文件 类型注解&#xff1a;TypeScript里的类型注解是一种轻量级的为函数或变量添加约束…

Python中模块和包基础学习

目录 模块 引入模块 使用from...import语句引入模块中的指定变量或函数 使用import...as语句给模块起别名 使用dir()函数查看模块中的所有变量和函数 使用__name__变量判断模块是被导入还是直接执行 包 注意 示例 模块 Python中的模块是指一个文件&#xff0c;可以包…

2.1 掌握NumPy数组对象ndarray

2.1 掌握NumPy数组对象ndarray 2.2.1 创建数组对象1&#xff0e;数组创建2&#xff0e;数组属性&#xff1a;ndarray&#xff08;数组&#xff09;是存储单一数据类型的多维数组。3&#xff0e;数组数据类型 2.1.2 生成随机数random模块常用随机数生成函数 2.1.3 通过索引访问数…

Python中异常处理的学习

目录 异常的基本介绍 异常处理语句 抛出异常 异常的基本介绍 在Python中&#xff0c;如果程序出现错误&#xff0c;会抛出异常。异常是一种Python对象&#xff0c;它封装了错误的信息&#xff0c;并提供了一种处理错误的机制。Python中内置了很多异常类型&#xff0c;包括但…

C语言-学习之路-07

C语言-学习之路-07 内存管理作用域局部变量静态&#xff08;static&#xff09;局部变量全局变量extern全局变量声明全局函数和静态函数 内存分布内存分区 内存管理 作用域 C语言中变量的作用域可分为&#xff1a;代码作用域、函数作用域、文件作用域 局部变量 局部变量也叫…

C嘎嘎~~ [类 下篇(2)]

类 下篇2 5.赋值运算符重载5.1运算符重载5.1.1 运算符的概念5..1.2 重载运费符的位置5.1.3运算符重载的实质 5.2 赋值运算符重载5.2.1深刻理解---编译器生成的默认赋值运算符重载5.2.2深刻理解---拷贝构造和赋值运算符重载5.2.3深刻理解---传参和返回值用引用修饰 5.赋值运算符…

ADAS-透视前方:汽车HUD技术原理解析

“ 当人们谈论未来的汽车技术时&#xff0c;汽车HUD&#xff08;Head-Up Display&#xff09;是一个经常被提及的技术。HUD是一种驾驶辅助技术&#xff0c;它可以将关键的驾驶信息直接显示在驾驶员的视线范围内&#xff0c;让驾驶员无需转移视线就能获得所需信息。这个技术在过…

HZNUCTF2023 web

目录 <1> guessguessguess <2> ezflask(无过滤ssti) ​ <3> ppppop(cookie泄露反序列化) <4> ezlogin(bool盲注) <5> ezpickle(pickle反序列化) <6> eznode(原型链污染) <1> guessguessguess 尝试是否存在sql注入&#xff0c;…