图像语义分割中的上采样(Upsampling)和下采样(subsampling)
图像语义分割中的上采样和下采样
- 1. 下采样(subsampled)
- 2. 上采样(upsampled)
- 2.1 线性插值
- 2.2 单线性插值
- 2.3 双线性插值
- 2.4 双线性插值举例
- 2.5 插值法总结
- 2.6 转置卷积(Transposed Convolution)
- 3. FCN (Fully Convolutional Networks)
最近在看到一篇论文中用到了transposed convolution
,并出现了upsampling
等概念,表示很迷。那么什么是upsampling
?
因此作出如下总结仅供自己学习理解。
1. 下采样(subsampled)
下采样:就是对卷积得到的 FeatureMapFeature MapFeatureMap 进行进一步压缩。通俗的所,实际上就是卷积层之间的池化
操作。
作用: 通过最大池化
或者平均池化
从而减少了特征,减少了参数的数量,且降低了卷积网络计算的复杂度;实际上就是过滤作用小、信息冗余的特征,保留关键信息(而信息关键与否就体现在对应像素的value是否被激活的更大)。
下图左边是经过卷积得到的一个Feature Map,卷积后的每一个像素点我理解成:将原始图像中卷积核大小的所有像素点特征糅合到了一个像素点。
通过步长为 2 的最大池化,将被激活程度最大(value最大)的特征筛选出来,而其余相对较小的特征则被去掉,达到降低特征维度的作用。同时还增大了整个网络图所覆盖的感受野。
2. 上采样(upsampled)
就是将提取到的Feature Map进行放大, 从而以更高的分辨率进行显示图像。这里的方法图像放大,并不是简单地方法放大,也不是之前下采样的逆操作。
也就是说上采样放大后输出的图像和下采样之前的图像是不一样的。
常用的上采样方法有两种:
- 双线性插值
- 反卷积
首先看看什么是线性插值吧。
2.1 线性插值
其实线性插值1是一种数学方法,有一阶、二阶、三阶,对应为单线性插值、双线性插值和三线性插值。三者不同之处在于:
- 单线性插值对应两点之间任意一点为插值;
- 双线性插值对应4点形成方形之间的任意一点作为插值;
- 三线性插值对应8点形成立方体内的任意一点作为插值。
2.2 单线性插值
已知中P1P_1P1点和P2P_2P2点,坐标分别为(x1,y1)(x_1, y_1)(x1,y1)、(x2,y2)(x_2, y_2)(x2,y2),要计算[x1,x2][x_1, x_2][x1,x2] 区间内某一位置 xxx 在直线上的 yyy 值.
该直线一定满足方程:
(y−y1)(x−x1)=(y2−y1)(x2−x1)\frac{(y-y_1)}{(x-x_1)} = \frac{(y_2-y_1)}{(x_2-x_1)}(x−x1)(y−y1)=(x2−x1)(y2−y1)
可以化简得到:
y=(x2−xx2−x1)y1+(x−x1x2−x1)y2y = (\frac{x_2-x} {x_2-x_1})y_1 + (\frac{x-x_1} {x_2-x_1})y_2y=(x2−x1x2−x)y1+(x2−x1x−x1)y2
可以看到yyy的值与y1y_1y1和y2y_2y2的各自对应有关,并且对应系数(x2−xx2−x1)(\frac{x_2-x} {x_2-x_1})(x2−x1x2−x)和 (x−x1x2−x1)(\frac{x-x_1} {x_2-x_1})(x2−x1x−x1)决定了 y1y_1y1 和 y2y_2y2 分别对 yyy 的贡献。
进一步细看,x1、x2、y1、y2x_1、x_2、y_1、y_2x1、x2、y1、y2均已知,则由 xxx 值决定 yyy 走向。
- 当 xxx 越靠近 x1x_1x1,那么 (x−x1x2−x1)(\frac{x-x_1} {x_2-x_1})(x2−x1x−x1)的值就越小,则 y2y_2y2 对 yyy 的贡献越小,反而 y1y_1y1 对 yyy 的贡献越大,所以 yyy 更加靠近 y1y_1y1 的值。
- 当 xxx 越靠近 x2x_2x2,那么 (x2−xx2−x1)(\frac{x_2-x} {x_2-x_1})(x2−x1x2−x)的值就越小,则 y1y_1y1 对 yyy 的贡献越小,反而 y2y_2y2 对 yyy 的贡献越大,所以 yyy 更加靠近 y2y_2y2 的值。
这是根据直线方程的定义求得的结论,但是我们现在在讨论插值。
即考虑如何在某一个坐标点上插入一个合理的像素值。
同样根据插入点与它周围像素点的距离远近,来分配不同权重,进行叠加。
将 y1y_1y1 和 y2y_2y2 换作对应点位置的像素值 即:f(p1)f(p_1)f(p1) 和 f(p2)f(p_2)f(p2) ,则公式可得:
f(p)=(x2−xx2−x1)f(p1)+(x−x1x2−x1)f(p2)f(p) = (\frac{x_2-x} {x_2-x_1})f(p_1) + (\frac{x-x_1} {x_2-x_1})f(p_2)f(p)=(x2−x1x2−x)f(p1)+(x2−x1x−x1)f(p2)
也就是说,插值点离哪一个像素点越近,就与那一个像素点更相关,则更近像素点的权重应当更大。
2.3 双线性插值
然后,根据单线性插值再来介绍下双线性插值
方法2。
实际上就是先进行了 2 次横向的单线性插值,然后根据单线性插值的结果进行 1 次纵向的单线性插值。
首已知Q11(x1,y1)、Q12(x1,y2)、Q21(x2,y1)、Q22(x2,y2)Q_{11}(x_1,y_1)、Q_{12}(x_1,y_2)、Q_{21}(x_2,y_1)、Q_{22}(x_2,y_2)Q11(x1,y1)、Q12(x1,y2)、Q21(x2,y1)、Q22(x2,y2) 四个点的坐标,设插值坐标点为(x,y)(x,y)(x,y),像素为 zzz
现在固定 xxx ,计算 yyy 的位置。
- 首先根据Q11、Q21Q_{11}、Q_{21}Q11、Q21计算出R1(x,y1)R_1(x,y_1)R1(x,y1)的像素值;
- 再根据Q12、Q22Q_{12}、Q_{22}Q12、Q22计算出R2(x,y2)R_2(x,y_2)R2(x,y2)的像素值;
- 最后再依据R1R_1R1、R1R_1R1得到 ppp 的像素插值zzz。
根据单线性插值的结论公式,可以直接得出结果1:
f(R1)=(x2−xx2−x1)f(Q11)+(x−x1x2−x1)f(Q21)f(R_1) = (\frac{x_2-x} {x_2-x_1})f(Q_{11}) + (\frac{x-x_1} {x_2-x_1})f(Q_{21})f(R1)=(x2−x1x2−x)f(Q11)+(x2−x1x−x1)f(Q21)
f(R2)=(x2−xx2−x1)f(Q12)+(x−x1x2−x1)f(Q22)f(R_2) = (\frac{x_2-x} {x_2-x_1})f(Q_{12}) + (\frac{x-x_1} {x_2-x_1})f(Q_{22})f(R2)=(x2−x1x2−x)f(Q12)+(x2−x1x−x1)f(Q22)
再根据f(R1)、f(R2)f(R_1)、f(R_2)f(R1)、f(R2)进行纵向单线性插值,可得结果2:
f(p)=(y2−yy2−y1)f(R1)+(y−y1y2−y1)f(R2)f(p) = (\frac{y_2-y}{y_2-y_1})f(R_1) + (\frac{y-y_1}{y_2-y_1})f(R_2)f(p)=(y2−y1y2−y)f(R1)+(y2−y1y−y1)f(R2)
将结果1代入结果2中,可得:
f(p)=(y2−yy2−y1)(x2−xx2−x1)f(Q11)+(y2−yy2−y1)(x−x1x2−x1)f(Q21)+(y−y1y2−y1)(x2−xx2−x1)f(Q12)+(y−y1y2−y1)(x−x1x2−x1)f(Q22)f(p) = (\frac{y_2-y}{y_2-y_1}) (\frac{x_2-x} {x_2-x_1})f(Q_{11}) + (\frac{y_2-y}{y_2-y_1}) (\frac{x-x_1} {x_2-x_1})f(Q_{21}) + (\frac{y-y_1}{y_2-y_1}) (\frac{x_2-x} {x_2-x_1})f(Q_{12}) + (\frac{y-y_1}{y_2-y_1})(\frac{x-x_1} {x_2-x_1})f(Q_{22}) f(p)=(y2−y1y2−y)(x2−x1x2−x)f(Q11)+(y2−y1y2−y)(x2−x1x−x1)f(Q21)+(y2−y1y−y1)(x2−x1x2−x)f(Q12)+(y2−y1y−y1)(x2−x1x−x1)f(Q22)
可以简化得:
f(p)=w11f(Q11)+w21f(Q21)+w12f(Q12)+w22f(Q22)f(p) = w_{11}f(Q_{11}) + w_{21}f(Q_{21}) + w_{12}f(Q_{12}) + w_{22}f(Q_{22}) f(p)=w11f(Q11)+w21f(Q21)+w12f(Q12)+w22f(Q22)
其中w11、w21、w12、w22w_{11}、w_{21}、w_{12}、w_{22}w11、w21、w12、w22分别表示四个点对点ppp上像素的一个权重比,这是根据训练得出来的。
根据结果可得,双线性插值和前面提到的定义 (双线性插值对应4点形成方形之间的任意一点作为插值) 刚好对应。
2.4 双线性插值举例
这里假设按照取平均的准则,进行插值计算,即w11、w21、w12、w22w_{11}、w_{21}、w_{12}、w_{22}w11、w21、w12、w22均为 0.50.50.5
2.5 插值法总结
在原有图像像素的基础上,在像素点之间采用合适的插值算法插入新的元素3。
插值就是在不生成像素的情况下增加图像像素大小的一种方法,在周围像素色彩的基础上用数学公式计算丢失像素的色彩(也有的有些相机使用插值,人为地增加图像的分辨率)。
所以在放大图像时,图像看上去会比较平滑、干净。但必须注意的是插值并不能增加图像信息。
2.6 转置卷积(Transposed Convolution)
其实转置卷积还有更通俗的说法,叫做反卷积(Deconvolution)。
转置卷积实际上是通过卷积运算实现分辨率还原。因为卷积操作中有权重参数,所以这是一种可以学习的方法,通过参数的学习实现输出图像尽可能与原图像相似。
和传统的卷积运算相比:
- 相同点:都是根据卷积核进行卷积运算;
- 不同点:普通卷积通过padding然后卷积是为了提取特征,使Feature Map变小,提取出更加复杂的特征;而在转置卷积中的stride存在不同,在输入图像的每两个像素之间增加大小为stirde的空像素,和空洞卷积的空洞操作是一样的。并且通过转置卷积,有使得Feature Map尺寸变大的效果。
即前者提取高级特征,后者放大高级特征。
具体给一些常见的例子4:
No padding, no strides, transposed | Arbitrary padding, no strides, transposed | Half padding, no strides, transposed | Full padding, no strides, transposed |
No padding, strides, transposed | Padding, strides, transposed | Padding, strides, transposed (odd) |
可以注意到第一行的四张图都是no strides
,所以和不同的卷积类似;
而第二行的strides
设置为2,所以两两像素之间存在一个空像素,即 0 的个数为 strides−1strides - 1strides−1。
这样对像素周围进行补0的方式就是最简单的反卷积。
另外也可以看看这一篇总结的反卷积,感觉写的不错,有对应的实际Demo。
但是这样的补0操作会使得像素边缘信息不断丢失。FCNFCNFCN 5中通过相加的方式很好地解决了这类特征信息不足问题。
3. FCN (Fully Convolutional Networks)
全卷积神经网络(full Convolutional neural network, FCN)是一个普通的CNN,其中最后一个全连接层被另一个具有较大“感受野”的卷积层所取代。这样做是为了捕捉全局背景的整体信息(告诉我们图像中有什么,并且给出一些物体位置的粗略描述)。
如上图中,imageimageimage 为原始图像(32∗32)(32*32)(32∗32),有 pool1、pool2、pool3、pool4、pool5pool1、pool2、pool3、pool4、pool5pool1、pool2、pool3、pool4、pool5 五次卷积得到的FeatureMapFeature MapFeatureMap
首先看到 pool5pool5pool5,是通过原始图像经过了 5 次下采样操作,得到的1∗11*11∗1的FeatureMapFeature MapFeatureMap,包含了高纬度的特征信息。直接将该 FeatureMapFeature MapFeatureMap 通过上采样放大 32 倍,还原到原始图片大小,得到了32x32x32x upsampledupsampledupsampled predictionpredictionprediction 的结果,如下图红色箭头指向所示:
因为在 FCNFCNFCN 中每下采样一次,图像的边缘信息在不断减少,而图像的更高维度特征则会被学习到,为了同时包含低纬度和高纬度特征图的的不同特点,因此提出了一个相加的操作。
也就是说不仅只考虑高纬度的FeatureMapFeature MapFeatureMap ,因此 FCNFCNFCN 做出如下操作:
- 将 pool5pool5pool5 的特征进行两倍大小的上采样放大,即得到图中的2x2x2x upsampledupsampledupsampled predictionpredictionprediction,此时的 FeatureMapFeature MapFeatureMap 大小和 pool4pool4pool4 的大小一致;
- 因为 pool5pool5pool5 中保存了最高维度的特征信息,pool4pool4pool4 中保存了次高维度的特征信息,然后将这两个FeatureMapFeature MapFeatureMap 进行相加;
- 将相加的结果进行16倍的上采样放大,即得到图中的16x16x16x upsampledupsampledupsampled predictionpredictionprediction,此时的 FeatureMapFeature MapFeatureMap 大小也和原始输入图像一致。
通过上面三个步骤得到的图像同时保存了 pool4pool4pool4 和 pool5pool5pool5 两个维度级别的特征。
依次类推,把 pool3、pool4、pool5pool3、 pool4、pool5pool3、pool4、pool5 的维度特征也进行叠加,然后对比各自不同叠加情况的预测效果,取最优情况,这就是 FCNFCNFCN 最经典的一个原理流程。
最后其实我还是对转置卷积的运算有些不理解,如果有道友懂的可以一起聊聊,我也等后续理解了在进行补充吧!
【数学】线性插值 ↩︎
学无疑物-上采样之双线性插值法详解 ↩︎
深度学习中的上采样 ↩︎
Convolution arithmetic ↩︎
Fully Convolutional Networks for Semantic Segmentation ↩︎
图像语义分割中的上采样(Upsampling)和下采样(subsampling)相关推荐
- 探索图像语义分割中的特征融合
简介 图像语义分割是计算机视觉领域一大重要分支,在benchmark性能一次次提升的过程中,特征融合起到很重要的作用.下面,将介绍图像语义分割任务中历年的比较不错的特征融合方法. 常用的Backbon ...
- 语义分割中的深度学习方法全解:从FCN、SegNet到各版本DeepLab
语义分割中的深度学习方法全解:从FCN.SegNet到各版本DeepLab 原文:https://www.sohu.com/a/155907339_610300 图像语义分割就是机器自动从图像中分割出 ...
- 笔记:基于DCNN的图像语义分割综述
写在前面:一篇魏云超博士的综述论文,完整题目为<基于DCNN的图像语义分割综述>,在这里选择性摘抄和理解,以加深自己印象,同时达到对近年来图像语义分割历史学习和了解的目的,博古才能通今!感 ...
- 深度学习-Tensorflow2.2-图像处理{10}-图像语义分割-23
图像语义分割简介 图像语义分割网络结构-FCN 上采样 代码实现 import tensorflow as tf import matplotlib.pyplot as plt %matplotlib ...
- 当前主流的深度学习图像语义分割模型解析
转载自[量子位]公众号 QbitAI 原文地址:http://www.sohu.com/a/155907339_610300 图像语义分割就是机器自动从图像中分割出对象区域,并识别其中的内容. 量子位 ...
- 图像语义分割方法研究进展
全监督学习的图像语义分割方法研究进展 简介 1 全监督学习的图像语义分割方法 1.1 基于全卷积的图像语义分割方法 1.2 基于编码器解码器结构的图像语义分割方法 1.3 基于注意力机制的图像语义分割 ...
- 将特定像素点在图像上连接起来_(NeurIPS 2019) Gated CRF Loss-一种用于弱监督图像语义分割的新型损失函数...
本文已经被NeurIPS 2019(2019 Conference and Workshop on Neural Information Processing Systems)接收,论文为弱监督图像语 ...
- 图像语义分割和目标检测(上)
语义分割是对图像在像素级别上进行分类的方法,在一张图像中,属于同一类的像素点都要被预测为相同的类,因此语义分割是从像素级别来理解图像.但是需要正确区分语义分割和实例分割,虽然他们在名称上很相似,但是他 ...
- 一、深度卷积神经网络中图像语义分割研究总结
时间:20220410 内容:语义分割研究进程总结 参考:深度卷积神经网络图像语义分割研究进展 http://www.cjig.cn/html/jig/2020/6/20200601.htm 语义分割 ...
最新文章
- php4.3-5.x,4.3 案例之 ThinkPHP 5.0 集成方法
- 三十八、商业智能与ETL基础知识
- linux移植wifi sd8688.bin 最新固件,[ZZ]浅析firmware完整生存和使用流程
- mysql分析sql语句性能_sql语句执行性能分析
- 160809312 王仲超 第四次作业
- php可以运行js代码吗,php可以运行js代码吗?
- 关于三极管集电极电压1V以上后伏安特性曲线不右移
- 第十二章、GDK学习
- caniuse-lite is outdated. Please run: npx browserslist@latest --update-db
- 【Processing】行走的行星 动态海报 processing艺术与科技
- blender合并物体后材质丢失问题的解决办法
- Latex 字体的设置
- 美国华盛顿州立大学计算机排名,华盛顿州立大学专业排名一览及最强专业推荐(USNEWS美国大学排名)...
- Understand教程—使用搜索功能的几种方法
- 机器学习 第二节 第二课
- flume系列之:监控flume上个小时生成的HDFS文件是否有损毁,并发送告警信息
- 二代测序之SNV基础知识笔记总结
- 安然邮箱社交网络分析
- 深圳弘辽科技电商如何用互联网思维摆地摊
- 利用python自带的库sympy,求解不同阻尼比的振动方程表达式
热门文章
- 遍历map的键值对的方法(深入浅出)
- 谁说夫妻之间没有爱情只剩亲情?
- 录用了一位38岁老程序员,结果...
- c#调用ShowDialog方法内存泄露
- 信托公司利用境外资金的两大途径
- 赤峰计算机二级考试在哪考,【图】赤峰电脑培训计算机二级考试就到东方—赤峰天下信息网...
- mysql自然连接和等值连接_区分笛卡儿积,自然连接,等值连接,内连接,外连接...
- 【SQL】群辉 NAS 安装 Mysql 远程访问连接
- PHP+html实现搜索功能,
- Unity3D发布APK到Android平台