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中的“炸開”是帶着厚厚的特征一塊“炸開”的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM