FCN全卷积网络—upsampling(上采样)——OpenCV图像金字塔
- 一、上采样理论
- 1.1 bilinear
- 1.2 Deconvolution(反卷积)
- 1.3 unpooling
- 二、OpenCV金字塔:高斯金字塔、拉普拉斯金字塔与图片缩放
一、上采样理论
FCN全卷积网络:
将网络的全连接层 变成 卷积层之后,整个网络变成了只有卷积层和池化层的网络,于是网络就称之为全卷积网络。
全卷积网络一般是用来对图像进行语义分割的,于是就需要对图像上的各个像素进行分类,这就需要一个上采样将最后得到的输出上采样到原图的大小。上采样的过程也类似于一个卷积的过程,只不过在卷积之前将输入特征插值到一个更大的特征图然后进行卷积。下面举例子说明这个过程。
- 上采样利用的是
conv2d_transpose()
函数,这个函数输入的有几个关键的参数,(value , filter , output_shape , strides , padding..)
value 是输入的特征图: 将这个特征图进行上采样,格式是[n,h,w,c],n是你这一个batch的图片数量, h和w是特征图的宽和高,c是特征图的数量;filter是卷积核的大小: 四维的[h,w,in_channel,out_channel],h和w是卷积核的大小, in_channel是输入特征图的数量,out_channel是输出特征图的数量。output_shape: 是要上采样得到的特征图的大小,格式与value一致。strides是步长: 四维格式,分别对应value四个维度的步长。
1.1 bilinear
双线性插值是目前在语义分割中用的比较多的一种方式:
具体的实现方式,可以直接参考fcn.berkerlyvision.org中的surgery.py如下:
def upsample_filt(size):"""Make a 2D bilinear kernel suitable for upsampling of the given (h, w) size."""factor = (size + 1) // 2if size % 2 == 1:center = factor - 1else:center = factor - 0.5og = np.ogrid[:size, :size]return (1 - abs(og[0] - center) / factor) * \(1 - abs(og[1] - center) / factor)
1.2 Deconvolution(反卷积)
Deconvolution是目前争议比较多的方法,由于实现上采用转置卷积核的方法,所以有人说应该叫(transposed convolution),但是思想上是为了还原原有特征图,类似消除原有卷积的某种效果,所以叫反卷积(deconvolution)。
卷积计算通常的两种实现方式是:在caffe中使用im2col的方法,在其他的地方使用toeplitz matrix(托普利兹矩阵)进行实现。
为了更容易地实现deconvolution,直接使deconv的前向传播模拟conv的反向传播,当然,这里只是为了保证尺寸大小互逆,并不能保证值的还原。
例子
- (1) 关于第一节中bilinear的在caffe中使用deconvolution进行实现,上节的bilinear论述过程中使用固定值计算的方法,本节从deconv可视化计算的角度进行理解,https://github.com/vdumoulin/conv_arithmetic
63个元素 [16x16中的(0,0)元素] 31个元素 [16x16中的(0,1)元素] 31个元素
其中,中括号中的元素可见
对以上过程进行卷积运算,注意这里stride 使用1, 最终输出大小为(63+32x15+64-64)/1 + 1 = 544
这里可以脑补一下计算过程,相当于第一节中的手算叠加 - (2) 对bilinear使用转置运算进行实现,先将64x64的卷积核转化为toeplitz matrix,然后转置,得到544x544,256的矩阵,然后将score_fr转化为1, 256的矩阵,两者矩阵乘法,得到544x544的最终结果,具体过程脑补吧
1.3 unpooling
也就是反池化,不需要学习,用的不是太多,参考论文Visualizing and Understanding Convolutional Networks,还有SegNet和DeconvNet
简单原理:在池化过程中,记录下max-pooling在对应kernel中的坐标,在反池化过程中,将一个元素根据kernel进行放大,根据之前的坐标将元素填写进去,其他位置补0
实现代码可以看SegNet的实现
二、OpenCV金字塔:高斯金字塔、拉普拉斯金字塔与图片缩放
使用OpenCV函数 pyrUp 和 pyrDown 对图像进行向上和向下采样,以及了解了专门用于缩放图像尺寸的resize函数的用法。
OpenCV (图像处理模块结构)| -------imgproc| |-------Image Filtering| | |---------pyrUp、pyrDown| || |-------Geometric Image Transformations| | |--------resize
高斯金字塔(Gaussianpyramid): 用来向下采样,主要的图像金字塔
拉普拉斯金字塔(Laplacianpyramid): 用来从金字塔低层图像重建上层未采样图像,在数字图像处理中也即是预测残差,可以对图像进行最大程度的还原。
- 高斯金字塔:
-
第 iii 层生成第i+1" role="presentation">i+1i+1i+1层(第 i+1i+1i+1 层表示为Gi+1Gi+1G_{i+1}),我们先要用高斯核对 G1G1G_1 进行卷积,然后删除所有偶数行和偶数列。
当然的是,新得到图像面积会变为源图像的四分之一。按上述过程对输入图像G0G0G_0执行操作就可产生出整个金字塔。
显然:结果图像只有原图的四分之一;向下取样(卷积)会逐渐丢失图像的信息。 - 拉普拉斯金字塔
-
拉普拉斯金字塔第i层的数学定义:
Li=Gi−UP(Gi+1)⨂g5×5Li=Gi−UP(Gi+1)⨂g5×5
L_i = G_i-UP(G_{i+1})\bigotimes g_{5\times 5}
GiGiG_i 表示第 i 层的图像。而 UP()UP()UP( ) 操作是将源图像中位置为 (x,y)(x,y)(x,y) 的像素映射到目标图像的 (2x+1,2y+1)(2x+1,2y+1)(2x+1,2y+1) 位置,即在进行向上取样。⨂⨂\bigotimes表示卷积,g5×5g5×5g_{5\times 5} 为5x5的高斯内核。
- 对图像向上采样:pyrUp函数
-
如果想放大图像,则需要通过向上取样操作得到,具体做法如下:
(1)将图像在每个方向扩大为原来的俩倍,新增的行和列以0填充
(2)使用先前同样的内核(乘以4)与放大后的图像卷积,获得新增像素的近似值 - 对图像向下采样:pyrDown函数
-
PryUp和PryDown不是互逆的,即PryUp不是降采样的逆操作。
这种情况下,图像首先在每个维度上扩大为原来的两倍,新增的行(偶数行)以0填充。
然后给指定的滤波器进行卷积(实际上是一个在每个维度都扩大为原来两倍的过滤器)去估计“丢失”像素的近似值。
FCN全卷积网络—upsampling(上采样)——OpenCV图像金字塔相关推荐
- FCN全卷积网络上采样理解
FCN全卷积网络将网络的全连接层变成卷积层之后整个网络变成了只有卷积层和池化层的网络,于是网络就称之为全卷积网络.全卷积网络一般是用来对图像进行语义分割的,于是就需要对图像上的各个像素进行分类,这就需 ...
- 图像语义分割:FCN全卷积网络概述
图像语义分割:FCN全卷积网络概述 Why does FCN work? FCN网络的基本概念 FCN的计算原理 Feature map上采样 What is FCN? FCN网络的结构 FCN每层的 ...
- FCN全卷积网络随笔
参考:四.全卷积网络FCN详细讲解(超级详细哦) 这篇文章已经写的很好了,这里说两个我考虑的点. 第一个就是:FCN在缩小成heat map,为什么要通过上采样还原回原图大小? 我觉得这个的原因是因为 ...
- FCN全卷积网络理解及代码实现(来自pytorch官方实现)
视频链接:https://www.bilibili.com/video/BV1J3411C7zd?vd_source=a0d4f7000e77468aec70dc618794d26f 代码:https ...
- FCN全卷积网络和Deconv转置卷积原理描述
直到RPN生成Roi的时候,MaskRcnn和FasterRcnn的结构都是一样的. 然后RPN会过滤掉一部分,剩下的Roi分成前景和背景(2分类),同时RPN会对Roi做一个初步的box回归. 接下 ...
- FCN全卷积网络理解
FCN我以前总是把它很1*1 conv弄混,实际上这是两个不同的概念,FCN意思是把FC层用卷积层替代,用于处理segmentation问题的一个网络:1*1是一种卷积形式,用于改变feature m ...
- FCN全卷积网络阅读笔记
论文标题: Fully Convolutional Networks for Semantic Segmentation 参考文献和链接: [1] Long, Jonathan, Evan Shelh ...
- 全卷积网络(FCN)理解
概要 作为计算机视觉领域的三大任务之一(图像分类,目标检测,图像分割),图像分割这些年也获得了长足的发展,它被广泛用于在医学图像和自然图像的分割上,除此之外,图像分割也被用于在道路分割上,这对于自动驾 ...
- 全卷积网络FCN详细讲解(超级详细哦)
原文链接:https://blog.csdn.net/qq_41760767/article/details/97521397?depth_1-utm_source=distribute.pc_rel ...
最新文章
- 【CCNA考试】2010-06-29-北京-987(PASS)
- 使用.bat文件或者是cmd里面运行.jar文件
- 软件构造学习笔记-第四周
- ora 00900 已编译但有错误_技术分享|万万没想到!编译错误竟然还没灭绝???
- linux下mysql 有双机_在Linux环境下配置mysql cluster双机集群
- QS世界大学排名_百度百科
- android引入外部moudle,Android Studio3.2,调用其他Module作为依赖,出现的问题。
- SSM商城系统开发笔记-配置01-web.xml
- 配置WindowsLiveWriter,写cnblogs博客
- MS Navision专业BBS
- 51单片机led灯依次点亮
- 批量自动打印PDF文件辅助工具BatchOutput PDF for Mac
- bat文件实现ftp上传和下载
- 练就超强记忆力,成为最强大脑【完结】
- linux 命令行字体发虚,解决Linux字体发虚的终极方法
- 53、backtrader的一些基本概念---如何用backtrader画图?
- 第 8 篇、Linux C 基础 | 运算符
- 5.1.2 消费者的加入组和同步组
- SMTP邮件发送原理
- python数据分析用什么软件好_居民出行OD调查后数据分析应该用什么软件做?
热门文章
- 在线阅读计算机基础,计算机基础知识点.docx
- java.io.IOException: Cannot run program “***.exe“ CreateProcess error=2, 系统找不到指定的文件,java调用可执行程序
- mkv转mp4,mkv转换mp4格式方法
- java 枚举 方法_Java枚举使用方法详解
- android操作系统详细目录结构
- TCAN114x-Q1部分组网增强型CAN FD收发器(SBC_CAN的收发器)
- Taro request 请求封装
- 多目标跟踪(MOT)中的卡尔曼滤波(Kalman filter)和匈牙利(Hungarian)算法详解
- ssh连接和传输文件
- 元类metaclass