深度学习---图像卷积与反卷积(最完美的解释)

2023-05-16

转自:卷积神经网络CNN(1)——图像卷积与反卷积(后卷积,转置卷积)

动态图

1.前言

   传统的CNN网络只能给出图像的LABLE,但是在很多情况下需要对识别的物体进行分割实现end to end,然后FCN出现了,给物体分割提供了一个非常重要的解决思路,其核心就是卷积与反卷积,所以这里就详细解释卷积与反卷积。

    对于1维的卷积,公式(离散)与计算过程(连续)如下,要记住的是其中一个函数(原函数或者卷积函数)在卷积前要翻转180度

图1

    对于离散卷积,f的大小是n1,g的大小是n2,卷积后的大小是n1+n2-1

2.图像卷积

图2

同样地,卷积的时候需要对卷积核进行180的旋转,同时卷积核中心与需计算的图像像素对齐,输出结构为中心对齐像素的一个新的像素值,计算例子如下

图3

这样计算出左上角(即第一行第一列)像素的卷积后像素值。

 

给出一个更直观的例子,从左到右看,原像素经过卷积由1变成-8。

图4

通过滑动卷积核,就可以得到整张图片的卷积结果,

图5

    到了这里,大致可以明白图像卷积。但是我们可以看出,通过图像卷积后,新图像的大小跟原来一样,或者变小。图2计算后图像大小不变,如图5卷积后图像变小是因为没有对所用像素进行卷积计算。但是1维的卷积结果不是变大了吗? 下面对其解释。

 

    在matlb中对2维卷积的计算分为了3类,1.full   2.same   3. valid   参考:https://cn.mathworks.com/help/matlab/ref/conv2.html?requestedDomain=www.mathworks.com

图2对应的卷积就是就是所谓的same,图5对应的就是valid。那么full又是什么呢?如下图

图6

    图6中蓝色为原图像,白色为对应卷积所增加的padding,通常全部为0,绿色是卷积后图片。图6的卷积的滑动是从卷积核右下角与图片左上角重叠开始进行卷积,滑动步长为1,卷积核的中心元素对应卷积后图像的像素点。可以看到卷积后的图像是4X4,比原图2X2大了,我们还记1维卷积大小是n1+n2-1,这里原图是2X2,卷积核3X3,卷积后结果是4X4,与一维完全对应起来了。其实这才是完整的卷积计算,其他比它小的卷积结果都是省去了部分像素的卷积。下面是WIKI对应图像卷积后多出部分的解释:

Kernel convolution usually requires values from pixels outside of the image boundaries. There are a variety of methods for handling image edges.意思就是多出来的部分根据实际情况可以有不同的处理方法。(其实这里的full卷积就是后面要说的反卷积)

 

这里,我们可以总结出full,same,valid三种卷积后图像大小的计算公式:

1.full: 滑动步长为1,图片大小为N1xN1,卷积核大小为N2xN2,卷积后图像大小:N1+N2-1 x N1+N2-1

如图6, 滑动步长为1,图片大小为2x2,卷积核大小为3x3,卷积后图像大小:4x4

2.same: 滑动步长为1,图片大小为N1xN1,卷积核大小为N2xN2,卷积后图像大小:N1xN1

3.valid:滑动步长为S,图片大小为N1xN1,卷积核大小为N2xN2,卷积后图像大小:(N1-N2)/S+1 x (N1-N2)/S+1

如图5,滑动步长为1,图片大小为5x5,卷积核大小为3x3,卷积后图像大小:3x3

 

3.反卷积(后卷积,转置卷积)

    这里提到的反卷积跟1维信号处理的反卷积计算是很不一样的,FCN作者称为backwards convolution,有人称Deconvolution layer is a very unfortunate name and should rather be called a transposed convolutional layer. 我们可以知道,在CNN中有con layer与pool layer,con layer进行对图像卷积提取特征,pool layer对图像缩小一半筛选重要特征,对于经典的图像识别CNN网络,如IMAGENET,最后输出结果是1X1X1000,1000是类别种类,1x1得到的是。FCN作者,或者后来对end to end研究的人员,就是对最终1x1的结果使用反卷积(事实上FCN作者最后的输出不是1X1,是图片大小的32分之一,但不影响反卷积的使用)。

    这里图像的反卷积与图6的full卷积原理是一样的,使用了这一种反卷积手段使得图像可以变大,FCN作者使用的方法是这里所说反卷积的一种变体,这样就可以获得相应的像素值,图像可以实现end to end。

