关于上采样方法总结(插值和深度学习)

2023-11-05

一、简介

      上采样的技术是图像进行超分辨率的必要步骤,最近看到了CVPR2019有一些关于上采样的文章,所以想着把上采样的方法做一个简单的总结。
看了一些文章后,发现上采样大致被总结成了三个类别:
1、基于线性插值的上采样
2、基于深度学习的上采样(转置卷积)
3、Unpooling的方法
其实第三种只是做各种简单的补零或者扩充操作,下文将不对其进行涉及。

为了方便大家阅读,做了个小的目录,接下来的文章介绍主要分为以下内容:
线性插值
1、最近邻算法
2、双线性插值算法
3、双三次插值算法(bicubic)

深入学习
1、转置卷积
2、PixelShuffle(亚像素卷积,CVPR2016)
3、DUpsampling(亚像素卷积,CVPR2019)
4、Meta-Upscale(任意尺度缩放,CVPR2019)
5、CAPAFE(内容关注与核重组,思路新颖,ICCV2019)

二、线性插值

      线性插值用的比较多的主要有三种:最近邻插值算法、双线性插值、双三次插值(BiCubic),当然还有各种其改进型。在如今SR中这些方法仍然广泛应用。这些方法各有优劣和劣势,主要在于处理效果和计算量的差别。
      计算效果:最近邻插值算法 < 双线性插值 < 双三次插值
      计算速度:最近邻插值算法 > 双线性插值 > 双三次插值
       在接下来我会将测试这些算法的效果和运行速度。

1、最近邻插值算法

      最近邻插值算法是最简单的一种插值算法,当图片放大时,缺少的像素通过直接使用与之最近原有颜色生成,也就是说照搬旁边的像素这样做结果产生了明显可见的锯齿。在待求像素的四邻像素中,将距离待求像素最近的邻灰度赋给待求像素。
在这里插入图片描述
      一张来自网上的图,描述的很清楚,也就是说在A区域的值邻近于(i,j)点,所以都将(i,j)点的像素值赋予在A区域的所有像素,同理可得其他的区域。在图上没有表达清楚的是在坐标轴上的像素如何处理,个人觉得可能是在程序中定义等号偏向于一边。
在这里插入图片描述

      可见有很明显的马赛克块,这里我没有用opencv的resize去做(这个函数里的最近邻应该不是很准确,不清楚里面做了什么优化或者其他处理,理论上相邻的像素值是一样的,但是那个库调用后出来的效果和其他两种方法的效果基本相同而且时间差不多。。。。)


2、双线性插值

在这里插入图片描述

双线性插值就是做两次线性变换,先在X轴上做一次线性变换,求出每一行的R点:

在这里插入图片描述
再通过一次线性变换求出在该区域中的P点:
在这里插入图片描述
可以把上式汇成所要计算的f(x,y)
在这里插入图片描述
效果如图:
在这里插入图片描述


3、双三次插值
      双三次插值在SR中引用的比较多,其计算也比较复杂速度较慢。它实际上也是一种插值的方式,但是并不是通过线性插值,而是通过邻近的4x4的像素做加权。
      首先第一步是先构建作者所说的BiCubic函数,即上式中的aij
在这里插入图片描述
      其中aij = W(x)* W(y),即我们要分别求取x,y方向的W,然后相乘作为权重。
      至于x的取值访问如何理解,我简单把我的理解绘制成这张图,当要求的像素点为(u,v),则内圈的四个点权值计算选用|x|<=1的计算公式,外圈的选择另一个公式。
在这里插入图片描述
之后的计算就是对这16个值做加权,即可求出(u,v)的像素值。
在这里插入图片描述
      手写代码的运行速度(按原理写的,没有优化有点慢)
在这里插入图片描述
      使用的话opencv中的resize可以直接使用,而且速度特别快,但是他的最近邻运行出来的效果太好了,而且时间最长,对于有点疑惑。。如果有懂的朋友麻烦解惑谢谢。以下是opencv运行时间:
在这里插入图片描述

二、深度学习

1、转置卷积
       基于深度学习的上采样实际上就是通过训练转置卷积核对图片的尺寸进行扩充,当然为了取得好的效果,肯定不单单是一个转置卷积核就可以办到的,很多的学者对上采样的网络做了很多工作。
      基础的转置卷积可以参考这篇文章:https://blog.csdn.net/gaotihong/article/details/79164172
在这里插入图片描述
在这里插入图片描述
      除了以上这种单纯通过补零和unpooling来做输入的扩大的方法之外,近几年来,随着语义分割和超分辨率的发展,也出现了很多其他深度学习的方法来做上采样,取得了很好的效果。


