前 言:作为当前先进的深度学习目标检测算法YOLOv5、v7系列算法,已经集合了大量的trick,但是在处理一些复杂背景问题的时候,还是容易出现错漏检的问题。此后的系列文章,将重点对YOLO系列算法的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程项目的朋友需要达到更好的效果提供自己的微薄帮助和参考。
解决问题:小目标由于携带信息少导致特征表达能力较弱,经过多层次的卷积操作后能提取到的特征较少,因此检测困难。利用自校正卷积取代特征提取网络中的常规卷积,以扩展感受野丰富输出,进而强化对弱特征的提取能力。
主要原理:
论文:20cvprSCNet.pdf (mmcheng.net)
CNN 的最新进展主要致力于设计更复杂的架构以增强其表示学习能力。在本文中,我们考虑改进基本的卷积特征转换过程在不调整模型架构的情况下使用 CNN。对此最后,我们提出了一种新颖的自校准卷积,它显式扩展了每个卷积层的视野通过内部沟通,从而丰富输出特征。特别是,与标准卷积不同,标准卷积使用融合空间和通道信息小内核(例如 3 × 3),我们的自校准卷积通过小说自适应地在每个空间位置周围建立远程空间和通道间依赖关系自校准操作。因此,它可以帮助 CNN 生成通过明确地结合更丰富的信息来进行更具区分性的表示。我们的自校准卷积设计简单通用,可以很容易地应用于在不引入的情况下增加标准卷积层额外的参数和复杂性。广泛的实验证明当将我们的自校准卷积应用于不同的主干时,基线模型可以是在各种视觉任务中得到显着改善,包括图像识别、对象检测、实例分割和关键点检测,无需更改网络架构。我们希望这项工作可以提供未来研究一种设计新颖的卷积特征变换以改进卷积的有前途的方法网络。
添加方法:
第一步:common.py构建SCConv模块。部分代码示例如下。
class SCConv(nn.Module):
def __init__(self, inplanes, planes, stride, padding, dilation, groups, pooling_r, norm_layer):
super(SCConv, self).__init__()
self.k2 = nn.Sequential(
nn.AvgPool2d(kernel_size=pooling_r, stride=pooling_r),
nn.Conv2d(inplanes, planes, kernel_size=3, stride=1,
padding=padding, dilation=dilation,
groups=groups, bias=False),
norm_layer(planes),
)
self.k3 = nn.Sequential(
nn.Conv2d(inplanes, planes, kernel_size=3, stride=1,
padding=padding, dilation=dilation,
groups=groups, bias=False),
norm_layer(planes),
)
self.k4 = nn.Sequential(
nn.Conv2d(inplanes, planes, kernel_size=3, stride=stride,
padding=padding, dilation=dilation,
groups=groups, bias=False),
norm_layer(planes),
)
def forward(self, x):
identity = x
out = torch.sigmoid(torch.add(identity, F.interpolate(self.k2(x), identity.size()[2:]))) # sigmoid(identity + k2)
out = torch.mul(self.k3(x), out) # k3 * sigmoid(identity + k2)
out = self.k4(out) # k4
return out
第二步:yolo.py中注册SCConv模块。部分代码示例如下。
第三步:修改yaml文件,需要修改。
第四步:将train.py中改为本文的yaml文件即可,开始训练。
结 果:本人在多个数据集上做了大量实验,针对不同的数据集效果不同,需要大家进行实验。有效果有提升的情况占大多数。
预告一下:继续分享深度学习相关内容。有兴趣的朋友可以关注一下我,有问题可以留言或者私聊我哦
PS:系列改进算法不仅仅是可以添加进YOLOv5,也可以添加进任何其他的深度学习网络,不管是分类还是检测还是分割,主要是计算机视觉领域,都可能会有不同程度的提升效果。
最后,希望能互粉一下,做个朋友,一起学习交流。