[完結]saliency filters精讀之permutohedral lattice
勘誤使於2017年3月19日
本文寫於2012年碩士生階段,有較多疏漏和誤解,於今日起開始勘誤,以最大限度的保留原始文章,同時更正其中錯誤。
一、背景碎碎念




本文思想
二、現有成果

三、Permutohedral Lattice
本文貢獻
- 它不僅僅把一個點映射到格子中心表示,而是映射到單形格子的各個頂點上,這樣子近似卷積的更加精確;
- 由於每個lattice具有同等形態,能夠用質心差值插值映射到lattice的各個頂點上;
- 並且能夠快速在此lattice上找到映射點四周的頂點,這樣子兩次映射(splat,slice)能夠快速進行;
- blur階段可以每一維離散進行,並且一個lattice頂點的周邊頂點能夠迅速確定,此階段能夠快速進行。
定義

![\vec{1}=[1,1,...,1]](/image/aHR0cDovL2xhdGV4LmNvZGVjb2dzLmNvbS9naWYubGF0ZXg_JTVDdmVjJTdCMSU3RD0lNUIxLDEsLi4uLDElNUQ=.png)








網格性質
- 這個子平面被相同形狀的單形填充,不留縫隙,沒有重疊
- 子平面中任意一點所在的單形頂點都能以
的時間內定義
- 單形頂點周圍所有的頂點也能以
的時間內定義


生成特征值映射到子平面的點
首先將每個坐標點除了一個誤差,是由splat,blur以及slice中產生的。然后映射到子平面上,注意此時的映射矩陣與上面的不同,因為上面的基向量不是正交的,並且此映射可以用
舉例bilateral filter,position由5-D向量組成,





查找單形頂點的所有相鄰點對,即
![\hat{l}_i\pm [-1,...,-1,d,-1,...,-1]](/image/aHR0cDovL2xhdGV4LmNvZGVjb2dzLmNvbS9naWYubGF0ZXg_JTVDaGF0JTdCbCU3RF9pJTVDcG0mc3BhY2U7JTVCLTEsLi4uLC0xLGQsLTEsLi4uLC0xJTVE.png)

Slice階段:
同splat階段步驟,利用權重b計算插值。由於在splat階段建立了b的table,所以用時O(nd)。
本算法總計用時為O((n+l)d^2)。

可以看到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空間就是有多個單形不留縫隙地拼接而成,它不像歐式空間那樣坐標軸互相垂直,而是成一定角度,分布在平面上。它具有以下特點:
- 平面中任意一點所在的單形頂點都能以
的時間內定義;
- 單形頂點周圍所有的頂點也能以
的時間內定義;
- ...還有一些更專業,就不再列了。
關於這兩點我的理解僅限於,這種空間對於稀疏無序的數據,能夠更加高效地進行組織,便於查找和各種運算的進行。
把歐式空間里的點變換到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空間就是有多個單形不留縫隙地拼接而成,它不像歐式空間那樣坐標軸互相垂直,而是成一定角度,分布在平面上。它具有以下特點:
- 平面中任意一點所在的單形頂點都能以
的時間內定義;
- 單形頂點周圍所有的頂點也能以
的時間內定義;
- ...還有一些更專業,就不再列了。
關於這兩點我的理解僅限於,這種空間對於稀疏無序的數據,能夠更加高效地進行組織,便於查找和各種運算的進行。
把歐式空間里的點變換到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中的“炸開”是帶着厚厚的特征一塊“炸開”的。