2、PixelShuffle
      PixelShuffle是在CVPR2016的Real-Time Single Image and Video Super-Resolution Using an Effificient Sub-Pixel Convolutional Neural Network一文中提出。ESPCN的主要概念是关注于亚像素卷积层,通过三次卷积之后输出与原图一样尺寸的r2通道的输出图,再通过如下图所示的reshape方法将 Hx Wxr2 的特征图转成 rHxrW 的输出图。而扩大的倍数刚刚好等同于通道数。这样的做法可以让网络去学习到一种插值方法,并存在于前面三层卷积层的参数中。
在这里插入图片描述
      这个方法的提出对超分辨率有两个与之前不同的贡献:一个是不需要再通过一开始进行线性插值来扩大输入的尺寸了,从而可以用更小的卷积核就可以获得很好的效果,另一个是作者认为bicubic是一种卷积的特殊情况(即计算权重相乘求和),用卷积学习可以学会比手工设计更好的拟合方式。


3、DUpsampling
      这个上采样方法是在CVPR2019中的Decoders Matter for Semantic Segmentation: Data-Dependent Decoding Enables Flexible Feature Aggregation∗中提出的,从下面的网络结构来看和PixelShuffle有点类似,它是通过卷积学习亚像素,并最后重组来获得更大的图像。
在这里插入图片描述
      DUpsampling在对特征图的操作上有所不同,是先通过将单个像素所对应的C个通道reshape成一个1xC的向量,与CxN的矩阵相乘得到1xN的向量,再reshape成为2x2xN/4(2应该指的是放大倍数,即rxrxN/r2)的扩大后的亚像素块,组合成放大后的特征图。
      以上这两种算法都是基于数据去训练的,可以获得比线性插值更好的效果,但是与线性插值相比存在的问题是:1、对于不同的放大倍数的图像需要训练不同的网络(因为通道数的改变);2、不容易进行连续的放大,比如1.1倍,1.2倍这样。说不容易而不是不能是因为可以适当放大输入图像或者对权重和步长进行调整后放缩,但是计算很复杂,效果没有整数倍好,线性插值却很容易办到。


4、Meta-Upscale
在这里插入图片描述
       先上一张图,这张图我觉得比较好的说明了原来的方法要如何做一次非整数尺度的放缩,这样方便进一步了解Meta-SR的思路。
       Meta-SR中的Meta-Upscale是在CVPR2019上的Meta-SR: A Magnifification-Arbitrary Network for Super-Resolution一文中提出来的,作者提出了一种可以任意尺度缩放的方法,可以实现较好效果的非整数的放缩。
在这里插入图片描述
       FLR 表示由特征学习模块提取的特征,并假定缩放因子是 r。对于 SR 图像上的每个像素(i, j),文中认为它由 ILR 图像上像素(i′,j′)的特征与一组相应卷积滤波器的权重所共同决定。从这一角度看,放大模块可视为从 FLR 到 ISR 的映射函数。
在这里插入图片描述
       我对此的理解是,kxk应该是所设定的与I^SR所相关的一个像素搜索范围。及这个范围内的所有像素都是和最后输出的像素是有关系的,需要对其计算相应的权重并加权计算。HWx(InCxoutC)我的理解是图像最后输出的长x宽x输入的通道数(文中为64)x输出的通道数(文中为3)做为权值生成的输出的通道数。对于一个像素的计算我们需要对64个通道上feature map上的对应9个值加权求和,就可以计算出输出的一个通道值,重复3次就是一个值的3个通道数的值,重复HW次就可以计算出整个输出。
       那么知道最后如何计算输出之后,我们关心的是文中提到的是怎么来做对不同的放缩大小的权值计算的以及如何在任意尺度下完成输出像素和LR特征图上的对应。
       作者把 Meta-Upscale 模块由三个重要的函数,即 Location Projection、Weight Prediction、Feature Mapping(这个就是上文讲的如何乘以权值得到最后的输出)。
       先说下文中的Location Projection,如下图:
在这里插入图片描述
在这里插入图片描述
       通过向下取整使得ISR中的每一个值都可以在ILR上找到一个对应的值。如放大1.5倍,那么ILR上的0对应ISR中的0和1(0/1.5<1,1/1.5<1)。

       而权重预测Weight Prediction在网络中是通过构建了两层全链接层和relu来实现的,输出在上文已经讲过了就不再重复,而文中用于预测的输入是这样获得的,如下式:
在这里插入图片描述
       总结一下,Meta-SR中的思路有点像RPN,做了一个外部的推荐网络,来推荐放缩的权值及像素的对应关系,在非整数倍放大上起的不错的效果。


