一,通用优化技巧
1.1 数据增强
数据增强(Data Argumentation)则是从数据层面解决过拟合,提高模型的泛化性(generalization),通用的数据增强方法有:几何变换、颜色抖动(color jitter)、噪声(高斯噪声)、Cutout(遮掩一部分)、PCA jitter等等
- 几何变换:裁切、缩放、水平翻转、旋转、 平移、仿射变换等。
- 颜色抖动:亮度、色调、饱和度、对比度。
注意:一定要做图像亮度变换增强,亮度鲁棒性会更好,但是要结合你的数据的亮度分布自适应的调整
代码参考:【SSD算法】史上最全代码解析-数据篇
1.1.1 Mixup
简单来讲就是将两张图片通过不同的比例进行融合,同时图片对应的one-hot编码也以相同的比例相乘,从而构造出新的数据集。 本质上,mixup在成对样本及其标签的凸组合(convex combinations)上训练神经网络,可以规范神经网络,增强训练样本之间的线性表达。 其优点是:
- 改善了网络模型的泛化能力
- 减少对错误标签的记忆
- 增加对抗样本的鲁棒性
- 稳定训练过程,部分解决 “Elephant in the room”问题
1.1.2 Classfication Head Label Smoothing
Label Smoothing 原理简单来说就是:在分类的时候,比如二分类把原先的标签(0,1) (称为hard target) 转成 soft target,具体方法就是 y‘ = y (1 − α) + α/K 这里α 是个超参数常量,K就是类别的个数 。
参考:目标检测算法优化技巧
1.2 卷积核相关
常用技巧:batchnorm一定要用、xavier
初始化、
- 网络能深则深,在保持比较小宽度的时候,要想办法加深网络,变深的过程中网络慢慢变胖(金字塔型或者沙漏型)
- 下采样在网络前几层的密度大一些,(这样能尽可能用微弱精度损失换取速度提升) 越往后下采样的密度应该更小,中间层下采样频率降低,并使用不下采样的方法(如空洞卷积)提高深度。 注意:最终能够下采样的最大深度,以该层的感受野以及数据集中最大的有意义物体尺寸决定(自然不可能让最大有意义的物体在某一层被下采样到分辨率小于1,但是网络依然可以work,只不过最后几层可能废弃了(相信cnn的学习能力,因为最大不了它也能学出单位卷积,只有中心元素不为0的卷积核),更准确的说这是最大感受野的极限,最大感受野覆盖最大有意义的物体)
- shortcut connection里,找不到concat,用add凑合吧
- 先训一个大模型然后裁剪,也许比直接训一个小模型性能好
- 能用可分离卷积替代的卷积一定要替代,一般除了第一个卷积,都能替代,替代完后考虑给替代可分离的通道数乘以2,因为可分离卷积的参数和计算量都是线性增长的,3*3卷积+1*3卷积+3*1卷积=白给的精度提升。同样的道理适用于2+1分离卷积。
- inception或者shortcut connection或者dense connection其实都相当于ensemble模型,考虑结合使用,shortcut connection的使用几乎是无痛的
- 如果你的分类精度不够是因为有两类或者多类太相近造成的,考虑使用其他softmax,比如amsoftmax。
1.3 loss相关
常用的loss有focal loss(正负样本不平衡时)、triple loss(学习困难样本)
1.2.1 模型裁剪
1.3 训练策略
1.3.1 余弦学习率+warmup
上图是step方法和cosine方法的对比,预先的方法上升更快,不过最终结果比较接近
由于刚开始训练时模型的权重(weights)是随机初始化的(全部置为0是一个坑,原因见[2]),此时选择一个较大的学习率,可能会带来模型的不稳定。学习率预热就是在刚开始训练的时候先使用一个较小的学习率,训练一些epoches或iterations,等模型稳定时再修改为预先设置的学习率进行训练。论文[1]中使用一个110层的ResNet在cifar10上训练时,先用0.01的学习率训练直到训练误差低于80%(大概训练了400个iterations),然后使用0.1的学习率进行训练。
1.4 通用技巧
1.4.1 特征图可视化
二,目标检测优化
2.1 多尺度特征融合
常用的方法有:
- 第一种:图像金字塔(不常用),将输入图片放缩成不同比例,将预测结果融合得到最终输出
- 第二种:特征融合,融合 Encoder阶段的多尺度特征和Decoder上采样特征以恢复空间分辨率
- 第三种:在原始模型的顶端叠加额外的模块,以捕捉像素间长距离信息。例如Dense CRF,或者叠加一些其他的卷积层
- 第四种:Spatial Pyramid Pooling空间金字塔池化,使用不同采样率和多种视野的卷积核,以捕捉多尺度对象
2.1.1 双向特征图融合 - BiFPN
自底而上和自上而下的双流向(高维和低维)特征融合,配合使用skip-connection和weight(起到自注意力机制的作用),达到速度和精度的良好平衡
EfficientDet(51mAP,weight: 51.9M) 算法解读
注:FPN的结构如下:单向特征融合,但其上采用没有使用 反卷积和插值,只是简单的复制,具体见 KL.UpSampling2D
2.1.2 空洞卷积级联-ASPP
解决连续stride导致信息损失
如图3(a)中引入的stride使得更深的模块更容易捕获长距离的信息,整个图像的特征都可以汇聚在最后一个小分辨率的特征图中,但是连续的stride对语义分割是有害的,会造成细节信息的丢失,因此采用不同采样率的空洞卷积。如图3(b)中,输出步幅为out_stride = 16
2.1.3 自适应空间特征融合-ASFF
解决在单阶段目标检测特征金字塔中存在的这种不一致问题. ASFF 能够让网络去学习如何在空间上过滤其他层的无用信息, 只保留有用信息去combination,用特征金字塔检测物体时, 存在一个启发性式特征选择机制, 大的intance对应高层的feature map, 小的instance对应低层的feature map. 当一个某一特征层的实例属于positive sample, 这意味着在其他特征层上相应的那部分区域将被是为背景. 这种不同level特征之间的冲突、这种不一致会干扰训练时的梯度计算,降低了特征金字塔的有效性。
注意:ASFF与backbone无关,适用于所有具有特征金字塔结构的单阶段检测器
ASFF的关键思想是自适应地学习每个尺度特征图的融合空间权重,分为两步:恒等缩放和自适应融合。
恒等缩放:1/2下采样:3*3 conv/stride=2;1/4下采样:3*3 conv/stride=2 + max pooling/stride=2。上采样:1*1 conv/stride=1 + interpolation。每个特征层都缩放成统一的shape,然后根据权重 spatially fused, 例如, 如果现在要将level 1、level 2、level3融合成ASFF-1, 首先需要对level 2、level 3进行下采样, size一样了再融合.
自适应融合:融合后空间位置(i, j)处的向量是融合前三个特征图(i, j)处的向量的加权融合,系数(特征图的空间重要性权重)是由网络自适应学习到的,他们在所有通道间是共享的。作者限制(softmax可以轻易的算出来)。作者用一个1*1卷积来计算softmax中的系数 。所以他们可以用标准的BP算法来进行优化
其中
注意:自适应权重参数是二维的(ij)参考:Adaptively Spatial Feature Fusion (ASFF)
2.2 anchor 相关
以往目标检测的anchor通常是一组超参,如ssd(ssd_pascal.py)结合feature map大小通过定义 k 个特定尺度(scale)和长宽比(aspect ratio)的 anchor来控制、yolo3以上的系列通过kmean聚类coco数据集的bounding box来获得,好处是可以根据实际需要检测目标对bounding box 进行调整(如手势检测时少生成小box,避免检测远处的小目标等),缺点就是性能受经验超参影响、如果尺度和长宽比设置不合适可能会导致 recall 不够高、 anchor 过多影响分类性能和速度、导致正负样本失衡,导致网络只是在学习负样本,通常需要进行 hard negative mining(正负1:3比例)、或者引入 Focal Loss 等来平衡。
通常使用 4 个数 (x, y, w, h) 来描述一个 anchor,将 anchor 的分布 formulate 成如下公式:
Anchor 的概率分布被分解为两个条件概率分布,也就是给定图像特征之后 anchor 中心点的概率分布,和给定图像特征和中心点之后的形状概率分布,这也是论文标题中 Guided Anchoring 的由来。Sliding window 可以看成是 p(x,y|I) 是均匀分布,而p(w,h|x,y,I)是冲激函数的一个特例。根据上面的公式,anchor 的生成过程可以分解为两个步骤,anchor 位置预测和形状预测。
2.2.1 RPN
上图为RPN的整个过程,一个特征图经过sliding window处理,得到256维特征,然后通过两次全连接得到结果2k个分数和4k个坐标;
1)3x3的sliding window看作是对特征图做了一次3x3的卷积操作,最后得到了一个channel数目是256的特征图,尺寸和公共特征图相同,我们假设是256 x (H x W),然后我们要对每个256维特征向量做两次全连接操作,一个得到2个分数,一个得到4个坐标,需要注意:4个坐标是指针对原图坐标的偏移
2)首先我们知道有H x W个结果,我们随机取一点,它跟原图肯定是有个一一映射关系的,由于原图和特征图大小不同,所以特征图上的一个点对应原图肯定是一个框,然而这个框很小,比如说8 x 8,这里8是指原图和特征图的比例,所以这个并不是我们想要的框,那我们不妨把框的左上角或者框的中心作为锚点(Anchor),然后想象出一堆框,具体多少,聪明的读者肯定已经猜到,K个,这也就是图中所说的K anchor boxes(由锚点产生的K个框);换句话说,H x W个点,每个点对应原图有K个框,那么就有H x W x k个框默默的在原图上,那RPN的结果其实就是判断这些框是不是物体以及他们的偏移;那么K个框到底有多大,长宽比是多少?这里是预先设定好的,共有9种组合,所以k等于9,最后我们的结果是针对这9种组合的,所以有H x W x 9个结果,也就是18个分数和36个坐标,最后通过分数来选择最终box;
参考:RPN 解析
2.2.2 Guided Anchoring
Guided Anchoring,即通过图像特征来指导 anchor 的生成。通过预测 anchor 的位置和形状,来生成稀疏而且形状任意的 anchor,并且设计了 Feature Adaption 模块来修正特征图使之与 anchor 形状更加匹配
主要分为3块:
- location:中心位置预测,预测那些区域应该作为中心点来生成 anchor,是一个二分类问题。不同于 RPN 或者 segmentation 的分类,这里我们并不是预测每个点是前景还是背景,而是预测是不是物体的中心。
- shape:形状预测分支的目标是给定 anchor 中心点,预测最佳的长和宽,然而这玩意的 target (w、h)并不好计算,而且实现起来也会比较困难,所以直接使用 bounded IoU Loss 作为监督,来学习 w 和 h。
- Feature adaption :在原来的 RPN 里面,大家都表示相同形状的 anchor(对应的特征向量相同),所以相安无事,但是现在每个 anchor 都有自己独特的形状大小,和 feature 就不是特别好地 match。另一方面,对原本的特征图来说,它并不知道形状预测分支预测的 anchor 形状,但是接下来的分类和回归却是基于预测出的 anchor 来做的,可能会比较懵逼。因此增加了一个 Feature Adaption 模块来解决这种问题。思路很简单,就是把 anchor 的形状信息直接融入到特征图中,这样新得到的特征图就可以去适应每个位置 anchor 的形状。我们利用一个 3x3 的 deformable convolution 来修正原始的特征图,而 deformable convolution 的 offset 是通过 anchor 的 w 和 h 经过一个 1x1 conv 得到的
参考:Guided Anchoring: 物体检测器也能自己学 Anchor
四、网址收藏
github gluon-cv 、CenterTrack、