当前位置:   article > 正文

YOLOv5改进之BiFPN(含代码,超详细哦)_yolov5改进bifpn

yolov5改进bifpn
BiFPN论文

论文地址:[1911.09070] EfficientDet: Scalable and Efficient Object Detection (arxiv.org)

BiFPN简介

BiFPN即“双向特征金字塔网络”,是一种常用于计算机视觉任务,特别是目标检测和实例分割的神经网络架构。它扩展了特征金字塔网络(FPN),通过在金字塔级别之间引入双向连接,使信息能够在网络中同时进行自底向上和自顶向下的流动。

以下是BiFPN的工作原理概述:

1. 特征金字塔生成:最初,网络通过从骨干网络(通常是ResNet等卷积神经网络)的多个层中提取特征来生成特征金字塔。

2. 双向连接:与传统FPN不同,BiFPN在特征金字塔相邻级别之间引入了双向连接。这意味着信息可以从更高级别的特征流向更低级别的特征(自顶向下路径),也可以从更低级别的特征流向更高级别的特征(自底向上路径)。

3. 特征整合:双向连接允许在两个方向上整合来自特征金字塔不同级别的信息。这种整合有助于有效地捕获多尺度特征。

4. 加权特征融合:BiFPN采用加权特征融合机制,将不同级别的特征进行组合。融合的权重在训练过程中学习,确保了最佳的特征整合。

BiFPN中的双向连接有助于更好地在不同尺度上捕获特征表示,提高了网络处理不同尺寸和复杂度对象的能力。这在目标检测任务中尤为重要,因为图像中的对象大小可能差异显著。

研究表明,BiFPN可以提高模型的效率和性能,特别是对于目标检测、实例分割和其他相关计算机视觉任务。

BiFPN结构图
添加代码

在common.py中添加BiFPN模块

将下面BiFPN模块的代码复制粘贴到common.py文件的末尾。

  1. # BiFPN
  2. # 两个特征图add操作
  3. class BiFPN_Add2(nn.Module):
  4. def __init__(self, c1, c2):
  5. super(BiFPN_Add2, self).__init__()
  6. # 设置可学习参数 nn.Parameter的作用是:将一个不可训练的类型Tensor转换成可以训练的类型parameter
  7. # 并且会向宿主模型注册该参数 成为其一部分 即model.parameters()会包含这个parameter
  8. # 从而在参数优化的时候可以自动一起优化
  9. self.w = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True)
  10. self.epsilon = 0.0001
  11. self.conv = nn.Conv2d(c1, c2, kernel_size=1, stride=1, padding=0)
  12. self.silu = nn.SiLU()
  13. def forward(self, x):
  14. w = self.w
  15. weight = w / (torch.sum(w, dim=0) + self.epsilon)
  16. return self.conv(self.silu(weight[0] * x[0] + weight[1] * x[1]))
  17. # 三个特征图add操作
  18. class BiFPN_Add3(nn.Module):
  19. def __init__(self, c1, c2):
  20. super(BiFPN_Add3, self).__init__()
  21. self.w = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True)
  22. self.epsilon = 0.0001
  23. self.conv = nn.Conv2d(c1, c2, kernel_size=1, stride=1, padding=0)
  24. self.silu = nn.SiLU()
  25. def forward(self, x):
  26. w = self.w
  27. weight = w / (torch.sum(w, dim=0) + self.epsilon)
  28. # Fast normalized fusion
  29. return self.conv(self.silu(weight[0] * x[0] + weight[1] * x[1] + weight[2] * x[2]))

步骤2:在yolo.py文件中加入类名

yolo.py文件parse_model函数中找到 elif m is Conat: 语句,在其后面加上下列语句:

  1. # 添加bifpn_add结构
  2. elif m in [BiFPN_Add2, BiFPN_Add3]:
  3. c2 = max([ch[x] for x in f])

步骤3:创建自定义yaml文件

然后将yaml文件中所有Concat换成BiFPN_Add

yaml文件修改后的完整代码如下:

  1. # YOLOv5
    声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/322256
    推荐阅读
    相关标签