问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

YOLO算法中的CBR、CBL、CBM和CBS模块详解

创作时间:
作者:
@小白创作中心

YOLO算法中的CBR、CBL、CBM和CBS模块详解

引用
CSDN
1.
https://blog.csdn.net/m0_49699378/article/details/145928032

YOLO(You Only Look Once)算法是目前最流行的实时目标检测算法之一,其核心模块包括CBR、CBL、CBM和CBS等。这些模块通过卷积层、批归一化层以及不同的激活函数组合,实现了高效的特征提取和目标检测。本文将详细介绍这些模块的组成和特点,并提供Mish激活函数和CBM模块的PyTorch实现代码示例。

CBR模块

CBR模块由卷积层(Conv)、批归一化层(BN)和ReLU激活函数组成。其结构如下:

  • 卷积层(Conv):用于提取输入特征图的局部特征。
  • 批归一化层(BN):对卷积层的输出进行归一化处理,加速网络训练并提高模型稳定性。
  • ReLU激活函数:引入非线性因素,使得模型能够学习到复杂的映射关系。

CBL模块

CBL模块与CBR模块类似,但使用Leaky ReLU作为激活函数。其结构如下:

  • 卷积层(Conv):用于提取输入特征图的局部特征。
  • 批归一化层(BN):对卷积层的输出进行归一化处理。
  • Leaky ReLU激活函数:允许小梯度值的通过,避免了ReLU激活函数在输入小于0时梯度为0的问题,从而提高了网络的训练效果。

CBM模块

CBM模块使用Mish激活函数,其结构如下:

  • 卷积层(Conv):用于提取输入特征图的局部特征。
  • 批归一化层(BN):对卷积层的输出进行归一化处理。
  • Mish激活函数:一种非线性激活函数,用于引入非线性因素,增强网络的表达能力。Mish激活函数的公式为f(x)=x⋅tanh(log(1+ex)),它相比其他激活函数(如ReLU、Leaky ReLU等)在保持梯度稳定性的同时,能够更好地捕捉输入数据的微小变化。

CBS模块

CBS模块使用SiLU激活函数,其结构如下:

  • 卷积层(Conv):用于提取输入特征图的局部特征。
  • 批归一化层(BN):对卷积层的输出进行归一化处理。
  • SiLU激活函数:SiLU激活函数的公式为silu(x)=x⋅sigmoid(x),它是swish激活函数的一个变体,具有平滑、非单调的特性,有助于缓解梯度消失问题。

激活函数对比

下图展示了不同激活函数的图像,从左到右依次为ReLU、Leaky ReLU、Mish和SiLU。

PyTorch实现CBM模块和Mish激活函数

以下是Mish激活函数和CBM模块的PyTorch实现代码示例:

import torch
import torch.nn as nn
import torch.nn.functional as F

# 定义Mish激活函数
class Mish(nn.Module):
    def __init__(self):
        super(Mish, self).__init__()

    def forward(self, x):
        return x * torch.tanh(F.softplus(x))

# 定义CBM模块
class CBM(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0):
        super(CBM, self).__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding, bias=False)
        self.bn = nn.BatchNorm2d(out_channels)
        self.mish = Mish()

    def forward(self, x):
        x = self.conv(x)
        x = self.bn(x)
        x = self.mish(x)
        return x

# 示例使用
if __name__ == "__main__":
    # 假设输入张量的形状为 [batch_size, in_channels, height, width]
    # 这里我们使用随机数据来模拟输入
    batch_size, in_channels, height, width = 1, 3, 224, 224
    x = torch.randn(batch_size, in_channels, height, width)

    # 创建一个CBM模块实例,参数根据实际情况调整
    cbm = CBM(in_channels=in_channels, out_channels=64, kernel_size=3, stride=1, padding=1)

    # 通过CBM模块
    output = cbm(x)

    # 打印输出张量的形状
    print(output.shape)  # 输出应为 [batch_size, 64, height, width],其中height和width可能因padding和stride而改变

通过以上代码,读者可以快速实现CBM模块并在自己的项目中使用。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号