yolov5 common文件各模块理解

Conv模块
也是老组合了。包含卷积、批量归一化(控制梯度消失)、激活操作(激活操作的作用去线性化)

Focus模块
将图片切片为四块每一块的特征数量都变少了但是通道增加了可以看作另一种下采样,虽然增加了参数值和运算量并没有丢失特征。

Bottleneck
一种计算速度更快的残差块,相较于resnet残差块既加深了网络还减少了计算参数

BottleneckCSP和C3
均是CSP的一种结构是学习特征的主要结构

class BottleneckCSP(nn.Module):
    # CSP Bottleneck https://github.com/WongKinYiu/CrossStagePartialNetworks
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = nn.Conv2d(c1, c_, 1, 1, bias=False)
        self.cv3 = nn.Conv2d(c_, c_, 1, 1, bias=False)
        self.cv4 = Conv(2 * c_, c2, 1, 1)
        self.bn = nn.BatchNorm2d(2 * c_)  # applied to cat(cv2, cv3)
        self.act = nn.SiLU()
        self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))

    def forward(self, x):
        y1 = self.cv3(self.m(self.cv1(x)))
        y2 = self.cv2(x)
        return self.cv4(self.act(self.bn(torch.cat((y1, y2), dim=1))))


class C3(nn.Module):
    # CSP Bottleneck with 3 convolutions
    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, number, shortcut, groups, expansion
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c1, c_, 1, 1)
        self.cv3 = Conv(2 * c_, c2, 1)  # act=FReLU(c2)
        self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))
        # self.m = nn.Sequential(*[CrossConv(c_, c_, 3, 1, g, 1.0, shortcut) for _ in range(n)])

    def forward(self, x):
        return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1))

可见C3和bottleneckcsp的差别在于卷积层的选择上的差别。首先将原特征图分为两个部分一部分进行标准卷积,另一部分进行多个Bottleneck残差块的卷积操作。最后通过拼接操作拼接在最后进行一次标准卷积。

SPP空间金字塔池化
将一张特征图经过一系列不同的大小的滑动窗口进行最大值池化

45454
首先这是经过卷积、池化之后输入输出图片的大小之间的计算公式。 padding为扩充spp中为k//2,又因为k为奇数,乘2之后可以换一种表示方式就是 k-1,dilation为空洞卷积的参数函数中没有给出默认为1,stride 为1化简之后 H out==H in 同理W out == W in

class SPP(nn.Module):
    # Spatial Pyramid Pooling (SPP) layer https://arxiv.org/abs/1406.4729
    def __init__(self, c1, c2, k=(5, 9, 13)):
        super().__init__()
        c_ = c1 // 2  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c_ * (len(k) + 1), c2, 1, 1)
        self.m = nn.ModuleList([nn.MaxPool2d(kernel_size=x, stride=1, padding=x // 2) for x in k])

    def forward(self, x):
        x = self.cv1(x)
        with warnings.catch_warnings():
            warnings.simplefilter('ignore')  # suppress torch 1.9.0 max_pool2d() warning
            return self.cv2(torch.cat([x] + [m(x) for m in self.m], 1))

通过forward了解到先对x进行了一次标准卷积,之后将原特征图进行多次最大值池化和原特征图根据channel进行拼接,巧妙在多个最大池化层的参数的选取在经过上述公式计算之后图片的宽高并没有变化。所以除了channel batch,H,W都是相同的。而关于spp可以将不同的输入转化为同样大小的输出的理解,根据上述代码我的理解是相对于HW经过多个MAXpooling之后保持HW不变,如果是对不同的hw仅通过spp这个结构保证输出的格式都相同还是不太容易实现。请各位批评指正了。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
YOLO-V5的Conv模块是指在YOLO-V5算法中用于进行卷积操作的模块。YOLO-V5是一个基于深度学习的目标检测算法,它通过卷积神经网络来实现物体的检测和分类。 在YOLO-V5的代码仓库中,可以找到Conv模块的具体实现和代码。该代码仓库的地址是:https://github.com/ultralytics/yolov5。 此外,在YOLO-V5的训练过程中,也可以使用预训练模型来加速训练过程。其中一个常用的预训练模型是yolov3-tiny.conv,它是用于darknet框架的预训练模型,文件大小为6M。 除了Conv模块,YOLO-V5还有其他一些模块和功能,比如Mosaic数据增强和网络结构yaml文件参数的理解。可以在YOLO-V5的文档中找到更多关于这些模块的详细信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [YOLOV5 网络模块解析](https://blog.csdn.net/m0_46498587/article/details/122311244)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [yolov3-tiny.conv.rar](https://download.csdn.net/download/huxizhong2017/12363138)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值