1. swish激活函数

f(x) = x • sigmoid(x)

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

 

2. Mish 激活函数

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

 

 

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

 

3. spatial pyramid pooling(SPP)

citehttps://arxiv.org/abs/1406.4729

传统的卷积神经网络,对输入图像的大小有严格要求,例如LeNet5只能为224x224,这要求我们在使用网络前需要对图像进行一些预处理操作.为了解决这个麻烦,何恺明发明了SPP这个局部结构,把SPP放在卷积层和全连接层之间,从而很好地解决了这个问题.

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

下面是一个例子:

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

 

图像经过卷积层,来到全连接层前面, 在input image size不确定的情况下(可能224x224,可能256x448),它经过层层卷积处理后的输出,即一组feature map的数量是固定的,只是feature map size 不确定.然而接下来的全连接层的输入量是固定的(4096), 我们对这些feature maps进行以下处理再输入到全连接层里:

假设有256张feature map

对256张feature map分别进行如图所示的三种max-pooling,控制三种max-pooling的输出严格为4x4 size, 2x2 size, 1x1 size, 将这些输出cancatenate到一起作为全连接层的输入.如上操作即为SPP处理.

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

4. 特征融合Feature Pyramid Network (FPN)

citehttps://arxiv.org/abs/1612.03144

 

 

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

 

5. Squeeze-and-Excitation(SE)

citehttps://arxiv.org/abs/1709.01507 

一种channel-wise的注意力机制

下图从U的输出到X的输出这段即为SE

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

直接说,

Squeeze:  先对U做一个global average pooling

Excitation: 输出的1x1xC数据做两级全连接,最后sigmoid限制到[0,1]的范围.

Scale:        然后把这个值对应着乘到U的C个通道上,作为下一级的输入.

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

 

两个例子:

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

 

 

6. Spatial Attention Module

一种point-wise的注意力机制

对feature maps, 分别从通道维度进行求平均值和求最大, 合并得到一个通道数为2的卷积层,然后通过一个卷积,得到一个通道数为1的spatial attention.

直观图示:

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

准确代码实现:

#cite https://zhuanlan.zhihu.com/p/102035273

class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention, self).__init__()
        assert kernel_size in (3,7), "kernel size must be 3 or 7"
        padding = 3 if kernel_size == 7 else 1

        self.conv = nn.Conv2d(2,1,kernel_size, padding=padding, bias=False)
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avgout = torch.mean(x, dim=1, keepdim=True)
        maxout, _ = torch.max(x, dim=1, keepdim=True)
        x = torch.cat([avgout, maxout], dim=1)
        x = self.conv(x)
        return self.sigmoid(x)

 

yolov4中作了微调,改为了

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

  

 

 

9. PAN

 

yolov4中用到的微调的PAN

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

 

二. bags of freebies

1. dropblock正则化

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

 DropBlock是dropout的一种结构化形式. 在DropBlock中,特征在一个block中, 例如一个feature map中的连续区域会一起被drop掉.当DropBlock抛弃掉相关区域的特征时,为了拟合数据网络就不得不往别处看以寻找新的证据.

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

2. 跨批量归一化Cross mini-batch Normalization

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

3.CIoU loss

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

 

 

4. class label smoothing 

    one-hot标签 所存在的disadvantage: 1) 无法保证模型的泛化能力,容易造成过拟合 2)全概率和0概率鼓励所属类别和其他类别之间的差距尽可能加大,而由梯度有界可知这种情况很难adapt,会造成模型过于相信预测的类别.

    我们将q(k)改为q(k)' , 即下图所示机制,从而使模型less confident.

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

从而,交叉熵为:

目标检测,SOTA>>>在打开yolov4文档前你必须要知道的几个tricks

相关文章:

  • 2022-01-01
  • 2021-11-20
  • 2021-11-09
  • 2021-12-12
  • 2021-07-05
  • 2022-02-09
  • 2021-11-30
  • 2022-01-12
猜你喜欢
  • 2021-09-17
  • 2021-07-19
  • 2021-11-05
  • 2021-06-24
  • 2022-12-23
  • 2022-12-23
  • 2021-07-12
相关资源
相似解决方案