yolov4 超级详细介绍 https://zhuanlan.zhihu.com/p/237539414
CSP意思是跨阶段部分连接,看着这跨阶段三个字,肯定又是Skip操作,目的为了解决梯度消失问题,同时丰富多尺度特征,提高检测等任务的效果。
嗯,也确实是这样的。
论文作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的,采用CSP模块先将基础层的特征划分为两部分,然后通过跨阶段层次结构将它们合并,在减少计算量的同时可以保证准确率。
所以,是怎么发现梯度信息重复,又是按照什么规则划分?
我也不知道因为我暂时还没读论文(摊手)。
先介绍一种CSPDarknet中使用到的Mish激活函数
实现方法
tanh(softplus(x))
其中tanh,是均值为0的sigmoid,复习sigmoid,它是0到1之间的!
softplus也是一个激活函数,可以说是平滑版本的RELU
Mish的优点在于Mish激活函数无边界(即正值可以达到任何高度)避免了由于封顶而导致的饱和。
理论上对负值的轻微允许更好的梯度流,而不是像ReLU中那样的硬零边界,
同时,平滑的激活函数允许更准确的信息深入神经网络,从而得到更好的准确性和泛化。缺点是这东西本身就较慢,还吃显存,得到的性能提升没那么大,性价比太低了,
依旧使用LeakyReLU也可以的。
这里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.pthreturn 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.pthgroups = 32width_per_group = 4return 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。
CSP将梯度的变化从头到尾地集成到特征图中,在减少了计算量的同时可以保证准确率(或有所提升)。??
其中transition layer是一个卷积加池化, 用于整合学到的特征,降低特征图的尺寸。
CSP Darknet53 可以看下图中的Backbone部分
CBM = Conv+BN+Mish
CSP = Cross Stage Patrial
CBL = Conv+BN+Leaky Relu
Cross Stage Patrtial 细节
每个CSP模块都有以下特点:
相比于输入,输出featuremap大小减半
相比于输入,输出通道数增倍
经过第一个CBM后,featuremap大小减半,通道数增倍
CSP1和其他CSP有所不同:
经过模块第二个CBM后,CSP1 featuremap大小和通道数都不变,但是其他模块featuremap大小不变,通道减半
经过最后一个CBM后,CSP1 featuremap大小不变,通道数减半,但是其他模块featuremap大小通道数都不变
参考 博客