图7

    这里说另外一种反卷积做法,假设原图是3X3,首先使用上采样让图像变成7X7,可以看到图像多了很多空白的像素点。使用一个3X3的卷积核对图像进行滑动步长为1的valid卷积,得到一个5X5的图像,我们知道的是使用上采样扩大图片,使用反卷积填充图像内容,使得图像内容变得丰富,这也是CNN输出end to end结果的一种方法。韩国作者Hyeonwoo Noh使用VGG16层CNN网络后面加上对称的16层反卷积与上采样网络实现end to end 输出,其不同层上采样与反卷积变化效果如下,

                                                                                                                                                   图8

 

    到这里就把图像卷积与反卷积解释完成,如有不妥,请学者们指证。
    
    补充一个资料:
    图6与图7出处,https://github.com/vdumoulin/conv_arithmetic     

------------新增反卷积过程解释----------------
经过上面的解释与推导,对卷积有基本的了解,但是在图像上的deconvolution究竟是怎么一回事,可能还是不能够很好的理解,因此这里再对这个过程解释一下。
目前使用得最多的deconvolution有2种,上文都已经介绍。 
方法1:full卷积, 完整的卷积可以使得原来的定义域变大
方法2:记录pooling index,然后扩大空间,再用卷积填充


图像的deconvolution过程如下,

输入:2x2, 卷积核:4x4, 滑动步长:3, 输出:7x7
即输入为2x2的图片经过4x4的卷积核进行步长为3的反卷积的过程
1.输入图片每个像素进行一次full卷积,根据full卷积大小计算可以知道每个像素的卷积后大小为 1+4-1=4, 即4x4大小的特征图,输入有4个像素所以4个4x4的特征图
2.将4个特征图进行步长为3的fusion(即相加); 例如红色的特征图仍然是在原来输入位置(左上角),绿色还是在原来的位置(右上角),步长为3是指每隔3个像素进行fusion,重叠部分进行相加,即输出的第1行第4列是由红色特阵图的第一行第四列与绿色特征图的第一行第一列相加得到,其他如此类推。

可以看出反卷积的大小是由卷积核大小与滑动步长决定, in是输入大小, k是卷积核大小, s是滑动步长, out是输出大小
得到 out = (in - 1) * s + k
上图过程就是, (2 - 1) * 3 + 4 = 7

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