5、CAPAFE
       CAPAFE是出自ICCV2019中的CARAFE: Content-Aware ReAssembly of FEatures 一文中的,作者提出了构建一种内容感知并重组特征的上采样方法,看到这篇文章的时候感觉到它的结构思路与之前有很大的不同。
在这里插入图片描述
       CAPAFE的整个网络结构由两部分组成,一部分是核预测模块(Kernel Prediction Module),用于生成用于重组计算的核上的权重。另一部分是内容感知重组模块(Content-aware Reassembly Module),用于将计算到的权重将通道reshape成一个kxk的矩阵作为核与原本输入的特征图上的对应点及以其为中心点的kxk区域做卷积计算,获得输出。
       首先我们先关注下核预测模块是如何预测出权重值的,这一部分文中分为三部分:通道压缩器(Channel Compressor)、内容编码(Content Encoder)、核归一化(Kernel Normaliaer)。输入的Feature map通过1x1的卷积核,完成对通道数的压缩,文中提及这一步的原因是为了减少计算量,而且文中说通过实验将通道数压缩在64不会影响效果,文中给的Cm为64。之后通过多层Kenconder x Kenconder的卷积核完成对特征图的计算,输出HxWxσ2xKup2的特征图,这里Kenconder的大小与感受野有关,越大生成的权重与周围的内容的关联性越高。最后将特征图reshape成σHxσWxKup2,之后单独对每一个像素的所有通道用softmax做归一化,为了是最后生成的重组核内权重值和为1。这样权重的预测就完成了。
       之后将预测好的权重对每一个像素都拉成kupxkup的卷积核即图中对应的Wl,通过对(i/σ,j/σ)向下映射的方法(floor function)找到每个像素在原来的feature map上对应的点,以其为中心点构建出kupxkup的区域做卷积计算,就可以得到一个像素的输出,重复操作可以获得整个输出。
在这里插入图片描述
       CAPAFE的整个网络内的参数量特别少,只有Content Encoder中的NxKenconder x Kenconderxσ2xKup2的卷积核的参数,同时它的上采样思路也比较不同,当然它无法如Meta-SR那样做连续缩放。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于上采样方法总结(插值和深度学习) 的相关文章

  • linux系统创建新用户

    一般情况下linux系统创建 删除新用户主要有以下几种方式 1 创建新用户 useradd 用户名 删除用户 userdel 用户名 2 sudo useradd m 用户名 删除用户 sudo userdel r 用户名 可以直接删掉用户
  • 联想笔记本插入耳机仍外放--解决方式

    1 打开控制面板 2 点击硬件和声音 3 点击realtek音频管理器 4 点击设备高级设置 5 选中第二项 6 点击确定 关闭所有窗口即可解决该问题

