专栏首页贾志刚-OpenCV学堂推荐 | 深度学习反卷积最易懂理解

推荐 | 深度学习反卷积最易懂理解

引言 ·

普通图像反卷积,跟深度学习中的反卷积是一回事吗?别傻傻分不清!其实它们根本不是一个概念

图像反卷积

最早支持反卷积是因为图像去噪跟去模糊,知道图像去模糊时候会使用反卷积技术,那个是真正的反卷积计算,会估算核,会有很复杂的数学推导,主要用在图像的预处理与数字信号处理中。本质上反卷积是一种图像复原技术,典型的图像模糊可以看成事图像卷积操作得到的结果,把模糊图像重新复原为清晰图像的过程常常被称为去模糊技术,根据模糊的类别不同可以分为运动模糊与离焦模糊,OpenCV支持对这两张模糊图像进行反卷积处理得到清晰图像。反卷积的基本原理就是把图像转换到频率域,通过估算图像的核函数,在频率域对图像点乘计算之后,重新获取图像信息,转回为空间域。主要操作都在频率域,转换通过离散傅里叶(DFT)变换与反变换,通过维纳滤波处理获取反模糊信息,OpenCV支持反卷积采用维纳滤波方式的去模糊,但是参数调整事一个大坑,基本上每张图像的参数都不一样,很难有相同的结果。最近这些年,图像反模糊逐步被深度学习的方法引领,OpenCV提供的那几个函数越来越少的人知道,主要是通用性很差。贴一张图:

OpenCV反模糊之后的效果:

深度学习中的反卷积

深度学习中典型网络就是卷积神经网络,对图像分类,对象检测都可以取得很好的效果。但是在语义分割任务中,网络模型涉及到上采样操作,最常见的就是通过填充0或者最近邻插值的方式来完成上采样。在ICCV 2015年的一篇论文中提出了可学习的反卷积网络,不再通过简单粗暴的填充0或者最近邻插值方法来完成上采样,让整个过程变成可学习,在图像语义分割网络中实现了对上采样过程的训练。论文中提到的反卷积操作实现上采样跟图像处理中反卷积实现图像去模糊有本质区别,这里的反卷积更加准确的说法应该是转置卷积。

卷积操作 ·

图中第二行就是卷积与反卷积的示意图,下面通过一个简单的例子来解释上图的内容。假设有4x4大小的二维矩阵D,有3x3大小的卷积核C,图示如下:

直接对上述完成卷积操作(不考虑边缘填充)输出卷积结果是2x2的矩阵

其中2x2卷积的输出结果来自D中第二行第二列像素位置对应输出,相关的卷积核与数据点乘的计算为:

0x3+1x3+2x2+2x0+2x0+0x1+0x3+1x1+2x2=12,可以看出卷积操作是卷积核在矩阵上对应位置点乘线性组合得到的输出,对D=4x4大小的矩阵从左到右,从上到下,展开得到16个维度的向量表示如下:

我们同样可以把3x3的卷积核表示如下:

为了获得卷积核的4x4的向量表示,我们可以对其余部分填充零,那么卷积核在D上面移动的位置与对应的一维向量表示如下:

考虑到卷积核C与D的点成关系,合并在一起还可以写成如下形式:

把上面卷积核中的字符表示替换为实际卷积核C,得到:

所以上述的卷积操作可以简单的写为:

重排以后就得到上面的2x2的输出结果。

转置卷积

现在我们有2x2的数据块,需要通过卷积操作完成上采样得到4x4的数据矩阵,怎么完成这样的操作,很容易,我们把2x2转换为1x4的向量E,然后对卷积核C转置,再相乘,表示为

就得到16维度向量,重排以后就得到了4x4的数据块。这个就是深度学习中的卷积与反卷积最通俗易懂的解释。

终极解释-一维转置卷积 ·

什么!还不明白,那我最后只能放一个大招了!我搞了个一维的转置卷积的例子:

有个前提,你得先理解什么是卷积跟一维卷积,二维卷积等基本概念。这个例子就很直接,我用Excel绘制的,先看图:

