• permutohedral lattice理解


    [完结]saliency filters精读之permutohedral lattice

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

    勘误使于2017年3月19日

    本文写于2012年硕士生阶段,有较多疏漏和误解,于今日起开始勘误,以最大限度的保留原始文章,同时更正其中错误。

    一、背景碎碎念

    之前的saliency filter引用了一篇Adams的Fast high-dimensional filtering using the permutohedral lattice,2010(见引用4),看了很多遍,感觉由于篇幅受限略过去了很多东西,数学又是属于基础的问题,看起来很慢。不死心继续搜,终于功夫不负有心人,找到了Adams在2011年写的HIGH-DIMENSIONAL GAUSSIAN FILTERING FOR COMPUTATIONAL PHOTOGRAPHY(Pdf)博士毕业论文,全文133页,详细阐明了新提出的两种高斯卷积加速方法:一个就是本篇中要详细讲的利用permutohedral lattice,第二种使用了Gaussian KD-Tree。
     
    文章首先在开始处介绍了几种Gaussian滤波的家族成员:双边滤波,joint-双边滤波,joint-双边滤波upsample,以及Non-local Means的主要函数形式,以及在图片处理中的效果。下面是高维高斯滤波的函数形式:
    左边为位置i的新数值(一般为颜色),向量表示;pi表示当前点的特征值,pj为窗口空间中剩余点的特征值,
    对于此处为什么有个1,我的理解是为了保证窗口中权值之和为1需要除一个参数,新得到rgb值缺少这么一个参数,于是就有了这个1
     
    我们分析不同滤波方式中特征值不同产生的影响:
    1)在普通的高斯滤波中有
    也就是说当前像素点周围只是位置的远近影响新的值;
    2)而双边滤波中
    导致颜色迥异的点时权值近似为零。(后来我才知道这里放的两只黑狗照片是作者拍摄地,有钱淫,他的Stanford主页上还有各种旅游风景照,口水ing)这里先做简单介绍,实现代码与此有关。此后又对以上几种方法进行了图片(Canon 400D at ISO 1600.)处理的对比,发现对于非高斯噪点,joint-双边滤波对人眼表现最好,但Non-local Means处理后的照片最真实。
     
    说了这么多,其实作者的意思就是高斯卷积在图片处理中处于使用量巨大,但是同时速度很慢的一个技术,如何快速计算高斯卷积是一项灰常灰常重要的事。
     

    本文思想

     
    下面轮到介绍本文的基本思想了,也许各位也看过了很多遍吧。。。
    1)用新建坐标系,用pi表示特征值节点坐标而不是原始的(x, y),vi保持不变
    2)投影映射,就是坐标变换,降维的步骤在此处进行。一个坐标不是投影到一个点,而是类似于重心插值投影到一个单形(lattice)各个顶点处,保留各顶点的权值为以后的upsample保存。若两个不同的点投影到相同的顶点坐标时,增大此点值。
    3)对lattice的顶点计算高斯卷积
    4)upsample得到原始的点。

    二、现有成果

    由于我读本文重点在于permutohedral lattice,所以那些滤波之类的就只做了一下简单了解,joint-双边滤波-upsample和Non_local Means真心没有搞懂,这里也不瞎做介绍。然后有一幅图挺重要的,具体对比了Gaussian Filter这些年的进步。
     
    1)Naive方法只是单纯地将窗口中所有点进行卷积,时间复杂度O(mn^d);
    2)快速高斯卷积方法首先将格子中的每个点都放在了格子的重心上,时间复杂度O(mk^d),由于格子的个数k小于point的个数n,所以提速;
    3)双边方格卷积在上面的基础上,不对每个点卷积,而是对格子的每个顶点卷积,最后使用插值方式恢复特征点,复杂度变为O(k^(d+1)),特征点的个数多于格子的个数,所以有加速,但此方法有个缺点就是对于维度仍然是指数复杂度,对高维特征的高斯滤波不合适(d>3 or d>5)
    4)改进的快速高斯卷积,不局限于方格而是簇概念,每个簇可以是跨维度的形状,双边滤波改进处就是在中心表示之后,直接对重心进行blur,然后在插值形成原来的点,时间复杂度O(mkd);
    5)本文在第一步采用了新的方法,通过提高维度的方法将格子原来的grid变成了文中的permutohedral lattice,时间复杂度也是O(nd^2),但由于使用质心插值方法,能够产生更加优秀的效果;高斯Kd-tree则在分类上做了改变,有时间再继续读。

    三、Permutohedral Lattice

    本文贡献

    Permutohedral lattice相比之前工作的进步之处于,
    1. 它不仅仅把一个点映射到格子中心表示,而是映射到单形格子的各个顶点上,这样子近似卷积的更加精确;
    2. 由于每个lattice具有同等形态,能够用质心差值插值映射到lattice的各个顶点上;
    3. 并且能够快速在此lattice上找到映射点四周的顶点,这样子两次映射(splat,slice)能够快速进行;
    4. blur阶段可以每一维离散进行,并且一个lattice顶点的周边顶点能够迅速确定,此阶段能够快速进行。

    定义

    一个d维的permutohedral lattice是d+1维空间子平面分割,此超平面法向量为,所以我们有。什么是分割?一般认为分割的格子(lattice)是同样形状,一个平面能够被相同形状的格子没有缝隙,没有重叠的布满,那么格子就是空间的分割。
    我们需要对此子平面进行分割,作者使用了单形进行分割。单形顶点在d+1维空间坐标我们不得而知,作者重新定义了基向量(并不完全准确,因为之间线性相关),于是此子平面上单形顶点的坐标直接满足在平面上的要求,即
    当d=3时,单形顶点在原点,单形的边长为1,格子如上图所示。单形的顶点坐标为整数,并且一个点的坐标各项模d+1=3有相同余项k,我们称这个顶点为余k点。这里对上面的基向量稍微做一下解释,假设在三维空间中,有子空间,有
     
    在xoy平面上,有三个点,这个点经过映射变换,就对应了上图中的橙色区域,坐标为
    也就是说,下图右侧x轴原点y轴夹的右上部分区域,是下图左侧分割空间坐标映射变换
    下面的文章都是基于映射后的坐标。

    网格性质

    子平面具有三个属性:
    1. 这个子平面被相同形状的单形填充,不留缝隙,没有重叠
    2. 子平面中任意一点所在的单形顶点都能以的时间内定义
    3. 单形顶点周围所有的顶点也能以的时间内定义
    文章有详细的论证,我们这里简单的说明一下:
    这个子平面被相同形状的单形填充,不留缝隙,没有重叠。作者首先证明了一个距离子平面中一点x最近的余0顶点是原点,其充分必要条件是该点坐标最大值与最小值差小于等于d+1。由格子的平移不变性,我们可以得到每个点(不在格子的边上)的最近余0点l都是唯一的,而且可以通过x-l的坐标得到具体在余0点周边具体的单形区域(也唯一)。所以子平面被单形分割,没有缝隙,没有重叠。
    子平面中任意一点所在的单形顶点都能以的时间内定义。分两步,先确定最近余0点,然后通过l-x坐标判断所在单形然后计算单形顶点。本文使用Conway&Sloane提出的方法确定最近余0点,给一个坐标,先找出其最近的余0点。具体方法为:坐标向量中每个值找到最近的模d+1余0的值,如果坐标向量1范式值不为0(不在此子平面),则调整坐标中变化最大的那一项,使其向反方向增加或者减少d+1。用时
    单形顶点周围的顶点也能以的时间内定义。一个单形顶点所有临近点与其坐标相差为,总共有2(d+1)个这样的点,所以用时

    计算高斯卷积

    下面介绍利用这个permutohedral lattice计算高斯卷积。

    生成特征值映射到子平面的点

    首先将每个坐标点除了一个误差,是由splat,blur以及slice中产生的。然后映射到子平面上,注意此时的映射矩阵与上面的不同,因为上面的基向量不是正交的,并且此映射可以用的时间计算出来。
    举例bilateral filter,position由5-D向量组成,
    计算方法如下:

    Splat阶段:

    这个阶段主要是把特征点的值使用质心插值的方法,累加到所在单形的所有顶点上。上文已经介绍了如何通过点找到所在单形的顶点。那么质心插值如何计算?
    还记得上面图片的橙色三角区域吗,假设其中有一个点y,s是单形的顶点,b是插值系数,那么我们有
    作者证明了此阶段时间复杂度是
     
    Blur阶段:
    查找单形顶点的所有相邻点对,即,使用核函数进行blur操作,此步骤复杂度为

    Slice阶段:
    同splat阶段步骤,利用权重b计算插值。由于在splat阶段建立了b的table,所以用时O(nd)。
    本算法总计用时为O((n+l)d^2)。

     
    此图为速度比的等高线,为最快速度和第二快的算法结构用时之比。颜色越深相差越大。图片左侧标志维度,横轴为filter size,右侧为使用的算法。
    可以看到5-20维度时候permutohedral lattice根据filter size情况最优。

    完结。

    https://www.codetd.com/article/2771587

    直接看第三章,bilateral convolution layers。这个词来自于文献[22]和[25]:

    [22]Learning Sparse High Dimensional Filters:Image Filtering, Dense CRFs and Bilateral Neural Networks . CVPR2016

    [25]Permutohedral Lattice CNNs.  ICLR 2015 

    但是笔者去看了这两篇文章,感觉这里其实叫Permutohedral Lattice CNNs更贴切。文献[22]写得乱七八糟得,提出了Bilateral Neural Networks这么个词,其实根本就只是把文献[25]里的Permutohedral Lattice CNNs换了换名字、换了个场合。

     

    接着看文章,为了讲解方便,我们就继续用文中BCL这个名词。

     

    第三章比较重要,首先讲了BCL的输入。这里先区分两个词,input features 和lattice features ,前者是实打实的输入特征,其维度为df,既可以是低阶特征,也可以是神经网络提取的高阶特征,维度从几到几百均可;而后者是用来构造Permutohedral Lattice的特征,只用低阶特征,如位置、颜色、法线,维度一般为个位数。例如第四章文中给的SPLATNet3D 的实现结构,lattice features是位置,维度就只有3。

    接着,就是文章的核心了,介绍了BCL的三个基本操作:Splat、Convolve、Slice,这里文章介绍的不细致,而且容易误导人,建议有时间的同学去看看文献[25]以及文献[1]“Fast High-Dimensional Filtering Using the Permutohedral Lattice”会有个更深入的理解。

    Splat。

    这个操作就是把欧式空间变换成另外一个空间,怎么变换?通过乘一个变换矩阵。变换矩阵一般是这样

    具体为什么定义成这样就是数学问题了,在此就不赘述了。这里d表示Permutohedral Lattice空间的维度。

    为了便于理解,给一个例子:欧式空间定义三个点,分别是(0,0,0)、(1,0,0)、(1,1,0)。令Permutohedral Lattice维度取d=2,则

    用B2乘坐标,得到经过变换后新的三点坐标(0,0,0)、(2,-1,-1)、(1,1,-2)。这一过程如下图所示:

    右图中,带颜色的数字0,1,2都是余数(即文献[1]中的remainder)。这个余数是怎么算的呢?举例说明,如(2,-1,-1)这个点,2和-1两个数对3进行取模运算,得到的余数都是2,所以这点就标成2;再比如(1,1,-2)对3取模,余数都是1,所以这点就标成1。在整个Permutohedral Lattice空间都遵循这种规则进行标注,后面做卷积运算时会根据这些余数进行相应操作。

    如上图所示的那样,Permutohedral Lattice空间就是有多个单形不留缝隙地拼接而成,它不像欧式空间那样坐标轴互相垂直,而是成一定角度,分布在平面上。它具有以下特点:

     

    1. 平面中任意一点所在的单形顶点都能以的时间内定义;
    2. 单形顶点周围所有的顶点也能以的时间内定义;
    3. ...还有一些更专业,就不再列了。

    关于这两点我的理解仅限于,这种空间对于稀疏无序的数据,能够更加高效地进行组织,便于查找和各种运算的进行。

     

    把欧式空间里的点变换到Permutohedral Lattice空间后,还要进行一步“炸裂”操作(这个名字是我杜撰的),如下图:

    也就是把单形里的某个点的信息炸开到周围三个顶点上,当然了,这个点带的信息也就是它的特征,不管64维也好128维也好,都要炸开到周围三个顶点。这个所谓的“炸开”也是有一定依据的,会根据距离分配不同的权值,但是基本上炸开之后的特征维度是不变的。

    至此,Splat操作完成。所以,现在大家应该能够体会到Splat的作用了,就是把原本在欧式空间中又稀疏、又不均匀的点按照一种新的形式组织了一下,方便进行后续运算。下面就是Convolve。

    Convolve说起来就简单了,Splat操作之后,点的特征已经按照一定原则“分配”到各个单形的顶点上了,所以,位置也就很比较规整了,按照哈希表做索引,进行卷积操作就行了。

    Slice。这是Splat的逆过程,把卷积运算后得到的Lattice顶点上的信息,“汇聚”到原来点的位置上。当然,如果“汇聚”到新的位置上也可以,新的点数也可以比原来的点数少,也可以分布在不同维度的欧式空间上。这就和卷积操作变换图片尺寸的效果有点类似。

    至此,就把Permutohedral Lattice CNN模块讲完了,这就是BCL的核心内容了。

    第四章就简单了,无非就是介绍网络的超参是如何设定的、网络结构如何设计的,都是比较容易理解了。

    第五章介绍了2D-3D融合的实现版本,无非就是多加了几个concate的操作,网络更加复杂一些,根据语义分割的任务特点加了多层次信息融合等等,也都不难理解。

    第六章是实验,证明了本文所提网络的有效性。

    第七章总结。

    附录部分——附录部分可以看看网络的设计参数,例如BCL的输出特征维度64-128-128-64-64-7等等,可以加深对网络的认识。我最开始搞不清楚Splat投影是做什么的,受到文中一句话的误导:

    以为要把高维(如64,128)的特征映射到低维(如3,6),非常别扭。

    直到看到附录部分关于BCL输出特征维度的介绍,维度还是很高的,就才恍然大悟,才知道Splat中的“炸开”是带着厚厚的特征一块“炸开”的。

     

    直接看第三章,bilateral convolution layers。这个词来自于文献[22]和[25]:

    [22]Learning Sparse High Dimensional Filters:Image Filtering, Dense CRFs and Bilateral Neural Networks . CVPR2016

    [25]Permutohedral Lattice CNNs.  ICLR 2015 

    但是笔者去看了这两篇文章,感觉这里其实叫Permutohedral Lattice CNNs更贴切。文献[22]写得乱七八糟得,提出了Bilateral Neural Networks这么个词,其实根本就只是把文献[25]里的Permutohedral Lattice CNNs换了换名字、换了个场合。

     

    接着看文章,为了讲解方便,我们就继续用文中BCL这个名词。

     

    第三章比较重要,首先讲了BCL的输入。这里先区分两个词,input features 和lattice features ,前者是实打实的输入特征,其维度为df,既可以是低阶特征,也可以是神经网络提取的高阶特征,维度从几到几百均可;而后者是用来构造Permutohedral Lattice的特征,只用低阶特征,如位置、颜色、法线,维度一般为个位数。例如第四章文中给的SPLATNet3D 的实现结构,lattice features是位置,维度就只有3。

    接着,就是文章的核心了,介绍了BCL的三个基本操作:Splat、Convolve、Slice,这里文章介绍的不细致,而且容易误导人,建议有时间的同学去看看文献[25]以及文献[1]“Fast High-Dimensional Filtering Using the Permutohedral Lattice”会有个更深入的理解。

    Splat。

    这个操作就是把欧式空间变换成另外一个空间,怎么变换?通过乘一个变换矩阵。变换矩阵一般是这样

    具体为什么定义成这样就是数学问题了,在此就不赘述了。这里d表示Permutohedral Lattice空间的维度。

    为了便于理解,给一个例子:欧式空间定义三个点,分别是(0,0,0)、(1,0,0)、(1,1,0)。令Permutohedral Lattice维度取d=2,则

    用B2乘坐标,得到经过变换后新的三点坐标(0,0,0)、(2,-1,-1)、(1,1,-2)。这一过程如下图所示:

    右图中,带颜色的数字0,1,2都是余数(即文献[1]中的remainder)。这个余数是怎么算的呢?举例说明,如(2,-1,-1)这个点,2和-1两个数对3进行取模运算,得到的余数都是2,所以这点就标成2;再比如(1,1,-2)对3取模,余数都是1,所以这点就标成1。在整个Permutohedral Lattice空间都遵循这种规则进行标注,后面做卷积运算时会根据这些余数进行相应操作。

    如上图所示的那样,Permutohedral Lattice空间就是有多个单形不留缝隙地拼接而成,它不像欧式空间那样坐标轴互相垂直,而是成一定角度,分布在平面上。它具有以下特点:

     

    1. 平面中任意一点所在的单形顶点都能以的时间内定义;
    2. 单形顶点周围所有的顶点也能以的时间内定义;
    3. ...还有一些更专业,就不再列了。

    关于这两点我的理解仅限于,这种空间对于稀疏无序的数据,能够更加高效地进行组织,便于查找和各种运算的进行。

     

    把欧式空间里的点变换到Permutohedral Lattice空间后,还要进行一步“炸裂”操作(这个名字是我杜撰的),如下图:

    也就是把单形里的某个点的信息炸开到周围三个顶点上,当然了,这个点带的信息也就是它的特征,不管64维也好128维也好,都要炸开到周围三个顶点。这个所谓的“炸开”也是有一定依据的,会根据距离分配不同的权值,但是基本上炸开之后的特征维度是不变的。

    至此,Splat操作完成。所以,现在大家应该能够体会到Splat的作用了,就是把原本在欧式空间中又稀疏、又不均匀的点按照一种新的形式组织了一下,方便进行后续运算。下面就是Convolve。

    Convolve说起来就简单了,Splat操作之后,点的特征已经按照一定原则“分配”到各个单形的顶点上了,所以,位置也就很比较规整了,按照哈希表做索引,进行卷积操作就行了。

    Slice。这是Splat的逆过程,把卷积运算后得到的Lattice顶点上的信息,“汇聚”到原来点的位置上。当然,如果“汇聚”到新的位置上也可以,新的点数也可以比原来的点数少,也可以分布在不同维度的欧式空间上。这就和卷积操作变换图片尺寸的效果有点类似。

    至此,就把Permutohedral Lattice CNN模块讲完了,这就是BCL的核心内容了。

    第四章就简单了,无非就是介绍网络的超参是如何设定的、网络结构如何设计的,都是比较容易理解了。

    第五章介绍了2D-3D融合的实现版本,无非就是多加了几个concate的操作,网络更加复杂一些,根据语义分割的任务特点加了多层次信息融合等等,也都不难理解。

    第六章是实验,证明了本文所提网络的有效性。

    第七章总结。

    附录部分——附录部分可以看看网络的设计参数,例如BCL的输出特征维度64-128-128-64-64-7等等,可以加深对网络的认识。我最开始搞不清楚Splat投影是做什么的,受到文中一句话的误导:

    以为要把高维(如64,128)的特征映射到低维(如3,6),非常别扭。

    直到看到附录部分关于BCL输出特征维度的介绍,维度还是很高的,就才恍然大悟,才知道Splat中的“炸开”是带着厚厚的特征一块“炸开”的。

     

  • 相关阅读:
    凸包模板
    1060E Sergey and Subway(思维题,dfs)
    1060D Social Circles(贪心)
    D
    牛客国庆集训派对Day2
    网络流
    Tarjan算法(缩点)
    莫队分块算法
    计算几何
    hdu5943素数间隙与二分匹配
  • 原文地址:https://www.cnblogs.com/adong7639/p/10531140.html
Copyright © 2020-2023  润新知