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

news2025/2/24 17:49:28

文章目录

  • 一、引言
  • 二、下采样(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)

四、总结

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2050997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宝塔面板部署webman项目+nginx反向代理

新建站点 新建一个站点,php版本选择纯净态即可,反正都是用不上的,域名填写你申请得到的域名 拉取代码 新建一个目录,然后将代码部署到本地 启动项目 推荐使用宝塔面板的进程守护管理器启动项目,其实就是用superviso…

ATT格式与Intel格式x86汇编指令的区别

AT&T公司 这个公司的创始人就是发明电话的贝尔,而Unix和C语言都是出自贝尔实验室的产物。 Intel公司 世界上第一片CPU是1971年发明的,型号是Intel生产的4004微处理器。 两种格式的区别 AT&T格式Intel格式目的操作数d、源操作数s op s, d 注…

vue2中使用i18n配置elementUi切换语言

1、下载插件 npm i vue-i18n8.22.2 2、新建文件夹i18n 3、编写index.js文件 import Vue from "vue"; import VueI18n from "vue-i18n"; import locale from element-ui/lib/locale; // 引入 elementui 的多语言 import enLocale from element-ui/lib/l…

【MySQL】C/C++连接MySQL客户端,MySQL函数接口认知,图形化界面进行连接

【MySQL】C/C引入MySQL客户端 安装mysqlclient库mysql接口介绍初始化mysql_init链接数据库mysql_real_connect下发mysql命令mysql_query获取出错信息mysql_error获取执行结果mysql_store_result获取结果行数mysql_num_rows获取结果列数mysql_num_fields判断结果列数mysql_field…

域自适应,你适应了嘛?

“最难的深度学习是谁?” “嗯,是迁徙学习吧?” “要分情况,不过,应该是迁徙学习吧? ” “不是迁徙学习嘛?” 目录 域自适应是啥? 域自适应的方法? 基于差异的方法…

Kafka系列之:Kafka Connect深入探讨 - 错误处理和死信队列

Kafka系列之:Kafka Connect深入探讨 - 错误处理和死信队列 一、快速失败二、YOLO:默默忽略坏消息三、如果一条消息掉在树林里,会发出声音吗?四、将消息路由到死信队列五、记录消息失败原因:消息头六、记录消息失败原因…

k8s Pod生命周期详解

文章目录 一、创建Pod二、启动Pod三、销毁Pod 共分为三步:创建Pod、启动Pod、销毁Pod 一、创建Pod K8S创建Pod的过程 二、启动Pod 1、kubelet调用容器运行时创建Pause容器,准备一个容器环境 2、创建初始化容器init container。如果有多个,…

打印网页使内容包含有效网络连接Print webpage with workable hyperlinks

小虎想打印网页,并且将里面有链接的文字带文字一起打印保存。 解决方法 利用谷歌浏览器的打印功能即可: Use print options in chrome.

构建一个Markdown编辑器:Fyne综合案例

在本文中,我们将通过一个完整的案例来介绍如何使用Go语言的Fyne库来构建一个简单的Markdown编辑器。Fyne是一个易于使用的库,它允许开发者使用Go语言来创建跨平台的GUI应用程序。 1. 项目结构 首先,我们需要创建一个Go项目,并引…

基于vllm部署大模型

VLLM(非常大的语言模型)在中文中通常指的是经过大量文本数据训练的神经网络模型,能够理解和生成类似人类语言的文本。这类模型是许多先进AI系统的核心,比如ChatGPT、GPT-4等。 VLLM 可以执行各种任务,如自然语言处理、…

【实用工具】使用Chrome插件搭建第二大脑!SuperMemory大语言模型登场,开源、免费、保存你需要的所有网站!——含入门安装教程

文章目录 项目简介项目搭建主要功能How do I use this?本地部署 项目简介 最近,有一款Github项目十分火爆,它专注于用超级内存打造自己的第二大脑。它是书签的 ChatGPT,基于Chrome 浏览器扩展导入推文或保存网站和内容,你可以访…

RTD2739 8K60Hz/4K 240Hz

RTD2739支持4K240Hz/80K60Hz。 RTD2739 supports input format up to 3840 x 2160 240Hz RTD2739 supports 3 ports of Ultra-High Speed Receiver can support DisplayPort1.4 In DisplayPort mode, four link layer speed HBR3 (8.1GHz), HBR2 (5.4GHz), HBR(2.7GHz), R…

理解Linux中的作业控制:详解fg、bg和jobs命令

理解Linux中的作业控制:详解fg、bg和jobs命令 文章目录 理解Linux中的作业控制:详解fg、bg和jobs命令1. 前言2. jobs 命令3. bg 命令4. fg 命令5. 简要总结6. 一图概览 1. 前言 ​ Linux系统中,作业控制是一个非常重要的概念,尤其…

成为Python砖家(1): 在本地查询Python HTML文档

本地是 macOS 系统。 下载 python html 格式文档 https://docs.python.org/3/download.html 下载logo png图像 https://www.python.org/community/logos/ 创建 PythonDoc.sh, 用于创建 PythonDoc.app: #!/bin/bash# This script generates /Application/Python…

【MySQL】order by 的排序策略

目录 一、全字段排序 二、磁盘临时文件辅助排序 三、RowId 排序 四、优化 order by 在前面的文章中我们分析了 explain 执行计划的各个字段,其中有一个 Extra 字段。 在执行计划中,Extra 字段如有 Using filesort 则表示使用到了排序。 而 MySQL 的…

小白做毕设——HTTP扫盲

工具下载 Postman(发送 http 请求的工具) 官网(下载速度比较慢):https://www.postman.com/downloads/ Http 请求格式 请求地址请求方法状态码同源策略请求头响应头 接口类型 Post 接口(新增数据&#x…

ubuntu20.04挂载机械硬盘

环境说明 1.基于清华源地址下载的ubuntu20.04制作的系统盘,然后安装在PC上(固态硬盘) 2.机械硬盘无法看见 目的 挂载机械硬盘,开机就能自动启动/挂载 参考链接 https://blog.csdn.net/qq_35624642/article/details/137713143…

web技术1——http详解(重要)

什么是http 超文本: 超过文本的,不止文本,就是不是文本的也能传,比如图片,音乐,视频等。 https: 带s,是安全的意思 两个时代 1.0访问一次,连接就断开了,再访问要重新请…

低代码平台工具 —— 公式编辑器

导读 公式编辑器:公式编辑用于字段值来源于其他字段或是来源于函数计算结果都可由公式编辑来完成 公式编辑器主要需要解决三件事: 合适的编辑器强大的函数库合适的事件监听 技术选型 excel函数库 formulajs,这个函数库可以让JavaScript支…

pql语言学习

转自:https://yunlzheng.gitbook.io/prometheus-book/parti-prometheus-ji-chu/promql/prometheus-query-language //非常全面易懂的教程 1.语法 当我们直接使用监控指标名称查询时,可以查询该指标下的所有时间序列,只会返回瞬时向量表达式…