CNN backbone 总结笔记

算是一篇梳理backbone的总结笔记,前面部分不少内容都是照搬 reference 2 的,稍微总结了一下里面的内容,后面增加了其中遗漏的以及今年新出的网络(FPN,Hourglass,ResNeXt,DCN,DPN,SENet,MobileNet v3),用了很多网图,联系侵删;

Reference: 

1. https://arxiv.org/pdf/1908.03673.pdf,19年8月的目标检测硬核综述;

2. https://www.cnblogs.com/silence-cho/p/11620863.html,backbone总结的很细致了,强烈推荐;

下图是目标检测的发展历程,可以看到其中backbone对于其发展起到了至关重要的作用,大多数milestone都有在backbone上有新的创新。

CNN backbone 总结笔记_第1张图片

其发展方向主要有三种类型:

1. 深度:网络层数增加,VGG -> ResNet -> ResNeXt

2. 模块化:GoogLeNet系列,ResNeXt(Inception 结构)

3. 轻量:MobileNet系列,ShuffleNet;

一些比较早的网络结构大致了解一下即可。


  • LeNet-5
    • 结构简单,主要是卷积和全连接;

CNN backbone 总结笔记_第2张图片


  • AlexNet
    • 分为上下两部分卷积,因算力不足分别放在两块GPU上;
    • 使用ReLU替代Sigmoid,有效缓解了梯度消失问题;
    • 使用局部相应归一化;
    • 使用数据增广和dropput防止过拟合;

CNN backbone 总结笔记_第3张图片


  • ZFNet
    • 将AlexNet起始的卷积由(11x11,stride 4)修改为 (7x7,stride 2)
    • 增加中间卷积核的通道数;

CNN backbone 总结笔记_第4张图片


  •  VGGNet
    • 结构简洁,5层卷积,3个全连接,softmax作为输出,层之间用max-pooling分开,隐层采用ReLU激活函数;
    • 采用小卷积核(3x3)和多卷积核,减少参数也增加了非线性映射(增强表达能力);
    • 结论:局部响应归一化无增益;网络层数加深性能变好;多个小卷积核由于单个大卷积核;

CNN backbone 总结笔记_第5张图片


  • GoogLeNet(Inception) v1:
    • 引入inception结构,性能和vgg差不多但参数量少很多:既保持网络结构的稀疏性(减少参数,减轻过拟合),又能利用密集矩阵的高计算你性能,Inception网络结构的主要思想是寻找用密集成分来近似最优局部稀疏连接;
    • 加深的基础上加宽,使用稀疏的网路结构又能产生稠密的数据;
    • 采用不同大小的卷积核获得不同大小的感受野,最后在channel上拼接实现不同尺度特征融合;
    • 采用1x1卷积接一个ReLU,既减少计算量增加了非线性能力;
    • 采用 average pool 替代全连接层;

