Advertisement

论文阅读 Learning Affinity via Spatial Propagation Networks

阅读量:
  • abstract

    • 摘要
      研究本文旨在探讨线性传播机制及其在空间扩散问题中的应用效果。
    • 引言
      随着现代科学和技术的发展, 对复杂系统行为的研究日益重要。
      本文将阐述所研究问题的背景及其意义。
      同时明确本文的研究目标与创新点。
    • 相关工作分析
      在现有研究的基础上, 分析现有解决方案的优缺点。
      突出本研究的独特价值与必要性。
    • 所提方法设计
      基于线性传播模型, 构建了一种新的空间扩散机制。
      通过理论分析与数值模拟, 验证了该方法的有效性与优越性。
  • ralated work

    • 相关工作综述
      总结了当前领域内主要的研究成果与技术进展。
      分析了这些方法在解决实际问题时面临的局限性。
  • proposed approach

    • 方法设计原理
      针对传统算法的不足, 提出了一种改进型的空间扩散算法框架。
      其核心思想在于通过动态权重分配来优化信息传播效率。
  • 数学证明 linear propagation as spatial diffusion

    • 定理1: 线性传播机制的有效性证明
      对于任意给定的空间分布系统, 线性传播机制能够实现信息的有效扩散.
      其收敛速度优于传统扩散模型.
      可通过矩阵特征值分析来验证系统的稳定性.
  • 定理2: 空间扩散算法的优化性质证明
    在满足特定条件下, 所提出的算法能够达到全局最优解.
    这一结论可以通过Lyapunov稳定性理论进行严格证明.

    • learning data-driven affinity
      • 定理3
  • 实现

  • 实验结果

  • 补充说明

    • 基本概念
    • 各向异性扩散
      • 连续性方程的描述
      • 散度在图像处理中的应用
      • Python代码示例

abstract

利用空间传播网络学习生成affinity matrix用于vision tasks


Introduction

邻接矩阵是用来表征两个点之间的接近程度以及它们之间的相似性程度的数值工具。在高维空间任务中也发挥着重要作用,在这一领域中一直未被当作一个可学习的问题来处理。在该论文中我们表明学习affinity matrix等价于学习一系列按照行列方向的空间上线性变换矩阵模型,并在此过程中发现采用三元连接方式相比全连接方式能更有效地训练出密集型affinity matrix模型参数。


用data-driven manner学习affinity matrix的优势是多方面的(multifold)。1. 不适用于mid-to-high-level的空间相似矩阵假设。2. 能够有效提取高维特征间的关联性


ralated work


proposed approach

SPN 通过映射将一个二维图转换为一个新的具备期望性质的图。该过程相当于标准各向异性扩散过程。图像转换对应基于拉普拉斯矩阵分解的技术。(从未见过如此数学化的DCNN论文)

数学证明 linear propagation as spatial diffusion

设二维图像由变量XH表示,则其尺寸为n \times n, 其中x_t, h_t分别代表第t个纵列的空间位置参数。具体而言,在自左向右传播的过程中,二维图像的各个纵列x_t, h_t将遵循以下更新规则:

单位矩阵I被定义为一个方阵,在其主对角线上所有元素均为1,在其余位置上的元素均为0;初始条件设定为h_1 = x_1 其中d_t(i,i)是一个对角矩阵,并且其第i^{th}个元素等于第i列\omega _t$的和。

.
即有: 其中 \lambda_t = I - d_t.

定理1

G的每一行元素合起来等于1

定理2

对于演化矩阵 \begin{Bmatrix} U \end{Bmatrix}_T而言,在其时间导数\partial_T U中存在关系式\partial_T U = -LU其中L代表拉普拉斯矩阵D代表度数矩阵而A代表affinity(相似性)矩阵。定理2表明(1)式是一个典型的扩散过程其中L参数化了空间传播机制而A型邻接矩阵则量化了任意两点之间的相似程度。进一步地表明学习ω与学习邻接矩阵具有相同的性质关键在于如何使深度学习网络能够有效地学习构建邻接矩阵。

learning data-driven affinity

因为邻接矩阵被用于描述特定输入图像之间的相似性, 所以必须涉及data的相关性. 输入由c通道构成, 输出则包含n \times c \times 4通道. 这一计算量过于庞大, 因此表明certain local connections确实能够实现. 随后证明了three-way connection更加高效. 换句话说, 在单个pixel与前一个row或column中的三个pixel建立连接时相比仅建立单个连接更为有效.

one-way vs three-way

定理3

证明了该变换是stability的。

implementation

两个部分:
(a). 生成一个变换矩阵。
(b). 构建一个传播机制(PropagationModule),能够产生传播结果。

这里写图片描述

在深度神经网络(deep CNN)中接收一张图像作为输入,其空间维度为n \times n \times c;经过卷积操作后输出的空间维度变为n \times n \times c \times (3\times4)

experimental results

SPN被广泛应用于对任意图像分割模型进行集成训练,并且充当着一种精炼工具的作用。在测试阶段,则涉及到了数据来源的选择以及流程优化工作。最终输出的效果显示出了明显的提升。

这里写图片描述
这里写图片描述
这里写图片描述

补充

引用来源于万能的知乎

https://www.zhihu.com/question/24591127

以及博客

访问<>的详细页面

基本定义

一个图的关联矩阵:在无向图中每条边(u,v)都会使第u行第v列以及第v行第u列的位置元素加1即为该关联矩阵。
一个图的次数矩阵D:在无向图中每条边连接两个顶点时,在对应的对角元素位置会分别加1从而构成该次数矩阵。
拉普拉斯矩阵如下所示:

各向异性扩散也被称作P–M扩散法,在图像处理与计算机视觉领域被广泛应用。该技术通过有效保护图像细节特征的同时实现降噪功能。其主要功能是保护图像细节特征并有效地去除噪声。

各向异性扩散

连续性方程

以电磁理论的电荷守恒为例子,很容易有

如果在空间中存在一个密度场 ρ(x, y, z, t),那么该密度场(电场)中的电荷必定会向周围辐射出去,并且显而易见的是,在这种情况下电荷总是沿着浓度梯度方向进行迁移的。因此,在这种情况下我们可以得到经典的扩散方程:
当忽略扩散系数的影响时,

所指含义即为在时间区间内任意一点若其二阶导数值为正则浓度呈现上升趋势反之亦然直至t\rightarrow \infty时场域趋于光滑状态

散度在图像中的运用

同样,在图像中使用梯度算子配合连续性方程可以使图像变得平滑。这相当于将I(x,y)用于代替\rho。然而由于连续性方程式四方向均匀分布的特性,则形成了P-M方程:
图像是在梯度值较大的点处通过调节扩散速率来实现去噪效果的同时也能有效保护细节特征的完整性——当扩散速率在梯度值大的区域减缓扩散速度而在梯度值较小的区域则会加快扩散速度以达到平衡处理的效果

假设 xx是平行于边缘方向, yy是横跨边缘方向.

这里写图片描述
这里写图片描述
这里写图片描述

分别是原图,各向同性扩散图,各向异性扩散图

python参考代码

复制代码
    import numpy as np
    import math
    import scipy.ndimage
    from scipy import misc as misc
    np.set_printoptions(threshold=np.inf)
    def anisodiff2d(image, num_iter, delta_t, kappa, activation):
    """
    :param image: 输入图像
    :param num_iter: 滤波次数
    :param delta_t: 积分常数 0 - 1 /7
    :param kappa: 梯度阈值
    :param activation: 扩散函数
    :return: 扩散图像
    """
    init_im = image
    # 初始矩阵
    
    dx = 1
    dy = 1
    dd = math.sqrt(2)
    # 距离
    
    lu = np.array([[1, 0, 0], [0, -1, 0], [0, 0, 0]])
    uu = np.array([[0, 1, 0], [0, -1, 0], [0, 0, 0]])
    ru = np.array([[0, 0, 1], [0, -1, 0], [0, 0, 0]])
    lm = np.array([[0, 0, 0], [1, -1, 0], [0, 0, 0]])
    rm = np.array([[0, 0, 0], [0, -1, 1], [0, 0, 0]])
    lb = np.array([[0, 0, 0], [0, -1, 0], [1, 0, 0]])
    mb = np.array([[0, 0, 0], [0, -1, 0], [0, 1, 0]])
    rb = np.array([[0, 0, 0], [0, -1, 0], [0, 0, 1]])
    # 八个方向的掩码
    
    for i in range(num_iter):
        nable_lu = scipy.ndimage.correlate(init_im, lu, mode= 'nearest')
        nable_uu = scipy.ndimage.correlate(init_im, uu, mode= 'nearest')
        nable_ru = scipy.ndimage.correlate(init_im, ru, mode= 'nearest')
        nable_rm = scipy.ndimage.correlate(init_im, rm, mode= 'nearest')
        nable_lm = scipy.ndimage.correlate(init_im, lm, mode= 'nearest')
        nable_lb = scipy.ndimage.correlate(init_im, lb, mode= 'nearest')
        nable_mb = scipy.ndimage.correlate(init_im, mb, mode= 'nearest')
        nable_rb = scipy.ndimage.correlate(init_im, rb, mode= 'nearest')
    
        c_lu = activation(nable_lu, kappa)
        c_uu = activation(nable_uu, kappa)
        c_ru = activation(nable_ru, kappa)
        c_rm = activation(nable_rm, kappa)
        c_lm = activation(nable_lm, kappa)
        c_lb = activation(nable_lb, kappa)
        c_mb = activation(nable_mb, kappa)
        c_rb = activation(nable_rb, kappa)
    
        init_im = init_im + delta_t * (
                (1 / (dd * dd)) * c_lu * nable_lu + (1 / (dy * dy)) * c_uu * nable_uu +
                (1 / (dd * dd)) * c_ru * nable_ru + (1 / (dx * dx)) * c_rm * nable_rm +
                (1 / (dx * dx)) * c_lm * nable_lm + (1 / (dd * dd)) * c_lb * nable_lb +
                (1 / (dy * dy)) * c_mb * nable_mb + (1 / (dd * dd)) * c_rb * nable_rb
                )
        print("*****complete {} iteration*******".format(i + 1))
    
    return init_im
    
    
    def activation(nable, kappa):
    # return np.exp(-(nable / kappa)*(nable / kappa))
    return 1 / (1 + (nable / kappa) * (nable / kappa))
    
    
    if __name__ == "__main__":
    image = misc.imread(r"ori.jpg", mode = "RGB")
    num_iter = 20
    delta_t = 1/7
    kappa = 20
    # a = image[0]
    print(np.shape(image[:,:,0]))
    image[:, :, 0] = anisodiff2d(image[:,:,0], num_iter, delta_t, kappa, activation)
    image[:, :, 1] = anisodiff2d(image[:,:,1], num_iter, delta_t, kappa, activation)
    image[:, :, 2] = anisodiff2d(image[:,:,2], num_iter, delta_t, kappa, activation)
    #ima = np.array([a.tolist(),b.tolist(),c.tolist()])
    
    # print(a - image[0])
    
    misc.imsave(r"new.jpg", image)

待继续填坑
跪求代码

全部评论 (0)

还没有任何评论哟~