随机推荐

  • 数学在机器学习中的重要性

    数学在机器学习中的重要性 by Dahua Lin Linear Algebra 线性代数 和 Statistics 统计学 是最重要和不可缺少的 这代表了Machine Learning中最主流的两大类方法的基础 一种是以研究函数和变换为
  • 使用BOTO进行S3各种操作

    使用BOTO进行S3各种操作 BOTO是一个开源的PYTHON发布包 是AWS AMAZON WEBSERVICE 的PYTHON封装 近期 我们公司用到国内某知名公司的S3云存储服务 需要调用该公司提供的S3 PYTHON SDK 鉴于该
  • Java连接MySQL数据库(多种连接方法)

    当我们掌握Java的基础知识后就可以学习一些Java的高级技术 或特性 了 例如 集合 多线程 网络编程 数据库技术 并发等等 其中数据库技术在Java的学习中也是相当重要的 今天就简单介绍一下Java与MySQL数据类的 1 提前准备 下
  • 亚马逊云科技实时 AI 编程助手 Amazon CodeWhisperer,开发快人一步!

    Amazon CodeWhisperer 是一款 AI 编码配套应用程序 可在 IDE 中生成整行代码和完整的函数代码建议 以帮助您更快地完成更多工作 在本系列文章中 我们将为您详细介绍 Amazon CodeWhisperer 的相关信息
  • 传输层——TCP报文头介绍

    16位源端口号 16位目的端口号 32位序列号 32位确认序列号 4位头部长度 保留6位 U R G A C K P S H R S T S Y N F I N 16位窗口大小 16位检验和 16位紧急指针 可选项 数据 源端口 长度为16
  • flex布局(骰子布局)

    1 应该都知道使用VS来敲写页面的第一步就是新建文件夹 也可以建文件夹 这是指只有html没有css与js才可以的 然后 可以在VS中打开文件夹 也可以直接把文件夹拖进去 这有两种方法 任意一种就行了 建议你直接拖进去 因为方便 2 这次的
  • Apache配置文件httpd.conf的理解

    httpd conf 是Apache使用的主要配置文件 1 文件位置 一般在 C wamp64 bin apache apache2 4 51 conf 2 是注释符号 1 解释每一指令的作用 2 指令模板 有时去掉 就能使用 3 Unix
  • Surprise库使用总结

    文章目录 Surprise库 1 加载数据模块 2 模型训练前的数据划分模块 2 1 交叉验证数据划分 2 2 训练集测试集划分 3 构建算法模块 3 1 记号说明 3 2 基于统计的算法 3 3 基于近邻 协同过滤 的方法 3 3 1 相
  • stata回归?固定效应模型(组内变换OR LSDV最小二乘法)

    面板数据分析与Stata应用笔记整理自慕课上浙江大学方红生教授的面板数据分析与Stata应用课程 笔记中部分图片来自课程截图 笔记内容还参考了陈强教授的 高级计量经济学及Stata应用 第二版 一 面板数据的定义 面板数据 panel da
  • 笔记本左Ctrl键失灵

    这两天发现笔记本的左Ctrl键单按失灵 无法使用快捷键 很是麻烦 一开始以为按键坏了 打算去官方店维修 但使用在线网站测试 先按其余任意按键的同时 再按左Ctrl 它有反应 可以使用在线键盘测试 zFrontier 装备前线对键盘按键进行在
  • vben admin框架 useForm 时间选择器 开始时间,结束时间解析.懒人方法

    因为搜索部分需要一个创建时间范围 因为DatePicker返回的是一个数组 开始自己在useTable 中的beforeFetch中拦截请求 然后解析参数 重组参数 这样有好多表格组件的时候 就需要写多个beforeFetch 然后闲来无事
  • 《新程序员002》图书正式上市! 从“新数据库时代”到“软件定义汽车”

    20年前 伴随着互联网打开信息化大门 技术人成为新时代的开拓者 在时代的召唤下 CSDN于2001年推出国内首个面向IT人员的专业杂志 程序员 成为一代代开发者的技术启蒙 20年后的今天 人工智能 云计算 大数据等新兴技术被赋予撬动新一轮产
  • 最有效的方法来增加在Map中的值

    关于这个是在一个博客上看到的 就像试一下 测试结果出人意料 看到这个标题可能还是觉得有点抽象 那么首先来一段代码 int count map containsKey string map get string 0 map put strin
  • 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

    给定一个包含 n 个整数的数组 nums 判断 nums 中是否存在三个元素 a b c 使得 a b c 0 找出所有满足条件且不重复的三元组 注意 答案中不可以包含重复的三元组 例如 给定数组 nums 1 0 1 2 1 1 4 满足
  • Linux的chmod

    chmod 命令是 Linux 系统中的一个重要命令 用于更改文件或目录的访问权限 chmod 命令可以设置文件或目录的所有者 所属组和其他用户的读 写 执行权限 通过 chmod 命令 用户可以控制文件或目录的访问权限 以保护重要数据不被
  • KVM学习(一)vnc连接

    完整流程Windows连接CentOS7 这个KVM系列是我的本科毕业设计 边学边做 长期更新 1 安装vncserver 首先看下实验环境 windows上跑的vmware虚拟机 vncserver安装在虚拟机上 虚拟机已经安装好了gno
  • 游戏服务器维护是干啥的,网络游戏的服务器维护都是在做些什么?

    来 我作为前网易游戏从业人员来说说真正服务器维护时候在做什么 服务器维护分成两种 紧急维护和日常维护 1 紧急维护 紧急维护一般就是硬件故障或者严重Bug 这个时候是各个团队最紧张的时候 每个团队都忙个不停 运营团队会发布公告 安慰玩家 统
  • 黑马JAVA P174 线程池概述、线程池的7个参数详解

  • Java Spring注解二:参数请求@RequestParam和@RequestBody

    作为一名crud boy 关于web请求 接口处理基本是家常便饭 涉及到这些中间肯定少不了请求参数 毕竟要根据请求参数才能进行相应的操作 返回预想的结果 一般来说我们web请求参数是不能直接通过http请求来代码识别的 所以你必须要通过注解
  • 关于上采样方法总结(插值和深度学习)

    一 简介 上采样的技术是图像进行超分辨率的必要步骤 最近看到了CVPR2019有一些关于上采样的文章 所以想着把上采样的方法做一个简单的总结 看了一些文章后 发现上采样大致被总结成了三个类别 1 基于线性插值的上采样 2 基于深度学习的上采