LIFT 論文詳解

LIFT

本文提供了相應的theanotensorflow,論文是比較早期的探索利用CNN的方法去學習特徵的工做,並且該組是瑞士聯邦理工學院的 cvlab,以前也作過不少 deep feature 和 三維視覺相關的研究,該工做很值得研究一下。html

主要思路

本文利用CNN網絡特徵點提取,ori 估計和特徵描述符的計算,並且是在統一模型框架裏面學習這三個子任務。git

基本流程

總體 pipeline

本文提出的統一模型框架 LIFT 的總體 pipeline 以下圖所示:github

LIFT pipeline

其中包括主要的部分 Detector、Orientation Estimator 和 Descriptor。每一個子任務都是單獨的 CNN 網絡,以前的工做 TILDELearn OrientationDeepDesc 已經證實單獨任務利用 CNN 網絡能夠處理的很好,本文則把它們統一到大框架裏一塊兒學習,整個網絡架構是端對端可導的。web

其中爲了把這三個任務合併在一塊兒,這裏獲得 Detector 和 Orientation Estimator 任務的輸出結果後,利用 Spatial Transformers 層獲得 patch 做爲 Descriptor 任務的輸入。算法

其中用 soft argmax 替代傳統檢測算法 non-local maximum suppression(NMS) 算法。這樣作的好處是整個 pipeline 都是可導的,這樣能夠統一利用反向傳導訓練,以前沒有其餘相似的工做,這個是第一次嘗試。windows

網絡架構

LIFT 總體的網絡架構以下圖所示:網絡

LIFT pipeline

其中網絡的輸入是 image patches,而不是整張圖像,主要是圖像中大部分區域並不包含特徵點。這些 image patches 是根據特徵點提取的,特徵點是 SIFT-SfM 構建的,後面會詳細討論。 有個問題是,訓練能夠這樣製造 patches,可是測試時 patches 怎麼得到??? 並且 image patch 儘量選擇的小,這樣保證在給定的這個 scale 的 image patch 上只有一個主要的特徵點存在,減小了查找該 image patch 其餘特徵點時間。 有點奇怪,這還叫特徵點 Detector???架構

其中總體網絡架構包含四個分支,每一個分支都包含 Detector、Orientation Estimator 和 Descriptor 三個不一樣的 CNN 網絡。框架

在訓練過程當中,使用 image patches 四元組做爲輸入。四元組包含兩個匹配的 image patches, P 1 \mathbf{P}^1 P1 P 2 \mathbf{P}^2 P2(對應同一個 3D 點,在不一樣的 view 上),第三個 image patch P 3 \mathbf{P}^3 P3 表示不一樣的 3D 對應的 patches,第四個 image patch P 4 \mathbf{P}^4 P4 表示不對應任何 3D 點,上面也不包含特徵點。四元組中的四個 image patches 對應網絡結構中的四個分支。 可是第四個分支去的其實有問題,有些 patches 在 SfM 中並無對應 3D 點可能有不少緣由,不必定就不包含特徵點,這種數據設計是由噪聲的????ide

爲了實現端到端的求導,每一個分支各個任務的鏈接關係以下:

  1. 輸入 image patch P \mathbf{P} P,Detector 輸出 score map S \mathbf{S} S
  2. 在 score map S \mathbf{S} S 上執行 soft argmax 獲取特徵點位置 x \mathbf { x } x 若是不存在呢???
  3. 以特徵點位置 x \mathbf { x } x 爲中心,利用 Spatial Transformer 層去 Crop 提取小 patch p \mathbf{p} p 做爲 Orientation Estimator 的輸入;
  4. Orientation Estimator 估計 p \mathbf{p} p 的 orientation θ \theta θ
  5. 而後利用 Spatial Transformer 層根據 θ \theta θ 去 rotate p \mathbf{p} p 獲得 p θ \mathbf{p}_{\theta} pθ
  6. p θ \mathbf{p}_{\theta} pθ 輸入到 Descriptor 網絡獲得最終的特徵向量 d \mathbf{d} d

soft argmax 使 argmax 變爲可導,將 score map 轉換爲具體座標,須要 check 具體公式;

