位置: IT常识 - 正文

将yolov5中的PANet层改为BiFPN(yolov5输出result)

编辑:rootadmin
将yolov5中的PANet层改为BiFPN 本文以YOLOv5-6.1版本为例

推荐整理分享将yolov5中的PANet层改为BiFPN(yolov5输出result),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:yolov5的map,yolov5的map,yolov5 output,yolov5实现,yolov5实现,yolov5实现,yolov5实现,yolov1到yolov5,内容如对您有帮助,希望把文章链接给更多的朋友!

一、Add

1.在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]))

2.yolov5s.yaml进行修改

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parametersnc: 80 # number of classesdepth_multiple: 0.33 # model depth multiplewidth_multiple: 0.50 # layer channel multipleanchors: - [10,13, 16,30, 33,23] # P3/8 - [30,61, 62,45, 59,119] # P4/16 - [116,90, 156,198, 373,326] # P5/32# YOLOv5 v6.0 backbonebackbone: # [from, number, module, args] [[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2 [-1, 1, Conv, [128, 3, 2]], # 1-P2/4 [-1, 3, C3, [128]], [-1, 1, Conv, [256, 3, 2]], # 3-P3/8 [-1, 6, C3, [256]], [-1, 1, Conv, [512, 3, 2]], # 5-P4/16 [-1, 9, C3, [512]], [-1, 1, Conv, [1024, 3, 2]], # 7-P5/32 [-1, 3, C3, [1024]], [-1, 1, SPPF, [1024, 5]], # 9 ]# YOLOv5 v6.0 BiFPN headhead: [[-1, 1, Conv, [512, 1, 1]], [-1, 1, nn.Upsample, [None, 2, 'nearest']], [[-1, 6], 1, BiFPN_Add2, [256, 256]], # cat backbone P4 [-1, 3, C3, [512, False]], # 13 [-1, 1, Conv, [256, 1, 1]], [-1, 1, nn.Upsample, [None, 2, 'nearest']], [[-1, 4], 1, BiFPN_Add2, [128, 128]], # cat backbone P3 [-1, 3, C3, [256, False]], # 17 (P3/8-small) [-1, 1, Conv, [512, 3, 2]], # 为了BiFPN正确add,调整channel数 [[-1, 13, 6], 1, BiFPN_Add3, [256, 256]], # cat P4 <--- BiFPN change 注意v5s通道数是默认参数的一半 [-1, 3, C3, [512, False]], # 20 (P4/16-medium) [-1, 1, Conv, [512, 3, 2]], [[-1, 10], 1, BiFPN_Add2, [256, 256]], # cat head P5 [-1, 3, C3, [1024, False]], # 23 (P5/32-large) [[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5) ]

3.修改yolo.py,在parse_model函数中找到elif m is Concat:语句,在其后面加上BiFPN_Add相关语句:

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

4.修改train.py,向优化器中添加BiFPN的权重参数

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

将yolov5中的PANet层改为BiFPN(yolov5输出result)

# BiFPN_Concat elif isinstance(v, BiFPN_Add2) and hasattr(v, 'w') and isinstance(v.w, nn.Parameter): g1.append(v.w) elif isinstance(v, BiFPN_Add3) and hasattr(v, 'w') and isinstance(v.w, nn.Parameter): g1.append(v.w)

然后导入一下这两个包

一、Concat

1.在common.py后加入如下代码

