一、RCNN系列
1、RCNN
RCNN是用于目标检测的经典方法,其核心思想是将目标检测任务分解为两个主要步骤:候选区域生成和目标分类。
- 候选区域生成:RCNN的第一步是生成可能包含目标的候选区域,RCNN使用传统的计算机视觉技术,特别是选择性搜索(Selective Search)算法,这是一种Region Proposal区域提议方法,它根据图像中的纹理、颜色和形状等信息来生成潜在的候选区域。选择性搜索生成的候选区域通常数千个,因此需要对这些区域进行裁剪和调整,以使它们具有相同的大小和纵横比。
- 特征提取:对于每个候选区域,RCNN使用深度卷积神经网络(通常是在ImageNet数据集上预训练的AlexNet)来提取特征。这些特征用于表示每个候选区域的内容。RCNN通过将每个候选区域的图像块调整为固定大小,然后通过卷积神经网络进行前向传播,得到一个固定维度的特征向量。
- 目标分类:对于每个候选区域,RCNN将提取的特征向量输入到一个支持向量机(SVM)分类器中共,以确定该区域是否包含感兴趣的目标物体。RCNN还对每个目标物体的类别进行分类,使用不同的SVM分类器来表示不同的类别。每个分类器被训练为将包含目标物体的候选区域与不包含目标物体的区域进行区分。
- 边界框回归:为了提高目标的位置精度,RCNN还使用了一个回归器来微调每个候选区域的边界框,这个回归器被训练为预测候选区域与实际目标边界框之间的差异。
- 训练:RCNN的训练分为两个阶段,预训练和微调。①预训练阶段,卷积神经网络(Alexnet)在大规模图像分类任务上进行与训练,以获得有用的特征提取器。②微调阶段,使用标注的目标检测数据对整个RCNN模型进行微调,包括SVM分类器和边界框回归器。
- 优点和缺点:①优点:RCNN在目标检测上取得了很好的性能,特别是在大规模目标检测数据集上。它能够处理不同大小和形状的目标,并且可以适应多类别目标检测。②缺点:RCNN是一个复杂的多阶段模型,难以实现端到端的训练,后续版本(如Fast R-CNN和Faster R-CNN)针对这些缺点进行了改进,提高了速度和性能。
2、Fast R-CNN(Fast Region-based Convolutional Neural Network)
Fast R-CNN是在RCNN和Selective Search基础上提出的改进方法,主要创新是将整个目标检测流程集成到一个卷积神经网络(CNN)种,从而显著提高了速度和性能。
- 候选区域生成:不同于RCNN中使用选择性搜索,FastRCNN使用卷积网络直接从输入图像中生成候选区域。使用一个称为Region Proposal Network(RPN)的子网络,RPN可以高效地生成多尺度和多形状地候选区域,这些区域被称为锚框(Anchor Boxes)。
- 特征提取:FastRCNN使用卷积神经网络来提取每个候选区域的特征。这些区域特征被送入网络中以进行目标分类和边界框回归。使用卷积层和ROI(Region of Interest)池化层来提取固定维度的特征向量
- 目标分类和边界框回归:对于每个候选区域,Fast R-CNN使用两个并行的全连接层,一个用于目标分类(哪个类别?)和用于边界框回归(目标位置)。分类层使用softmax来预测目标的类别概率,而回归层用于微调候选区域的边界框。
- 训练:Fast R-CNN进行端到端的训练,可以同时优化RPN、目标分类和边界框回归的损失函数。训练数据包括正样本(包含目标的锚框)、负样本(不包含目标的锚框)以及他们的标签。
3、Faster R-CNN(Faster Region-based Convolutional Neural Network)
Faster R-CNN 进一步改进了 Fast R-CNN,将目标检测模型的速度提高到了一个新的水平,同时保持了很高的准确性。
- 候选区域生成:Faster R-CNN引入了一个完全卷积网络,作为RPN,用来生成候选区域。RPN是一个端到端可训练的网络,可以生成候选区域。
- 特征提取:与Fast-RCNN类似,Faster R-CNN 使用卷积神经网络来提取候选区域的特征。
- 目标分类和边界框回归:Faster R-CNN 与 Fast R-CNN 具有相似的目标分类和边界框回归步骤。
- 训练:Faster R-CNN 通过联合训练 RPN 和检测网络(包括目标分类和边界框回归)来优化整个系统。整个模型可以一次性生成候选区域并执行目标检测,从而提高了速度。
二、yolo系列
计算机视觉领域,目标检测是一个十分重要的研究主题, 广泛应用在人脸识别、车牌识别、安防、智慧交通、自动驾驶等领域。主要经典算法有:YOLO
1、YOLOv1
以往的二阶段检测算法,如Faster-RCNN,在检测时需要经过两步:边框回归和softmax分类。由于大量预选框的生成,该方法检测精度较高,但实时性较差。YOLO之父Joseph Redmon提出了通过直接回归的方式获取目标检测的具体位置信息和类别分类信息。极大的降低了计算量,显著提升了检测的速度。达到了45FPS(Fast YOLO版本达到了155FPS)。
- 思路:①将输入图片缩放至448x448x3大小;②经过卷积网络backbone提取特征图;③把提取到的特征图送入两层全连接层,最终输出7x7x30大小的特征图。更进一步讲,就是将输入的图片整体划分为SxS的网格(例如7x7),物体中心落在哪一个格子中,那么该各自就负责该物体的检测,每一个格子预测B个边框,输出SxS(B*5+C)。对于YOLOv1而言,常用的是7x7的网格划分,预测2个边框,输出7x7x30,30个通道包含每个类别的概率+边框置信度+边框位置信息。
- 网络结构:骨干网络是GoogleNet网络,24个卷积层+2个全连接层。使用7x7卷积。
- 优势与不足:①优点:与二阶段检测算法相比,利用直接回归的方式,大大缩小了计算量,提升了运行速度。②不足:每一个网格仅有两个预测框,当存在多物体密集挨着或者小目标的时候,检测效果不好。
2、YOLOv2
与YOLOv1相比,v2做了三点改变①更换骨干网络;②引入PassThrough;③借鉴了二阶段检测的思想,添加了预选框。
- 思路:将图片输入到darknet19网络中提取特征图,然后输出目标框类别信息和位置信息。
- 网络结构:骨干网络为darknet19,如下图所示针对1000类别的分类任务,只不过对于检测任务而言,需要使用3x3卷积(输出通道1024)取代上表中最后的卷积层,再添加Passthrough操作后,进行输出。已不再使用7x7这样的大卷积核:
- 技巧1: PassThrough操作-该方法将28x28x512调整为14x14x2048,后续v5版本中的Focus操作类似该操作。将生成的14x14x2048与原始的14x14x1024进行concat操作。
- 技巧2:引入anchor,调整位置预测为偏移预测借鉴了Faster-RCNN的思想,引入了anchor,将目标框的位置预测由直接预测坐标调整为偏移量预测,大大降低了预测难度,提升了预测准确性。
- 优势与不足:①优势:利用passthrough操作对高低层语义信息进行融合,在一定程度上增强了小目标的检测能力。采用小卷积核代替7x7的大卷积核,降低了计算量,同时改进的位置偏移策略降低了检测目标框的难度。② 尚未采用残差网络结构,且当存在多物体密集挨着的时候或者小目标的时候,检测效果有待提升。
3、YOLOv3
针对YOLOv2的问题,YOLOv3引入了残差网络模块。①再darknet19的基础上推陈出新,引入残差,并加深网络深度,提出了Darknet53;②借鉴了金字塔的思想,在三个不同的尺寸上分别进行预测。
- 思路:YOLOv3检测算法是将图片输入到darknet53网络中提取特征图,然后借鉴特征金字塔网络思想,将高级和低级语义信息进行融合,在低、中、高三个层次上分别预测目标狂,最后输出三个尺度的特征图信息(52×52×75、26×26×75、13×13×75)。
其中, 52×52 大小的特征图负责检测小目标, 26×26大小的特征图负责检测中目标, 13×13大小的特征图负责检测大目标。下图中,黄色表示目标框真值,蓝色表示3个预选框。
在训练之前,预先通过聚类的方式生成小,中,大三个尺寸的预选框,共9个。预测时最终会输出
3x(20+1+4)的数据。一个目标框的输出数据如下:
- 网络结构:骨干网络是Darknet53
- 技巧:特征金字塔,该版本借鉴了特征金字塔的思想,只不过与普通的FPN相比略有不同。①选择融合的层不同;②融合方式不同。对于普通FPN而言,是将高级语义的小尺寸特征图上采样后与上一层进行逐像素相加的融合,融合后尺寸大小和通道数保持不变。而对于YOLOv3而言,是将高级语义的小尺寸特征图上采样到SxS后,选择前面的同为SxS的特征图进行通道方向拼接的融合,融合后,尺寸大小不变但通道数为两者之和。
- 优势:基本解决了小目标检测的问题,在速度和精度上实现了较好的平衡。
4、YOLOv4
Alexey Bochkovskiy大神对YOLOv3进行了升级改造,核心思想与之前基本一致,不过从数据处理、主干网络、网络训练、激活函数、损失函数等方面对子结构进行了大量的改进。
- 重要升级:①将CSP结构融入Darknet53中,生成了新得主干网络CSPDarknet53;②采用SPP空间金字塔池化来扩大感受野;③在Neck部分引入PAN皆否,即FPN+PAN形式;④引入Mish激活函数;⑤引入Mosaic数据增强;⑥训练时采用CIOU_loss,同时预测时采用DIOU_nms。
- 网络结构:骨干网络时CSPDarknet53(含spp) Neck:FPN+PAN,检测头同v3版本。
- 技巧1:输入数据采用Mosaic数据增强,借鉴了2019年CutMix的思路,并在此基础上进行了拓展,Mosaic数据增强方式采用了4张图片,随机缩放,随机裁剪,随机排布的方式进行拼接,从而对小目标的检测起到了进一步的提升的作用。
- 技巧2 :修改骨干网络为CSPDarkbet53,借鉴了2019CSPNet的经验,并结合先前的Darknet53,获得了新的骨干网络CSPDarknet53。在CSPNet中,存在如下操作,即进入每个stage先将数据划分为两部分,如下图中的part1, part2,区别在于CSPNet中直接对通道维度进行划分,而YOLOv4应用时是利用两个1x1卷积层来实现的。两个分支的信息在交汇处及进行concat拼接。
- 技巧3:引入SPP空间金字塔池化模块, 引入SPP结构来增加感受野,采用1x1、5x5、9x9、13x13的最大池化的方式,进行多尺度融合,输出按照通道进行concat融合。类似于语义分割网络PSPNet中的PPM模块。
- 技巧4:在Neck部分采用FPN+PAN的结构,借鉴了 2018年图像分割领域PANet,相比于原始的PAN结构,YOLOv4实际采用的PAN结构将addition的方式改为了concatenation,如下图:
- 由于FPN结构是自顶向下的,将高级特征信息以上采样的方式向下传递,但是融合的信息依旧存在不足,因此YOLOv4在FPN之后又添加了PAN结构,再次将信息从底部传递到顶部,如此一来,FPN自顶向下传递强语义信息,而PAN则底向上传递强定位信息,达到更强的特征聚合效果。整个NECK结构如下图所示:
- 优势: 对比v3和v4版本,在COCO数据集上,同样FPS等于83左右时,Yolov4的AP是43,而Yolov3是33,直接上涨了10个百分点。
5、YOLOv5
YOLOv5版本 UltralyticsLLC 公司推出的,是在YOLOv4的基础上做了少许的修补,①将v4版本骨干网络中的CSP结构拓展到NECK结构中。②增加了FOCUS操作,但是后续6.1版本又剔除掉了该操作,使用一个6x6的卷积进行了替代。③使用SPPF结构代替SPP。
- 思路:与v4版本基本一致
- 技巧1:SPPF,主要区别就是MaxPool由原来的并行调整为串行,值得注意的是:串行两个 5 x 5 大小的 MaxPool 和一个 9 x 9 大小的 MaxPool 是等价的,串行三个 5 x 5 大小的 MaxPool 层和一个 13 x 13 大小的 MaxPool 是等价的。虽然并行和串行的效果一样,但是串行的效率更高,降低了耗时。
- 技巧2:自适应锚框计算:比较简单,就是把锚框的聚类改为了使用程序自适应计算,此处就不再赘述了。
- 技巧3:Focus操作, 后续版本提出了该操作,此处就不展开介绍了。
6、Yolov6
YOLOv6是由美团推出的,所作的主要工作是为了更加适应GPU设备,将2021年RepVGG结构引入到了YOLO。
- YOLOv6检测算法的思路类似YOLOv5(backbone+neck)+YOLOX(head),主要有如下改动①骨干网络由CSPDarknet换为了EfficientRep;②Neck是基于Rep和PAN构建了Rep-PAN;③检测头部分模仿YOLOX,进行了解耦操作,并进行了少许优化。
- 网络结构:骨干网络是EfficientRep; Neck: FPN+RepPAN; 检测头:类似YOLOX.。
- 技巧1:引入RepVGG ,按照RepVGG的思路,为每一个3X3的卷积添加平行了一个1x1的卷积分支和恒等映射分支,然后在推理时融合为3x3的结构,这种方式对计算密集型的硬件设备会比较友好。
- 技巧2:骨干网络 EfficientRep,把backbone中stride = 2的卷积层换成了stride=2的RepConv层,并且也将CSP-Block修改为了RepBlock。
- 技巧3:Neck中引入Rep, 为了进一步降低硬件上的耗时,将PAN中的CSP-BLOCK替换为RepBlock,从而生成了Rep-PAN结构。
- 技巧4:对检测头解耦并重新设计了高效的解耦头,为了加快收敛速度和降低检测头复杂度,YOLOv6模仿YOLOX对检测头进行了解耦,分开了目标检测中的边框回归过程和类别分类过程。 由于YOLOX的解耦头中,新增了两个额外的3x3卷积,会在一定程度增加运算的复杂度。鉴于此,YOLOv6基于Hybrid Channels的策略重新设计出了一个更高效的解耦头结构。在不怎么改变精度的情况下降低延时,从而达到了速度与精度的权衡。
- 优势:对耗时做了进一步的优化,进一步提升YOLO检测算法性能。
7、Yolov7
YOLOv7是YOLO4团队的续作,主要是针对模型结构重参化和动态标签分配问题进行了优化。
- 思路:YOLOv7检测算法的思路是与YOLOv4、v5类似。
- 主要改动:①提出了计划的模型结构重参化。②借鉴了YOLOv5、Scale YOLOv4、YOLOX,“拓展”和“复合缩放”方法,以便高效的利用参数和计算量。③提出了一种新的标签分配方法。
- 网络结构:在YOLOv4、YOLOv5、YOLOv6基础上通过添加了以下tricks进行了进一步的升级改造。
- 技巧1:高效的聚合网络,E-ELAN采用expand、shuffle、merge cardinality结构,实现在不破坏原始梯度路径的情况下,提高网络的学习能力。在体系结构方面,E-ELAN只改变了计算模块中的结构,而过渡层的结构则完全不变。作者的策略是利用分组卷积来扩展计算模块的通道和基数,将相同的group parameter和channel multiplier用于计算每一层中的所有模块。然后,将每个模块计算出的特征图根据设置的分组数打乱成G组,最后将它们连接在一起。此时,每一组特征图中的通道数将与原始体系结构中的通道数相同。最后,作者添加了G组特征来merge cardinality。
- 技巧2:模型缩放, 类似于YOLOv5、Scale YOLOv4、YOLOX,一般是对depth、width或者module scale进行缩放,实现扩大或缩小baseline的目的。
- 技巧3: 引入了卷积重参化并进行了改进采用梯度传播路径来分析不同的重参化模块应该和哪些网络搭配使用。同时分析出RepConv中的identity破坏了ResNet中的残差结构和DenseNet中的跨层连接,因此作者做了改进,采用没有Identity连接的RepConv结构进行卷积重参数化。下图是设计的用于PlainNet和ResNet的计划重参数卷积。
技巧4: 引入了辅助训练模块-coarse-to-fine(由粗到细)引导标签分配策略,常用的方式是图(c)所示,即辅助头和引导头各自独立,分别利用ground truth和它们(辅助头、引导头)各自的预测结果实现标签分配。YOLOV7算法中提出了利用引导头的预测结果作为指导,生成从粗到细的层次标签,将这些层次标签分别用于辅助头和引导头的学习,如下图(d)和(e)所示。
- 优势:参数量和计算量大幅度减少,但性能仍能保持少量的提升。