目录
1.Yolov4整体网络架构
网络整体由三部分组成backbone、neck、head部分,注意蓝色卷积是属于head部分(但在网络实现时往往和neck一起定义,简便起见)。
1.1backbone模块
backbone部分包含CBM、CSP两个子模块。CBM表示Conv+Normalization+Mish结构,CSP表示CBM+ResUnit+concat组成,输入(608,608,3),输出(76,76,256)、(38,38,512)、(19,19,1024),具体如下:
1.1.1CBM子模块
CBM是backbone中的基础模块,由基本的单层卷积层conv、单层BatchNormalization和一个Mish激活函数层组成。Mish激活函数公式如下:
f ( x ) = x tanh ( log ( 1 + e x ) ) (1) \bm{f(x)=x\tanh(\log(1+e^{x}))\tag{1}} f(x)=xtanh(log(1+ex))(1)
注意: pytorch并未实现Mish激活函数的API调用,因此需要自己定义使用,代码如下:
class Mish(nn.Module):
def __init__(self):
super(Mish, self).__init__()
def forward(self, x):
return x * torch.tanh(F.softplus(x))
1.1.2CSPX子模块
注意:CSPX其中的X表示下分路两个CBM中间残差单元(Res unit)的个数
in : 表示上一个网络子模块的输出,该输出走向两个分路:
- 下分路为CBM、Res unit、CBM
- 上分路为一个CBM子模块
- 上下分路输出进行concat
concat: 上下分路采用concat堆叠到一起,例如上路输出 ( 152 , 152 , 282 ) (152,152,282) (152,152,282)、下路输出 ( 152 , 152 , 318 ) (152,152,318) (152,152,318),concat后变为 ( 152 , 152 , 600 ) (152,152,600) (152,152,600)。
CBM: 同上1.1.1
Res unit:
Res unit由两个CBL组成的上分路和作为下分路的原输入进行add操作,例如上路输出 ( 152 , 152 , 282 ) (152,152,282) (152,152,282)、下路输出 ( 152 , 152 , 318 ) (152,152,318) (152,152,318),各通道对应位置元素直接相加(add),维度还是 ( 152 , 152 , 318 ) (152,152,318) (152,152,318)。
CBL:由基本的单层卷积层conv、单层BatchNormalization和一个Leakyrelu激活函数层组成。Leakyrelu激活函数公式如下:
f ( x ) = { z , i f ( z > 0 ) a z , i f ( z ≦ 0 ) (2) \bm{f(x)=\left\{\begin{aligned}&z, &if(z>0)\\ &az, &if(z\leqq0)\end{aligned}\right.\tag{2}} f(x)={
z,az,if(z>0)if(z≦0)(2)
1.2neck模块
neck部分包含CBL、SPP以及上采样三个子模块。CBL表示Conv+BatchNormalization+LeakyRelu结构
SPP表示一个特征图经过3个最大池化+一个直连,最后通过拼接得到输出。
上采样层输入(608,608,3),输出(76,76,256)、(38,38,512)、(19,19,1024),具体如下:
1.2.1CBL层
CBL是由基本的单层卷积层conv、单层BatchNormalization和一个Leakyrelu激活函数层组成。Leakyrelu激活函数公式如下:
f ( x ) = { z , i f ( z > 0 ) a z , i f ( z ≦ 0 ) (2) \bm{f(x)=\left\{\begin{aligned}&z, &if(z>0)\\ &az, &if(z\leqq0)\end{aligned}\right.\tag{2}} f(x)={