计算机视觉中的上采样与下采样:深入浅出实例代码解析


在计算机视觉领域,尤其是在深度学习和卷积神经网络(CNNs)的应用中,“上采样”和“下采样”是两个经常被提及的概念。如果你已经了解了基本的卷积和池化操作,那么接下来的内容将帮助你更深入地理解这些概念及其在实际应用中的作用。

一、引言

在处理图像数据时,我们经常会遇到需要调整图像分辨率的情况。例如,在语义分割任务中,模型需要输出与输入图像相同尺寸的像素级标签图;而在图像识别任务中,为了减少计算量或提取特征,我们可能希望降低图像的分辨率。这就是上采样和下采样的用武之地。

二、下采样(Downsampling)

下采样其实很好理解,如果你知道池化操作,那么就会明白下采样的概念。

定义

  • 下采样是指减少图像的空间分辨率,从而降低图像的尺寸和细节水平。
  • 在计算机视觉中,下采样通常通过池化操作实现,如最大池化(Max Pooling)或平均池化(Average Pooling)。

目的

  1. 减少计算成本:降低图像分辨率可以显著减少计算量和内存消耗。
  2. 特征提取:通过下采样,可以获取图像的更高层次特征,这对于分类等任务非常有用。
  3. 抗过拟合:减少图像信息有助于模型学习更为泛化的特征。

示例
假设我们有一个 (32 × 32) 像素的图像,使用 (2 × 2) 的最大池化操作进行下采样,结果将是一个 (16 × 16) 像素的新图像,每个新像素代表原始图像中 (2 × 2) 区域的最大值。

三、上采样(Upsampling)

定义

  • 上采样是指增加图像的空间分辨率,使图像尺寸变大。
  • 上采样技术在很多场景中都有应用,比如超分辨率重建(超分)、图像放大以及语义分割等任务中。

方法

1. 最近邻插值

  • 概念:将每个目标像素找到距离它最近的原图像素点,然后将该像素的值直接赋值给目标像素。
  • 优点:实现简单,计算速度快
  • 缺点:插值结果缺乏连续性,可能会产生锯齿状的边缘,对于图像质量影响较大,因此当处理精度要求较高的图像时,通常会采用更加精细的插值算法,例如:双线性插值、三次插值。
  • 使用场景
    虽然最近邻插值算法会导致处理后的图像出现锯齿失真,但最进行图像分割模型训练时,为了避免引入其他像素值的干扰,必须采用最近邻插值算法。
  • 下面是图解

在这里插入图片描述
注意!之后的图解,都是以“将2×2图像扩充成为3×3的任务”为例,并且图像通道数为3
具体例子,文末配备了python代码,大家自行尝试
在这里插入图片描述

2.双线性插值

概念:根据周围像素的值进行加权平均来估计缺失像素的值。
说白了,就是像素点之间插入平均值!
图解示例如下,一看就明白了,():
在这里插入图片描述
双线性插值之后的图像如下,其实就是平均值嘛
在这里插入图片描述

3.转置卷积(Deconvolution)

概念:通过反向卷积操作来扩大图像尺寸,常用于生成对抗网络(GANs)和语义分割任务中。
别称:也称为反卷积,传统的卷积通常是将大图片卷积成一张小图片,而反卷积就是反过来,将一张小图片变成大图片。
如果你只想看看反卷积大概是个什么效果,可以直接复制我后面给出的代码。如果你想详细研究,可以参看下面这篇文章:
反卷积通俗详细解析与nn.ConvTranspose2d重要参数解释

4.代码部分

(只要你有pytorch环境,复制就可以运行!)

  • 最近邻插值和双线性插值的代码如下:
import numpy as np
import torch
import torch.nn.functional as F
# image_arr=(np.random.rand(3,2,2)).astype(np.float32)
# print(image_arr)
# 创建一个3x2x2的张量
image_arr = np.array([
    [[1, 2], [3, 4]],
    [[5, 6], [7, 8]],
    [[9, 10], [11, 12]]
], dtype=np.float32)

# image_arr=(np.random.rand(3,2,2)).astype(np.float32)
# print(image_arr)

image_tensor=torch.tensor(image_arr.copy(),dtype=torch.float32).unsqueeze(0)
# image_tensor=torch.tensor(image_arr.copy(),dtype=torch.float32)


print(image_tensor)

# 使用pytorch的函数方法实现
result_nearest = F.interpolate(image_tensor, size=(3,3), mode='nearest')
# result_nearest=F.interpolate(image_tensor,size=(3,3),mode='nearest',align_corners=False)
result_bilinear=F.interpolate(image_tensor,size=(3,3),mode='bilinear',align_corners=False)
print("result_nearest:")
print(result_nearest)
print("result_bilinear:")
print(result_bilinear)
  • 转置卷积的代码:
import torch
import torch.nn as nn

# 定义转置卷积层
conv_transpose = nn.ConvTranspose2d(in_channels=3, out_channels=3, kernel_size=3, stride=2, padding=1, output_padding=1)

# 创建一个3x2x2的张量
tensor = torch.tensor([
    [[1, 2], [3, 4]],
    [[5, 6], [7, 8]],
    [[9, 10], [11, 12]]
], dtype=torch.float32)

# 调整张量形状以匹配 PyTorch 的要求 (N, C, H, W)
image_tensor = tensor.unsqueeze(0)  # 添加 batch 维度

# 应用转置卷积
output = conv_transpose(image_tensor)

# 输出结果
print("Original:", image_tensor)
print("Transposed Convolution output:", output)

四、总结

上采样和下采样是计算机视觉中重要的图像处理步骤,它们在不同的应用场景中发挥着关键的作用。通过合理地使用这些技术,可以有效地提升模型的性能和效率。理解这些操作的基本原理和应用场景对于设计高效的视觉模型至关重要。

本人软件工程本科在读;
这篇博客如果对你理解上采样与下采样有所帮助的话,感谢你的点赞关注啦!共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

.别止步春天.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值