Yolov4 网络结构学习
Yolov4网络结构
由下图可见YoloV4主要组成部分
DarknetConv2D_BN_Mish(卷积块)
- 相较YoloV3在YoloV4中激活函数变成了Mish
- 卷积块 = 卷积(Conv2d) + 标准化(BatchNormalization ) + 激活函数(Mish)
- 卷积块代码实现
#-------------------------------------------------#
# MISH激活函数
#-------------------------------------------------#
class Mish(nn.Module):
def __init__(self):
super(Mish, self).__init__()
def forward(self, x):
return x * torch.tanh(F.softplus(x))
#---------------------------------------------------#
# 卷积块 -> 卷积 + 标准化 + 激活函数
# Conv2d + BatchNormalization + Mish
#---------------------------------------------------#
class BasicConv(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size, stride=1):
super(BasicConv, self).__init__()
self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, kernel_size//2, bias=False)
self.bn = nn.BatchNorm2d(out_channels)
self.activation = Mish()
def forward(self, x):
x = self.conv(x)
x = self.bn(x)
x = self.activation(x)
return x
Resblock_body(CSPnet结构)
- Resblock_body使用了CSPnet结构
- 首先利用ZeroPadding2D和一个步长为2x2的卷积块进行高和宽的压缩
- 然后建立一个大的残差边shortconv、这个大残差边绕过了很多的残差结构
- 主干部分会对num_blocks进行循环,循环内部是残差结构。
- 对于整个CSPdarknet的结构块,就是一个大残差块+内部多个小残差块
- 比对Yolov3,在残差结构上YoloV4变为右图所示:
- 查看onnx中CSPnet的结构
CSPDarkNet53(主干网络)
PANet
- PANet是2018的一种实例分割算法, 特点就是特征的反复提取
SPP
- SpatialPyramidPooling:空间金字塔池化
- 利用不同大小的池化核进行池化,池化后堆叠
- SPP能够极大地增加感受野,分离出最显著的上下文特征
- SPP结构参杂在对CSPdarknet53的最后一个特征层的卷积里,在对CSPdarknet53的最后一个特征层进行三次DarknetConv2D_BN_Leaky卷积后,分别利用四个不同尺度的最大池化进行处理,最大池化的池化核大小分别为13x13、9x9、5x5、1x1(1x1即无处理)
Yolo Head
- Yolo Head本质上是一次3x3卷积加上一次1x1卷积,3x3卷积的作用是特征整合,1x1卷积的作用是调整通道数,结构和作用上与Yolov3一致(激活函数有变化)。
|