当前位置: 首页 > news >正文

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

文章目录

  • 一、引言
  • 二、下采样(Downsampling)
  • 三、上采样(Upsampling)
    • 1. 最近邻插值
    • 2.双线性插值
    • 3.转置卷积(Deconvolution)
    • 4.代码部分
  • 四、总结


在计算机视觉领域,尤其是在深度学习和卷积神经网络(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)

四、总结

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 具身智能成败之关键!干货长文首次全面回顾具身智能领域中的视觉-语言-动作模型!
  • 聊聊国产数据库的生态系统建设
  • C语言 之 strlen、strcpy、strcat、strcmp字符串函数的使用和模拟实现
  • Java面试题--JVM大厂篇之解密ZGC:让你的Java应用高效飞驰
  • KNN算法原理
  • Fly Catcher:通过监测恶意信号来检测飞机欺骗
  • 2024年运营技术与网络安全态势研究报告:遭遇多次网络威胁的比例暴增
  • RabbitMQ-消息队列之routing使用
  • 【Python系列】 Python打印99乘法表
  • 在 Go 语言中,字符串格式化拼接可以通过多种方法实现
  • 嵌入式Linux:proc文件系统
  • Scratch魔法课堂:开启编程奇幻之旅
  • 【排序篇】实现快速排序的三种方法
  • 动手学深度学习(pytorch)学习记录9-图像分类数据集之Fashion-MNIST[学习记录]
  • Vue的本地部署
  • ----------
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Angular 响应式表单之下拉框
  • DataBase in Android
  • hadoop入门学习教程--DKHadoop完整安装步骤
  • IIS 10 PHP CGI 设置 PHP_INI_SCAN_DIR
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaScript标准库系列——Math对象和Date对象(二)
  • python大佬养成计划----difflib模块
  • Unix命令
  • vuex 笔记整理
  • 不上全站https的网站你们就等着被恶心死吧
  • 对象管理器(defineProperty)学习笔记
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 使用 @font-face
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 微服务入门【系列视频课程】
  • 译有关态射的一切
  • 译自由幺半群
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • ${factoryList }后面有空格不影响
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (七)理解angular中的module和injector,即依赖注入
  • (全注解开发)学习Spring-MVC的第三天
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (轉)JSON.stringify 语法实例讲解
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .bat文件调用java类的main方法
  • .dat文件写入byte类型数组_用Python从Abaqus导出txt、dat数据
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复