文章目录
一:几大主流backbone的效果比较
当前主流的几大backbone,从发布时间开始排序,有VGG,Resnet, Mobilenet,swimtransformer等,VGG作为最早期的网络架构提出,有里程碑式的价值,但因为结构思想的简单,总体的提取特征效果远不如后继者。Resnet的提出,解决了先前网络深度最大只能到30几层就会过拟合与梯度消失的问题,盘活了深度学习,其中的残差结构至今也被广泛使用,整体性能也是不错的。Mobilenet v1-v3无疑是轻量级backbone网络的首选,深度可分离卷积的提出大大减少了网络的param和multi-add,同时巧用SE模块中的通道注意力思想,在“偷工减料”的同时还增加了网络的强健性,可谓妙不可言。近几年屠杀CV界backbone的代表作swimtransformer,将NLP中的self-attention机制运用到了CV领域,将图像数据转化为Patch序列,不断学习patch与patch间的关系,最后提取出的特征效果也很乐观,但是最大的问题就是需要大量的训练数据。
今天,我想主要谈一谈2019年末谷歌大脑团队提出的Efficient Net,可以说是当下武林比较强悍的backbone!话不多说,上图:
效果有点碾压了前几年的backbone大佬,其中B0-B7表示各种参数的版本,这事也就谷歌爸爸能干出来了,没错,就是用的NAS搜索出来的!但我们做搬运工就行啦,还是感谢!!下面我们来仔细聊一聊这个牛×的backbone网络。
二:EfficientNet
EfficientNet的核心其实是如何利用复合系数统一缩放模型的所有维度(说人话就是每个方面都顾及到,每个维度缩放都加入),达到精度最高效率最高,符合系数包括w,d,r,其中,w表示卷积核大小,决定了感受野大小;d表示神经网络的深度;r表示分辨率大小。
首先总结一下我们常用的三种提升网络能力的方式:增大感受野w,增大网络深度d,增大分辨率大小r,三种方式示意图如下:
其中,(a)为基线网络,也可以理解为小网络;(b)为增大感受野的方式扩展网络;©为增大网络深度d的方式扩展网络;(d)为增大分辨率r的方式扩展网络;(e)为EfficientNet所采用的混合参数扩展方式;
深度(d):缩放深度越深,越有更好的非线性表达能力,可以学习更复杂的变换,从而可以拟合更加复杂的特征,更深的网络可以更简单地学习复杂特征。但网络加深会带来梯度不稳定、网络退化的问题,过深的网络会使浅层学习能力下降。深度到了一定程度,性能就不会提升了,还有可能会下降。尽管有一些技术,例如跨层连接、批量归一化等可以有效减缓训练问题,但是深层网络的精度回报减弱了,Figure 3(中)可见。
宽度(w):缩放网络宽度也是一种常用的手段,足够的宽度可以保证每一层都学到丰富的特征,比如不同方向,不同频率的纹理特征。宽度太窄,特征提取不充分,学习不到足够信息,模型性能受限。
但是,宽度贡献了网络大量计算量,太宽的网络会提取过多重复特征,加大模型计算负担。同时,非常宽而又很浅的网络在捕捉高层次特征时有困难,Figure 3(左)表明了当网络宽度随着w变大时,精度很快就饱和了。
Resolution(r):使用更高分辨率的输入图像,ConvNets可能可以捕捉到更细粒度的模式。从最早的 224x224,现在有些ConvNets为了获得更高的精度选择使用 229x229 或者 331x331。目前,GPipe使用 480x480 的分辨率获得了最先进的ImageNet精度,更好的精度比如 600x600 也被广泛使用在目标检测网络中。Figure 3(右)展示了缩放网络分辨率对精度的影响,同样可以看到在非常高的分辨率时网络精度回报会减弱。
我们经验上可以观察到不同缩放维度之间是不独立的,直观上来讲,对于分辨率更高的图像,我们应该增加网络深度,因为需要更大的感受野来帮助捕获更多像素点的类似特征,同时也应该增加网络宽度来获得更细粒度的特征。这些直觉指导着我们去协调平衡不同缩放维度而不是传统的单个缩放维度。
简言之,为了追去更好的精度和效率,在缩放时平衡网络所有维度至关重要。google团队提出了一个新的复合缩放方法——使用一个复合系数ϕ统一缩放网络宽度、深度和分辨率:
这里的α,β,γ都是由一个很小范围的网络搜索得到的常量,直观上来讲ϕ是一个特定的系数,可以控制用于资源的使用量,α,β,γ决定了具体是如何分配资源的。值得注意的是,常规卷积op的计算量是和d,w2,r2成正比的,加倍深度会使得FLOPS加倍,但是加倍宽度和分辨率会使得FLOPS加4倍。由于卷积ops经常在CNN中占据了大部分计算量,使用等式(3)缩放ConvNet将会使得整体计算量近似增加(α⋅β2⋅γ2)ϕ倍。
最终,谷歌团队运用以上所述的搜索策略,得到了一个高效的网络,便称之为EfficientNet-B0,因为谷歌团队使用的搜索空间和MnasNet相似,所以得到的网络结构也很相似,不过因为FLOPS的预算更高所以EfficientNet-B0稍微大了点。
下面我来详细讲解一下EfficientNet的架构。
1.EfficientNet网络结构
它的主要构建块就是倒置瓶颈MBConv,其网络结构如下:
其中的MBConv1指的是MBCon层中没有expand网络宽度,MBConv6则指的是层中expand网络宽度到6倍。整个网络架构基本都是由MBConv层构建的,MBConv层的结构框图如下:
总体而言,和MobileNet的bneck结构有异曲同工之妙,有关MobileNet的讲解可看本人另一篇文章
2.细节描述
1)Depthwise separative卷积
有关DS的详细讲解在本人另一篇文章中
2)SE模块
有关SE模块的详细讲解在本人另一篇文章中
3)Drop connect
Drop connect的思想和Dropout的思想相似,都可以有效的减少过拟合风险,只是Dropout是直接随机杀死神经元,而这里的Drop-connect只是随机去掉权重连接线,依旧保留所有的神经元。如图:
三:EfficientDet检测算法
既然讲完了EfficientNet,那么必然也得讲讲目标检测领域中,运用EfficientNet作为backbone的EfficientDet检测算法。一如既往一个字,牛!!,上图给大伙儿看一看它的威力:
总体而言,EfficientDet = EfficientNet + BiFPN,那么接下来讲一讲什么是BiFPN呢,想必FPN(图像金字塔)大家都耳熟能详,就是融合多尺度特征,将高层的语义信息和底层的空间信息巧妙混合,同时在YOLO_v4中还提出了变种PANet,如下图:
当然,特征融合的花活,也是琳琅满目,再看下图:
最后,展现一下我们的BiFPN:
当然,不同版本的BiFPN网络层数,需要根据精度和速度要求来选择,如下图:
至此我对EfficientNet和EfficientDet进行了简单讲解,希望对大家有所帮助,有不懂的地方或者建议,欢迎大家在下方留言评论。
我是努力在CV泥潭中摸爬滚打的江南咸鱼,我们一起努力,不留遗憾!