YOLOv5:图解common.py常用模块

前言

前提条件

相关介绍

  • Python是一种跨平台的计算机程序设计语言。是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。
  • PyTorch 是一个深度学习框架,封装好了很多网络和深度学习相关的工具方便我们调用,而不用我们一个个去单独写了。它分为 CPU 和 GPU 版本,其他框架还有 TensorFlow、Caffe 等。PyTorch 是由 Facebook 人工智能研究院(FAIR)基于 Torch 推出的,它是一个基于 Python 的可续计算包,提供两个高级功能:1、具有强大的 GPU 加速的张量计算(如 NumPy);2、构建深度神经网络时的自动微分机制。
  • YOLOv5是一种单阶段目标检测算法,该算法在YOLOv4的基础上添加了一些新的改进思路,使其速度与精度都得到了极大的性能提升。它是一个在COCO数据集上预训练的物体检测架构和模型系列,代表了Ultralytics对未来视觉AI方法的开源研究,其中包含了经过数千小时的研究和开发而形成的经验教训和最佳实践。

common.py

  • common.py文件中主要是封装了不同的通用模块。

基本模块

Conv

在这里插入图片描述

class Conv(nn.Module):
    # Standard convolution
    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):  # ch_in, ch_out, kernel, stride, padding, groups
        super().__init__()
        self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False)
        self.bn = nn.BatchNorm2d(c2)
        self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())

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

    def forward_fuse(self, x):
        return self.act(self.conv(x))

Bottleneck

在这里插入图片描述

class Bottleneck(nn.Module):
    # Standard bottleneck
    def __init__(self, c1, c2, shortcut=True, g=1, e=0.5):  # ch_in, ch_out, shortcut, groups, expansion
        super().__init__()
        c_ = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c_, c2, 3, 1, g=g)
        self.add = shortcut and c1 == c2

    def forward(self, x):
        return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))

BottleneckCSP

在这里插入图片描述

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

C3

在这里插入图片描述

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

SPP

在这里插入图片描述

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

SPPF

在这里插入图片描述

class SPPF(nn.Module):
    # Spatial Pyramid Pooling - Fast (SPPF) layer for YOLOv5 by Glenn Jocher
    def __init__(self, c1, c2, k=5):  # equivalent to SPP(k=(5, 9, 13))
        super().__init__()
        c_ = c1 // 2  # hidden channels
        self.cv1 = Conv(c1, c_, 1, 1)
        self.cv2 = Conv(c_ * 4, c2, 1, 1)
        self.m = nn.MaxPool2d(kernel_size=k, stride=1, padding=k // 2)

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

Focus

  • 在yolov5-6.x及更新版本中,不再使用Focus模块。

在这里插入图片描述

class Focus(nn.Module):
    # Focus wh information into c-space
    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):  # ch_in, ch_out, kernel, stride, padding, groups
        super().__init__()
        self.conv = Conv(c1 * 4, c2, k, s, p, g, act)
        # self.contract = Contract(gain=2)

    def forward(self, x):  # x(b,c,w,h) -> y(b,4c,w/2,h/2)
        return self.conv(torch.cat([x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]], 1))
        # return self.conv(self.contract(x))

未完待续

参考

[1] https://github.com/ultralytics/yolov5

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 《强化学习导论》(Reinforcement Learning: An Introduction)是Richard S. Sutton和Andrew G. Barto合作编写的一本经典教材,是强化学习领域的一本重要参考书。该书系统地介绍了强化学习的基本概念、算法和应用。 这本书分为三个部分。第一部分概述了强化学习的基本概念和问题,介绍了强化学习的基本元素:智能体、环境、状态、动作、奖励等,并讨论了不同类型的强化学习问题。第二部分重点介绍了标准强化学习问题的解决方法,包括动态规划、蒙特卡罗方法和时间差分学习等。通过这些方法,可以学习到如何最大化累积奖励来达到特定目标。第三部分则讨论了强化学习中的其他重要主题,如函数近似学习、策略梯度方法、探索与利用的平衡等。 这本书有几个显著的特点。首先,它以直观的例子和图解介绍了强化学习的基本概念,使得读者能够更容易地理解和掌握相关知识。其次,书中提供了大量的算法和伪代码,方便读者实际操作和实现。此外,书中还包含了丰富的练习题和案例研究,可以帮助读者巩固学习成果和应用知识。 《强化学习导论》被广泛应用于学术界和工业界,对于研究者、学生和工程师都具有重要的参考价值。它为读者提供了一个系统和全面的学习路径,帮助他们深入理解强化学习的原理和方法,并在实际问题中应用和发展强化学习技术。通过阅读《强化学习导论》,读者将能够了解强化学习的基本思想,熟悉常用的解决方法,并能够运用这些知识解决实际问题,为相关领域的研究和应用做出贡献。 ### 回答2: 《强化学习导论》(Reinforcement Learning: An Introduction)是一本经典的强化学习教材,由Richard S. Sutton和Andrew G. Barto合著。 该书的主要目的是介绍强化学习的基本概念、方法和算法。强化学习是一种机器学习的分支,其中智能体通过与环境的交互来学习最佳行动策略。与传统的监督学习和无监督学习不同,强化学习的训练过程主要基于奖励信号的反馈。 《强化学习导论》的内容涵盖了强化学习的基础知识和重要概念。首先,书中介绍了马尔可夫决策过程(Markov Decision Process,MDP)作为强化学习问题的数学框架。然后详细介绍了值函数和策略的概念,以及如何通过值函数和策略来指导智能体的学习和决策过程。 该书还介绍了各种强化学习方法,如蒙特卡罗方法、时序差分学习和Q-learning等。这些方法用于解决基于模型(model-based)和非基于模型(model-free)的强化学习问题。每种方法的优点、局限性和适用场景都有详细阐述。 此外,《强化学习导论》还提供了大量的实例和案例研究,以帮助读者加深对强化学习理论的理解。书中还包含了许多练习题和算法伪代码,读者可以通过实践来巩固所学的知识。 总之,《强化学习导论》是一本系统全面介绍强化学习理论和方法的经典教材。它不仅适合作为强化学习领域的入门读物,也适合作为学术界和工业界从业人员的参考书籍。 ### 回答3: 《强化学习:一种介绍》(Reinforcement Learning: An Introduction)是由Richard S. Sutton和Andrew G. Barto合著的一本权威教材,详细介绍了强化学习的原理和应用。 该书首先从强化学习的基本概念入手,解释了强化学习与其他机器学习方法的区别。强化学习是一种学习代理如何通过与环境的交互来最大化奖励的方法。与监督学习和无监督学习不同,强化学习的代理在无人指导的情况下进行学习,通过不断试错来逐步提升策略的质量。 书中详细介绍了强化学习中的基本要素:环境、状态、动作和奖励。同时,书中还介绍了多种强化学习算法,包括动态规划、蒙特卡洛方法和时序差分学习等。这些算法分别适用于不同类型的问题和环境,读者可以根据具体情况选择合适的算法进行应用。 此外,书中还介绍了强化学习中的进一步概念,如函数逼近和价值函数等。函数逼近是解决大规模问题的关键技术,而价值函数则用于评估状态或策略的质量。通过这些进一步的概念,读者可以深入理解强化学习的工作原理,并应用于解决复杂实际问题。 《强化学习:一种介绍》是一本深入浅出、权威且易读的教材,适合学习强化学习的初学者和相关领域的研究人员。无论是对于计算机科学、人工智能还是机器学习感兴趣的读者,该书都提供了一个良好的入门指南,帮助读者理解并应用强化学习的基本原理和方法。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FriendshipT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值