JJJYmmm 发布的文章

相较于RCNN的改进

  • Fast RCNN仍然使用selective search选取2000个建议框,但是这里不是将这么多建议框都输入卷积网络中,而是将原始图片输入卷积网络中得到特征图,再使用建议框对特征图提取特征框。这样做的好处是,原来建议框重合部分非常多,卷积重复计算严重,而这里每个位置都只计算了一次卷积,大大减少了计算量
  • 由于建议框大小不一,得到的特征框需要转化为相同大小,这一步是通过ROI池化层(region of interest)来实现的
  • Fast RCNN里没有SVM分类器和回归器了,分类和预测框的位置大小都是通过卷积神经网络输出
  • 为了提高计算速度,网络最后使用SVD代替全连接层

算法流程

  • 输入一张图片,使用Selective Search获取建议框(region proposal)
  • 将原始图片输入卷积神经网络之中,获取特征图
  • 对每个建议框,从特征图中找到对应位置(按照比例映射),截取出特征框(深度保持不变)
  • 将每个特征框划分为 HxW个网格(论文中是 7×7 ),在每个网格内进行最大池化(即每个网格内取最大值),这就是ROI池化。这样每个特征框就被转化为了 7×7×C 的矩阵
  • 每个矩阵展平为一个向量,分别作为之后的全连接层的输入
  • 全连接层的输出有两个,计算class得分bounding box回归。前者是sotfmax的21类分类器(假设有20个类别+背景类),输出属于每一类的概率(所有建议框的输出构成得分矩阵);后者是输出一个 20×4 的矩阵,4表示(x, y, w, h),20表示20个类,这里是对20个类分别计算了框的位置和大小
  • 对输出的得分矩阵使用非极大抑制方法选出少数框,对每一个框选择概率最大的类作为标注的类,根据网络结构的第二个输出,选择对应类下的位置和大小对图像进行标注

image-20230307213534355

网络结构

​ 网络backbone采用VGG-16,不用resnet是因为那个时候还没有resnet

​ 最开始仍然是在ImageNet数据集上训练一个1000类的分类网络,随后将模型进行以下改动

  • 最后一个最大池化层换成ROI池化层
  • 将最后一个全连接层和后面的softmax1000分类器换成两个并行层,一个是全连接层1+21分类器,另一个是全连接层2+表示每个类预测框位置的输出

​ 使用变动后的模型,在标注过的图像数据上fine-tuning,训练时要输入图像、标注(这里将人为标注的框称为ground truth)和建议框信息。这里为了提高训练速度,采取了小批量梯度下降的方式,每次使用2张图片的128张建议框(每张图片取64个建议框)更新参数

训练网络

