返回顶部
首页 > 资讯 > 精选 >怎么将yolov5中的PANet层改为BiFPN
  • 159
分享到

怎么将yolov5中的PANet层改为BiFPN

2023-07-02 13:07:17 159人浏览 安东尼
摘要

今天小编给大家分享一下怎么将yolov5中的PANet层改为BiFPN的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、Ad

今天小编给大家分享一下怎么将yolov5中的PANet层改为BiFPN的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

一、Add

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

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

怎么将yolov5中的PANet层改为BiFPN

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

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

BiFPN_Add2BiFPN_Add3函数中定义的w参数,加入g1

怎么将yolov5中的PANet层改为BiFPN

 # 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)

然后导入一下这两个包

怎么将yolov5中的PANet层改为BiFPN

二、Concat

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

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

怎么将yolov5中的PANet层改为BiFPN

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

修改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)

以上就是“怎么将yolov5中的PANet层改为BiFPN”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: 怎么将yolov5中的PANet层改为BiFPN

本文链接: https://lsjlt.com/news/342101.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么将yolov5中的PANet层改为BiFPN
    今天小编给大家分享一下怎么将yolov5中的PANet层改为BiFPN的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、Ad...
    99+
    2023-07-02
  • 如何将yolov5中的PANet层改为BiFPN详析
    目录一、Add二、Concat总结本文以YOLOv5-6.1版本为例 一、Add 1.在common.py后加入如下代码 # 结合BiFPN 设置可学习参数 学习不同分支的权重 # ...
    99+
    2024-04-02
  • yolov5中head怎么修改为decouple head
    这篇文章主要介绍“yolov5中head怎么修改为decouple head”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“yolov5中head怎么修改为decouple hea...
    99+
    2023-07-02
  • ubuntu中怎么将dhcp改为静态IP
    本篇文章为大家展示了ubuntu中怎么将dhcp改为静态IP,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。静态ip不能连接外网因为老的虚拟机有ubuntu桌面 以及一些磁盘的问题, 想 迁移 自己的...
    99+
    2023-06-05
  • 如何将Yolov5的detect.py修改为可以直接调用的函数详解
    前几天学习了Yolov5,当我想实际将Yolov5实际运用的时候却不知道怎么办了 然后我决定对Yolov5的detect.py修改为可以直接调用的函数 因为我只需要识别图片,所以我将...
    99+
    2024-04-02
  • JDK9为何要将String的底层实现由char[]改成了byte[]
    目录一、为什么要优化 String 节省内存空间二、byte[] 为什么就能节省内存空间呢?三、为什么用UTF-16而不用UTF-8呢?如果你不是 Java8 的钉子户,你...
    99+
    2024-04-02
  • php怎么将时区改为美东
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑时区的划分全球分为 24 个时区,每个时区都有自己的本地时间,同一时间内各时区的本地时间相差 1~23 小时,如英国伦敦本地时间与北京本地时间相差 8 个小时。在国际无...
    99+
    2019-10-21
    php 修改时区 美东
  • 怎么在MySQL中将字符集utf8修改为utf8mb4
    本篇文章给大家分享的是有关怎么在MySQL中将字符集utf8修改为utf8mb4,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。[client]...
    99+
    2024-04-02
  • 怎么将RestTemplate的编码格式改为UTF-8
    本篇内容介绍了“怎么将RestTemplate的编码格式改为UTF-8”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!RestTemplate...
    99+
    2023-06-25
  • 怎么将mysql默认编码改为UTF8
    这篇文章主要介绍怎么将mysql默认编码改为UTF8,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!将mysql默认编码改为UTF8的方法:首先在client字段里加入【default...
    99+
    2024-04-02
  • win11怎么将右边栏改为底部
    本篇内容主要讲解“win11怎么将右边栏改为底部”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“win11怎么将右边栏改为底部”吧!首先同时按下键盘上的“win+r”组合键调出运行。在运行对话框中...
    99+
    2023-07-01
  • 怎么将Windows11更改为经典视图
    本文小编为大家详细介绍“怎么将Windows11更改为经典视图”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么将Windows11更改为经典视图”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起...
    99+
    2023-04-14
    windows11
  • Oracle中怎么将VARCHAR类型的列修改为指定长度
    这篇文章将为大家详细讲解有关Oracle中怎么将VARCHAR类型的列修改为指定长度,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。修改 VARCHAR 列的长度 Oracle 中 VARCHAR 类型的数...
    99+
    2024-05-13
    VARCHAR ALTER_TABLE TRUNCATE EXTEND In-place_column_addition
  • Angular项目中怎么将 .css 文件修改为 .scss 文件
    本篇内容主要讲解“Angular项目中怎么将 .css 文件修改为 .scss 文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Angular项目中怎么将 ....
    99+
    2024-04-02
  • Dreamweave怎么将默认编码修改为UTF-8
    本篇内容主要讲解“Dreamweave怎么将默认编码修改为UTF-8”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Dreamweave怎么将默认编码修改为UTF-8”吧!双击DW图标,打开进入D...
    99+
    2023-06-08
  • 帝国cms怎么将副表修改为主表
    帝国cms将副表修改为主表的一般步骤是:1、备份数据;2、使用数据库管理工具导出副表数据;3、创建新的主表;4、导入副表数据到主表;5、修改相关代码;6、完成代码修改后,对网站进行全面测试,确保副表改为主表后的功能正常运行即可。本教程操作系...
    99+
    2023-08-02
  • win10怎么将逻辑分区改为主分区
    今天小编给大家分享一下win10怎么将逻辑分区改为主分区的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。win10将逻辑分区改...
    99+
    2023-07-01
  • 怎么用JavaScript将下载的svg图片改为png格式
    本篇内容介绍了“怎么用JavaScript将下载的svg图片改为png格式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,...
    99+
    2024-04-02
  • nodejs中怎么将doc转为txt
    在现代社会中,数据转换成为了一项非常重要的任务。许多公司和个人需要把一个文档从一种格式转换成另一种格式。其中一个最常见的转换是doc到txt。在这种情况下,使用Node.js可以非常容易地完成这个任务。Node.js是一款非常强大的Java...
    99+
    2023-05-14
  • Java中怎么将html转为pdf
    近年来,随着数字化进程的不断推进,电子化文件的需求也越来越高。在实际工作中,我们常常需要将 HTML 文件转换为 PDF 文件,在此过程中需要使用到 Java 编程技术。本文将从以下三个方面介绍 HTML 转 PDF 的 Java 实现方法...
    99+
    2023-05-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作