# 结合BiFPN 设置可学习参数 学习不同分支的权重# 两个分支concat操作class BiFPN_Concat2(nn.Module): def __init__(self, dimension=1): super(BiFPN_Concat2, self).__init__() self.d = dimension self.w = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True) self.epsilon = 0.0001 def forward(self, x): w = self.w weight = w / (torch.sum(w, dim=0) + self.epsilon) # 将权重进行归一化 # Fast normalized fusion x = [weight[0] * x[0], weight[1] * x[1]] return torch.cat(x, self.d)# 三个分支concat操作class BiFPN_Concat3(nn.Module): def __init__(self, dimension=1): super(BiFPN_Concat3, self).__init__() self.d = dimension # 设置可学习参数 nn.Parameter的作用是:将一个不可训练的类型Tensor转换成可以训练的类型parameter # 并且会向宿主模型注册该参数 成为其一部分 即model.parameters()会包含这个parameter # 从而在参数优化的时候可以自动一起优化 self.w = nn.Parameter(torch.ones(3, dtype=torch.float32), requires_grad=True) self.epsilon = 0.0001 def forward(self, x): w = self.w weight = w / (torch.sum(w, dim=0) + self.epsilon) # 将权重进行归一化 # Fast normalized fusion x = [weight[0] * x[0], weight[1] * x[1], weight[2] * x[2]] return torch.cat(x, self.d)

2.yolov5s.yaml进行修改 

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parametersnc: 80 # number of classesdepth_multiple: 0.33 # model depth multiplewidth_multiple: 0.50 # layer channel multipleanchors: - [10,13, 16,30, 33,23] # P3/8 - [30,61, 62,45, 59,119] # P4/16 - [116,90, 156,198, 373,326] # P5/32# YOLOv5 v6.0 backbonebackbone: # [from, number, module, args] [[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2 [-1, 1, Conv, [128, 3, 2]], # 1-P2/4 [-1, 3, C3, [128]], [-1, 1, Conv, [256, 3, 2]], # 3-P3/8 [-1, 6, C3, [256]], [-1, 1, Conv, [512, 3, 2]], # 5-P4/16 [-1, 9, C3, [512]], [-1, 1, Conv, [1024, 3, 2]], # 7-P5/32 [-1, 3, C3, [1024]], [-1, 1, SPPF, [1024, 5]], # 9 ]# YOLOv5 v6.0 BiFPN headhead: [[-1, 1, Conv, [512, 1, 1]], [-1, 1, nn.Upsample, [None, 2, 'nearest']], [[-1, 6], 1, BiFPN_Concat2, [1]], # cat backbone P4 <--- BiFPN change [-1, 3, C3, [512, False]], # 13 [-1, 1, Conv, [256, 1, 1]], [-1, 1, nn.Upsample, [None, 2, 'nearest']], [[-1, 4], 1, BiFPN_Concat2, [1]], # cat backbone P3 <--- BiFPN change [-1, 3, C3, [256, False]], # 17 (P3/8-small) [-1, 1, Conv, [256, 3, 2]], [[-1, 14, 6], 1, BiFPN_Concat3, [1]], # cat P4 <--- BiFPN change [-1, 3, C3, [512, False]], # 20 (P4/16-medium) [-1, 1, Conv, [512, 3, 2]], [[-1, 10], 1, BiFPN_Concat2, [1]], # cat head P5 <--- BiFPN change [-1, 3, C3, [1024, False]], # 23 (P5/32-large) [[17, 20, 23], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5) ]

3.修改yolo.py,在parse_model函数中找到elif m is Concat:语句,在其后面加上BiFPN_Concat相关语句: 

# 添加bifpn_concat结构elif m in [Concat, BiFPN_Concat2, BiFPN_Concat3]: c2 = sum(ch[x] for x in f)

4.修改train.py,向优化器中添加BiFPN的权重参数

添加复方式同上(Add)

# BiFPN_Concat elif isinstance(v, BiFPN_Concat2) and hasattr(v, 'w') and isinstance(v.w, nn.Parameter): g1.append(v.w) elif isinstance(v, BiFPN_Concat3) and hasattr(v, 'w') and isinstance(v.w, nn.Parameter): g1.append(v.w)

至此,大功告成~~~