每次更新参数的训练步骤如下

  • 2张图像直接经过前面的卷积层获得特征图
  • 根据ground truth标注所有建议框的类别。具体步骤为,对每一个类别的ground truth,与它的iou大于0.5的建议框标记为groud truth的类别(正样本),对于与ground truth的iou介于0.1到0.5之间的建议框,标注为背景类别(负样本)
  • 每张图片随机选取64个建议框(要控制背景类的建议框占75%),提取出特征框
  • 特征框继续向下计算,进入两个并行层计算损失函数
  • 反向传播更新参数(关于ROI池化的反向传播细节可以参考这篇博客

image-20230307213611296

损失函数

​ 跟YOLO系列类似(其实应该是YOLO与rcnn类似),损失函数分成两部分——分类损失和回归损失。

  • 对类别输出按照softmax正常计算损失(交叉熵损失)
  • 对框的位置的损失方面,标注为背景类的建议框(负样本)不增加损失(体现在下面公式中的 [u>1] 艾弗森括号)。对于标注为物体类别的建议框(正样本)来说,先计算ground truth的四个标注参数,再和网络的预测值来计算loss(采用smoothL1 loss)

image-20230307213352907

论文中的其他

  • 全连接层使用SVD分解来减少计算时间
  • 模型在各种数据集上的测试效果及对比
  • 在fine-tuning基础上更新哪些层的参数实验
  • SVM V.S. softmax,输入多种规格的图片,更多训练数据等等

image-20230307213740234

摘要

​ RCNN可以说是利用深度学习进行目标检测的开山之作。在当时的VOC 2012数据集上,将mAP提升了30%以上,达到了53.3%。

​ 这篇论文主要提出两个关键见解:

  • 可以将高容量的卷积神经网络应用在自底向上的区域建议(region proposal),以此来定位和分割对象。
  • 当训练数据不足时,可以选择进行辅助任务的监督预训练,再针对具体任务进行fine-tuning,以此获得显著的性能提升。

算法流程

  • 一张图像生成1k~2k个候选区域(使用Selective Search)
  • 对每个候选区域,使用深度网络提取特征
  • 特征送入每一类的SVM分类器,判别种类
  • 使用回归器对候选框进行微调

image-20230307094945946

候选区域生成

​ 使用Selective Search算法。算法大致思路是通过聚类的方法在图像上初步分割,找到

颜色/纹理/大小/相似度比较相似的区域,再根据这些区域进行加权合并,最后(希望)得到一些包括了GT box的候选框。

image-20230307095455683

AlexNet 提取特征

​ 对于每个候选框,将框中的内容提取出来,并缩放至227x227的大小,送入AlexNet中提取特征,产生4096维的向量

这里之所以一定要缩放到固定大小,是因为CNN里面有全连接层

image-20230307100723121

SVM分类

​ 将2000x4096的特征矩阵与20个SVM(20个类别)组成的4096x20权值矩阵相乘,得到2000x20的分数矩阵,行表示每个候选区域,列表是该候选区域对应类别的分数(概率).

​ 针对分数矩阵,在每一列中应用greed NMS剔除重叠的建议框,得到该列中得分较高的一些候选框。

之所以用SVM而不是直接softmax在论文附录中有提到,第一个原因是训练神经网络和训练SVM时采用的参数(IoU阈值)不一致,无法直接实现端到端。第二个原因是softmax无法实现难例挖掘(存疑)

回归器修正候选框位置

​ 回归器同样是利用CNN输出的特征向量(4096维)进行预测,通过预测相对于候选框的宽高偏移和位置偏移,可以对候选框的位置进行微调,更接近GT Box。

​ 预测时通过四个函数dx/dy/dw/dh来拟合GT Box,前两个公式拟合GTBox的中心位置,后两个位置拟合宽高的指数偏移。

image-20230307101918729

​ 训练时的标签值可以由以下公式获得。也就是上面四个公式的逆变换。

image-20230307102128616

网络框架

image-20230307101120843

卷积可视化

​ 论文里提到一个卷积可视化的概念。具体来说,选择在神经网络的某一个神经元,将他作为一个独立的对象检测器使用。对于该神经元,输入10 million的region proposal,找到这些区域中使该神经元值最大的那些候选框。通过输出这些图像,可以发现每个神经元有自己偏好的识别模式.比如上半身/狗子/红花等等。

image-20230307102830346

​ 论文中也提到这些神经元选取的是POOL5中的神经元。POOL5在网络尾部,所以偏好的识别模式也是比较抽象的(上文提到的上半身等等)。同时论文中也说到在一个通道内,坐标y/x只影响感受野,不影响识别模式。(很好理解,卷积核是不变的)

image-20230307102533964

消融实验

​ 论文里还做了一些消融实验,比较了神经网络中卷积层和全连接层的作用。在不进行fine-tuning时,不加全连接的mAP比较高;加了fine-tuning后,加了全连接的mAP比较高。得出结论:

①在HOG意义上,通过仅使用CNN的卷积层来计算任意大小的图像的密集特征图方面具有潜在的实用性。这种表示将使得能够在pool5特征之上使用滑动窗口检测器(包括DPM)进行实验。(其实就是卷积层负责提取通用特征?)

②从ImageNet学习的pool5特征是通用的,并且大部分mAP改善是通过在其上学习特定的非线性分类器获得的。(全连接层负责整合特征)

RCNN存在的问题

  • 测试速度慢,测试一张图片需要53s(CPU),首先需要2秒提取候选框,随后对2k个候选框进行卷积操作(最耗时间),最后进行矩阵乘法和NMS(以及利用回归器)筛选(回归)候选框。其中神经网络抽取特征耗时最长,因为进行很多重复操作(2k个候选框难免会有很多重叠区域)
  • 训练速度慢,不是端到端的系统,SVM分类器,BBOX回归器都需要单独训练。
  • 训练所需空间大,训练SVM和回归器的时候需要将每个候选框的特征写入磁盘。对于VGG16,从VOC2007训练集上5k个图像提取的特征,需要数百GB的存储空间。

论文地址

[1706.03762] Attention Is All You Need (arxiv.org)

Abstract

​ 目前的主流序列转译模型基本是编码器-解码器架构的复杂RNN或CNN网络(当然现在已经是Transformer了),本文提出了一个简单的网络结构——Transformer。Transformer完全基于注意力机制,在机器翻译上可以达到比RNN/CNN更好的效果,同时并行化效率更高,训练时间更少。作者测试了模型在英翻德/英翻法翻译任务的效果,并尝试证明了Transformer对其它任务的泛化能力。

Introduction

​ 简单介绍了一下当前序列建模和预测的主流方法——LSTM/GRU。

RNN在每个时间步都会生成一个隐状态Ht,Ht中保存了以往单词的历史信息,使RNN在序列任务上表现较好。当然,Ht需要按时间步依次计算,并行度比较低,计算效率比较低。同时历史信息是逐步传递的,对于序列比较长的输入,较早时间步的信息有可能被遗忘,当然这个可以通过增加隐藏层单元来缓解,不过这也会进一步导致内存过大的问题。

​ Attention机制其实已经应用在序列模型中,不过依旧是结合RNN在做。

​ 本文提出完全基于Attention机制的Transformer,并行度比较高。

Model Architecture

​ Transformer整体架构如下图。接下来将逐层介绍。

image-20230320220735447

Encoder

​ 编码器由N=6个层组成,每层由两个子层组成。第一个子层是多头注意力,第二个子层是FeedForward层(就是一个隐藏层的MLP)。每个子层都使用了残差链接LayerNorm

$$ LayerNorm(x + Sublayer(x)) $$

Decoder

​ 解码器同样由N=6个层组成,每层由三个子层组成。除了Encoder中的两个子层外,还有一个Masked Multi-Head Attention层。这里之所以要Mask是因为在训练时,t时刻需要保证Decoder无法看到t时刻以后的输入,保证训练和预测行为是一致的。

Attention

​ 注意力简单来说由K(key) Q(query) V(value)三部分组成,对于每个query,根据query和每个key的相似度算对应value的加权和。

Scaled Dot-Product Attention

​ 本篇论文中计算query和key的相似度采用内积的方法,根据内积的值来作为对应value的权重(加权前需要做一次softmax)。

​ 实际应用中,做完内积后需要除以sqrt($d_k$)。主要原因是当$d_k$比较大时,做完内积后的值会比较大,那么不同内积值之间的绝对差距就会比较大,这会影响softmax的输出,即softmax的输出会向两边分散(0/1),那么反向传播的时候,就会难以训练。(因为softmax一般是跟1/0的label去比较)。所以需要÷$d_k$来缩小绝对差距。

​ mask操作也比较简单,在t时刻计算完内积后,将t+1时刻及往后的key对应的内积值换成很小的负数,那么之后做softmax并加权计算得到的value中那些“不应该出现的key-value”所占的比例就很小了。

$$ Attention(Q,K, V) = softmax(QK^T/sqrt(d_k))V $$

image-20230320222343891

Multi-Head Attention

​ 来自CNN多通道识别不同模式的灵感,做多头注意力。

​ 具体操作是先把KQV映射到比较低的维度(具体维度大小就是$d_{model}/h$),分别做h次注意力机制,将结果concat起来并映射回原尺度。

image-20230320222814348

$$ MultiHead(Q,K, V) = Concat(head1, ..., headh)W^O \\where headi = Attention(QW^Q_i ,KW^K_i , VW^V_i ) $$

image-20230320223208490

Applications of Attention in our Model

​ 总共在三个部分用到了多头注意力机制。

  • 第一个应用在Encoder中,KQV都是输入本身
  • 第二个是在Decoder中的Masked Multi-Head Attention,跟第一个相比多了一个Mask操作KQV同样是输入本身
  • 第三个也在Decoder中,其K和V是来自Encoder的输出;Q则来自Masked Multi-Head Attention的输出。也就是把编码器的输出根据Mask注意力的输出(想要的东西)抽出来。

FeedForward

​ 其实就是一个带有一个隐藏层的MLP,将MLP对于每个词都作用一次。这个的作用跟RNN中的MLP效果很像,就是把注意力抓取(aggregation)得到的信息(包括了序列信息)做一次投影,映射到更合适的语义空间,或者说利用MLP做语义转换

$$ FFN(x) = max(0, xW1 + b1)W2 + b2 $$

image-20230320224053838

Embeddings and Softmax

​ Embedding就是把token映射到一个向量。编码器和解码器用的Embedding用的权重一致,方便训练。最后Embedding的结果乘了一个sqrt($d_{model}$),这是为了和之后的Positional Encoding做scale适配

Positional Encoding

​ 因为Attention机制只记录序列信息,而不记录时序信息。通过在输入加入位置编码信息,来增加时序信息。具体编码方式如下。

$$ PE_{(pos,2i)} = sin(pos/10000^{2i/d_{model}}) \\PE_{(pos,2i+1)} = cos(pos/10000^{2i/d_{model}}) $$

Why Self-Attention

​ 本节介绍了为什么要用自注意力机制。主要总结了一下这张表。

​ 从计算复杂度/序列计算复杂度/最大路径复杂度。

最大路径可以理解成获得任意两个点的关系最少需要的步数

image-20230320225319835

Train

​ 具体详见论文/源码。

  • 使用Adam,β1=0.9,β2=0.98
  • image-20230320225609440
  • 正则化手段

    • Residual Dropout P=0.1
    • Label Smoothing

Different Variations on the Transformer architecture

image-20230320225859976

Conclusion

​ 本篇论文提出了一个完全基于注意力机制的序列转译模型,用多头注意力代替了以往常用的RNN。对于机器翻译任务,Transformer有明显的训练速度和准确率优势。同时Transformer有可能应用在图片/视频等其他媒体,实现多模态的输入,

模型对比

不同版本的YOLOv5的表现如下,参数量从小到大为n-s-m-l-x,mAP也逐渐升高,不过推理速度也近乎翻了一倍(V100)

表格后一部分带6的模型是针对高分辨率图片的,参数更多,mAP更高,具体差异将在网络结构提及

image-20230305102634129

网络结构

网络主体

  • Backbone: New CSP-Darknet53
  • Neck: SPPF, New CSP-PAN
  • Head: YOLOv3 Head

​ YOLOv5针对不同大小(n, s, m, l, x)的网络整体架构都是一样的,只不过会在每个子模块中采用不同的深度和宽度,分别应对yaml文件中的depth_multiple和width_multiple参数。

官方除了n, s, m, l, x版本外还有n6, s6, m6, l6, x6,区别在于后者是针对更大分辨率的图片比如1280x1280,当然结构上也有些差异,后者会下采样64倍,采用4个预测特征层,而前者只会下采样到32倍且采用3个预测特征层

Backbone

​ YOLOv5在Backbone部分较于v4没太大变化。但是YOLOv5在v6.0版本后相比之前版本有一个很小的改动,把网络的第一层(原来是Focus模块)换成了一个6x6大小的卷积层。两者在理论上其实等价的,但是对于现有的一些GPU设备(以及相应的优化算法)使用6x6大小的卷积层比使用Focus模块更加高效。详情可以参考这个issue #4825。

​ 下图是原来的Focus模块(和之前Swin Transformer中的Patch Merging类似),将每个2x2的相邻像素划分为一个patch,然后将每个patch中相同位置(同一颜色)像素给拼在一起就得到了4个feature map,然后在接上一个3x3大小的卷积层。这和直接使用一个6x6大小的卷积层等效。

等效这个说法还是需要琢磨一下,形状确实等效。但是能达到同一效果应该是实验出来的?

image-20230322192111819

Neck

​ Neck部分把SPP换成了SPPF。传统SPP是几个最大池化层(k5,k9,k13)并行计算再将结果concat起来SPPF则是将最大池化层做串行处理。从数学角度来说,两个k5 maxpool串联等效于一个k9 maxpool,三个k5 maxpool串联等效于一个k13 maxpool。而较小的核可以提高计算量,所以效率提高了~

image-20230322192118601

​ 除了SPP,Neck部分还在PAN结构中加入了CSP,这个以后再好好研究一下~

image-20230322192123175

Head

​ 检测头和v3/v4一样

数据增强

  • Mosaic:将四张图片拼成一张图片

image-20230322192130148

  • Copy paste:将部分目标随机粘贴到其他图片中,前提是数据要有segments数据。这个方法相当于扩充了数据集

在这里插入图片描述

  • Random affine(Rotation, Scale, Translation and Shear):随机进行仿射变换,但根据配置文件里的超参数发现只使用了ScaleTranslation即缩放和平移

image-20230322192135937

  • MixUp:就是将两张图片按照一定的透明度融合在一起,之前v4提到过

image-20230322192140739

  • 其他还有Albumentations/Augment HSV/Random horizaontal flip等等

训练策略

在YOLOv5源码中使用到了很多训练的策略

  • Multi-scale training(0.5~1.5x),多尺度训练,假设设置输入图片的大小为640 × 640 640 \times 640640×640,训练时采用尺寸是在0.5 × 640 ∼ 1.5 × 640 0.5 \times 640 \sim 1.5 \times 6400.5×640∼1.5×640之间随机取值,注意取值时取得都是32的整数倍(因为网络会最大下采样32倍)。
  • AutoAnchor(For training custom data),训练自己数据集时可以根据自己数据集里的目标进行重新聚类生成Anchors模板
  • Warmup and Cosine LR scheduler,训练前先进行Warmup热身,然后在采用Cosine学习率下降策略
  • EMA(Exponential Moving Average),可以理解为给训练的参数加了一个动量,让它更新过程更加平滑(类似于优化器里的momenten)。
  • Mixed precision,混合精度训练,能够减少显存的占用并且加快训练速度,前提是GPU硬件支持。
  • Evolve hyper-parameters,超参数优化,没有炼丹经验的人勿碰,保持默认就好。

损失计算

​ v5的损失计算和之前版本区别不大,都是三部分组成。

  • Classes loss || 使用BCE loss || 只计算正样本的分类损失
  • Objectness loss || 使用BCE损失 || label值是predict box和GT box的CIoU || 计算所有样本
  • Location loss || 定位损失 || 采用CIoU loss || 只计算正样本

权重因子

P3采用的权重是4.0,P4权重为1.0,P5权重为0.4。这是针对coco数据集设置的超参数。

解释性角度来说,小物体更难检测,所以权重自然就大(

$L_{obj}$=4.0⋅$L^{small}_{obj}$+1.0⋅$L^{medium}_{obj}$+0.4⋅$L^{large}_{obj}$

坐标映射

首先是bx/by,即预测框中心离grid cell左上角的偏移,这里给了sigmod函数一个常数2的因子,让bx/by的区间范围从-0.5~1.5,更容易取到1.

image-20230305105754849

image-20230305105940220

其次是bw/bh,即预测的相对于Anchor box的宽高偏移。

image-20230305110036898

原来是直接乘了一个指数函数,当预测值tw/th比较大的时候,容易出现梯度爆炸,所以改成上式,将范围缩减到0-4之间。(这个范围也影响了之后的正样本匹配)

正样本匹配

​ 在v3/v4中的正样本匹配一般只看锚框和GT Box的IoU大小。在v5中还比较了GT Box和Anchor的宽高比例。

image-20230305110302803

统计这些比例和它们倒数之间的最大值,这里可以理解成计算GT BoxAnchor Templates分别在宽度以及高度方向的最大差异(当相等的时候比例为1,差异最小)

image-20230305110323481

​ 接着统计$r_w^{max}$ 和$r_h^{max}$ 之间的最大值,即宽度和高度方向差异最大的值

image-20230305110415200

​ 如果GT Box和对应的Anchor的r^{max}小于阈值anchor_t(在源码中默认设置为4.0),即GT Box和对应的Anchor Template的高、宽比例相差不算太大,则将GT Box分配给该Anchor Template模板。

image-20230305110756988

图源CSDN 太阳花的小绿豆

​ 接下来步骤就和v4一样了.需要注意的是由于偏移tx/ty现在的范围是-0.5~1.5,所以可以增加GT Box分配的grid cell,增加一点正样本。

image-20230305110953638

参考博客

太阳花的小绿豆 YOLOv5网络详解_太阳花的小绿豆的博客-CSDN博客](https://blog.csdn.net/qq_37541097/article/details/123594351))

摘要

YOLOv4使用了一些新特性:

WRC/CSP/CmBN/SAT/Mish && activation/Mosaic && data augmentation/DropBlock && regularization/CIou loss

Introduction

​ 当前(2020)最精确的现代神经网络无法实时进行目标检测,并且需要多块GPU进行训练(对显存有较高要求)。

​ 而YOLOv4可以在一个传统GPU上进行训练/推断,降低了使用门槛。具体来说,GPU可以是1080 Ti/2080 Ti

​ 除此之外,在YOLOv4上对比了“Bag-of-freebies”“Bag-of-Specials”这两类方法对模型的影响。

​ 最后,通过改进CBN/PAN/SAM,使YOLOv4更适合单GPU训练

Related work

Ordinary object detector

​ 一般来说,一个现代detector应该由两部分组成——一个在ImageNet预训练过的backbone、一个检测头用于类别和BBox的预测

骨干网络

  • GPU平台有VGG/ResNet/ResNeXt/DenseNet
  • CPU平台有SqueezeNet/MobileNet/ShuffleNet

检测头

  • two-stage:R-CNN/faster R-CNN/R-FCN/Libra R-CNN anchor-free:RepPoints
  • one-stage:YOLO/SSD/RetinaNet anchor-free:CenterNet/CornerNet/FCOS

Neck:

Neck介于backbone和head之间,主要功能是融合不同阶段的特征图,混合浅层细粒度特征和深层的语义特征

  • 主要代表有:FPN/PAN/BiFPN/NAS-FPN

以下是通用检测器的结构图

image-20230226172814228

Bag of freebies

Definitions:We call these methods that only
change the training strategy or only increase the training
cost as “bag of freebies.“

​ Bag of freebies指只改变训练策略或只增加训练开销的方法。其中一个典型代表是data augmentation(数据增强)。

data augmentation

常见的数据增强有:

  • 调整图像的亮度、对比度、色调、饱和度,添加噪点
  • 随机缩放、裁剪、翻转、旋转
以上方法都是逐像素调整,保留了原始像素信息。

除此之外,还有数据遮挡方面的增强:

  • CutOut:随机选择图像中的矩形区域,填充随机值/0
  • hide-and-seek/grid mask:随机或均匀地选择图像中的多个矩形区域并替换为零
  • 特征映射中也有和hide-and-seek类似的方法,DropOut/DropConnect/DropBlock
  • MixUp:将两个图像以不同系数叠加,并按照系数调整标签
  • CutMix:将裁剪后的图像覆盖到其他图像的矩形区域,并根据混合区域的大小调整标签
  • GAN:风格转移也可以做数据增强,并且这种使用可以减少CNN学习的纹理偏差

image-20230226201332445

Imbalance between different classes

​ 在数据集中可能会存在语义分布偏差问题,也就是不同类之间存在较大的数据量差异。这个问题可以通过难例挖掘解决。不过难例挖掘不适用于单阶段检测器,因为单阶段检测器属于密集预测架构。

​ 因此focal loss被提出(这个方法在YOLOv3论文中有被提到。不过不怎么work),focal loss用于解决正负类样本数量不均衡的问题,对于YOLOv3而言,由于IOU阈值设得比较高(好像是0.5),一些预测的比较好的框被判为负类,从而使负类里混了正样本。focal loss又会强调这些负类的loss,导致网络无法学到较好的效果。

BBox regression

​ 之前BBox的损失计算,是直接对四个参数(可能是左上角右下角坐标,也可能是中心点宽高,再或者中线点以及相对于锚框大小的偏移)直接计算MSE,这有个问题就是没有考虑到对象本身的完整性,四个参数都是视作独立变量处理

​ 新改进就是引入IoU损失,因为IoU计算本身会用到BBox四个坐标点,反向传播的时候可以都更新到,并且这个时候这四个点是作为一个整体考虑的。其次IoU损失是一种尺度不变的表示,可以解决传统方法的问题。即无论是L1 loss还是L2 loss,尺度增加loss都会不可避免的增大。

​ 近年来,推出了GIoU损失,它不仅考虑了覆盖区域,还考虑了物体的形状和方向,具体来说就是找到同时覆盖预测框和真实框的最小的BBox作为新的分母,代替原来的分母计算IoU.

DIoU损失则额外考虑了物体中心点的距离CIoU则同时考虑了覆盖面积、中心点之间的距离和宽高比,具有更好的收敛速度和精度。

Bag of specials

Definitions: For those plugin modules and post-processing methods that only increase the inference cost by a small amount but can significantly improve the accuracy of object detection, we call them “bag of specials”.

​ Bag of specials 指那些增加少量推理开销却能显著提高目标检测准确率的模块和后处理方法。

​ 一般来说,这些模块增强了模型中的某些属性,比如扩大感受野、引入注意力机制、增强特征整合等。

​ 后处理则是对模型的预测结果进行筛选。

enhance receptive field

​ 增强感受野的模块有SPP/ASPP/RFB。

​ SPP起源于SPM,SPM是分割特征图并提取词袋特征。SPP则是将SPM集成到CNN中,使用Maxpool代替词袋操作。改进后的SPP是具有核大小k × k的maxpool输出的级联,其中k = {1,5,9,13},并且stride等于1。

​ ASPP和RFB是对SPP的进一步改进。

the attention module

​ 物体检测中常用的注意力模型主要分为通道注意力和点注意力,这两种注意力模型的代表分别是挤压和激励(SE)和空间注意力模型(SAM)。

​ 虽然SE模块可以在ImageNet图像分类任务中以仅增加2%的计算量为代价提高ResNet50 1%的top-1准确率,但在GPU上通常会增加约10%的推理时间,因此更适合在移动设备上使用

​ 而对于SAM,它只需要付出0.1%的额外计算,就可以将ResNet50-SE在ImageNet图像分类任务中的top-1准确率提高0.5%。最棒的是,它完全不影响GPU上的推理速度

feature integrations

​ 特征集成方面,早期的实践是使用跳跃连接(skip connection)或超列(hyper-column)将低级物理特征集成到高级语义特征。随着FPN等多尺度预测方法的流行,许多集成不同特征金字塔的轻量级模型被提出。这类模块包括SFAM、ASFF和BiFPN。SFAM的主要思想是利用SE模块对多尺度级联特征图进行通道级重加权。对于ASFF,它使用softmax进行逐点水平重加权,然后添加不同尺度的特征图。在BiFPN中,提出了多输入加权残差连接进行尺度级重加权,然后添加不同尺度的特征图。

good activation function

​ 一个好的激活函数可以使梯度更有效地传播,同时不会引起太多额外的计算代价。2010年,Nair和Hinton提出ReLU,实质上解决了tanh和sigmoid中经常遇到的梯度消失问题.(但是relu也可能会导致梯度爆炸吧?)随后,LReLU、PReLU 、ReLU6 、缩放指数线性单元(SELU)、Swish 、硬Swish和Mish等,其也被用于解决梯度消失问题。LReLU和PReLU的主要目的是解决当输出小于零时ReLU的梯度为零的问题。(leaky relu也可以吧)至于ReLU6和硬Swish,它们是专门为量化网络设计的。为了实现神经网络的自归一化,提出了SELU激活函数来满足这一目标。值得注意的是Swish和Mish都是连续可微的激活函数。

post-process

​ 基于深度学习的目标检测中常用的后处理方法是NMS,它可以过滤掉对同一目标预测不好的BBox,只保留响应较高的候选BBox。NMS试图改进的方法与优化目标函数的方法是一致的。NMS提出的原始方法没有考虑上下文信息,Girshick等在R-CNN中加入了分类置信度作为参考,并根据置信度的大小,按照得分从高到低的顺序进行贪婪NMS。对于soft NMS,考虑了对象遮挡可能导致具有IoU值的贪婪NMS的置信度下降的问题。DIoU NMS 开发者的思路是在soft NMS的基础上,在BBox筛选过程中加入中心点距离的信息。值得一提的是,由于上述后处理方法均未直接参考捕获的图像特征,因此在后续开发无锚方法时不再需要进行后处理

Methodology

架构选择

  • 骨干网络选择CSPDarknet53,有29个3 × 3的卷积层,725 × 725的感受野和27.6M的参数。
  • 在CSPDarknet53上添加SPP块,因为它显著增加了感受野,分离出最显著的上下文特征,并且几乎不引起网络运行速度的降低
  • 使用PANet作为针对不同检测器水平的不同骨干水平的参数聚合方法,而不是YOLOv3中使用的FPN
  • 选择CSPDarknet53 backbone、SPP附加模块、PANet Neck和YOLOv3 head作为YOLOv4的体系结构。

用到的BoF/BoS

​ 对于Bag of freebiesBag of specials见这里。

​ YOLOv4里用到了以下这些技术。

image-20230226194356292

对于训练激活函数,由于PReLU和SELU较难训练,而ReLU6是专门为量化网络设计的,因此将上述激活函数从候选列表中移除。在正则化的方法上,发表DropBlock的人详细地将他们的方法与其他方法进行了比较,他们的正则化方法大获全胜。因此作者选择DropBlock作为正则化方法。对于归一化方法的选择,由于关注仅使用一个GPU的训练策略,因此不考虑syncBN。

针对单GPU训练的进一步改进

  • 介绍了一种新的数据增强马赛克自对抗训练(SAT)方法
  • 在应用遗传算法时选择最佳超参数
  • 修改了一些现有方法使其更适合于高效训练和检测:修改SAM、修改PAN和交叉小批量归一(CmBN)

mosaic augmentation

​ Mosaic是一种新的数据增广方法,它混合了4个训练图像,而CutMix仅混合2个输入图像。这允许检测其正常上下文之外的对象。(检测比较突兀的物体)此外,BN在每层上计算4个不同图像的activation statistics(这里不是很懂)。这显著降低了对大的小批量的需求。也就是一张图相当于四个图(batch size有x4的效果)。

image-20230226195129562

SAT

​ 自我对抗训练(SAT)也代表了一种新的数据增广技术,其在2个阶段中操作。在第一阶段,神经网络改变原始图像而不是网络权重。通过这种方式,神经网络对自身执行对抗性攻击,改变原始图像以创建图像上没有期望对象的欺骗。在第二阶段,训练神经网络以正常方式检测该修改图像上的对象

这里论文也没细说如何修改原始图像的....说的比较笼统

CmBN

​ CmBN表示CBN的修改版本,如图4所示,定义为交叉小批量归一化(CmBN)。这只在单个batch内的mini-batch之间收集统计信息。(大概就是把batch norm再细化了一下,从更小的单位做归一化吧)

image-20230226195612298

modify SAM/PAN

​ modify SAM这玩意作者在最后代码里没用,估计是效果不好。

image-20230226200012675

最终网络一览

image-20230226200122835

一些值得注意的改进点

1.之前为了让预测的坐标中心点落在当前grid cell里面,采用sigmoid函数对txty进行约束,这导致了只有在tx/ty特别大的时候,这一项才会是1,即预测很难到达网格边缘,为了解决这个问题,在sigmiod前乘了一个大于1的因子,来稍微补偿一下这个问题。

image-20230226201553852

2.实验对比表示,CSPResNeXt50+PAN+SPP+SAM效果最好

image-20230226201841301

3.PAN结构如下,就是在FPN的基础上多了一个下采样操作。通过第二次下采样,期望将浅层的定位信息也传递到深层的特征图中。

具体步骤

  • 先复制特征金字塔中最底下的那层(①),变成新特征金字塔的最底层。
  • 将新特征金字塔的最底层来一个下采样操作,然后原特征金字塔的倒数第二层进行一个3 3卷积,步幅为2;然后与下采样后的最底层进行一个横向连接,两者相加。最后再来一个33卷积来融合他们的特征。
  • 新特征金字塔其他层的操作与(2)一致

原文链接:https://blog.csdn.net/weixin_55073640/article/details/122637249

image-20230302171919060

Conclusions

​ 本篇文章算是对之前YOLOv3的延续,网络本身没有什么大的改动(无非换了一个backbone/把FPN换成SAM/加了SPP,算法核心没变),而是使用了很多trick来提高性能(BOF/BOS),并且对单GPU训练提供更好的支持。

image-20230226202243879

复现

​ 感觉是在复现各种trick...暂时先咕了