(新型事件相機有關的論文解讀)Unsupervised Event-based Learning of Optical Flow, Depth, and Egomotion

新型事件相機有關的論文解讀之:

Unsupervised Event-based Learning of Optical Flow, Depth, and Egomotion

關於事件相機:
事件相機是一個新型的類腦相機,是一個待開發的大領域。希望通過我的分享,能夠有更多人來研究並將它更好地運用在我們的生活中~
對於事件相機還不瞭解的朋友們可以看我這一系列的另一篇博客:事件相機(Event Camera)及相關研究簡介——新一代相機?新的計算機視覺領域?

本篇論文地址:https://arxiv.org/abs/1812.08156v1
作者在youtube上上傳了項目視頻:https://www.youtube.com/watch?v=aDzFSG4yV0M&t=1078s

寫在前面

這篇論文做的工作不止有光流估計,還有深度和姿態的估計。
這篇論文和我之前分享的EVFlowNet非常相似,可以說是EVFlowNet的改進版,兩篇論文的作者也相同(膜Alex大佬)。之前在另一篇文章解讀的博客裏(A Unifying Contrast Maximization Framework for Event Cameras)也提到過這篇論文,這篇論文的部分設計思路也來源於那篇。
在EVFlowNet介紹的結尾,我說到目前這類算法的侷限性。人們更希望去尋找無監督的,不使用灰度圖的方法,以此來證明事件相機的優越性。這篇論文就是一個全無監督的網絡,也沒有了灰度圖的參與。

貢獻

1、一種新的離散事件量表示方法,用於將事件傳遞到神經網絡中。
2、一個新穎的應用運動模糊爲基礎的損失函數,來做到僅使用事件的無監督學習。
3、一種新的立體相似性損失在去模糊事件圖像普查變換中的應用。
4、在MVSEC上的定量測試,同時定性定量地在多種夜晚環境下進行測試。

下面我們來一一講解

網絡結構

在這裏插入圖片描述
論文使用的網絡結構如圖,可以看到其結構和EVFlowNet幾乎相同,loss計算位置的細節也幾乎相同,在這裏不多敘述,大家可以轉到我對EVFlowNet介紹的博客中去了解。
在進行光流預測時,網絡爲普通的Encoder+Decoder結構,在進行深度和姿態估計時,Encoder+Decoder結構用於估計深度,而上圖中的pose_model(紫色部分)用於輸出姿態估計。

事件如何放入網絡

如何將事件信息轉化爲圖像或放入網絡結構裏是很多人研究的點,也是事件視覺領域相比於rgb視覺領域的一個難點。在EVFlowNet裏,作者將兩幅灰度圖之間的事件累積在一個四通道的圖片上,前兩通道爲事件數累積(count_image),後兩通道爲最近的事件時間(time_image)。在本篇論文裏,作者又提出了一種新的方法。
假設一次前向傳播中輸入的事件數爲N,這列事件爲{(xi,yi,ti,pi)}i[1,N]\{(x_i,y_i,t_i,p_i)\}_{i\in[1,N]},然後我們將這一列事件劃分爲離散的B個容器裏。將時間尺度轉到[0,B-1]上,並對事件進行下列操作:
在這裏插入圖片描述
其中kb(a)k_b(a)類似於一個雙線性採樣核函數。由於相機失真的矯正可能導致像素對應的座標變成浮點數,所以應該使用該插值函數計算出原來整數座標下像素應有的值。
通過這樣的操作,就將輸入的事件分爲了B組。

姿態補償

所謂姿態補償通常通俗點說也就是去模糊吧,就是通過計算相機的姿態,把一個組裏的所有不同時刻的事件通過姿態變換轉到同一時間戳上,這樣能使得圖像模糊最小。
這裏假設u、v爲每個像素的光流,根據光流的定義,我們可以把所有的事件座標(xi,yi)(x_i,y_i)變換到統一時間戳tt'時它應該處於的座標(xi,yi)(x_i',y_i')。可想而知,變換後的座標是浮點數。
在這裏插入圖片描述
這樣的操作是否成功進行了姿態補償,在於光流值是否準確,那麼如何判定其是否準確呢,這裏作者嘗試使用了文章(A Unifying Contrast Maximization Framework for Event Cameras)中的方法,計算變換後事件數的方差作爲loss,但他發現這樣的方法非常容易過擬合。之後,作者運用了另一篇文章中提到的方法:最小化時間圖像和。
爲什麼這樣做呢,可以想象,如果光流估計的準確的話,所有事件將被變換到在tt'時刻它們本來所處的位置,那麼事件將會大概率重疊,逐像素地計算其上事件的平均時間戳,再將其求和,這個值將會較小。而如果光流估計不正確,那麼事件可能會更加混亂,重疊的事件數較少,逐點計算其上事件的平均時間再求和,這個值會很大。形象地舉個例子就是下面這樣:
2+3+4+5>1+22+3+422+3+4+5>\frac{1+2}{2}+\frac{3+4}{2}
那麼下來就是它的數學表示了:
在這裏插入圖片描述
這裏kb(x)k_b(x)仍爲之前定義的雙線性採樣核函數。由於如果直接將變換後的浮點座標四捨五入,將引入不可微的取整函數,導致網絡無法訓練,所以這裏採用了類似於雙線性採樣的方式,將一個浮點座標對應的像素值按距離比例分配到其周圍的四個整數座標的點上,如下圖:
在這裏插入圖片描述
公式中pp'控制事件極性,也就是說正負事件分開計算。然後在求和時候逐點求正負事件平均時間戳的平方和。
在這裏插入圖片描述
這樣,能夠衡量光流估計準確與否的時間誤差(time_loss)就計算完成了。
在設計完成後,還有一個問題:統一時間tt'怎麼確定。自然地我們想到用輸入的所有事件中時間最小的,即最初的事件時間。但是這裏就會有一個問題,與這個事件時間上靠的近的事件在反向傳播的時候會乘一個(tti)(t'-t_i)的項,這個項可能會非常小導致梯度消失。所以作者設定了兩個tt',分別計算,最後相加,這兩個tt'爲所有事件時間中的最大值與最小值,即最初時刻與最末時刻,用t1t_1tNt_N表示,公式如下:
在這裏插入圖片描述
這樣,我們就可以用一個損失函數LtimeL_{time}來衡量姿態補償是否完成。

