Py学习  »  机器学习算法

深度学习中的反向卷积

小白学视觉 • 2 年前 • 265 次点击  

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

本文转自|OpenCV学堂
图像卷积与反卷积

图像卷积最常见的一个功能就是输出模糊(smooth)图像,通过卷积实现了像素的扩散效应,常见的卷积操作是由卷积核+输入图像组成,卷积核(filter)是一个窗口区域,在输入图像上从左到右,从上到下进行窗口范围内系数与像素值的点乘求和操作,输出作为中心像素点的卷积结果。对图像进行卷积模糊的效果如下:

图像反卷积的含义是对模糊图像进行反向模糊去除,让图像重新变得清晰化,本质上是一种图像去模糊算法,而且它可以看出是图像卷积模糊的反向操作,OpenCV在其3.4版本中新增了移动图像去模糊算法,通过反卷积操作实现。其原理主要是基于PSF进行重新估算模糊半边,然后进行反向卷积算计得到。简单的模糊图像与反卷积/去模型效果如下:


深度学习中的卷积

深度学习中的卷积操作包括卷积层与池化层,其中卷积层得主要作用是通过卷积操作进行自动特征提取,池化层作用是让特征具备迁移不变性,不断的降采样减低feature map的大小,如下就是一个简单的feature map生成过程,左侧图像是输入,filter大小是3x3,右下角红色部分的小子是filter的权重系数。它输出的第一个值是右侧feature中的4。

关于深度学习中的卷积层作用与声明,可以参考公众号文章:
卷积神经网络是如何实现不变性特征提取的

深度学习中的反卷积

深度学习中的反向卷积跟图像的反卷积去模糊有本质区别,深度学习中的反向卷积本质上是转置卷积操作,常见在图像语义分割网络FCN、对抗生成网络中DCGAN中。专置卷积的作用对卷积层的解码,实现从低维特征向量向高维特征空间的映射,生成与输入大小完全一致的feature maps。对于一个正常的卷积操作:

输入是4x4大小,卷积核3x3大小,步长是1,输出是2x2大小,如果对它们近一步分析就是知道,输入是4x4=16维度的数据,输出是2x2=4维的数据,展开的卷积核权重系数如下:

它是一个16x4的矩阵,现在我们需要输入是4维度,输出是16维度,相当于对这个矩阵进行了转置操作,转置卷积就是这样出来的。常见的转置卷积操作有如下两种:

单位步长
填充周围为零,通过填充输入来计算转置卷积,通过这种方式把反向/转置卷积,当成一个正常的卷积操作。输入2x2,输出4x4,步长1,卷积核3x3,操作演示如下:

分步步长
通过对每一行每一列分步进行填充,得到输入填充好的输入,然后再进行正常的卷积操作,这种方法更加的合理。输入=3x3,填充=2,步长等于1的分步卷积方式的转置操作输出5x5的feature显示如下:

在这里需要特别注意的是上述对转置卷积的步长跟正向卷积的步长不是一样的,单位步长的转置卷积步长=S,输入图像H=W=N,则输出图像大小为 H=W=SXN,这个必须保持一致。
Tensorflow中转置卷积代码演示如下:

import tensorflow as tf
import numpy as np


def test_conv2d_transpose():
    # input (batch_size, height, width, channels) - 2x2x1 image in batch of 1
    x = tf.constant(np.array([[
        [[1], [2]],
        [[3], [4]]
    ]]
), tf.float32)

    # 3x3x1 filter
    f = tf.constant(np.array([
        [[[1]][[1]][[1]]],
        [[[1]][[1]][[1]]],
        [[[1]][[1]][[1]]]
    ]), tf.float32)

    # transposed-convolution operator
    conv = tf.nn.conv2d_transpose(x, f, output_shape=(1441), strides=[1221], padding='SAME')

    # run it
    with tf.Session() as session:
        result = session.run(conv)
        print(result)

    assert (np.array([[
        [[1.0], [1.0],  [3.0], [2.0]],
        [[1.0], [1.0],  [3.0], [2.0]],
        [[4.0], [4.0], [10.0], [6.0]],
        [[3.0], [3.0],  [7.0], [4.0]]]]
) == result).all()


test_conv2d_transpose()



好消息,小白学视觉团队的知识星球开通啦,为了感谢大家的支持与厚爱,团队决定将价值149元的知识星球现时免费加入。各位小伙伴们要抓住机会哦!


下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/120288
 
265 次点击