对称耦合卷积网络(SCCN)的tensorflow实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Rulixiang/article/details/79626401

论文原文:A Deep Convolutional Coupling Network for Change Detection Based on Heterogeneous Optical and Radar Images, 这篇论文讲的是利用对称耦合神经网络(Symmetric Convolutional Coupling Network)来对异构遥感影像进行变化检测的问题。

论文算法介绍:

异构图像(Heterogeneous images)指的是用不同类型的传感器获得的遥感影像.
例如光学影像(Optical images)和合成孔径雷达图像(Synthetic aperture radar (SAR) images)就是两类异构图像。

论文的大致算法过程:论文中提出的网络结构是对称的,两个异构的输入图像分别从网络的两侧输入到网络中,分别经过特征转换之后映射到新的特征空间,计算对应像素点之间的距离,然后进行阈值分割,就可以得到最终的change map。

论文中提出的网络结构如下图所示:
SCCN网络结构图
从网络的结构图中可以看出,这是一个两侧对称的网络,每一侧分别包含了一个卷积层,以及若干耦合层。卷积层的作用是提取影像的特征图,几个耦合层依次将卷积层所得到的特征转换到一个新的特征空间。在网络结构的中间,输入图像的像素表示形式用来定义目标函数。

公式化表示:

假设一侧的输入图像为$ I$,经过卷积层和若干耦合层得到的最终的特征表示为:
H = F C C ( I ) = F m a p ( F c o v ( I ) ) H = FCC(I)=F_{map}(F_{cov}(I))

卷积层得到的结果可以表示为:
C i = s ( W c o v i I + b c o v i ) C_i=s(W^i_{cov}*I+b^i_{cov})
C i C_i 表示的是第 i i 个卷积核 W c o v i W^i_{cov} 得到的特征图, b c o v i b^i_{cov} 表示偏移, s s 是激活函数。
耦合层的计算结果: H = F m a p ( C ) H = F_{map}(C)
F i j ( C ) ( x , y ) = s ( w i j F i 1 ( C ) ( x , y ) + b i j ) F_{ij}(C)(x,y)=s(w_i^jF_{i-1}(C)(x,y)+b_i^j)

其中 i = 1 , 2 , , l i=1,2,…,l 表示耦合层的编号, F i j ( C ) F_{ij}(C) 表示第 j j 个特征图在第 i i 个耦合层所得到的结
果, ( x , y ) (x, y) 表示像素点的位置。 W i W_i 是一个 n i n i 1 n_i ∗ n_{i-1} 的权值矩阵。 b i b_i 是一个偏移向量。
差异图的产生:假设网络的输入图像分别是$I_1, I_2 $,分别经过卷积层和耦合层计算得到的结果是:
H 1 = F C C 1 ( I 1 ) , H 2 = F C C 2 ( I 2 ) H1=F_{CC1}(I_1), H2=F_{CC2}(I_2)

最终需要的差异图像计算方式:
D ( x , y ) = h 1 ( x , y ) h 2 ( x , y ) 2 D(x, y) = ||h_1(x, y) − h_2(x, y)||_2

学习过程:

由于多时相影像之间不变的区域应该显示出较小的像素差异,论文将最终的优化函数定义为以下形式:
m i n : F c o p ( θ , P u ) = x , y P u ( x , y ) h 1 ( x , y ) h 2 ( x , y ) 2 λ x , y P u ( x , y ) min: F_{cop}(\theta, P_u)=\sum_{x,y}P_u(x,y)||h_1(x, y) − h_2(x, y)||_2-\lambda \sum_{x,y}P_u(x,y)

s . t . 0 P u ( x , y ) 1 s. t. 0 ≤ P_u(x, y) ≤ 1
这里的θ表示的就是网络结构中所有参数的集合。也就是: θ = ( W c o v , b c o v , W m a p , b m a p ) θ =(W_{cov}, b_{cov}, W_{map}, b_{map}) P u P_u 是概率图,用来表示各个像素点未发生变化的概率。 λ x , y P u ( x , y ) - \lambda \sum_{x,y}P_u(x,y) 是一个正则项,用来防止 P u P_u 变成全0的值。
网络的训练过程:注意到上面所有的参数中需要优化的是 θ θ P u P_u ,我们可以对两者进行
交替优化。给定一个 θ θ ,目标函数的形式是:
m i n : F c o p ( θ , P u ) = x , y P u ( x , y ) ( h 1 ( x , y ) h 2 ( x , y ) 2 λ ) min: F_{cop}(\theta, P_u)=\sum_{x,y}P_u(x,y)(||h_1(x, y) − h_2(x, y)||_2-\lambda)
所以可以通过判断 h 1 ( x , y ) h 2 ( x , y ) 2 ||h_1(x, y) − h_2(x, y)||_2 λ \lambda 之间的关系来优化得到 P u ( x , y ) P_u(x,y)
P u ( x , y ) = { 0 , h 1 ( x , y ) h 2 ( x , y ) 2 < λ 1 , h 1 ( x , y ) h 2 ( x , y ) 2 λ P_u(x,y)=\begin{cases} 0, ||h_1(x, y) − h_2(x, y)||_2 <\lambda\\ &&&&\\ 1, ||h_1(x, y) − h_2(x, y)||_2 ≥\lambda& \end{cases}
这样就可以将目标函数的值优化为在 θ θ 确定时的最低值。
给定 P u P_u ,我们可以通过 B P BP 算法对于 θ θ 的各项值进行优化。具体优化学习过程如下图
算法流程

网络参数的初始化:

论文中对网络参数的初始化方式并不是一般的随机初始化,而是通过逐层的去噪自编码器(DAE)进行学习
每层的参数,从而实现对输入图像一定程度上的去噪功能。去噪自编码器实际上可以说是自编码器的随机版。
就是对于输入图像的随机部分区域添加噪声。噪声的种类分别是乘性和加性噪声,分别服从高斯和Γ分布。随
机添加到原始影像,进行自编码器的学习,学习到的参数作为各层的初始参数。

实验过程:

在tensorflow下搭建了网络结构,另外,我没用DAE初始化网络参数,直接随机初始化了。数据集选取的是两幅 400 400 400*400 R G B RGB 遥感影像:
实验影像

最后得到的变化图和基准图相对比:
结果
除了一些噪声(可能是我没用DAE进行初始化),直观上看起来结果还不错,over。

====================================================================================================

猜你喜欢

转载自blog.csdn.net/Rulixiang/article/details/79626401