前 言:作为当前先进的深度学习目标检测算法YOLOv7,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv7的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程项目的朋友需要达到更好的效果提供自己的微薄帮助和参考。由于出到YOLOv7,YOLOv5算法2020年至今已经涌现出大量改进论文,这个不论对于搞科研的同学或者已经工作的朋友来说,研究的价值和新颖度都不太够了,为与时俱进,以后改进算法以YOLOv7为基础,此前YOLOv5改进方法在YOLOv7同样适用,所以继续YOLOv5系列改进的序号。另外改进方法在YOLOv5等其他算法同样可以适用进行改进。希望能够对大家有帮助。
具体改进办法请关注后私信留言!
解决问题:之前改进从改进的部位来分的话从输入端、主干特征提取网络(backbone)、特征融合网络(neck)、检测头等四个方面进行改进,从改进的方法包括添加注意力机制、损失函数改进、改变网络结构、替换主干特征提取网络、改进非极大值抑制、k-means++聚类算法等方面进行改进,本文尝试通过改进更为专用于视觉任务的激活函数来网络进行改进。原激活函数为SiLU激活函数,来提高检测效果。
基本原理:
为图像识别任务提出了一种概念上简单但有效的漏斗激活,称为漏斗激活(FReLU),它通过添加空间条件的负开销将ReLU和PReLU扩展为2D激活。ReLU和PReLU的形式分别是y=max(x,0)和y=max(x,px),而FReLU是y=max(x,T(x))的形式,其中T(·)是2D空间条件。此外,空间条件以简单的方式实现了像素级建模能力,通过规则卷积捕获复杂的视觉布局。我们对ImageNet、COCO检测和语义分割任务进行了实验,结果表明FReLU在视觉识别任务中有很大的改进和增强。
与标量激活的比较我们对不同深度(如ResNet-50、ResNet-101)的ResNets[15]进行了全面比较。我们将ReLU作为基线,并将其变体之一PReLU进行比较。此外,我们将我们的视觉激活与NAS[52,53]技术搜索到的激活Swish[36]进行了比较。与许多标量激活相比,Swish对各种模型结构显示出积极的影响。表1显示了比较结果,我们的视觉激活仍然优于所有这些方法,但额外的复杂性可以忽略不计。在ResNet-50和ResNet-101上,我们的视觉激活提高了1.6%和0.7%的top-1准确率。值得注意的是,随着模型尺寸和模型深度的增加,其他标量激活显示出有限的改善,而视觉激活仍有显著改善。例如,Swish和PReLU在ResNet-101上提高了0.1%的精确度,而在ResNet-10上视觉激活仍显著增加,提高了0.7%
添加方法:
第一步:加入FReLU激活函数模块代码,部分代码如下:
class FReLU(nn.Module):
def __init__(self, c1, k=3): # ch_in, kernel
super().__init__()
self.conv = nn.Conv2d(c1, c1, k, 1, 1, groups=c1, bias=False)
self.bn = nn.BatchNorm2d(c1)
def forward(self, x):
return torch.max(x, self.bn(self.conv(x)))
第二步:将原yolo算法中的卷积的激活函数进行更换。
第三步:将train.py中改为本文的yaml文件即可,开始训练。
结 果:本人在遥感数据集上进行实验,有涨点效果。需要请关注留言。
预告一下:下一篇内容将继续分享深度学习算法相关改进方法。有兴趣的朋友可以关注一下我,有问题可以留言或者私聊我哦
PS:该方法不仅仅是适用改进YOLOv5,也可以改进其他的YOLO网络以及目标检测网络,比如YOLOv7、v6、v4、v3,Faster rcnn ,ssd等。
最后,有需要的请关注私信我吧。