点击上方“CVer”,选择加"星标"或“置顶”
重磅干货,第一时间送达
作者:akkaze-郑安坤
https://zhuanlan.zhihu.com/p/100609339
本文已由作者授权,未经允许,不得二次转载
cnn中各个参数的辩证矛盾。
深度决定了网络的表达能力,网络越深学习能力越强。
宽度决定了网络在某一层学到的信息量。
感受野决定了网络在某一层看到多大范围,一般说来最后一层一定至少要能看到最大的有意义的物体,更大的感受野通常是无害的。
在达到相同感受野的情况下,多层小卷积核的性能一定比大卷积核更好。
分辨率很重要,尽量不要损失分辨率,为了保住分辨率,在使用下采样之前要保证在这一层上有足够的感受野,这个感受野是相对感受野,是指这一个下采样层相对于上一个下采样层的感受野,把两个下采样之间看成一个子网络的话,这个子网络必须得有一定的感受野才能将空间信息编码到下面的网络去,而具体需要多大的相对感受野,只能实验,一般说来,靠近输入层的层空间信息冗余度最高,所以越靠近输入层相对感受野应该越小。同时在靠近输入层的层,这里可以合成一个大卷积核来降低计算量。
这种矛盾决定了下面的做法:
前面几层下采样频率高一点,中间层下采样频率降低,并使用不下采样的方法提高深度。
网络能深则深,在保持比较小宽度的时候,要想办法加深网络,变深的过程中网络慢慢变胖。
使用小卷积核,小卷积核有利于网络走向更深,并且有更好的识别鲁棒性,尤其是在分辨率更小的特征图上,因为卷积核的尺寸是相当于特征图的分辨率来说的,大特征图上偏大的卷积核其实也并不大。
下采样在网络前几层的密度大一些,(这样能尽可能用微弱精度损失换取速度提升) 越往后下采样的密度应该更小,最终能够下采样的最大深度,以该层的感受野以及数据集中最大的有意义物体尺寸决定(自然不可能让最大有意义的物体在某一层被下采样到分辨率小于1,但是网络依然可以work,只不过最后几层可能废弃了(要相信cnn的学习能力,因为最大不了它也能学出单位卷积,也就是只有中心元素不为0的卷积核),更准确的说这是最大感受野的极限,最大感受野应该覆盖数据集中最大有意义的物体)。
第一层下采样的时候大卷积核能尽可能保住分辨率(其实相当于合成了两三层小卷积核,另外,这和插值是类似的,类比于最近邻插值,双线性插值,双三次插值,这其实和感受野理论一致,更远的插值意味着更大的感受野)。
shortcut connection里,找不到concat,用add凑合吧,在需要量化的场合,add会更好,反之亦然。
先训一个大模型然后裁剪,也许比直接训一个小模型性能好。
能用可分离卷积替代的卷积一定要替代,一般除了第一个卷积,都能替代,替代完后考虑给替代可分离的通道数乘以2,因为可分离卷积的参数和计算量都是线性增长的,这样做依然有速度增益。同样的道理适用于2+1分离卷积。
inception或者shortcut connection或者dense connection其实都相当于ensemble模型,考虑结合使用,shortcut connection的使用几乎是无痛的。
网络最后面完全可以使用不采样的空洞卷积来做,对于分割尤其如此。
转置卷积完全可以使用上采样+卷积来替代。
这四种上采样方法里面,a的性能最好,但是计算量最大,b的计算量也很大,c和d的计算量相当,但是c很容易产生棋盘格现象。
a和b还有更加快速的版本,可见
interleaving的实现如下,可以参见tensorflow的depth_tospace或者pytorch的pixel_shuffle,这就是子像素卷积
对于分割模型而言,在encoder和decoder之间使用长跳转连接,在encoder和decoder内部使用短跳转连接,尤其是encoder比较深的情况下。
感受野也不是越大越好(大感受野意味着更多的语义信息),对于某些low-level的任务而言,比如图像降噪,感受野可能也就局部patch大小,对于low-level而言,下采样的意义更小,尽可能少使用下采样。
对于检测,anchor层不一定要有三层,同一层按照需求可以设定的aspect ratio和size都是可选的,比如blazeface使用两层anchor,这个要按照需求设计,事实上不同的层其实代表着不用的scale,三层就是三个scale,两层就是两个scale,一般说来scale分为大中小三种,但是依具体情况而变,主要取决于数据集中的scale分布。
bifpn真的有用,性能有提升且计算量小。
batchnorm一定要用,如果你是多机多卡,也可以考虑同步的batchnorm。
如果你的一阶段检测模型得不到好的分类结果,考虑两阶段,先检测再分类。
检测模型里的预训练模型是有用的,至少能提升前景背景的检测区分度。
metric learning(图像比对)一般说来是batchsize更大会性能更好,因为这样能采样到的正负样本对的范围更大。
如果你的分类精度不够是因为有两类或者多类太相近造成的,考虑使用其他softmax,比如amsoftmax。
如果你的分类精度不够是样本不均衡造成的,考虑使用focal loss。
不要只看精度,考虑其他metrics,并始终以上线后的可视化效果为最终评判标准。
尽可能使用全卷积网络来做landmark,不要直接用fc回归,回归真的不太稳定。另外,数学意义上的cnn是平移不变的,位置信息是通过padding泄露出来,所以fc直接回归landmark相当于用padding去拟合位置信息。
全卷积回归landmark如有必要一定要考虑part affinity fields的做法。
part affinity fields是替代picturiol model最好的选择,并且它也是全卷积的,它能极大的提高关节点检测的鲁棒性
一定要做图像亮度变换增强,亮度鲁棒性会更好,但是要结合你的数据的亮度分布自适应的调整。
最后,在不改动网络backbone的基础上,多尝试一些新的loss,工程上的代价并不大。
所有疑惑,请参见我的文章:CNN真的需要下采样(上采样)吗? 并参考其他论文。
重磅!CVer-学术交流群已成立
扫码可添加CVer助手,可申请加入CVer大群和细分方向群,细分方向已涵盖:目标检测、图像分割、目标跟踪、人脸检测&识别、OCR、姿态估计、超分辨率、SLAM、医疗影像、Re-ID、GAN、NAS、深度估计、自动驾驶、强化学习、车道线检测、模型剪枝&压缩、去噪、去雾、去雨、风格迁移、遥感图像、行为识别、视频理解、图像融合、图像检索等群。
一定要备注:研究方向+地点+学校/公司+昵称(如目标检测+上海+上交+卡卡),根据格式备注,可更快被通过且邀请进群
▲长按加群
▲长按关注我们
麻烦给我一个在看!