解释一下,一维卷积的本来是1xN,转置变为Nx1的,然后同样用输入的数据跟卷积核点乘,点成的方式如上,如果有重叠的部分,就加在一起就好啦,这部分还可以通过代码来验证演示一波,pytorch的代码演示如下:

你好

from __future__ import print_function
import torch
import numpy as np
# 输入一维数据
d = torch.tensor([1.,2.])
# 一维卷积核
f = torch.tensor([3.0,4.0])
# 维度转换dd
d = d.view(1,1,2)
f = f.view(1,1,2)
# 一维转置卷积
ct1d = torch.nn.ConvTranspose1d(in_channels=1, out_channels=1, kernel_size=2, stride=2, bias=0)
ct1d.weight = torch.nn.Parameter(f);
# 打印输出
print("输入数据:", d)
print("输出上采样结果:", ct1d(d))

运行结果如下:

根据我的手绘Excel图,可以认为:

[x, y] = [1, 2],
卷积核[a, b] = [3, 4],
输出结果[ax, bx, ay, by] = [3, 4, 6, 8]

这个就是转置卷积上采样!这下还不明白我真的没法啦!

参考:

https://iksinc.online/2017/05/06/deconvolution-in-deep-learning/

2015 ICCV论文《Learning Deconvolution Network for Semantic Segmentation》

本文分享自微信公众号 - OpenCV学堂(CVSCHOOL),作者:gloomyfish

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-09-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 理解CNN卷积层与池化层计算

    深度学习中CNN网络是核心,对CNN网络来说卷积层与池化层的计算至关重要,不同的步长、填充方式、卷积核大小、池化层策略等都会对最终输出模型与参数、计算复杂度产生...

    OpenCV学堂
  • 卷积神经网络(CNN)概念解释

    卷积神经网络(CNN)概念解释 传统对象识别-模式识别 传统的模式识别神经网络(NN)算法基于梯度下降,基于输入的大量样本特征数据学习有能力识别与分类不同的目...

    OpenCV学堂
  • 如何通俗易懂地解释图像卷积?

    卷积这个概念,很早以前就学过,但是一直没有搞懂。教科书上通常会给出定义,给出很多性质,也会用实例和图形进行解释,但究竟为什么要这么设计,这么计算,背后的意义是什...

    OpenCV学堂
  • 万字长文带你看尽深度学习中的各种卷积网络

    AI 科技评论按:深度学习中的各种卷积网络大家知多少?对于那些听说过却又对它们没有特别清晰的认识的小伙伴们,Kunlun Bai 这篇文章非常值得一读。Kunl...

    AI科技评论
  • 卷积为什么如此强大?理解深度学习中的卷积

    译自Tim Dettmers的Understanding Convolution in Deep Learning。有太多的公开课、教程在反复传颂卷积神经网络的...

    机器人网
  • 卷积层

    深度学习基础理论-CNN篇 卷积层 卷积层(convolution layer)是卷积神经网络中的基础操作,甚至在网络最后起分类作用的全连接层在工程实现时也...

    用户1386409
  • 【Pytorch 】笔记五:nn 模块中的网络层介绍

    疫情在家的这段时间,想系统的学习一遍 Pytorch 基础知识,因为我发现虽然直接 Pytorch 实战上手比较快,但是关于一些内部的原理知识其实并不是太懂,这...

    阿泽 Crz
  • 技术 | 变形卷积核、可分离卷积?卷积神经网络中十大拍案叫绝的操作

    作者 | Professor ho CNN从2012年的AlexNet发展至今,科学家们发明出各种各样的CNN模型,一个比一个深,一个比一个准确,一个比一个轻量...

    AI科技大本营
  • 【论文笔记】Pyramidal Convolution: Rethinking Convolutional Neural Networks for Visual Recognition

    目前的卷积神经网络普遍使用3×3的卷积神经网络,通过堆叠3×3的卷积核和下采样层,会在减少图像的大小的同时增加感受野,使用小尺度的卷积核存在两个问题:

    绝命生
  • 深度 | 理解深度学习中的卷积

    机器之心经授权转载 来源:码农场 译者按:本文译自 Tim Dettmers 的 Understanding Convolution in Deep Learn...

    机器之心

扫码关注云+社区

领取腾讯云代金券