【扒代码】regression_head.py

python 复制代码
import torch
from torch import nn

class UpsamplingLayer(nn.Module):
    # 初始化 UpsamplingLayer 类
    def __init__(self, in_channels, out_channels, leaky=True):
        super(UpsamplingLayer, self).__init__()  # 调用基类的初始化方法

        # 初始化一个序列模型,包含卷积层、激活函数和上采样操作
        self.layer = nn.Sequential(
            # 卷积层,用于特征图的卷积操作
            # in_channels 表示输入通道数,out_channels 表示输出通道数
            # kernel_size=3 表示卷积核大小为 3x3
            # padding=1 表示边缘填充,保持特征图尺寸不变
            nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1),
            # 根据参数 leaky 决定使用 LeakyReLU 激活函数还是 ReLU 激活函数
            # LeakyReLU 在正输入值上与 ReLU 相同,但在负输入值上允许一个小的梯度(由 leaky 参数控制)
            nn.LeakyReLU() if leaky else nn.ReLU(),
            # 上采样层,使用双线性插值方法放大特征图
            # scale_factor=2 表示将特征图的尺寸放大两倍
            nn.UpsamplingBilinear2d(scale_factor=2)
        )

    # 前向传播方法,将输入 x 通过定义好的层进行处理
    def forward(self, x):
        return self.layer(x)

功能解释

  • UpsamplingLayer 类接收三个参数:in_channels(输入通道数),out_channels(输出通道数),和 leaky(一个布尔值,决定是否使用 LeakyReLU 激活函数)。
  • 类初始化方法 __init__ 中,使用 nn.Sequential 创建了一个序列模型,它将按照顺序应用里面的层。
  • nn.Conv2d 是一个二维卷积层,用于在卷积神经网络中进行卷积操作。
  • nn.LeakyReLU 是一种激活函数,当输入为正时,它的行为与 nn.ReLU 相同,当输入为负时,它允许一个非零的梯度(由 leaky 参数控制)。
  • nn.UpsamplingBilinear2d 是一个上采样层,使用双线性插值方法来放大特征图的尺寸。
  • forward 方法定义了模型的前向传播,它接收输入 x,并通过 self.layer 中定义的层进行处理,然后返回处理后的结果。

整体而言,UpsamplingLayer 类实现了一个简单的上采样模块,它首先通过卷积层提取特征,然后应用激活函数,最后通过上采样层放大特征图,这在图像分割、特征细化等任务中非常有用。(这个上采样)

python 复制代码
import torch
from torch import nn
from .upsamplinglayer import UpsamplingLayer  # 假设 UpsamplingLayer 在当前包中定义

class DensityMapRegressor(nn.Module):
    # 初始化 DensityMapRegressor 类
    def __init__(self, in_channels, reduction):
        super(DensityMapRegressor, self).__init__()  # 调用基类的初始化方法

        # 根据 reduction 参数的不同,构建不同的回归器结构
        if reduction == 8:
            self.regressor = nn.Sequential(
                # 上采样层,将输入通道数 in_channels 上采样到 128
                UpsamplingLayer(in_channels, 128),
                # 继续上采样到 64
                UpsamplingLayer(128, 64),
                # 再上采样到 32
                UpsamplingLayer(64, 32),
                # 最后通过一个 1x1 卷积层将通道数减少到 1,生成密度图
                nn.Conv2d(32, 1, kernel_size=1),
                # 使用 LeakyReLU 激活函数
                nn.LeakyReLU()
            )
        elif reduction == 16:
            self.regressor = nn.Sequential(
                # 与 reduction == 8 类似,但是最后多一个上采样步骤到 16
                UpsamplingLayer(in_channels, 128),
                UpsamplingLayer(128, 64),
                UpsamplingLayer(64, 32),
                UpsamplingLayer(32, 16),
                nn.Conv2d(16, 1, kernel_size=1),
                nn.LeakyReLU()
            )

        # 初始化模型参数
        self.reset_parameters()

    # 前向传播方法,将输入 x 通过回归器处理
    def forward(self, x):
        return self.regressor(x)

    # 参数重置方法,使用特定的初始化方法初始化模型的权重和偏置
    def reset_parameters(self):
        for module in self.modules():  # 遍历模型中所有的模块
            if isinstance(module, nn.Conv2d):  # 如果模块是二维卷积层
                # 初始化权重为标准正态分布
                nn.init.normal_(module.weight, std=0.01)
                # 如果存在偏置项,则初始化为常数 0
                if module.bias is not None:
                    nn.init.constant_(module.bias, 0)

