站外seo是什么,丽水市建设局网站,docker wordpress fpm,抖音代运营报价单(仅供参考)#x1f60e;#x1f60e;#x1f60e;物体检测-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 17、SPP模块
17.1 SPP类
SPP是一种特殊的池化策略#xff0c;最初在YOLOv3-SPP中被使用…物体检测-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 17、SPP模块
17.1 SPP类
SPP是一种特殊的池化策略最初在YOLOv3-SPP中被使用旨在提高模型对于不同尺寸输入的适应性通过对同一特征图进行不同尺寸的池化然后将这些池化后的特征图拼接起来增加了模型捕捉不同尺度特征的能力
class SPP(nn.Module):# Spatial pyramid pooling layer used in YOLOv3-SPPdef __init__(self, c1, c2, k(5, 9, 13)):super(SPP, self).__init__()c_ c1 // 2 # hidden channelsself.cv1 Conv(c1, c_, 1, 1)self.cv2 Conv(c_ * (len(k) 1), c2, 1, 1)self.m nn.ModuleList([nn.MaxPool2d(kernel_sizex, stride1, paddingx // 2) for x in k])def forward(self, x):x self.cv1(x)return self.cv2(torch.cat([x] [m(x) for m in self.m], 1))继承nn.Module构造函数传入3个参数输入通道c1、输出通道c2、不同池化核的大小元组k包含三个整数表示特征金字塔池化中不同池化核的大小初始化c_计算中间层的通道数即通道数减半cv1 定义一个卷积模块通道数从c1降到c_cv2定义一个卷积模块输入通道数为c_ * (len(k) 1)这是因为SPP层将原始特征图与len(k)个池化后的特征图拼接因此增加了通道数。该卷积层的作用是将拼接后的特征图降维到输出通道数c2mm是一个模块列表相当于是pytorch对应的list是专门用来保存pytorch中的模型的listm包含三个最大池化层每个池化层的核大小分别为k元组中的值。步长设置为1并且填充(padding)设置为kernel_size // 2这样做是为了保持特征图的尺寸不变前向传播x将输入经过一个卷积模块将前面的输出和前面输出经过一个包含3个池化层的模块分别进行拼接拼接的结果再经过一个卷积模块返回结果
SPP模块通过特征金字塔池化技术增强了模型对不同尺度特征的捕捉能力。通过在不改变特征图空间维度的前提下增加通道维度信息SPP可以有效提升模型的性能
17.2 Flatten类
class Flatten(nn.Module):# Use after nn.AdaptiveAvgPool2d(1) to remove last 2 dimensionsstaticmethoddef forward(x):return x.view(x.size(0), -1)继承nn.Module一个Python装饰器表示是一个静态方法静态方法不需要实例化即可调用它不依赖于类的实例变量前向传播被装饰圈重写返回执行压平操作的输出
17.3 Concat类
class Concat(nn.Module):def __init__(self, dimension1):super(Concat, self).__init__()self.d dimensiondef forward(self, x):return torch.cat(x, self.d)继承nn.Module构造函数传入一个在哪个维度进行拼接的参数初始化d拼接维度前向传播返回拼接
17.4 Classify类
class Classify(nn.Module):def __init__(self, c1, c2, k1, s1, pNone, g1): super(Classify, self).__init__()self.aap nn.AdaptiveAvgPool2d(1) # to x(b,c1,1,1)self.conv nn.Conv2d(c1, c2, k, s, autopad(k, p), groupsg, biasFalse) # to x(b,c2,1,1)self.flat Flatten()def forward(self, x):z torch.cat([self.aap(y) for y in (x if isinstance(x, list) else [x])], 1) # cat if listreturn self.flat(self.conv(z)) # flatten to x(b,c2)继承nn.Module构造函数传入输入通道c1、输出c2、卷积核尺寸k1*1、卷积步长s1、padding、卷积分组g初始化aap定义一个全局自适应平均池化层conv定义一个卷积层padding通过调用autopad函数动态计算不要偏执flat调用一个展平模块前向传播z检查输入x是否为列表如果是对列表中的每个元素应用自适应平均池化层aap如果不是将x转换为列表后应用aap。然后在维度1上拼接处理后的特征图以支持多输入的情况进行一个卷积操作后再展平返回输出
Classify类实现了一个通用的分类头结构它通过一个自适应平均池化层和一个卷积层将输入特征图转换为一维特征向量适用于各种分类任务。此外它通过处理输入列表的能力为处理多输入或合并来自不同源的特征提供了便利。这种灵活性和效率是深度学习模型在图像分类任务中常见的要求
17.5 辅助函数
autopad用于自动计算卷积层的填充输出特征图的尺寸与输入相同
def autopad(k, pNone): # kernel, padding# Pad to sameif p is None:p k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-padreturn p
接受两个参数k卷积核大小p填充量。如果p没有显式提供即为None则该函数将计算并返回一个自动填充值使得卷积操作的输出特征图在空间尺寸上与输入特征图相同检查是否提供了p参数如果没有则进入自动计算填充的逻辑这行是自动计算填充量的核心逻辑。如果k是整数标准情况下表示卷积核大小是正方形则p被设置为k // 2。如果k是一个序列表示卷积核可能是矩形则对k中的每个元素进行同样的操作计算出一个填充量列表返回计算出的填充量p
DWConv一个深度可分离卷积层一种高效的卷积实现方式能够减少参数数量和计算成本 def DWConv(c1, c2, k1, s1, actTrue):# Depthwise convolutionreturn Conv(c1, c2, k, s, gmath.gcd(c1, c2), actact)这个函数定义了一个深度可分离卷积层。c1是输入通道数c2是输出通道数k是卷积核大小默认为1s是步长默认为1act标志是否使用激活函数默认为True返回一个Conv对象Conv是一个包含二维卷积、激活函数、归一化的卷积模块