CNN backbone 总结笔记_第6张图片


  • GoogLeNet(Inception) v2:
    • 用两个3*3卷积代替一个5*5卷积,降低参数量;
    • 将滤波器大小nxn的卷积分解为1xn和nx1卷积的组合(7x7卷积相当于首先执行1x7卷积,然后在其输出上执行7x1卷积(在中度大小的特征图上效果较好,featuremap size 在12-20之间);
    • 将池化和卷积并行执行再合并,保持特征表示并降低计算量;

CNN backbone 总结笔记_第7张图片

CNN backbone 总结笔记_第8张图片


  • GoogLeNet(Inception) v3:
    • 采用 RMSProp优化器;
    • Factorization into small convolution: 将7x7分解成两个一维的卷积(1x7,7x1),3x3也是一样(1x3,3x1),加速计算同时加深网络,提高非线性表达能力;
    • 辅助分类器中使用 BN;
    • 采用 label smoothing,防止过拟合;

  • GoogLeNet(Inception) v4:
    • 利用 ResNet 来改进 v3,得到 Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4网络;

CNN backbone 总结笔记_第9张图片


  • ResNet:
    • 传统网络 y = f(x),ResNet Block公式为:y = f(x) + x,一来其导数比传统网络加了1,即使原导数很小也可以保证梯度不消失;二是引入恒等映射,解决了网络深度增加带来的网络退化问题;
    • 第一个卷积层采用了7*7的大卷积核,更大的感受野,获取图片更多的初始特征;
    • 短路连接中,输入和输出维度不一致时采用步长为2的卷积来减小维度尺寸;

CNN backbone 总结笔记_第10张图片CNN backbone 总结笔记_第11张图片


  • DenseNet: 
    • 采用shortcut连接,与ResNet一致,但是是将前面所有层与后面层密集连接(dense connection);
    • 采用channel concatenate来实现特征重用(代替ResNet的Element-wise addition);
    • Transition layer主要是用来降低feature map的尺寸,将来自不同层的feature map变化为同等尺寸后进行concatenate:Transition Layer = BN + ReLU + 1x1 Conv + 2x2 Average Pool;
    • 密集连接提升了梯度的反向传播,使得网络更容易训练 (每层可以直达最后的误差信号);
    • 参数更小且计算更高效 (concatenate来实现特征复用,计算量很小);
    • 特征复用,分类器使用到了低级特征;
    • 需要较大的显存才能运行(所有层都需存储);

CNN backbone 总结笔记_第12张图片

CNN backbone 总结笔记_第13张图片


  • 轻量级网络:
    • 优化结构:ShuffleNet;
    • 减少参数:SqueezeNet;
    • 优化卷积计算:MobileNet,Winograd;
    • 删除全连接层:SqueezeNet,LightCNN;

CNN backbone 总结笔记_第14张图片


  •  SqueezeNet:
    • 多使用1*1的卷积,少使用3*3的卷积,减少参数量;
    • 3*3卷积采用更少的channel数;
    • 降采样后置,即推迟使用Pooling,从而增加感受野,尽可能多的获得feature;
    • 网络基础单元是 Fire Module,多个 fire module 堆叠,结合pooling组成SqueezeNet;
    • Fire Module又包括 squeeze layer(主要是1*1的卷积,对网络channel进行压缩)和 Expand layer (1*1的卷积和3*3的卷积进行concat):

CNN backbone 总结笔记_第15张图片CNN backbone 总结笔记_第16张图片


  • MobileNet v1:
    • 主要压缩策略是深度可分离卷积(Depthwise separable Convolution):深度卷积(depthwise conv) + 逐点卷积(pointwise conv);
    • 深度卷积(下图一): 对每一通道单独进行卷积操作,得到和输入特征图通道数一致的输出特征图;
    • 逐点卷积(下图二):即1*1的卷积,对深度卷积得到的特征图进行升维;
    • 深度可分离卷积单元相比传统卷积多一个ReLU6激活函数和1x1卷积层(下图三);
    • 假设图像尺寸 H x W x D,卷积核 N x K x K x C,传统卷积计算量: H x W x N x K x K x C;深度可分离卷积计算量:H x W x K x K x D(depthwise conv) + N x H x W x C (pointwise conv);参数量是传统卷积的 1 / N + 1 / K^{2}

CNN backbone 总结笔记_第17张图片     CNN backbone 总结笔记_第18张图片

CNN backbone 总结笔记_第19张图片


  • MobileNet v2:
    • 引入 linear bottleneck:在 MobileNet v1 训练是容易出现卷积层参数为空的现象,这是由于对低维度做ReLU运算容易造成信息丢失,反之高维度信息丢失就很少,因此去掉卷积之后的最后一个ReLU6函数换成 linear 即得到 linear bottleneck(本身模型参数不多,ReLU使得部分参数为0就更难以学到信息);
    • 引入 inverted residuals:在深度卷积之前使用 1x1 卷积进行升维(升维倍数为t,默认 t = 6),再在一个更高维的空间中进行卷积操作来提取特征,随后再进行降维,inverted residual: 升维 + 卷积 + 降维,刚好和 resnet 的操作相反(因为本身初始的channel就很少,所以不适合先降维再升维);

CNN backbone 总结笔记_第20张图片

CNN backbone 总结笔记_第21张图片


  • MobileNet v3:
    • TODO,NAS相关,待补;

  • ShuffleNet v1:
    • 主要压缩思路是 group convolutionchannel shuffle
    •  group convolution(分组卷积 、 群卷积):将输入特征图按通道数分为几组,然后采用不同的卷积核再对各个组进行卷积,可以降低计算量(常规卷积在所有通道上进行卷积,群卷积算是一种稀疏卷积);
    • channel shuffle(通道混洗):群卷积不同组之间的特征图信息不通信,不利于提取特征;而MobileNet是采用密集的1x1 pointwise convolution进行通道特征融合,计算量较大;channel shuffle 的思路是对群卷积之后的特征图顺序打乱重排,这样下一个群卷积的输入就来自不同的组,信息可以在不同组之间流转;
    • 图三(a): Bottleneck with DW Conv;  (b):ShuffleNet Unit with GConv + Channel Shuffle; (c):ShuffleNet unit with stride = 2;
    • 群卷积:减少计算量;1x1 卷积:维度融合; 1x1 群卷积:快速维度融合; 
    • 与ResNet共同之处:都使用 skip connection(1x1-3x3-1x1);不同之处:使用深度卷积(DConv);
    • 与MobileNet v2共同之处:使用深度卷积(1x1-3x3-1x1),两种bottlenecks;不同之处:使用1x1 GConv,若有FC层则使用ReLU激活函数;

CNN backbone 总结笔记_第22张图片

CNN backbone 总结笔记_第23张图片

 CNN backbone 总结笔记_第24张图片


  • ShuffleNet v2:
    • 给出了4条guidelines:
      • ​​​​​​​ 卷积层的输入和输出特征通道数相等时MAC(memory access cost)最小,此时模型速度最快;
      • 过多的群卷积操作会增大MAC,从而使模型速度变慢;
      • 模型中的分支数量越少,模型速度越快;
      • element-wise操作所带来的时间消耗远比在FLOPs上的体现的数值要多,因此要尽可能减少element-wise操作;
    • channel split然后concat,保证输入输出channel一致;
    • 去掉1*1的分组卷积(channel split相当于分组了);
    • channel split和将channel shuffle移动到后面;
    • 利用concat代替 element-wise add;

CNN backbone 总结笔记_第25张图片



  • FPN:
    • ​​​​​​​同时兼顾高层语义信息和低层位置信息;
    • 不同尺度特征融合对大目标和小目标都可以更好的提取相应的特征;
    • bottom-up和top-down尺寸相同的特征图对应相加(如果维度不同,使用 1x1 卷积调整维度后相加)

​​​​​​​CNN backbone 总结笔记_第26张图片


  • Hourglass(用于人体关键点估计)
    • 使用多尺度特征,捕捉人体各关节点的空间位置信息;
    • 网络结构形似沙漏状,重复使用top-down到bottom-up(论文使用了8个沙漏结构)来推断人体的关节点位置;
    • 中继监督训练,对每一个hourglass模块都添加loss,这就相当于是8个loss一起监督;
    • 整个hourglass不改变特征的尺度,只改变特征的深度;

​​​​​​​CNN backbone 总结笔记_第27张图片

CNN backbone 总结笔记_第28张图片


  • R-FCN:
    • ​​​​​​​在共享卷积层的最后一层网络上接上一个卷积层,而该卷积层就是位置敏感得分图 position-sensitive score map;
    • ROl 的 K*K i个子区域在各个类别的score maps上每个子区域的响应值,就是通过位置敏感Rol池化操作(Position-sensitive RoI pooling)找到的;
    • 在ResNet的共享卷积层的最后一层上面连接一个与position-sensitive score map并行的score maps (维度 4*K*K )用来进行regression操作;
    • 和Faster R-CNN相比,R-FCN具有更快的运行速度(2.5倍以上),稍微提高了一点检测精度,在速度和准确率之间进行了折中;

CNN backbone 总结笔记_第29张图片


  • ResNeXt:
    • ​​​​​​​不增加参数复杂度的前提下提高准确率,同时还减少了超参数的数量;
    • 采用 VGG 堆叠的思想和 Inception 的 split-transform-merge 思想,可扩展性比较强;
    • cardinality(the size of the set of transformations,即下图中的C,增加 cardinality 比增加深度和宽度更有效;
    • 算法流程:splitting,transforming和aggregating,实际实现过程中是 1x1 卷积降维 -> 3x3 群卷积 -> 1x1 升维;

CNN backbone 总结笔记_第30张图片

​​​​​​​​​​​​​​CNN backbone 总结笔记_第31张图片


  • DCN(Deformable Convolution Network):
    • Deformable Convolution & Deformable RoI Pooling 解决思路是让​​​​​​​传统的Convolution和RoI Pooling操作能够“自动形变”,通过给传统卷积采样点加offsets的方式来获得新的采样点;
    • 下图右侧的offset field就是变形卷积外加的待训练参数,大小和输入的 feature map 一致,卷积窗口在offset field上滑动就呈现了卷积像素偏移的效果,达到采样点优化的效果;若使用3*3的卷积核,则输入的 feature map 通过卷积生成一个新的channel 数为 2*3*3 的 feature map(大小不变),分别代表不同方向上x, y的offset值;
    • 若 pooling 的目标为一个 3*3 的featrue map,那么就需要 2×3 个偏置对应每一个bin,首先将输入的featrue map进行roi pooling为3*3大小的feature,然后通过全连接,输出为每一个bin(输出feature map大小决定bin个数)对应的offset。同时为了保证采样大小,需要对offset进行normalization。

​​​​​​​CNN backbone 总结笔记_第32张图片

CNN backbone 总结笔记_第33张图片


  • DPN(Dual Path Networks):
    • ​​​​​​​融合了ResNeXtDenseNet的核心思想:short-connection结构,group convolution,跨层连接;

CNN backbone 总结笔记_第34张图片

CNN backbone 总结笔记_第35张图片


  • RetinaNet(Focal Loss for Dense Object Detection)
    • 不算是backbone里的了,但是算是OD中比较重要的一篇,提出one stage精确度不足的重要原因有class imbalance;
    • two stage模型大多会对bg与fg预分类, 因此bg数量不会远大于fg数量, 而one stage模型为了提升速度舍弃了proposal过程, 因此大多数模型也谈不上预分类问题,这样虽然速度提升并且使用交叉熵, 但往往还是由于easy sample数目远大于hard sample,  以至于easy sample的loss统治整体loss;
    • 此前,OHEM(Online Hard Example Mining)直接舍弃部分easy example, 毫无疑问会导致数据残缺, 进而影响结果;
    • focal Loss只是交叉熵的变种,它会引入一个惩罚因子降低分类比较好的损失,达到样本均衡效果;
    • RetinaNet如下图,左半部分就是FPN,右半边分了上下两个权值不共享的卷积网络, 一个是用来分类,另一个是用来anchor box 回归;

CNN backbone 总结笔记_第36张图片


  • RefineNet:
    • ​​​​​​​结构类似 Unet,利用了ResNet网络,在四种不同的下采样阶段中,将特征图输入到refineNet模块中,产生融合后的特征图。除了refineNet4之外,每一个refineNet模块都有两个输入,一个是本阶段的特征图,另一个是低层产生的经过处理的特征图,这样随着下采样的进行,语义信息也逐渐丰富,最终得到的得分图,经过上采样操作恢复原有图片大小;

CNN backbone 总结笔记_第37张图片



  • SENet:
    • ​​​​​​​网络根据loss去学习特征权重,使得有效的feature map权重大,无效或效果小的feature map权重小的方式训练模型达到更好的结果。
    • Squeeze 操作将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野;
    • Excitation 操作类似于RNN中门机制,通过参数 w 来为每个特征通道生成权重,其中参数 w 被学习用来显式地建模特征通道间的相关性;
    • Reweight 操作将 Excitation 的输出的权重看做是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定;

CNN backbone 总结笔记_第38张图片


  • NASNet:
    • 基于NAS,不是很了解,待填坑;


  • EfficientNet(也是大厂才有可能做出来的产物,后面有空再补吧)
    • ​​​​​​​总结了三种网络调节方式:增大感受野w,增大网络深度d,增大分辨率大小r,对应下图(b,c,d);
      • 1,在r和w大小不变的情况下,随着d的增大,准确率没有太大的差异;
      • 2,在d和w不变的情况下,随着r的增大,准确率有较大提升;
      • 3,r和d不变的情况下,随着w的增大,准确率先有较大提升,然后趋于平缓,往后在无太大提升;
    • 将网络复合系数的确定转为如下的优化问题:
      • CNN backbone 总结笔记_第39张图片
      • H, W 为卷积核大小,C 为通道数,X 为输入 tensor;
    • 约束条件:
      • ​​​​​​​CNN backbone 总结笔记_第40张图片

CNN backbone 总结笔记_第41张图片

CNN backbone 总结笔记_第42张图片


  • DetNAS:
    • 同上,占个坑吧;

CNN backbone 总结笔记_第43张图片

你可能感兴趣的:(概念总结)