怎么做废品网站做淘宝客网站制作教程视频
- 作者: 五速梦信息网
- 时间: 2026年03月21日 06:47
当前位置: 首页 > news >正文
怎么做废品网站,做淘宝客网站制作教程视频,网络广告设计案例,数据分析师前景前言#xff1a;Hello大家好#xff0c;我是小哥谈。在YOLOv5中添加AFPN#xff08;Adaptive Feature Pyramid Network#xff09;可以提高目标检测的准确性。AFPN是一种用于目标检测任务的功能增强模块#xff0c;它能够自适应地融合来自不同层级的特征图#xff0c;以提… 前言Hello大家好我是小哥谈。在YOLOv5中添加AFPNAdaptive Feature Pyramid Network可以提高目标检测的准确性。AFPN是一种用于目标检测任务的功能增强模块它能够自适应地融合来自不同层级的特征图以提供更好的目标定位和尺度适应能力。 前期回顾 YOLOv5算法改进1— 如何去改进YOLOv5算法 YOLOv5算法改进2— 添加SE注意力机制 YOLOv5算法改进3— 添加CBAM注意力机制 YOLOv5算法改进4— 添加CA注意力机制 YOLOv5算法改进5— 添加ECA注意力机制 YOLOv5算法改进6— 添加SOCA注意力机制 YOLOv5算法改进7— 添加SimAM注意力机制 YOLOv5算法改进8— 替换主干网络之MobileNetV3 YOLOv5算法改进9— 替换主干网络之ShuffleNetV2 YOLOv5算法改进10— 替换主干网络之GhostNet YOLOv5算法改进11— 替换主干网络之EfficientNetv2 YOLOv5算法改进12— 替换主干网络之Swin Transformer YOLOv5算法改进13— 替换主干网络之PP-LCNet YOLOv5算法改进14— 更换Neck之BiFPN 目录 1.论文 2.AFPN网络架构及添加步骤 3.更换AFPN的方法 步骤1在common.py中添加AFPN模块 步骤2修改yolo.py文件 步骤3创建自定义的yaml文件 步骤4验证是否加入成功 1.论文 多尺度特征提取的一种常见策略是采用经典的自上而下和自下而上的特征金字塔网络。然而这些方法遭受特征信息的丢失或退化削弱了非相邻 Level 的融合效果。本文提出了一种渐近特征金字塔网络AFPN来支持非相邻层的直接交互。AFPN是通过融合两个相邻的Low-Level特征来启动的并渐进地将High-Level特征纳入融合过程。通过这种方式可以避免非相邻 Level 之间的较大语义差距。考虑到在每个空间位置的特征融合过程中可能出现多目标信息冲突进一步利用自适应空间融合操作来缓解这些不一致。 本文将所提出的AFPN纳入两阶段和一阶段目标检测框架并使用MS-COCO 2017验证和测试数据集进行评估。实验评估表明与其他最先进的特征金字塔网络相比论文作者的方法获得了更具竞争力的结果。 论文主要贡献♨️♨️♨️ 1.作者引入了一种渐进特征金字塔网络AFPN它有助于跨非相邻 Level 的直接特征融合从而防止特征信息在传输和交互过程中的丢失或退化。 2.为了抑制不同层次特征之间的信息矛盾作者在多层次特征融合过程中引入了自适应空间融合操作。 3.在MS COCO 2017验证和测试数据集上的大量实验表明与其他特征金字塔网络相比作者的方法表现出优越的计算效率同时获得了更具竞争力的结果。 论文题目《AFPN: Asymptotic Feature Pyramid Network for Object Detection》 论文地址 https://arxiv.org/abs/2306.15988v1 代码实现 GitHub - gyyang23/AFPN 2.AFPN网络架构及添加步骤 论文所提出的AFPN架构如下图所示。在Backbone网络自下而上的特征提取过程中AFPN渐进地集成了Low-Level、High-Level和顶级特征。具体来说AFPN最初融合了Low-Level特征然后融合了深层特征最后融合了最High-Level的特征即最抽象的特征。非相邻层次特征之间的语义差距大于相邻层次特征间的语义差距尤其是底部和顶部特征这直接导致了非相邻层次特征的融合效果较差。由于AFPN的架构是渐进的这将使不同 Level 特征的语义信息在渐进融合过程中更加接近从而缓解上述问题。 为了对齐维度并为特征融合做准备作者使用1×1卷积和双线性插值方法对特征进行上采样。另一方面作者根据所需的下采样率使用不同的卷积核和Stride来执行下采样。例如作者应用Stride为2的2×2卷积来实现2次下采样应用Stride为4的4×4卷积来实现4次下采样以及应用Stride为8的8×8卷积来实现8倍下采样。在特征融合之后作者使用4个残差单元继续学习特征这些残差单元类似于ResNet。每个残差单元包括2个3×3卷积。由于YOLO中只使用了3个 Level 的特征因此没有8次上采样和8次下采样。 在YOLOv5中添加AFPNAdaptive Feature Pyramid Network可以提高目标检测的准确性。AFPN是一种用于目标检测任务的功能增强模块它能够自适应地融合来自不同层级的特征图以提供更好的目标定位和尺度适应能力。✅ 要在YOLOv5中添加AFPN可以按照以下步骤进行操作 1首先在YOLOv5的模型架构中引入AFPN模块。为此您可以修改模型的backbone部分。通常YOLOv5使用CSPDarknet53作为backbone您可以在该部分添加AFPN。 2在引入AFPN之后您需要确定要从backbone中选择哪些特征图进行融合。一般来说可以选择较高层级和较低层级的特征图进行融合以获得更好的目标定位和尺度适应。 3接下来您需要实现AFPN模块的具体结构。AFPN通常由上采样和特征图融合两部分组成。上采样部分可以使用双线性插值或者转置卷积等方法进行实现。特征图融合部分可以使用逐元素相加或者卷积等方法进行实现。 4最后在YOLOv5的检测头部之前将AFPN模块的输出与backbone的输出进行融合。这样可以将更多信息引入到检测头部提升目标检测的准确性。 说明♨️♨️♨️ 请注意在实现AFPN时您需要根据YOLOv5的具体版本和代码结构进行适当的修改。这里提供的步骤仅供参考具体实现可能因版本而异。建议您查阅相关文档和代码以了解如何在YOLOv5中添加AFPN的详细实现方法。另外需要注意的是添加AFPN可能会增加模型的计算和内存开销因此在使用时需要根据实际情况进行权衡和优化。 3.更换AFPN的方法 步骤1在common.py中添加AFPN模块 class Upsample(nn.Module):Applies convolution followed by upsampling.
—1.渐进架构部分融合前的准备— #def init(self, c1, c2, scale_factor2):super().init()# self.cv1 Conv(c1, c2, 1)# self.upsample nn.Upsample(scale_factorscale_factor, modenearest) # or modelbilinear non-deterministicif scale_factor 2:self.cv1 nn.ConvTranspose2d(c1, c2, 2, 2, 0, biasTrue) # 如果下采样率为2就用Stride为2的2×2卷积来实现2次下采样elif scale_factor 4:self.cv1 nn.ConvTranspose2d(c1, c2, 4, 4, 0, biasTrue) # 如果下采样率为4就用Stride为4的4×4卷积来实现4次下采样def forward(self, x):# return self.upsample(self.cv1(x))return self.cv1(x)# —2.自适应空间融合ASFF—
class ASFF2(nn.Module):ASFF2 module for YOLO AFPN head https://arxiv.org/abs/2306.15988def init(self, c1, c2, level0):super().init()c1_l, c1_h c1[0], c1[1]self.level levelself.dim c1_l, c1_hself.inter_dim self.dim[self.level]compress_c 8#如果是第0层if level 0:
self.stride_level_1调整level-1出来的特征图通道调整为和level-0出来的特征图一样大小self.stride_level_1 Upsample(c1_h, self.inter_dim)
#如果是第1层if level 1:
self.stride_level_0通道调整为和level-1出来的特征图一样大小self.stride_level_0 Conv(c1_l, self.inter_dim, 2, 2, 0) # stride2 下采样为2倍# 两个卷积为了学习权重self.weight_level_0 Conv(self.inter_dim, compress_c, 1, 1)self.weight_level_1 Conv(self.inter_dim, compress_c, 1, 1)
用于调整拼接后的两个权重的通道self.weights_levels nn.Conv2d(compress_c * 2, 2, kernel_size1, stride1, padding0)self.conv Conv(self.inter_dim, self.inter_dim, 3, 1)def forward(self, x):x_level_0, x_level_1 x[0], x[1]# 如果在第0层
level-0出来的特征图保持不变
调整level-1的特征图使得其channel、width、height与level-0一致if self.level 0:level_0_resized x_level_0level_1_resized self.stride_level_1(x_level_1)
如果在第1层同上elif self.level 1:level_0_resized self.stride_level_0(x_level_0)level_1_resized x_level_1# 将N*C*H*W的level-0特征图卷积得到权重权重level_0_weight_v:N*256*H*Wlevel_0_weight_v self.weight_level_0(level_0_resized)level_1_weight_v self.weight_level_1(level_1_resized)# 将各个权重矩阵按照通道拼接
levels_weight_vN*3C*H*Wlevels_weight_v torch.cat((level_0_weight_v, level_1_weight_v), 1)# 将拼接后的矩阵调整每个通道对应着不同的level_0_resizedlevel_1_resized的权重levels_weight self.weights_levels(levels_weight_v)# 在通道维度对权重做归一化也就是对于二通道tmptmp[0][0]tmp[1][0]1levels_weight F.softmax(levels_weight, dim1)# 将levels_weight各个通道分别乘level_0_resized level_1_resized
点乘用到了广播机制fused_out_reduced level_0_resized * levels_weight[:, 0:1] level_1_resized * levels_weight[:, 1:2]return self.conv(fused_out_reduced)# ASFF3的运算流程同上
class ASFF3(nn.Module):ASFF3 module for YOLO AFPN head https://arxiv.org/abs/2306.15988def init(self, c1, c2, level0):super().init()c1_l, c1_m, c1_h c1[0], c1[1], c1[2]self.level levelself.dim c1_l, c1_m, c1_hself.inter_dim self.dim[self.level]compress_c 8if level 0:self.stride_level_1 Upsample(c1_m, self.inter_dim)self.stride_level_2 Upsample(c1_h, self.inter_dim, scale_factor4)if level 1:self.stride_level_0 Conv(c1_l, self.inter_dim, 2, 2, 0) # downsample 2xself.stride_level_2 Upsample(c1_h, self.inter_dim)if level 2:self.stride_level_0 Conv(c1_l, self.inter_dim, 4, 4, 0) # downsample 4xself.stride_level_1 Conv(c1_m, self.inter_dim, 2, 2, 0) # downsample 2xself.weight_level_0 Conv(self.inter_dim, compress_c, 1, 1)self.weight_level_1 Conv(self.inter_dim, compress_c, 1, 1)self.weight_level_2 Conv(self.inter_dim, compress_c, 1, 1)self.weights_levels nn.Conv2d(compress_c * 3, 3, kernel_size1, stride1, padding0)self.conv Conv(self.inter_dim, self.inter_dim, 3, 1)def forward(self, x):x_level_0, x_level_1, x_level_2 x[0], x[1], x[2]if self.level 0:level_0_resized x_level_0level_1_resized self.stride_level_1(x_level_1)level_2_resized self.stride_level_2(x_level_2)elif self.level 1:level_0_resized self.stride_level_0(x_level_0)level_1_resized x_level_1level_2_resized self.stride_level_2(x_level_2)elif self.level 2:level_0_resized self.stride_level_0(x_level_0)level_1_resized self.stride_level_1(x_level_1)level_2_resized x_level_2level_0_weight_v self.weight_level_0(level_0_resized)level_1_weight_v self.weight_level_1(level_1_resized)level_2_weight_v self.weight_level_2(level_2_resized)levels_weight_v torch.cat((level_0_weight_v, level_1_weight_v, level_2_weight_v), 1)w self.weights_levels(levels_weight_v)w F.softmax(w, dim1)fused_out_reduced level_0_resized * w[:, :1] level_1_resized * w[:, 1:2] level_2_resized * w[:, 2:]return self.conv(fused_out_reduced) 具体如下图所示 步骤2修改yolo.py文件 修改yolo.py文件在 parse_model函数中找到 elif m is Concat: 语句在其后面加上下列代码 elif m is ASFF2:c1, c2 [ch[f[0]], ch[f[1]]], args[0]c2 make_divisible(c2 * gw, 8)args [c1, c2, *args[1:]]elif m is ASFF3:c1, c2 [ch[f[0]], ch[f[1]], ch[f[2]]], args[0]c2 make_divisible(c2 * gw, 8)args [c1, c2, *args[1:]] 具体如下图所示 步骤3创建自定义的yaml文件 在models文件夹中复制yolov5s.yaml粘贴并重命名为yolov5s_AFPN.yaml。 yaml文件完整代码如下
YOLOv5 by Ultralytics, GPL-3.0 license# Parameters
nc: 80 # number of classes depth_multiple: 0.33 # model depth multiple width_multiple: 0.50 # layer channel multiple anchors:- [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.1 backbone backbone:# [from, repeats, module, args][[-1, 1, Conv, [64, 3, 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, 6, C3, [512]],[-1, 1, Conv, [1024, 3, 2]], # 7-P5/32[-1, 3, C3, [1024]],[-1, 1, SPPF, [1024, 5]],] # 9# YOLOv5 v6.1 head head:[[4, 1, Conv, [128, 1, 1]], # 10 downsample backbone P3[6, 1, Conv, [256, 1, 1]], # 11 downsample backbone P4[[10, 11], 1, ASFF2, [128, 0]], # 12[[10, 11], 1, ASFF2, [256, 1]], # 13[-2, 1, C3, [128, False]], # 14[-2, 1, C3, [256, False]], # 15[9, 1, Conv, [512, 1, 1]], # 16 downsample backbone P5[[14, 15, 16], 1, ASFF3, [128, 0]], # 17[[14, 15, 16], 1, ASFF3, [256, 1]], # 18[[14, 15, 16], 1, ASFF3, [512, 2]], # 19[17, 1, C3, [256, False]], # 20 (P3/8-small)[18, 1, C3, [512, False]], # 21 (P4/16-medium)[19, 1, C3, [1024, False]], # 22 (P5/32-large)[[20, 21, 22], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)] 步骤4验证是否加入成功 在yolo.py文件里配置我们刚才自定义的yolov5s_AFPN.yaml。 然后运行yolo.py。我运行时出现报错信息。 ❌ 报错信息如图所示 解决方法 需要导入包 import torch.nn.functional as F 导入后则报错消失。然后继续运行yolo.py得到运行结果。✅ 这样就算添加成功了。 我没有试验过这种方法效果如何有实验过的小伙伴可以把效果在评论区打出来我们共同讨论下
相关文章
-
怎么做二维码微信扫后直到网站韶关市住房和城乡建设局网站
怎么做二维码微信扫后直到网站韶关市住房和城乡建设局网站
- 技术栈
- 2026年03月21日
-
怎么做二维码微信扫后直到网站wordpress好用的编辑器插件
怎么做二维码微信扫后直到网站wordpress好用的编辑器插件
- 技术栈
- 2026年03月21日
-
怎么做多语言网站wordpress 多个边栏
怎么做多语言网站wordpress 多个边栏
- 技术栈
- 2026年03月21日
-
怎么做服务器当网站服务器免费推广app工作好做吗
怎么做服务器当网站服务器免费推广app工作好做吗
- 技术栈
- 2026年03月21日
-
怎么做付费的小说网站wordpress 调用
怎么做付费的小说网站wordpress 调用
- 技术栈
- 2026年03月21日
-
怎么做付费网站旅游电子商务网站策划书
怎么做付费网站旅游电子商务网站策划书
- 技术栈
- 2026年03月21日