功能解释

  • DensityMapRegressor 类用于生成对象计数的密度图,它根据输入的特征图和指定的 reduction 参数来构建一个回归器网络。
  • in_channels 参数指定了输入特征图的通道数。
  • reduction 参数控制了网络中上采样层的数量和最终生成的密度图的分辨率。
  • self.regressor 是一个序列模型,根据 reduction 参数的值,它将构建不同数量的上采样层,最后通过一个 1x1 卷积层输出通道数为 1 的密度图。
  • forward 方法定义了模型的前向传播逻辑,它接收输入 x,并通过 self.regressor 进行处理,返回处理后的密度图。
  • reset_parameters 方法用于初始化模型的参数,这里使用正态分布初始化权重,偏置初始化为常数 0。这是为了在训练开始前给模型一个合理的初始状态。

整体而言,DensityMapRegressor 类实现了一个用于生成密度图的回归网络,它通过一系列上采样层逐步放大特征图的尺寸,并最终生成一个通道数为 1 的密度图,这个密度图可以用于表示图像中对象的分布密度。

什么是上采样?

上采样(Upsampling)是深度学习和计算机视觉中常用的一种技术,用于增加数据的空间分辨率,即增加图像的高度和宽度。上采样通常在特征图(feature maps)经过一系列卷积层后应用,以便恢复图像的空间尺寸或为后续的网络层提供合适尺寸的输入。

上采样的常见方法包括:

  1. 最近邻插值(Nearest Neighbor Interpolation)

    • 这是最简单的上采样方法,通过选择距离最近的像素点的值来填充新像素点。
  2. 双线性插值(Bilinear Interpolation)

    • 这种方法考虑了新像素点周围四个最近像素点的值,并通过线性方式进行插值。
  3. 双三次插值(Bicubic Interpolation)

    • 类似于双线性插值,但使用了更高阶的多项式来提供平滑的插值效果。
  4. 转置卷积(Transposed Convolution)

    • 也称为反卷积,通过卷积操作来增加图像的空间尺寸,同时学习如何填充新像素点的值。
  5. 像素 Shuffle(Pixel Shuffle)

    • 通过重新排列像素来增加图像的分辨率,通常与子像素卷积一起使用。

在这个例子中,新像素点的值是通过考虑周围现有像素点的值并进行加权平均得到的。

上采样在许多深度学习任务中都非常有用,例如在语义分割任务中恢复图像分辨率,或者在生成对抗网络(GANs)中生成高分辨率的图像。通过上采样,模型能够生成更精细的特征表示,有助于提高任务的性能。

相关推荐
蓝婷儿1 小时前
Python 机器学习核心入门与实战进阶 Day 1 - 分类 vs 回归
python·机器学习·分类
Devil枫2 小时前
Kotlin扩展函数与属性
开发语言·python·kotlin
程序员阿超的博客3 小时前
Python 数据分析与机器学习入门 (八):用 Scikit-Learn 跑通第一个机器学习模型
python·机器学习·数据分析·scikit-learn·入门教程·python教程
xingshanchang4 小时前
PyTorch 不支持旧GPU的异常状态与解决方案:CUDNN_STATUS_NOT_SUPPORTED_ARCH_MISMATCH
人工智能·pytorch·python
昵称是6硬币7 小时前
YOLOv11: AN OVERVIEW OF THE KEY ARCHITECTURAL ENHANCEMENTS目标检测论文精读(逐段解析)
图像处理·人工智能·深度学习·yolo·目标检测·计算机视觉
费弗里7 小时前
Python全栈应用开发利器Dash 3.x新版本介绍(1)
python·dash
李少兄9 天前
解决OSS存储桶未创建导致的XML错误
xml·开发语言·python
就叫飞六吧9 天前
基于keepalived、vip实现高可用nginx (centos)
python·nginx·centos
Vertira9 天前
PyTorch中的permute, transpose, view, reshape和flatten函数详解(已解决)
人工智能·pytorch·python
heimeiyingwang9 天前
【深度学习加速探秘】Winograd 卷积算法:让计算效率 “飞” 起来
人工智能·深度学习·算法