发布时间:2023-07-12 12:30
前 言:作为当前先进的深度学习目标检测算法YOLOv5,已经集合了大量的trick,但是在处理一些复杂背景问题的时候,还是容易出现错漏检的问题。此后的系列文章,将重点对YOLOv5的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程项目的朋友需要达到更好的效果提供自己的微薄帮助和参考。
解决问题:加入BIFPN加权双向金字塔结构,提升不同尺度的检测效果
添加方法:
第一步:common.py构建Concat_BIFPN模块。
class Concat_BIFPN(nn.Module):
# Concatenate a list of tensors along dimension
def __init__(self, c1, c2):
super(Concat_BIFPN, self).__init__()
self.relu = nn.ReLU()
self.w1 = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True)
self.w2 = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True)
self.epsilon = 0.0001
self.conv = nn.Conv2d(c1, c2, kernel_size=1, stride=1, padding=0)
self.swish = MemoryEfficientSwish()
def forward(self, x):
outs = self._forward(x)
return outs
def _forward(self, x):
if len(x) == 2:
# w = self.relu(self.w1)
w = self.w1
weight = w / (torch.sum(w, dim=0) + self.epsilon)
# Connections for P6_0 and P7_0 to P6_1 respectively
x = self.conv(self.swish(weight[0] * x[0] + weight[1] * x[1]))
elif len(x) == 3:
# w = self.relu(self.w2)
w = self.w2
weight = w / (torch.sum(w, dim=0) + self.epsilon)
x = self.conv(self.swish(weight[0] * x[0] + weight[1] * x[1] + weight[2] * x[2]))
return x
第二步:yolo.py中注册Concat_BIFPNt模块
elif m is Concat_BIFPN:
c2 = max([ch[x] for x in f])#2021.11.11更改配合bifpn使用
第三步:修改yaml文件,需要修改head(特征融合网络)。
第四步:将train.py中改为本文的yaml文件即可,开始训练。
结 果:本人在多个数据集上做了大量实验,针对不同的数据集效果不同,同一个数据集的不同添加位置方法也是有差异,需要大家进行实验。有效果有提升的情况占大多数。
预告一下:下一篇内容分享增加小目标检测层。有兴趣的朋友可以关注一下我,有问题可以留言或者私聊我哦
PS:,不仅仅是可以添加进YOLOv5,也可以添加进任何其他的深度学习网络,不管是分类还是检测还是分割,主要是计算机视觉领域,都可能会有不同程度的提升效果。
最后,希望能互粉一下,做个朋友,一起学习交流。
[ MSF使用实例 ] 利用MS12-020漏洞导致windows靶机蓝屏
SpringBoot--@Async注解使用 及线程池简单配置
从华为云到米家APP,智能家居行业如何突破发展?智能家居未来发展方向(下)
笔记:STM32启动文件startup_stm32f10x_xx.s
计算机视觉——目标检测、实例分割(语义分割)、人体关键点检测
吴恩达机器学习作业-Linear Regression(Python实现)
kiner算法刷题记(四):你真的了解二叉树吗(手撕算法篇)
如何快速成为图像识别大神?英伟达专家带你低门槛、高效实现AI模型训练与部署 | 英伟达CV公开课...