深度学习---图像卷积与反卷积(最完美的解释) 的相关文章

  • c++中LPCTSTR,LPTSTR 解释

    char是C语言标准数据类型 xff0c 字符型 xff0c 至于由几个字节组成通常由编译器决定 xff0c 一般一个字节 Windows为了消除各编译器的差别 xff0c 重新定义了一些数据类型 xff0c 你提到了另外几个类型都是这样
  • Delphi 自定义事件的例子

    我们这个控件将演示控件的自定义事件的书写 这个控件有一个类型为string的SensitiveText属性 xff0c 当用户在输入框中输入的文字为InvalidText时就会触发OnSensitiveText事件 按照惯例 xff0c 我
  • c++中sscanf的用法

    sscanf 读取格式化的字符串中的数据 swscanf 是 sscanf 的宽字符版本 xff1b swscanf 的参数是宽字符串 swscanf不处理 Unicode 全角十六进制或 34 兼容性区 34 字符 除此以外 xff0c
  • c++内存测试

    void MemoryTest 内存测试 指针嵌套 char rr 栈中分配内存 系统自动分配释放 xff09 int ee 61 int amp rr 将rr的内存地址转换成整型数 char yy 61 amp rr 定义一个字符型指针y
  • C/C++串口通信原理及读写与操作

    http wangbaiyuan cn c serial communication write reading html 展开 文章目录 在工业控制中 xff0c 工控机 xff08 一般都基于Windows平台 xff09 经常需要与智
  • c# 调用c库dll ,char*转string的解决办法

    最近由于有个未知的设备需要用到modbus通讯协议 xff0c 底层需要与PLC通讯 xff0c 坤跌 xff0c PLC啥型号也不清楚封在里面不能拆 前人只留了几个不能运行的QT代码以及不完整的文档 用惯了C 想要重新学QT xff0c
  • C++多线程编程(入门实例)

    多线程在编程中有相当重要的地位 xff0c 我们在实际开发时或者找工作面试时总能遇到多线程的问题 xff0c 对多线程的理解程度从一个侧面反映了程序员的编程水平 其实C 43 43 语言本身并没有提供多线程机制 xff08 当然目前C 43
  • Android Studio 使用Log

    Android使用log来记录信息 xff0c 测试了下 xff0c 和system out println区别不大 xff0c 主要优势在于能使用过滤器过滤日志 本文记录基础的log使用方法 xff0c 来自 第一行代码 xff0c 以及
  • 指针强制转换问题

    void ff void abc 任意类型数据指针 xff08 指针即内存地址 xff09 int z 61 int abc 强制转换成int 指针变量 int zz 61 z 获取内存中的值
  • 新手git教程

    本文转载自 xff1a http igeekbar com igeekbar post 82 htm Git近些年的火爆程度非同一般 xff0c 这个版本控制系统被广泛地用在大型开源项目 xff08 比如Linux xff09 xff0c
  • 使用Project进行项目管理

    下面开始介绍Project的使用 1 从下列地址获取Project 2010的副本 版权问题 xff0c 已删除地址 2 安装 2 1 版权页 2 2 自定义安装页 2 3 安装完毕 3 使用该软件进行项目管理 3 1 打开Project
  • Marshal在C#中的应用(void *指针到IntPtr的转化)

    C 调用C语言的API时一般把void 指针转换成IntPtr xff0c 但这经常远远不够的 在C语言中void 是个万金油 xff0c 尤其是一些老的c语言程序 xff0c 所有的参数就一个void 指针 xff0c 里面包罗万象 xf
  • VS2012 2013 无法显示查找功能 无法具体定位 解决方法

    xfeff xfeff 问题的现象 通过使用 Ctrl 43 Shift 43 F 也就是Find In Files功能 xff0c 使用之后只能显示统计结果 不显示具体行 如下图 regedit 中在注册表中查找 xff1a HKEY C
  • C#中使用指针转换数据类型[C#/unsafe]

    今日因为一个同事说起 xff0c 在原来的旧系统中使用指针做数据转换很方便 xff0c 比如要把浮点数转化为数组 xff0c 也或者是字符串的相互转换 xff1b 当然 xff0c 大家都知道c 中实现指针只需要写入unsafe 编译选项把
  • c#指针的使用例程

    unsafe double value 61 888888 byte v1 61 BitConverter GetBytes value byte v2 61 new byte v1 Length double pv 61 amp valu
  • MPAndroidChart LineChart 折线图 你要的都在这里了

    前言 MPAndroidChart已经出了很长的一段时间 xff0c 相信大家也有所耳闻 xff0c 自己也使用了有一段时间 xff0c 固在此写下文章 xff0c 根据项目的需求 xff0c 记录一些见解与问题 xff0c 作为参考 望大
  • Android Chart框架 MPAndroidChart 坐标轴设置

    1 轴线的绘制 设置轴线就先必须取得轴线类Axis 在一个图标中有三个轴线 xff1a x轴 xff1a 调用 getXAxis 获取左边y轴 xff1a 调用 getAxisLeft 获取右边y轴 xff1a 调用 getAxisRigh
  • Android图表控件MPAndroidChart——曲线图LineChart的使用(财富收益图)

    目录 前言 本文涉及文章 其他相关文章 1 数据准备 1 1 数据来源 2 曲线展示 2 1 MPAndroidChart获取 2 2 数据对象获取 2 3 数据展示 3 曲线完善 3 1 图表背景 边框 网格线修改 3 2 X Y轴值的自
  • Android资源文件在配置文件中的使用

    Android资源文件大致可以分为两种 xff1a 第一种是res目录下存放的可编译的资源文件 xff1a 这种资源文件系统会在R Java里面自动生成该资源文件的ID xff0c 所以访问这种资源文件比较简单 xff0c 通过R XXX
  • android 如何创建配置文件和读配置文件

    因为一些配置信息 xff0c 多处用到的 且以后可能变更的 xff0c 我想写个 prorperties配置文件给管理起来 在studio中新建一个Assets文件 gt 新建一个file文件类型为properties文件 该文件可以与re

