Yolov5更换BiFPN的详细步骤总结

 更新时间:2022年12月20日 08:39  点击:341 作者:迪菲赫尔曼

Yolov5如何更换BiFPN?

第一步:修改common.py

将如下代码添加到common.py文件中

# BiFPN 
# 两个特征图add操作
class BiFPN_Add2(nn.Module):
    def __init__(self, c1, c2):
        super(BiFPN_Add2, self).__init__()
        # 设置可学习参数 nn.Parameter的作用是:将一个不可训练的类型Tensor转换成可以训练的类型parameter
        # 并且会向宿主模型注册该参数 成为其一部分 即model.parameters()会包含这个parameter
        # 从而在参数优化的时候可以自动一起优化
        self.w = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True)
        self.epsilon = 0.0001
        self.conv = nn.Conv2d(c1, c2, kernel_size=1, stride=1, padding=0)
        self.silu = nn.SiLU()

    def forward(self, x):
        w = self.w
        weight = w / (torch.sum(w, dim=0) + self.epsilon)
        return self.conv(self.silu(weight[0] * x[0] + weight[1] * x[1]))


# 三个特征图add操作
class BiFPN_Add3(nn.Module):
    def __init__(self, c1, c2):
        super(BiFPN_Add3, self).__init__()
        self.w = 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.silu = nn.SiLU()

    def forward(self, x):
        w = self.w
        weight = w / (torch.sum(w, dim=0) + self.epsilon)  
        # Fast normalized fusion
        return self.conv(self.silu(weight[0] * x[0] + weight[1] * x[1] + weight[2] * x[2]))

第二步:修改yolo.py

parse_model函数中找到elif m is Concat:语句,在其后面加上BiFPN_Add相关语句

elif m is Concat:
    c2 = sum(ch[x] for x in f)
# 添加bifpn_add结构
elif m in [BiFPN_Add2, BiFPN_Add3]:
    c2 = max([ch[x] for x in f])

第三步:修改train.py

将BiFPN_Add2和BiFPN_Add3函数中定义的w参数,加入g1

g = [], [], []  # optimizer parameter groups
    bn = tuple(v for k, v in nn.__dict__.items() if 'Norm' in k)  # normalization layers, i.e. BatchNorm2d()
    for v in model.modules():
        # hasattr: 测试指定的对象是否具有给定的属性,返回一个布尔值
        if hasattr(v, 'bias') and isinstance(v.bias, nn.Parameter):  # bias
            g[2].append(v.bias)
        if isinstance(v, bn):  # weight (no decay)
            g[1].append(v.weight)
        elif hasattr(v, 'weight') and isinstance(v.weight, nn.Parameter):  # weight (with decay)
            g[0].append(v.weight)
        # BiFPN_Concat
        elif isinstance(v, BiFPN_Add2) and hasattr(v, 'w') and isinstance(v.w, nn.Parameter):
            g[1].append(v.w)
        elif isinstance(v, BiFPN_Add3) and hasattr(v, 'w') and isinstance(v.w, nn.Parameter):
            g[1].append(v.w)

导入BiFPN_Add3, BiFPN_Add2

from models.common import BiFPN_Add3, BiFPN_Add2

第四步:修改yolov5.yaml

Concat全部换成BiFPN_Add

注意:BiFPN_Add本质是add操作,因此输入层通道数、feature map要完全对应

2022.8.25 官方也提供了BiFPN,可以尝试用官方的
关于5m加BiFPN的文件我已经更新到了我的Git

总结

到此这篇关于Yolov5更换BiFPN的文章就介绍到这了,更多相关Yolov5更换BiFPN内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!

原文出处:https://blog.csdn.net/weixin_43694096/article/details/125148

[!--infotagslink--]

相关文章

  • SQL SERVER迁移之更换磁盘文件夹的完整步骤

    这篇文章主要给大家介绍了关于SQL SERVER迁移之更换磁盘文件夹的完整步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-12-08
  • iPhone不越狱更换微信铃声的方法

    最近和朋友在一起,5个人5台iPhone,一来微信信息所有人都看手机,搞得好麻烦,我看过一篇修改微信铃声的教程,表示需要对苹果手机进行越狱才可以修改铃声,越狱实在太麻烦了,算了,还是看看小编给大家分享iPhone不越狱更换微信铃声的方法...2016-07-04
  • 网站更换模板对网站的影响分析

    网站更换模板对网站的影响分析,经常看到一些新手SEOer在那里说,网站做好之后就不要再乱动了,否则会被降权的。网站模板不要随便更换,否则会拔毛或者降权的。我并不是说他...2016-10-10
  • 用PHP画一个可以更换文字的按纽

    你总是花很多时间去做一些按纽吧,去设计一个好的按纽背景全部用它吧! 文字可以随意更换! <? Header( "Content-type: image/gif"); if(!isset($s)) $s=11; //times...2016-11-25
  • 美图秀秀更换照片底色教程

    今天小编在这里就来给美图秀秀的这一款软件的使用者们来说下更换照片底色的教程,各位想知道具体更换步骤的使用者,那么下面就快来跟着小编一起看一看教程吧。 给各...2016-09-14
  • Swift如何在应用中添加图标更换功能的方法

    本篇文章主要介绍了Swift如何在应用中添加图标更换功能的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-30
  • photoshop给古典建筑物写真照片更换天空后期教程

    今天小编在这里就来给各位photoshop的这一款软件的使用者们来说一说给古典建筑物写真照片更换天空,各位想知道具体替换方法的软件使用者们,那么各位同学们就来跟着小编...2016-11-22
  • yolov5中head修改为decouple head详解

    现成的YOLOv5代码真的很香,不管口碑怎么样,我用着反正是挺爽的,下面这篇文章主要给大家介绍了关于yolov5中head修改为decouple head的相关资料,需要的朋友可以参考下...2022-06-11
  • Yolov5服务器环境搭建详细过程

    这篇文章主要介绍了Yolov5服务器环境搭建,本文通过脚本命令图文介绍给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2022-06-01
  • Yolov5更换BiFPN的详细步骤总结

    将YOLOv5中的PANet层修改为EfficientDet-BiFPN,实现自上而下与自下而上的深浅层特征双向融合,明显提升YOLOv5算法检测精度,下面这篇文章主要给大家介绍了关于Yolov5更换BiFPN的详细步骤,需要的朋友可以参考下...2022-12-20