yolov4 超级详细介绍 https://zhuanlan.zhihu.com/p/237539414
CSP意思是跨阶段部分连接,看着这跨阶段三个字,肯定又是Skip操作,目的为了解决梯度消失问题,同时丰富多尺度特征,提高检测等任务的效果。
嗯,也确实是这样的。
论文作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的,采用CSP模块先将基础层的特征划分为两部分,然后通过跨阶段层次结构将它们合并,在减少计算量的同时可以保证准确率。
所以,是怎么发现梯度信息重复,又是按照什么规则划分?
我也不知道因为我暂时还没读论文(摊手)。
先介绍一种CSPDarknet中使用到的Mish激活函数
Mish=x * tanh(ln(1+e^x))。
实现方法
tanh(softplus(x))
其中tanh,是均值为0的sigmoid,复习sigmoid,它是0到1之间的!
softplus也是一个激活函数,可以说是平滑版本的RELU
Mish的优点在于
Mish激活函数无边界(即正值可以达到任何高度)避免了由于封顶而导致的饱和。
理论上对负值的轻微允许更好的梯度流,而不是像ReLU中那样的硬零边界,
同时,平滑的激活函数允许更准确的信息深入神经网络,从而得到更好的准确性和泛化。
缺点是这东西本身就较慢,还吃显存,得到的性能提升没那么大,性价比太低了,
依旧使用LeakyReLU也可以的。
CSPDarkNet的基础模块是CSP ResNeXt
这里ResNeXt和ResNet的区别可以参考
文章1
文章2 主要是代码
这里的total 32 paths在文中被定义为cardinality,文中提到,增加这个cardinality的值,比把网络加深或者增加channels更有用。
def resnet50(num_classes=1000, include_top=True):
# https://download.pytorch.org/models/resnet50-19c8e357.pth
return ResNet(Bottleneck, [3, 4, 6, 3], num_classes=num_classes, include_top=include_top)
def resnext50_32x4d(num_classes=1000, include_top=True):
# https://download.pytorch.org/models/resnext50_32x4d-7cdf4587.pth
groups = 32
width_per_group = 4
return ResNet(Bottleneck, [3, 4, 6, 3],
num_classes=num_classes,
include_top=include_top,
groups=groups,
width_per_group=width_per_group)
下面是普通的ResNeXt block 和 CSP ResNeXt block
从结构上来看,CSP是将输入通道分成两部分,‘一部分保持不变,
另外一部分经过常规Res(X)Block跟原来一部分进行通道拼接,拼接后进入transition layer。
作者的出发点是:像ResNeXt这样的网络,经过多个层之后导致梯度信息其实是有冗余的,所以我们不妨将没一路输入都分成两部分,一部分保持原装,另一部分和Res(X)Block进行卷积向后传递,最后将两者合并,主要是为了降低梯度冗余,增加梯度组合多样性,有利于减少模型卷积参数和计算量,并且提高明显提取特征的能力。
CSP将Darknet53的参数减少了10%~20%
CSP Darknet53 可以看下图中的Backbone部分
CBM = Conv+BN+Mish
CSP = Cross Stage Patrial
CBL = Conv+BN+Leaky Relu
在下图中,只有个上采样,并没有PAN中描述的下采样,因为有现成的小feature map进行拼接。另外,ResUnit的计算类似于resnet中的identity mapping,这个skip操作是add,而csp module是concat,将cbm模块和经过ResUnit模块的feature进行channel维度上的拼接。
Cross Stage Patrtial 细节
每个CSP模块都有以下特点:
相比于输入,输出feature map大小减半
相比于输入,输出通道数增倍
经过第一个CBM后,featuremap大小减半,通道数增倍
CSP1和其他CSP有所不同:
经过模块第二个CBM后,CSP1 featuremap大小和通道数都不变,但是其他模块featuremap大小不变,通道减半
CSP1是经过最后一个CBM后,通道数减半,但是其他模块featuremap大小通道数都不变。
参考 博客