随机推荐

  • android上如何写配置文件

    android上如何写配置文件 xff1a 使用SharedPreferences SharedPreferences是Android平台上一个轻量级的存储类 xff0c 用来保存应用的一些常用配置 xff0c 比如Activity状态 x
  • android SharedPreferences的用法

    之前做应用时碰到这样一个问题 xff1a 在 A Activity 要与 B Activity的Fragment进行通信传值 xff0c 但是忽然发现无法拿到B中Fragment的Handler xff0c 又不能发送广播 xff0c 短暂
  • Android中数据库的一些操作(增删改查)

    提起Android的开发 xff0c 就不得不提数据库 xff0c 几乎每个App中都会用到Sqlit数据库存储一些数据 xff0c 小编闲暇时期 xff0c 写了一个小demo关于数据库的增删改查 xff0c 之前也介绍过数据库的一个开源
  • VC2008 无法调试,无法断点,断点无效的最终解决方法

    今天VC2008忽然又出现断点无效了 按上次博客说的格式化了源文件 也删了编译工程数据库文件 问题依就 经过测试找到了终解决方法 其实出现这个问题常常出现在工程中某一个源文件中 多是文件内的一些不可视符出了问题 比较多的是由于制表符Tab
  • 计蒜客 蓝桥杯模拟赛1 马的管辖

    代码来自https blog csdn net weixin 41793113 article details 86721181 在中国象棋中 xff0c 马是走日字的 一个马的管辖范围指的是当前位置以及一步之内能走到的位置 xff0c 下
  • 菜单项onCreateOptionsMenu()和onOptionsItemSelected()的使用

    函数onCreateOptionsMenu 为创建Menu菜单的项目 函数onOptionsItemSelected 为处理菜单被选中运行后的事件处理 首先看下Activity的内容 xff1a lt span style 61 34 fo
  • C# 解决窗体假死的状态 非常有用!且非常重要!

    异步调用是CLR为开发者提供的一种重要的编程手段 xff0c 它也是构建高性能 可伸缩应用程序的关键 在多核CPU越来越普及的今天 xff0c 异步编程允许使用非常少的线程执行很多操作 我们通常使用异步完成许多计算型 IO型的复杂 耗时操作
  • C# Message 消息处理

    一 消息概述 Windows下应用程序的执行是通过消息驱动的 消息是整个应用程序的工作引擎 xff0c 我们需要理解掌握我们使用的编程语言是如何封装消息的原理 C 自定义消息通信往往采用事件驱动的方式实现 xff0c 但有时候我们不得不采用
  • C++new和delete实现原理(汇编解释)

    new和delete最终调用malloc和free xff0c 关于malloc和free实现原理参见这篇文章 xff1a http blog csdn net passion wu128 article details 38964045
  • c++中创建类型测试

    OpenVCTest cpp 定义控制台应用程序的入口点 include 34 stdafx h 34 class A public int a 61 10 class B public B int a b 61 a B int b 61
  • 离散卷积

    离散卷积 是两个离散序列 f n 和 h n 之间按照一定的规则将它们的有关序列值分别两两相乘再相加的一种特殊的运算 具体可用公式表示为 xff1a 离散函数 png 简记为 g n 61 f n h n 其中 xff1a g n 是经过卷
  • 最容易理解的对卷积(convolution)的解释

    啰嗦开场白 读本科期间 xff0c 信号与系统里面经常讲到卷积 convolution xff0c 自动控制原理里面也会经常有提到卷积 硕士期间又学了线性系统理论与数字信号处理 xff0c 里面也是各种大把大把卷积的概念 至于最近大火的深度
  • 高斯滤波

    高斯滤波 高斯滤波的含义 xff1a 高斯滤波就是对整幅图像进行加权平均的过程 xff0c 每一个像素点的值 xff0c 都由其本身和邻域内的其他像素值经过加权平均后得到 高斯滤波的作用 xff1a 高斯滤波是一种线性平滑滤波 xff0c
  • OpenCV:详解掩膜mask

    在OpenCV中我们经常会遇到一个名字 Mask 掩膜 很多函数都使用到它 xff0c 那么这个Mask到底什么呢 xff1f 一开始我接触到Mask这个东西时 xff0c 我还真是一头雾水啊 xff0c 也对无法理解Mask到底有什么用
  • 图像卷积和图像滤波的一些知识

    转自 http blog csdn net zouxy09 article details 49080029 一 线性滤波与卷积的基本概念 线性滤波可以说是图像处理最基本的方法 xff0c 它可以允许我们对图像进行处理 xff0c 产生很多
  • No MDI forms are currently active 的解决方法

    描述一下运行环境 几个存放MDI Child 子窗体的DLL和一个管理这些子窗体MDI主程序 在主程序中动态调入DLL子窗体 首先 xff0c DLL中的Application和MDI主程序中的Application是不同样的 要将MDI主
  • 图像处理中腐蚀与膨胀的原理

    腐蚀的原理 xff1a 二值图像前景物体为1 xff0c 背景为0 假设原图像中有一个前景物体 xff0c 那么我们用一个结构元素去腐蚀原图的过程是这样的 xff1a 遍历原图像的每一个像素 xff0c 然后用结构元素的中心点对准当前正在遍
  • 卷积为什么如此强大?一文全解深度学习中的卷积

    卷积为什么如此强大 xff1f 一文全解深度学习中的卷积 2018年05月10日 15 52 41 七月在线实验室 阅读数 xff1a 17112 作者 xff1a Tim Dettmers xff08 Understanding Conv
  • 一维卷积详细解释(转载+自己笔记)

    一 定义 离散信号f n g n 的定义如下 xff1a N 为信号f n 的长度 s n 为卷积结果序列 长度为len f n 43 len g n 1 以3个元素的信号为例 xff1a f n 61 1 2 3 g n 61 2 3 1
  • 深度学习---图像卷积与反卷积(最完美的解释)

    转自 xff1a 卷积神经网络CNN xff08 1 xff09 图像卷积与反卷积 xff08 后卷积 xff0c 转置卷积 xff09 动态图 1 前言 传统的CNN网络只能给出图像的LABLE xff0c 但是在很多情况下需要对识别的物