光流估計

在上面姿態補償部分的敘述中,我們便可以通過損失函數LtimeL_{time}訓練做到姿態補償。同時,姿態補償時候的u、v恰好就是光流,所以,同樣適用類似的損害函數便可以進行光流估計。
與EVFlowNet類似,除了LtimeL_{time}外還要加一個正則項LsmoothL_{smooth},即光滑損失。因爲輸出的光流圖應該是空間上光滑的,相鄰像素之間的光流不應該差別很大。所以該損失定義爲每個像素的光流與其周圍的像素上的光流之間的差距的和。
在這裏插入圖片描述
與一般論文類似,這裏的N(x)N(\vec x)表示向量x的鄰居們,這裏定義爲其四鄰居。函數ρ\rho表示Charbonnier損失函數,其定義爲:
ρ(x)=x2+ϵ2 \rho(x)=\sqrt{x^2+\epsilon^2}
其中ϵ\epsilon爲一個較小的常數,防止x在接近零的時候反傳變得奇怪~
這樣,在做光流估計時的損失函數定義爲:
在這裏插入圖片描述

姿態和深度估計

這裏要說明一下,光流是用一套參數估計的,而深度和姿態是用另一套參數估計的。也就是說網絡結構相似,分開訓練兩類任務。

重映射誤差

爲了導出重映射誤差,我們將光流與相機參數和姿態之間的關係寫出來,如下:
在這裏插入圖片描述
這個公式很好理解,就是基本的三維空間的變換。u、v爲光流,K爲相機內參,R爲旋轉矩陣,T爲平移向量,π\pi爲透視函數,f爲相機焦距,b爲雙目的基線長度。
由於上面已經有了評判光流準確有否好損失,故將這裏得到的光流帶入上面的損失中即可判斷R矩陣估計的準確與否,最終我們可以從估計準確的R矩陣中導出歐拉角(ψ,β,ϕ)(\psi,\beta,\phi)
這裏的誤差記爲LtemporalL_{temporal}

立體視差

這裏立體視差輸入的是通過上述計算到的光流去模糊後的圖片,是基於census變換來設計的。因爲即使是同一時刻的圖像,左右的事件數也可能不一樣,所以直接使用光度誤差會不太友好,而census變換對亮度並不敏感,所以作者採用了它。
在同一時刻,左右兩個相機的圖像應該是相似的,如果把視差計算進去那左右圖應該是相同的。所以我們利用網絡最後輸出的左圖片的視差,將右圖片的census變換warping到左圖上,然後計算兩者之間的差距,這裏和上面一樣使用Charbonnier損失。同樣的,反過來對右圖片計算一次。這一項我們記爲LstereoL_{stereo}
另外,作者還設計了LconsistencyL_{consistency},在同一時刻,左右輸出的視差應該相似,所以這一項代表左右視差的差值。
最後總的損失表示爲:
在這裏插入圖片描述
這裏LsmoothnessL_{smoothness}與上面光流預測部分相同。
下來就是無盡的調參了吧。。

個人總結

這篇文章最後的結果還不錯,部分的準確率提升了很多,是在事件視覺領域嘗試無監督方式的一大步。同時相似的論文還有很多,這些論文或是在改變結構,或是在設計前端,又或是在嘗試設計損失。總之,在事件視覺領域,這些都是有待開發的方面。如何設計前端可以把事件信息巧妙的輸入網絡?如何設計網絡能夠最大程度地提取事件中蘊藏着的我們所需要的信息?同時去除噪聲和無用信息。如何設計損失能夠使網絡更好地訓練,無監督地訓練?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章