reference:【YOLOv5-6.x】设置可学习权重结合BiFPN(Add操作)_嗜睡的篠龙的博客-CSDN博客【YOLOv5-6.x】设置可学习权重结合BiFPN(Concat操作)_嗜睡的篠龙的博客-CSDN博客_bifpn代码

本文链接地址:https://www.jiuchutong.com/zhishi/289727.html 转载请保留说明!

上一篇:vue.config.js 中 devServer.proxy 配置说明,以及配置正确不生效问题

下一篇:伊兰谷中的Pen y Garreg水坝,威尔士 (© Joe Daniel Price/Moment Open/Getty Images)(伊兰简介)

  • 美团立减金怎么清零(美团立减金怎么支付抵扣的)

    美团立减金怎么清零(美团立减金怎么支付抵扣的)

  • 华为mate30pro是多少w的快充

    华为mate30pro是多少w的快充

  • iphone突然重启(iPhone突然重启没电了充不进)

    iphone突然重启(iPhone突然重启没电了充不进)

  • 华为手机丢了而且被关机了(华为手机丢了而且没网怎么找到)

    华为手机丢了而且被关机了(华为手机丢了而且没网怎么找到)

  • 华为手机怎么把收藏的图片发到相册里(华为手机怎么把试卷答案去掉)

    华为手机怎么把收藏的图片发到相册里(华为手机怎么把试卷答案去掉)

  • tl-wr886n路由器是千兆的吗(tl-wr886n路由器怎么样)

    tl-wr886n路由器是千兆的吗(tl-wr886n路由器怎么样)

  • 光刻机7nm指的是什么(光刻机7nm什么意思指的是什么)

    光刻机7nm指的是什么(光刻机7nm什么意思指的是什么)

  • 苹果手表丢了能定位吗(苹果手表丢了能找回来吗)

    苹果手表丢了能定位吗(苹果手表丢了能找回来吗)

  • 处理器与cpu的区别(处理器和cpu一样吗)

    处理器与cpu的区别(处理器和cpu一样吗)

  • e6600cpu配什么主板(e6600cpu能装win7吗)

    e6600cpu配什么主板(e6600cpu能装win7吗)

  • 电脑一关机就自动还原(电脑一关机就自动重启)

    电脑一关机就自动还原(电脑一关机就自动重启)

  • 苹果11怎么查是不是国行(苹果11怎么查是不是翻新机)

    苹果11怎么查是不是国行(苹果11怎么查是不是翻新机)

  • 苹果双重认证关闭不了(苹果双重认证关闭不了没有可关闭的方式)

    苹果双重认证关闭不了(苹果双重认证关闭不了没有可关闭的方式)

  • 微信被加好友频繁多久恢复(微信被加好友频道怎么解决)

    微信被加好友频繁多久恢复(微信被加好友频道怎么解决)

  • 小米8lite是啥手机(小米mi8lite什么型号)

    小米8lite是啥手机(小米mi8lite什么型号)

  • 天猫方糖不插电能用吗(天猫方糖突然不能联网怎么弄)

    天猫方糖不插电能用吗(天猫方糖突然不能联网怎么弄)

  • 微信视频接不起来是怎么回事(微信视频接不起来怎么回事显示连接中)

    微信视频接不起来是怎么回事(微信视频接不起来怎么回事显示连接中)

  • 荣耀20的指纹解锁在哪(荣耀20指纹解锁坏了)

    荣耀20的指纹解锁在哪(荣耀20指纹解锁坏了)

  • vivox27微信铃声怎么设置(vivox27pro微信铃声设置自己的)

    vivox27微信铃声怎么设置(vivox27pro微信铃声设置自己的)

  • 快手作品被屏蔽怎么办(快手作品被屏蔽了是什么意思)

    快手作品被屏蔽怎么办(快手作品被屏蔽了是什么意思)

  • r32冷媒与r410的好处(冷媒r410a和r22比较)

    r32冷媒与r410的好处(冷媒r410a和r22比较)

  • mp3内存4g够吗(mp3内存4g存多少歌曲)

    mp3内存4g够吗(mp3内存4g存多少歌曲)

  • vivox9s水印相机怎么设置(vivox60水印)

    vivox9s水印相机怎么设置(vivox60水印)

  • 智慧视觉怎么关闭(智慧视觉怎么关闭不了)

    智慧视觉怎么关闭(智慧视觉怎么关闭不了)

  • 华为手机步数和微信不同步(华为手机步数和微信步数不同步怎么办)

    华为手机步数和微信不同步(华为手机步数和微信步数不同步怎么办)

  • 在windows7中桌面字体模糊怎么办(在windows7中桌面指的是全部窗口)

    在windows7中桌面字体模糊怎么办(在windows7中桌面指的是全部窗口)

  • MobileViT模型简介(mobilenet模型)

    MobileViT模型简介(mobilenet模型)

  • 上年度已交房产税减免如何做账务处理
  • 非征税期抄税如何解决
  • 股票交易印花税降低
  • 简易计税是什么意思?
  • 企业收到财政局退款需要开票吗
  • 小规模销售收入免税会计分录
  • 汇算清缴退款怎么入账
  • 金税盘没有及时清卡怎么办
  • 加计抵减税金分录
  • 财产转让应纳税额如果是负数怎么办
  • 高危职业人身意外险
  • 购进材料无发票会计分录
  • 法人转账到开户行的会计分录怎么做?
  • 境外公司委托境内公司提供劳务
  • 出口退税逾期未申报的可以申请免税吗
  • 企业如何处理
  • 岗位津贴一定要发吗
  • 收到的发票开票人是管理员,这样可以吗?
  • 高速支付宝支付如何开发票
  • 经营用的固定资产
  • 失控发票进项税转出申报怎么填
  • 出口50万货物退多少税
  • 环境保护税的申报期限是如何规定的
  • 分期收款所得税收入确认多少
  • mac电脑安装了windows
  • 王者荣耀电脑版叫啥名字
  • 银行承兑汇票有纸质的吗
  • 销售商品发生的现金折扣
  • 苹果Mac系统怎么切换输入法
  • adb是什么程序
  • 天猫收取的三大费用
  • 利息如何做会计分录
  • 在建工程进项税额转出
  • zmweb.exe是什么进程
  • node.js最新版本
  • ts基础类型
  • 预提收入需不需要计提增值税
  • 现金流量表结构分析
  • 坏账准备会计科目使用说明
  • 圣安德鲁斯市
  • 尚硅谷docker笔记
  • php微信公众号 全站模板
  • 公司账号能给个人打款吗
  • element remove
  • 小微企业材料
  • 现金存入银行如何做账
  • 查看db2状态
  • 企业所得税汇算清缴时间
  • 行政单位基建管理办法
  • 刚购入的固定资产已使用年限怎么填
  • 工程预付款是否含规费和税金
  • 办公室购买电脑属于什么费用
  • 产品成本计算的分批法适用于
  • 支出未取得发票
  • 固定资产明细账图片
  • 个人报销费用怎么做分录
  • 服务费的进项发票怎么做分录
  • 明细分类账有哪三种
  • 购入旧的固定资产还能一次性抵扣吗
  • mysql5717安装过程
  • 可以按日期排序
  • win10升级后c盘莫名其妙满了
  • Linux系统调用函数
  • win7回收站图标在哪个文件夹
  • perl 比较符
  • cocos2dx webview
  • 每天学一个成语
  • unity flybird
  • sort 函数
  • javascript绘制图形
  • unity jsonobject
  • shell函数返回多个值包含数组
  • js函数全局变量
  • 超精准的电压基准芯片
  • python魔法方法有啥用
  • python whiletrue循环语句
  • 中国个人所得税是多少?
  • 广东省税务登记网
  • 车辆购置税退税申请表
  • 财税知识
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设