- 640*640输入的还是下采样32倍,有3个输出层
- 1280*1280的输入是下采样64倍,有4个输出层
0x00 网络结构
1. Backbone
New CSP-Darknet53
- C3模块相比CSP模块的区别:使用SiLU替换Mish
- SiLU激活函数,也就是Swish
$$SiLU(x) = x*sigmoid(x)$$
2. Neck
SPPF、New CSP-PAN
- New CSP-PAN在Concat之后也会经过一个C3模块
- SPPF:不是并行,是串行,最后在拼接然后经过一个Conv,而且没有原输入那一路,而是要经过一个Conv模块,且池化层都是k=5
- 两个5×5大小的maxpooling串起来,相当于通过一个9x9maxpooling的结果(完全一样)
- 三个5×5大小的maxpooling串起来,相当于通过一个13x13maxpooling的结果
- 使用SPPF的计算效率更高
3. Head
YOLOv3 Head
4. v6.0之后的改动
把网络的第一层(原来是Focus
模块)换成了一个6x6
大小的卷积层。两者在理论上其实等价的,但是对于现有的一些GPU设备(以及相应的优化算法)使用6x6
大小的卷积层比使用Focus
模块更加高效
Focus:将每个2x2
的相邻像素划分为一个patch
,然后将每个patch
中相同位置(同一颜色)像素给拼在一起就得到了4个feature map
,然后在接上一个3x3
大小的卷积层。这和直接使用一个6x6
大小的卷积层等效。
0x01 数据增强
- Mosaic
- Copy paste
- 需要实例分割标签数据
- Random affine随机仿射变换
- 旋转、缩放、平移,错切
- data/hyps下面的yaml文件可以看到有没有启用
- MixUp
随机两张图片按一定透明度混合成一张(源码中大概10%概率使用)
- Albumentations滤波、直方图均衡化以及改变图片质量等。需要安装这个第三方包才会使用
- 随机改变HSV
- 随机水平翻转
0x02 训练策略
- Multi-scale training(0.5-1.5x)多尺度训练,假设设置输入图片的大小为640 × 640,训练时采用尺寸是在0.5 × 640 ∼ 1.5 × 640之间随机取值,注意取值时取得都是32的整数倍(因为网络会最大下采样32倍)
- AutoAnchor(For training custom data)训练自己数据集时可以根据自己数据集里的目标进行重新聚类生成Anchors模板
- Warmup and Cosine LR scheduler训练前先进行
Warmup
热身,然后在采用Cosine
学习率下降策略 - EMA(Exponential Moving Average)可以理解为给训练的参数加了一个动量,让它更新过程更加平滑。
- Mixed precision混合精度训练,能够减少显存的占用并且加快训练速度,前提是GPU硬件支持
- Evolve hyper-parameters超参数优化,没有炼丹经验的人勿碰,保持默认就好
0x03 损失计算
1. 损失计算
2. 平衡不同尺度损失
3. 消除Grid敏感度
V5对预测框的宽高偏移量也做了修改。原来的计算公式并没有对预测目标宽高做限制,这样可能出现梯度爆炸,训练不稳定等问题,调整后倍率因子被限制在( 0 , 4 ) 之间。也就是宽高最多就是anchor的4倍
4. 匹配正样本
- 先去计算每个
GT Box
与对应的Anchor Templates
模板的高宽比例
$$r_w = w_{gt} / w{at}$$
$$r_h = h_{gt} / h{at}$$
- 然后统计这些比例和它们倒数之间的最大值,这里可以理解成计算
GT Box
和Anchor Templates
分别在宽度以及高度方向的最大差异(当相等的时候比例为1,差异最小):
$$r_w^{max} = max(r_w, \frac{1}{r_w})$$
$$r_h^{max} = max(r_h, \frac{1}{r_h})$$
- 接着统计宽度和高度方向差异最大的值:
$$r^{max}=max(r_w^{max}, r_h^{max})$$
- 如果r_max小于设置阈值(默认4.0),即gt box和对应的anchor template的高、宽比例相差不算太大,则将gt box 分配给anchor template。
- 其实就是扩充正样本,让高宽比例和gt box相差不超过4的AT也作为正样本
- 剩下的就和YOLOv4一样
评论 (0)