yolov5里面的一些module


未完,想起来就更一下~

Conv

就是yaml结构图里的CBL(conv,bn,relu)
这里用Silu替代了ReLu。#后面记得要整理一下常用的激活函数。

在这里插入图片描述
就是做了个卷积+BN+激活
yolov5中也用到进行下采样

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(Conv, self).__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 fuseforward(self, x):
        return self.act(self.conv(x))

Fouse

隔一个拿一个,按dim=1拼接后成为新的特征图,再调用上面说到的Conv。这里需要把输入通道扩大四倍,原因如图所示。

其实就是隔着像素拿,再去进行卷积。 这个过程中通道变大,特征图变小。不会损失任何信息。
在这里插入图片描述

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(Focus, self).__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))

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

输入x
1* 1卷积,缩小通道
3* 3恢复通道,
再上+x

ResNet中的Bottleneck layer

在这里插入图片描述

如图所示分别是有bottleneck和没有bottleneck的ResNet模块。

DepthWise Separable Convolution

深度可分离卷积。将卷积操作分为两部分。
代码实现:

class DepthWise_Separable_Conv2d(nn.Module):
    def __init__(self, n_in, n_out):
        super(DepthWise_Separable_Conv2d, self).__init__()
        self.depth_wise = nn.Conv2d(n_in, n_in, kernel_size=3, padding=1, groups=n_in)
        self.point_wise = nn.Conv2d(n_in, n_out, kernel_size=1)
 
    def forward(self, x):
        out = self.depth_wise(x)
        out = self.point_wise(out)
        return out

yolov5里只写了Depthwise。

Depthwise Convolution

在这里插入图片描述
在二维平面内分别做3*3卷积,这一步不改变通道数,只在w,h维度上运算。

yolov5里的代码:
def DWConv(c1, c2, k=1, s=1, act=True):
    # Depthwise convolution
    return Conv(c1, c2, k, s, g=math.gcd(c1, c2), act=act)

在这里插入图片描述

Pointwise Convolution

在这里插入图片描述
利用1* 1卷积改变通道数.(1*1卷积的深度为Depthwise Convolution的输出)

### YOLOv5 5.0 Detect 功能实现与用法 YOLOv5 是一种高效的实时目标检测框架,其 `detect` 功能主要用于执行图像或视频的目标检测任务。以下是关于 YOLOv5 5.0 中 `detect` 功能的具体实现与用法: #### 1. 基础概念 YOLOv5 的核心在于其实现了轻量级模型结构以及高性能推理能力[^1]。它支持多种输入源(如图片、视频流、摄像头等),并通过预训练权重文件完成快速部署。 #### 2. 使用方法 要使用 YOLOv5 的 `detect.py` 脚本进行目标检测,可以通过以下方式操作: - **命令行调用**: 运行如下命令即可启动检测脚本并指定输入源为本地摄像头(通常编号为 `0` 表示默认摄像头)。 ```bash python detect.py --source 0 ``` 然而,在实际应用过程中可能会遇到错误提示,例如当尝试调用摄像头时发生异常 `TypeError: argument of type 'int' is not iterable`[^2]。这是因为在某些版本中对于输入参数类型的判断逻辑存在问题。解决办法是在代码中调整条件语句以适配整数类型输入的情况。 #### 3. 自定义封装成库 为了更灵活地集成到其他项目中,可以将 `detect.py` 封装为独立的 Python 库模块。具体步骤包括但不限于重构原始脚本中的函数接口设计,使其能够接受外部传入的数据流或者路径作为新的输入形式,并返回预测结果而非仅保存至磁盘文件。 此外需要注意的是,尽管官方文档可能未详尽描述每一步骤细节,但从社区反馈来看[Yolov5确实存在特定数据前处理流程][^3],这表明理解整个pipeline的工作原理同样重要。 #### 示例代码片段展示如何简单调用已打包好的yolov5类实例化对象来进行单张图片分析: ```python from yolov5_module import YOLOv5Detector detector = YOLOv5Detector(weights='best.pt', img_size=640, conf_thres=0.25) results = detector.predict(image_path="test.jpg") print(results) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值