深度学习Y4周:common.py文件解读

发布于:2025-04-13 ⋅ 阅读:(24) ⋅ 点赞:(0)

前言

文件位置:./models/common.py

该文件是实现YOLO算法中各个模块的地方,如果需要修改某一模块(如C3),就需要修改这个文件对应模块的定义。由于YOLOv5版本问题,同一个模块可能会看到不同版本,正常,以官网为主。

本周任务:将YOLOv5s网络模型中的C3模块按照下图方式修改,并跑通YOLOv5

任务提示:仅需修改./models/common.py文件

 YOLOv5网络结构图

0.导入需要的包和基本配置

import math                # 数学函数模块
from copy import copy      # 数据拷贝模块 分浅拷贝和深拷贝
from pathlib import Path   # Path将str转换为Path对象 使字符串路径易于操作的模块

import numpy as np         # numpy数组操作模块
import pandas as pd        # panda数组操作模块
import requests            # Python的HTTP客户端库
import torch               # pytorch深度学习框架
import torch.nn as nn      # 专门为神经网络设计的模块化接口
from PIL import Image      # 图像基础操作模块
from torch.cuda import amp # 混合精度训练模块

from utils.datasets import letterbox
from utils.general import non_max_suppression, make_divisible, scale_coords, increment_path, xyxy2xywh, save_one_box
from utils.plots import colors, plot_one_box
from utils.torch_utils import time_synchronized

我下的代码是这个:

1.基本组件

1.1 autopad

这个模块可以根据输入的卷积核计算该卷积模块所需的pad值,将会用于下面的Conv函数和Claffify函数中。

1.2 Conv

整个网络中最基础的组件,由卷积层+BN层+激活函数组成,具体结构如下图:

Conv模块代码:

另外,这个类中还有一个特殊函数fuseforward(前向加速推理模块),在前向传播过程中,通过融合Conv+bn层,达到加速推理的作用,一般用于测试或验证阶段。

1.3 Focus

Focus模块是作者自己设计出来的,为减少浮点数和提高速度,而不是增加feature map的,本质是将图像进行切片,类似于下采样取值,将原图像的宽高信息切分,聚合到channel通道中。结构如下:

 

1.4 Bottleneck

 

1.5 BottleneckCSP

这个模块是由Bottleneck模块盒CSP结构组成。CSP结构来源于2019年CSPNet:A New Backbone that can Enhance Learning Capability of CNN。这个模块与C3模块等效,如果要用的话,直接在yolov5s.yaml文件C3改成BottleneckCSP即可,但一般不用改,因为C3更好。

1.6 C3

 是一种简化的BottleneckCSP,除了Bottleneck部分只有三个卷积,可以减少参数,因此取名C3。

1.7 SPP

高层网络层的感受野的语义信息表征能力强,低层网络层的感受野空间细节信息表征能力强。空间金字塔池化(Spatial Pyramid Pooling,SPP)是目标检测算法中对高层特征进行多尺度池化以增加感受野的重要措施之一。

经典的空间金字塔池化模块首先将输入的卷积特征分成不同的尺寸,然后每个尺寸提取固定维度的特征,最后将这些特征拼接成一个固定的维度,如图所示。

输入的卷积特征图的大小为(w,h),

第一层空间金字塔采用4×4的刻度对特征图进行划分,其将输入的特征图分成了16个块,每块的大小为(w/4,h/4);

第二层空间金字塔采用2×2刻度对特征图进行划分,其将输入的特征图分为4个块,每块大小为(w/2,h/2);

第三层空间金字塔将整张特征图作为一块,进行特征提取操作,最终的特征向量为21=16+4+1维

 1.8 Concat

自身(a list of tensors)按照某个维度进行concat,常用来合并前后两个feature map。

1.9 Contract、Expand

两个函数用于改变feature map维度。

①Contract函数改变输入特征的shape,将feature map的w和h维度(缩小)的数据收缩到channel维度上(放大)。

如x(1,64,80,80)to x(1,256,40,40)

②Expand函数也是改变输入特征的shape,不过与Contract的相反,是将channel维度(变小)的数据扩展W和H维度(变大)。

如x(1,64,80,80)to x(1,16,160,160)、

 2.重要类

下面几个函数都是属于模型的拓展模块。

YOLOv5的作者将搭建模型的函数功能写的很齐全,包含搭建模型部分,还考虑到各方面其他功能,如给模型搭载NMS功能、给模型封装成包含前处理、推理、后处理的模块(预处理+推理+nms)、二次分类等功能

2.1 非极大值抑制(NMS)

非极大值抑制(Non-maximum Suppression,NMS)的作用:模型检测出了很多框,应该留哪些。 YOLOV5使用NMS算法来移除一些网络模型在预测时生成的多余预测框,该算法的核心是搜索局部得分最大值预测并移除与局部最大值预测框重叠度超过一定阈值的检测框,需要注意,NMS算法对所有待检测目标类别分别执行。

这个模块是给模型搭载NMS功能,直接调用./utils/general.py文件的non_max_suppression()函数

2.2 AutoShape

模型拓展模块,给模型封装成包含前处理、推理、后处理的模块(预处理+推理+nms),用得不多

2.3 Detections

2.4 Classify

二级分类模块,如做车牌的识别,需要先识别出车牌,如果想对车牌上的字进行识别,就需要二级分类进一步检测。

3.修改代码

 将C3模块中concat后的卷积层去掉。

class C3(nn.Module):
    """Implements a CSP Bottleneck module with three convolutions for enhanced feature extraction in neural networks."""

    def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5):
        """Initializes C3 module with options for channel count, bottleneck repetition, shortcut usage, group
        convolutions, and 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)  # optional act=FReLU(c2)
        self.m = nn.Sequential(*(Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)))

    def forward(self, x):
        """Performs forward propagation using concatenated outputs from two convolutions and a Bottleneck sequence."""
        return torch.cat((self.m(self.cv1(x)), self.cv2(x)), 1)

修改代码部分学习自 第Y4周:common.py文件解读-CSDN博客

代码运行:

4.总结

通过学习营和阅读别人的学习记录,彻底学习了YOLO的common文件内的所有模块,以及每个模块是干什么的,试着修改,运行。


网站公告

今日签到

点亮在社区的每一天
去签到