這裏提供的 Spatial Transformer 層不具備學習參數,只是爲了保持總體可導,操做須要的參數在前面 CNN 中已經求得 x \mathbf { x } x θ \theta θ,Spatial Transformer 層只須要根據這兩個值對 image patches 進行 Crop 和 Rot 便可。

整個網絡做爲總體一塊兒從 scratch 開始 train 比較難收斂。因此本文設計了一種針對特定任務學習流程,首先學習 Descriptor 的參數,而後基於學習到的參數學習 Orientation Estimator 的參數,最後根據前兩個已經學到的參數去學習 Detector 的參數。從後向前去訓練每一個部分,這樣最後的梯度也能夠正確的反向傳導。

構建訓練數據集

1DSfM 提供的 13 個數據集中選擇 Piccadilly Circus 和 Roman Forum 兩個數據集。而後利用 VisualSFM 進行重建(基於 SIFT 特徵點)獲得 3D 點。具體重建後每一個數據集內容以下:

  1. Piccadilly 包含 3384 張圖像, 59 k 59k 59k 個 3D 點,平均每一個 3D 點有 6.5 個圖像觀察到;
  2. Roman-Forum 包含 1658 張圖像, 51 k 51k 51k 個 3D 點,平均每一個 3D 點有 5.2 個圖像觀察到;

數據集中的一些圖像示例以下:

Training dataset

其中左邊圖像來自 Piccadilly 數據集,右邊圖像來自 Roman-Forum 數據集。在 SfM 重建過程當中保留下來的特徵點爲藍色,其餘的爲紅色。

把上面收集到的數據集分爲訓練集和驗證集,若是訓練集中某些 3D 在驗證集合也被觀察到,那就刪除驗證集合中觀察到這些點的 view,同理也刪除訓練集中觀察到驗證集中 3D 點的那些 view。 具體怎麼劃分的感受仍是有點問題???

構建正樣本匹配的 patch pair 只從 SfM 重建保留下來的特徵中選擇(這些點魯棒性強,當作特徵點合適)。同時爲了提取不包含任何特徵點的 patches(上面說的網絡結構中第四個分支的輸入),隨機採用不包含 SIFT 特徵的圖像區域,固然那些在 SfM 過程沒保留下來的特徵點也不能被包含。

根據點的 scale σ \sigma σ 值,去在原圖上提取灰度的 image patches P \mathbf{P} P。 patches P \mathbf{P} P 在給定的位置上提取 24 σ × 24 σ 24 \sigma \times 24 \sigma 24σ×24σ 的區域,而後標準化到 S × S S \times S S×S,其中 S = 128 S = 128 S=128。而後小的 patches p \mathbf{p} p p θ \mathbf{p}_{\theta} pθ 做爲 Orientation Estimator 和 Descriptor 網絡的輸入,大小都是 s × s ​ s \times s​ s×s,其中 s = 64 s = 64 s=64

這裏後面說小 patches 和 SIFT描述符的支持區域大小 12 σ 12 \sigma 12σ 對應起來,不太明白???

爲了防止 overfitting,在 patch 位置上作了隨機擾動,範圍是 20 % ( 4.8 σ ) 20 \% ( 4.8 \sigma ) 20%(4.8σ)。最後利用整個數據集灰度圖的均值和標準差歸一化輸入的 patches。

Descriptor

本文利用 DeepDesc 提供的網絡結構去提取 patches 的描述符。在訓練 Descriptor 網絡的時候,Detector 和 Orientation Estimator 不參與訓練。該網絡的輸入的是 Orientation Estimator 輸出 p θ \mathbf{p}_{\theta} pθ。可是此時前面的網絡尚未訓練,不能自動生成,這裏使用 SfM 獲得的特徵點的位置和 ori 來生成 p θ \mathbf{p}_{\theta} pθ,當作 Descriptor 網絡的訓練數據。

訓練 Descriptor 網絡,主要是最小化匹配 patch pairs 之間的 Euclidean 距離,最大化非匹配patch pairs 之間的 Euclidean 距離,具體的 loss 公式以下:

L d e s c ( p θ k , p θ l ) = { ∥ h ρ ( p θ k ) − h ρ ( p θ l ) ∥ 2  for positive pairs, and  max ⁡ ( 0 , C − ∥ h ρ ( p θ k ) − h ρ ( p θ l ) ∥ 2 )  for negative pairs  \mathcal { L } _ { \mathrm { desc } } \left( \mathbf { p } _ { \theta } ^ { k } , \mathbf { p } _ { \theta } ^ { l } \right) = \left\{ \begin{array} { l } { \left\| h _ { \rho } \left( \mathbf { p } _ { \theta } ^ { k } \right) - h _ { \rho } \left( \mathbf { p } _ { \theta } ^ { l } \right) \right\| _ { 2 } } & { \text { for positive pairs, and } } \\ { \max \left( 0 , C - \left\| h _ { \rho } \left( \mathbf { p } _ { \theta } ^ { k } \right) - h _ { \rho } \left( \mathbf { p } _ { \theta } ^ { l } \right) \right\| _ { 2 } \right) } & { \text { for negative pairs } } \end{array} \right. Ldesc(pθk,pθl)={ hρ(pθk)hρ(pθl)2max(0,Chρ(pθk)hρ(pθl)2) for positive pairs, and  for negative pairs 

其中 d = h ρ ( p θ ) \mathbf { d } = h _ { \rho } \left( \mathbf { p } _ { \theta } \right) d=hρ(pθ) h ( . ) h ( . ) h(.) 表示 Descriptor 網絡, ρ \rho ρ 表示 CNN 網絡參數。

其中 C = 4 C = 4 C=4 表示非匹配 patch pair 的最大距離邊界(距離更遠 loss 不繼續增長了)。

在訓練 Descriptor 網絡使用 hard mining 方法,和上面 DeepDesc 中使用方法同樣,在 DeepDesc 中也看出該策略對最終的描述符的性能很重要。基於該策略,總共輸入 K f ​ K _ { f }​ Kf 個 pairs,而後只取 loss 最高的前 K b ​ K _ { b }​ Kb 個 paris 的 loss 進行反向傳播, r = K f / K b ≥ 1 ​ r = K _ { f } / K _ { b } \geq 1​ r=Kf/Kb1 表示 mining ratio。在 DeepDesc 工做中,網絡預訓練沒使用 mining 策略,fine-tune 時候設置 r = 8 ​ r = 8​ r=8。本文使用增量是的 mining 策略,訓練開始 r = 1 ​ r = 1​ r=1,而後每 5000 個 batches 後 r ​ r​ r 翻倍。這裏每一個 batch 包括 128 對正樣本,128 對負樣本。

Orientation Estimator

本文進行 Orientation Estimator 的思路和 Learn Orientation 相似。但該方法須要預先計算好多個 orientation 的描述符向量,而後計算相對於 orientation 的 Jacobian 矩陣。 這裏說的 Jacobian 具體含義??? 在本文中 Detector 的輸入沒有直接處理,而是做爲整個 pipeline 的一部分,因此預先計算描述符向量是不可能的。

基於上面的考慮,本文采用 Spatial Transformers 去學習 orientation。根據 Detector 網絡輸出的區域位置能夠獲得 patch p \mathbf { p } p,而後 Orientation Estimator 估計一個 orientation,公式以下:

θ = g ϕ ( p ) \theta = g _ { \phi } ( \mathbf { p } ) θ=gϕ(p)

其中 g ( . ) g ( . ) g(.) 表示 Orientation Estimator 網絡, ϕ \phi ϕ 表示 CNN 網絡參數。

這樣給定原始的 image patch P \mathbf { P } P,以及 Detector 網絡的輸出位置 x \mathbf { x } x,還有第二個 Spatial Transformer 層 Rot ⁡ ( . ) \operatorname { Rot } ( . ) Rot(.) 估計的 θ \theta θ,這樣 Descriptor 網絡的輸入獲得了 p θ = Rot ⁡ ( P , x , θ ) \mathbf { p } _ { \theta } = \operatorname { Rot } ( \mathbf { P } , \mathbf { x } , \theta ) pθ=Rot(P,x,θ)

這樣在訓練 Orientation Estimator 網絡的時候,能夠最小化相同 3D 點在不一樣 views 下的特徵向量的距離,loss 最終仍是落在 Descriptor 網絡上。同時在訓練時固定前面已經訓練好的 Descriptor 的參數,同時 Detector 仍是不繼續訓練,使用 SfM 獲得的特徵點的位置信息生成。訓練 Orientation Estimator 網絡 loss 的公式以下:

L  orientation  ( P 1 , x 1 , P 2 , x 2 ) = ∥ h ρ ( G ( P 1 , x 1 ) ) − h ρ ( G ( P 2 , x 2 ) ) ∥ 2 \mathcal { L } _ { \text { orientation } } \left( \mathbf { P } ^ { 1 } , \mathbf { x } ^ { 1 } , \mathbf { P } ^ { 2 } , \mathbf { x } ^ { 2 } \right) = \left\| h _ { \rho } \left( G \left( \mathbf { P } ^ { 1 } , \mathbf { x } ^ { 1 } \right) \right) - h _ { \rho } \left( G \left( \mathbf { P } ^ { 2 } , \mathbf { x } ^ { 2 } \right) \right) \right\| _ { 2 } L orientation (P1,x1,P2,x2)=hρ(G(P1,x1))hρ(G(P2,x2))2

簡單來講就是最小化匹配 pairs 特徵向量之間的 Euclidean 距離。

其中 G ( P , x ) = Rot ⁡ ( P , x , g ϕ ( Crop ⁡ ( P , x ) ) ) G ( \mathbf { P } , \mathbf { x } ) = \operatorname { Rot } \left( \mathbf { P } , \mathbf { x } , g _ { \phi } ( \operatorname { Crop } ( \mathbf { P } , \mathbf { x } ) ) \right) G(P,x)=Rot(P,x,gϕ(Crop(P,x))),表示前面的 crop 和 rotate 操做。

其中 ( P 1 , P 2 ) \left( \mathbf { P } ^ { 1 } , \mathbf { P } ^ { 2 } \right) (P1,P2) 表示同一個 3D 點的投影對應的 image patches, x 1 \mathbf { x } ^ { 1 } x1 x 2 \mathbf { x } ^ { 2 } x2 分佈表示投影位置。

Detector

Detector 網絡輸入一個 image patch,返回一個 score map。本文的方法和 TILDE 相似,卷積層後面跟着分段線性激活函數,具體以下:

S = f μ ( P ) = ∑ n N δ n max ⁡ m ( W m n ∗ P + b m n ) \mathbf { S } = f _ { \mu } ( \mathbf { P } ) = \sum _ { n } ^ { N } \delta _ { n } \max _ { m } \left( \mathbf { W } _ { m n } * \mathbf { P } + \mathbf { b } _ { m n } \right) S=fμ(P)=nNδnmmax(WmnP+bmn)

其中 f μ ( P ) f _ { \mu } ( \mathbf { P } ) fμ(P) 表示 Detector 網絡, μ \mu μ 表示 CNN 網絡參數。

其中 δ n = { + 1  for n is odd, and  − 1  otherwise  ​ \delta _ { n } = \left\{ \begin{array} { l } { +1 } & { \text { for n is odd, and } } \\ { -1} & { \text { otherwise } } \end{array} \right.​ δn={ +11 for n is odd, and  otherwise 

N N N M M M 是超參,控制分段線性激活函數的複雜度。

上面公式部分有點不明白

這裏和 TILDE 主要的不一樣是本文使用 score map 中最大值來隱式的表示位置信息,而不是像 TILDE 網絡直接去迴歸 SfM 獲得的特徵點固定的位置,在實驗中發現這樣直接回歸位置會下降性能。

而後有 score map S \mathbf { S } S,能夠獲得特徵點的位置:

x =  softargmax  ( S ) \mathbf { x } = \text { softargmax } ( \mathbf { S } ) x= softargmax (S)

其中 softargmax 函數主要計算 score map 的質心,具體公式以下:

softargmax ⁡ ( S ) = ∑ y exp ⁡ ( β S ( y ) ) y ∑ y exp ⁡ ( β S ( y ) ) \operatorname { softargmax } ( \mathbf { S } ) = \frac { \sum _ { \mathbf { y } } \exp ( \beta \mathbf { S } ( \mathbf { y } ) ) \mathbf { y } } { \sum _ { \mathbf { y } } \exp ( \beta \mathbf { S } ( \mathbf { y } ) ) } softargmax(S)=yexp(βS(y))yexp(βS(y))y

其中 y \mathbf {y} y 是 score map S \mathbf { S } S 的位置, β = 10 \beta = 10 β=10 是控制 softargmax 函數平滑度的超參。softargmax 也能夠理解爲一個可導的非極大值抑制函數(NMS)。 x \mathbf {x} x 和 image patch P \mathbf {P} P 輸入到第一個 Spatial Transformer 層  Crop  ( . ) \text { Crop } ( . )  Crop (.) 函數裏面, p = Crop ⁡ ( P , x ) \mathbf { p } = \operatorname { Crop } ( \mathbf { P } , \mathbf { x } ) p=Crop(P,x) 能夠做爲 Orientation Estimator 的輸入。

並且以前 Orientation Estimator 網絡和 Descriptor 網絡都已經訓完成,這樣就能夠固定這兩個網絡的參數,基於整個 pipeline 來訓練。就像上面提到的,輸入訓練四元組 ( P 0 1 , P 2 , P 3 , P 4 ) \left( \mathbf { P } _ { 0 } ^ { 1 } , \mathbf { P } ^ { 2 } , \mathbf { P } ^ { 3 } , \mathbf { P } ^ { 4 } \right) (P01,P2,P3,P4),最小化 loss 總和,具體以下:

L  detector  ( P 1 , P 2 , P 3 , P 4 ) = γ L c l a s s ( P 1 , P 2 , P 3 , P 4 ) + L p a i r ( P 1 , P 2 ) \mathcal { L } _ { \text { detector } } \left( \mathbf { P } ^ { 1 } , \mathbf { P } ^ { 2 } , \mathbf { P } ^ { 3 } , \mathbf { P } ^ { 4 } \right) = \gamma \mathcal { L } _ { c l a s s } \left( \mathbf { P } ^ { 1 } , \mathbf { P } ^ { 2 } , \mathbf { P } ^ { 3 } , \mathbf { P } ^ { 4 } \right) + \mathcal { L } _ { p a i r } \left( \mathbf { P } ^ { 1 } , \mathbf { P } ^ { 2 } \right) L detector (P1,P2,P3,P4)=γLclass(P1,P2,P3,P4)+Lpair(P1,P2)

其中 γ \gamma γ 是平衡上面兩個 loss 的超參。

首先須要對輸入的 image patch 進行分類,判斷該 patch 上是否是包含一個特徵點:

L c l a s s ( P 1 , P 2 , P 3 , P 4 ) = ∑ i = 1 4 α i max ⁡ ( 0 , ( 1 − softmax ⁡ ( f μ ( P i ) ) y i ) ) 2 \mathcal { L } _ { \mathrm { class } } \left( \mathbf { P } ^ { 1 } , \mathbf { P } ^ { 2 } , \mathbf { P } ^ { 3 } , \mathbf { P } ^ { 4 } \right) = \sum _ { i = 1 } ^ { 4 } \alpha _ { i } \max \left( 0 , \left( 1 - \operatorname { softmax } \left( f _ { \mu } \left( \mathbf { P } ^ { i } \right) \right) y _ { i } \right) \right) ^ { 2 } \\ Lclass(P1,P2,P3,P4)=i=14αimax(0,(1softmax(fμ(Pi))yi))2

其中 $ \left{ \begin{array} { l } { y _ { i } = - 1 \text { and } \alpha _ { i } = 3 / 6 } & { \text { for i = 4, and } } \ { y _ { i } = + 1 \text { and } \alpha _ { i } = 1 / 6 } & { \text { otherwise } } \end{array} \right.$ 主要是用於正負樣本,是否是特徵點 patch。這裏的分類應該主要是該 patch 是否是包含特徵點,是和否,只有兩類,可是輸入 score map,怎麼進行兩類的 softmax???

而後須要肯定特徵點位置,這裏假設匹配 patch 學習到的位置須要儘量使根據該位置計算出的描述符直接的距離最近,公式以下:這樣其實有可能帶來反作用,描述符最近的位置點不必定是正確的匹配點位置???
L p a i r ( P 1 , P 2 ) = ∥ h ρ ( G ( P 1 , softargmax ⁡ ( f μ ( P 1 ) ) ) ) − h ρ ( G ( P 2 , softargmax ⁡ ( f μ ( P 2 ) ) ) ) \begin{aligned} \mathcal { L } _ { \mathrm { pair } } \left( \mathbf { P } ^ { 1 } , \mathbf { P } ^ { 2 } \right) = \| & h _ { \rho } \left( G \left( \mathbf { P } ^ { 1 } , \operatorname { softargmax } \left( f _ { \mu } \left( \mathbf { P } ^ { 1 } \right) \right) \right) \right) - h _ { \rho } \left( G \left( \mathbf { P } ^ { 2 } , \operatorname { softargmax } \left( f _ { \mu } \left( \mathbf { P } ^ { 2 } \right) \right) \right) \right) \end{aligned} Lpair(P1,P2)=hρ(G(P1,softargmax(fμ(P1))))hρ(G(P2,softargmax(fμ(P2))))

這裏三個組件一塊兒來促進 Detector 網絡的訓練,同時設置 Descriptor 網絡的 mining ratio 爲 r = 8 ​ r = 8​ r=8

同時文中提到在訓練 Descriptor 網絡時,已經學習到一些不變性(平移或者說是位置的不變性),這樣對於 Detector 網絡來講很難進一步去學習到有用的信息了。爲了讓 Detector 網絡去學習到正確的區域,預訓練時限制學習到的位置匹配 patch 必須徹底 overlap 在一塊兒,是否是實際輸入的位置在 image patch 上就是同樣的???,後面繼續訓練時解除限制。

預訓練時的 loss 用下面的替換:

L ~ p a i r ( P 1 , P 2 ) = 1 − p 1 ∩ p 2 p 1 ∪ p 2 + max ⁡ ( 0 , ∥ x 1 − x 2 ∥ 1 − 2 s ) p 1 ∪ p 2 \tilde { \mathcal { L } } _ { \mathrm { pair } } \left( \mathbf { P } ^ { 1 } , \mathbf { P } ^ { 2 } \right) = 1 - \frac { \mathbf { p } ^ { 1 } \cap \mathbf { p } ^ { 2 } } { \mathbf { p } ^ { 1 } \cup \mathbf { p } ^ { 2 } } + \frac { \max \left( 0 , \left\| \mathbf { x } ^ { 1 } - \mathbf { x } ^ { 2 } \right\| _ { 1 } - 2 s \right) } { \sqrt { \mathbf { p } ^ { 1 } \cup \mathbf { p } ^ { 2 } } } L~pair(P1,P2)=1p1p2p1p2+p1p2 max(0,x1x212s)

L ~  pair  = 0 ​ \tilde { \mathcal { L } } _ { \text { pair } } = 0​ L~ pair =0 也就是兩個 patch 徹底 overlap 在一塊兒。

其中 x j = softargmax ⁡ ( f μ ( P j ) ) \mathbf { x } ^ { j } = \operatorname { softargmax } \left( f _ { \mu } \left( \mathbf { P } ^ { j } \right) \right) xj=softargmax(fμ(Pj)) p j = Crop ⁡ ( P j , x j ) \mathbf { p } ^ { j } = \operatorname { Crop } \left( \mathbf { P } ^ { j } , \mathbf { x } ^ { j } \right) pj=Crop(Pj,xj) ∥ ⋅ ∥ 1 \| \cdot \| _ { 1 } 1 l 1  norm  l _ { 1 } \text { norm } l1 norm 

其中 s = 64 s = 64 s=64 p \mathbf { p } p 的長和寬。

Pipeline

總體的運行框架以下圖所示:

LIFT pipeline

雖然本文方法訓練時在 image patches 上進行的,可是測試的輸入是整張圖像,這裏採用在整張圖像是進行 sliding window 選取 image patches 的方法。但這樣操做,時間花費太大。但幸運的是,Orientation Estimator 和 Descriptor 網絡只須要在局部最大值上運行,而不須要在全部的 windows 上運行。這裏就把 Detector 網絡單獨拿出來在整張圖像上運行,如上圖紅框所示,並且是在多個 scale 上運行的,這樣把多個 patches 的 score map 合併到原圖上,獲得了 score pypamid,後面用 NMS(和 SIFT 中使用的一致) 方法代替網絡裏面的 softargmax 獲得最終的 keypoints 的位置。後面的流程就和訓練一致了。

實驗

數據集和試驗構建

三個標準數據集:

  1. Strecha 數據集,包含 2 個 scenes 的 19 張 viewpoint 變化的圖像。
  2. DTU 數據集,包含 60 個 objects 的 60 個序列,包括了 viewpoint 和 illumination,網址以下data。用該數據集評價在不一樣 viewpoint 下本文方法性能。
  3. Webcam 數據集,包含 6 個 scenes 的 710 張 illumination 變化的圖像(同一個 viewpoint )。用該數據集評價在不一樣 illumination 下本文方法性能。

對於 Strecha 和 DTU 數據集,用於原文做者提供的真值構建匹配關係。每張圖像最多使用 1000 個 keypoints,利用 A performance evaluation of local descriptors 提出的評估方法進行評估,主要包含如下指標:

  1. Repeatability (Rep.) :度量特徵點的可重複性,表示爲一個比例值。主要是評價特徵點 Detector 性能,具體指特徵點在真值區域被發現的比例。
  2. Nearest Neighbor mean Average Precision (NN mAP) :主要是評價描述符 Descriptor 的可區分度,具體指在不一樣描述符距離閾值下的 Precision-Recall 曲線的 Area Under Curve (AUC),使用 NN 匹配策略。
  3. Matching Score (M. Score) :主要是度量整個 pipeline 的性能,具體指真值匹配關係被發現的比例。

效果對比

和 SIFT 對比效果以下圖所示:

LIFT pipeline

其中左邊是 SIFT 結果,右邊是本文結果。從上到下測試數據來源分別爲Strecha,Webcam,DTU scene 7 和 DTU scene 19 數據集。能夠看出本文方法能夠獲得更多的正確匹配關係。

訓練使用的 Piccadilly 數據集,訓練集和測試集的區別仍是比較大的,可是效果都還不錯,說明泛化性能比較強。

整個 pipeline 的量化評估

下圖是在三個測試數據集上平均 matching score 對比,具體結果以下圖所示:

LIFT pipeline

其中 LIFT (pic) 是在 Piccadilly 數據集上訓練的,LIFT (rf) 是在 Roman-Forum 數據集上訓練的。

同時上面看出 SIFT 效果要好於 VGG,DeepDesc 和 PN-Net 等深度學習方法。

並且對於某些方法單個部分好比 Detector 和 Descriptor 性能可能會好,但在總體 pipeline 評估中性能不必定保持。這也說明整個 pipeline 要放在一塊兒進行學習,像本文方法同樣,並且在評估中要考慮對整個 pipeline 的評估。

各部分性能評估

Fine-tuning the Detector

上面討論 Detector 網絡進行預訓練和 fine tune 訓練,這裏對比了這兩種性能,具體結果以下圖所示:

LIFT pipeline

其中是在 Strecha 數據集上進行測試的。看出來只進行預訓練性能已經比較好了,fine tune 後性能仍是有一些提升的。

並且能夠看出來在 Piccadilly 數據集上訓練性能比 Roman-Forum 數據集上訓練要好一些。主要是由於 Roman-Forum 數據集上沒有不少的非特徵點區域,也就是說 Detector 訓練過程負樣本是不足的,在訓練過程很容易 over-fitting。

各部分性能

各個部分性能對好比下圖所示:

LIFT pipeline

其中是在 Strecha 數據集上進行測試的。

經過上面發現用本文方法替換 SIFT 中的每一個部分都會有提升。並且主要是用本文的 Detector 網絡替換 SIFT 的檢測方法不只對 Rep 性能有提升,並且對 NN mAP 和 M. Score 都有提升,這說明本文方法不只能夠正確找到特徵點位置,並且能找到更利於描述符匹配的位置。同時說明整個 pipeline 一塊兒訓練來講是最優的方案。

本文同步分享在 博客「無比機智的永哥」(CSDN)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索