深度濾波器詳細解讀git
極品巧克力github
空間定位是VR\AR中的一項關鍵技術,計算機建立出來的虛擬圖像必需要依賴空間定位技術才能與現實(Reality)聯結在一塊兒,因此它直接決定了用戶體驗的好壞。高精度的空間定位可讓VR用戶體驗到徹底的沉浸感,AR中的虛擬物體更加逼真;而若是空間定位的精度比較差的話,則VR用戶會頭暈想吐,AR中的虛擬物體會漂移。 算法
空間定位技術又能夠分爲兩類,outside-in和inside-out。outside-in方案,須要在環境中架設定位基站,對用戶進行定位跟蹤,好比如今市面上的HTC Vive和Oculus Rift。 數組
而inside-out方案,不須要在環境中架設基站,它只經過自身攜帶的傳感器來進行定位,好比微軟的HoloLens、WindowsMR頭盔系列、HTC Vive Focus、蘋果的ARKit、谷歌的ARCore和Project Tango,還有預計將在2018年發售的Oculus Santa Cruz、Magic Leap One。(固然,還有室內機器人、無人機、無人車)。 dom
outside-in方案要架設定位基站,而且對用戶的活動範圍有限制,至關於"PC互聯網時代",只適合PCVR。 koa
而insiede-out方案更加輕便天然,就像人用眼睛觀察,就能知道本身在環境中的位置同樣。用戶只須要戴着頭盔,就能隨意走動,沒有運動範圍限制,至關於"移動互聯網時代"。從目前的發展趨勢來看,inside-out方案正在逐漸走向成熟,被應用在愈來愈多的VR一體機和AR眼鏡上。ide
而我接下來要探討的是,如何讓創建的地圖點更加準確。由於不管哪一種算法,準確跟蹤定位的前提都是,要有準確的地圖點。可是,因爲傳感器噪聲和環境噪聲的存在,老是會不可避免地建立出一些偏差大的甚至假的地圖點,這些錯誤的地圖點會對跟蹤定位的準確性形成很大的影響。 函數
因此,我接下來就介紹一種可讓地圖點更加準確的方法——深度濾波,它能夠經過屢次觀測,計算出一個地圖點是假的地圖點仍是真實地圖點的機率,而且計算出其做爲真實地圖點的最有可能的位置。它最初是用在三維重建中的(http://george-vogiatzis.org/),後來被用在SVO(Semi-Direct Monocular Visual Odometry,https://github.com/uzh-rpg/rpg_svo)中,都取得了很好的效果。優化
本文主要是參考《Video-based, Real-Time Multi View Stereo》,按照我本身的理解,從最基礎的貝葉斯公式開始推導,一步步推導出最後的迭代公式,用最通俗易懂的方式,把深度濾波方法的前因後果講清楚。 spa
首先,是之前的基於投票的獲取深度的方法。要有一個特徵點,而後在其它幀找匹配。
左圖是該特徵點在一幅圖像上面的匹配,隨着Z的變化,對應在極線上的不一樣投影點位置。該特徵點圖塊通過仿射變化以後,與不一樣的投影點位置的圖塊進行NCC匹配,獲取不一樣的匹配分數,而後記錄極大值點,落在哪一個Z值區間。從Zmin到Zmax分了50段區間。右圖是把60幅圖像這樣的數組累加,把極大值點累加,記錄在每一個Z值區間出現的極大值的頻數。
最後,會獲得這樣的結果,最後會收斂。分別對應五、十、20、100張圖的時候的樣子。
這種方法比較準確,可是須要記錄大量的數據。好比上面(a),單是一幅圖上,從Zmin到Zmax就分了50段,因而要用50個元素的數組來記錄每段有無極大值。而後把60幅圖像的數組都合併起來,獲得(b)。
並且,即使能知道累加後最高的那個直方圖對應的深度值,但不能知道,根據全部的測量結果所推算出來的深度值,也不知道,那個特徵點對應的外點(假地圖點)的機率。
因此,要想出其它的辦法,既能夠綜合全部的測量結果推算出深度值,也能夠推算出這個特徵點對應的外點的機率。
那麼,就用另一種方法,再也不記錄單幅圖像上的全部極大值,而是隻記錄單幅圖像上的最大值。一樣地,也把全部的數組累加起來。積累了150幅圖像的測量值以後,能夠獲得下圖。
那麼,在這樣的測量數據的狀況下,從這些測量數據中,能夠反映出這個點的真正的深度值應該是多少呢?是外點的機率又是多少呢?
用表示該特徵點真正的深度值,用
表示內點的機率。
因此,能夠用機率方法表示以下,也就是後驗機率。
要求出一組和
,使得上面的
最大。可是,直接算,算不出來。用貝葉斯公式來轉換。
又由於和
的區間分佈的先驗值,就是每處都相同。
這裏的都是指機率密度,就像是把1千克的質量分散在這麼大的體積裏,每一個地方的密度。要變成機率,還須要乘以一個微分段
,但由於在等式兩邊都乘以一樣的微分段,因此能夠約掉了。貝葉斯公式也就能夠一樣適用於機率密度的推算了。機率密度與實際機率的關係,參考《從貝葉斯到beta分佈》。
因此,
又由於之間互相獨立,因此,
也就是,找出一組和
,使得
這個累乘結果最大。
而對其中的每個元素,能夠認爲是,內點的高斯分佈機率,加上,外點的機率,表示成以下公式。其中,
是匹配點在極線上的一個像素的擾動,形成的對應點在深度上的變化。參考《視覺SLAM十四講》13.2.3的《高斯分佈的深度濾波器》。這裏的
都是指機率密度。
在
上,隨着
和
的調節,會變成以下不一樣的機率曲線,
因此,如今已知有這樣的肯定的測量值。
每一個測量值都對應一個,全部的累乘。目標是,經過調節
和
,調節曲線的形狀,使得
這個累乘結果最大。其實,即使
和
相同,
所在的區間相同,
也是不一樣的,由於
裏面的
是由兩幀相機的相對位置以及特徵點的像素位置決定的,因此每一個測量值的
都不相同。由於在該幀上面,假設在極線上測到的極大值點
,知足方差爲1個像素的高斯分佈,即真實的極大值點與測量點
間知足這樣的高斯分佈。則計算出來的深度點
也會知足高斯分佈,方差用
表示,參考《視覺SLAM十四講》的《深度濾波器》。
但因爲實際上差異不大,爲了思考上的方便,這裏就先忽略掉
的差異。但實際計算上,仍是會根據公式計算,考慮公式中
的差異。
將展開,獲得,
經過思考,會發現,測量值都是已知的固定的,就是上面的灰色的直方圖,爲了使得累乘結果最大,須要調節曲線,使得直方圖高的地方几率高,就是曲線的形狀接近於直方圖的形狀的時候,全部測量值對應的機率的累乘結果會是最大的。
仍是直接用窮舉的方法來找,怎麼樣的和
可讓累乘結果最大。經過窮舉全部的
和
,獲得每一個組合對應的累乘結果
的值,畫成三維圖表示以下。分別對應五、十、20、100張圖的時候的樣子。
最後,能夠收斂。根據窮舉的結果,能夠找到讓累乘結果最大時的和
,也就是最終想獲得的
和
。
其實,上面的方法的本質是基於這樣的一個假設,若是那個特徵點是內點的話,最後造成的直方圖會是中間很是凸起的形狀。若是那個特徵點是外點的話,則最後造成的直方圖會是很是平坦的長方形的形狀。因此,上面的方法也能夠近似理解爲,看最後造成的直方圖的形狀,分佈與凸起形狀和平坦的長方形形狀的類似度。
可是,對一張直方圖都要進行這樣的窮舉,計算量太大(分50段,
分100段,要算5000種組合),並且還只是對應單個特徵點。並且,每新來一張圖片,新來一個測量值
,調整直方圖後,針對這個新的測量值
,再窮舉出一幅三維圖
,而後以前算出來的三維圖
再乘以新的這幅三維圖
,也就是每種組合的計算結果對應相乘,獲得新的累乘三維圖
,再在上面找峯值。公式以下。
問:上面的這種已知全部的測量值(直方圖),而後窮舉全部的,求機率最大的地方,與卡爾曼濾波的用測量值更新獲得真值的方法,有什麼不一樣呢?首先,卡爾曼濾波只針對高斯分佈成立,因此只對
有效。那麼就把
都當成零,認爲全是內點的狀況下,二者的區別呢?
答:本質上是同樣的,結果上也會是同樣的,只是使用場景不一樣。這種方法的特色是,知道每個測量值各自對應的方差,而後窮舉全部的
,使得累乘結果最大,就認爲獲得最大後驗機率。這種窮舉的方法,適合離線方法。而卡爾曼濾波,一步步迭代的,經過第一個測量值獲得,預測值和對應的協方差。認爲真值是不動的。而後用後面的測量值和各自對應的協方差,來更新。最後獲得一個較準確的值。卡爾曼濾波的方法,適合在線的迭代的方法。在只有一個測量值的狀況下,二者是幾乎相同的。
若是在只有第一個測量值的狀況下,上面的窮舉方法,窮舉的結果會發現,當,
等於測量值的狀況下,後驗機率會是最大的。也就是說,在只有一個測量值的狀況下,就直接認爲它是內點。因此,須要多一些測量值才比較好。
可是,每新來一個測量值都要針對新的測量值窮舉,而後再兩幅三維圖相乘,計算量仍是蠻大的,還有沒有更方便計算的方法呢?
首先,對於這種窮舉找最大值的方法,如今通常都是用凸優化方法來代替了。若是能計算出優雅的雅克比解析式的話,就能夠用梯度降低法,高斯牛頓法或LM方法來快速找到極大值點(能夠轉換成極小值點來算,好比被1減)。可是,從展開的公式上看,也沒有方便地計算雅克比的方法。若是不能方便地計算雅克比,那麼就用數值擾動的方法來求雅克比,這就接近於窮舉法了,但只是用數值擾動來算雅克比,沿着梯度變化找到極大值點,計算量應該仍是比窮舉法要小的。這就是通常的窮舉法,凸優化法(有雅克比解析式,和,無雅克比解析式用數值擾動算雅克比)的關係。(http://www.cnblogs.com/ilekoaiq)但這些凸優化方法的前提都是,三維曲面上,只有一個極大值點。
經過對展開,
發現並無什麼方便計算的方法。主要是,其中的每一個大括號裏,都是由兩項加在一塊兒的,這樣子,整個公式拆開來算的話,會很是龐大,並且找不出規律(雖然有點像快速傅里葉變換的蝶形乘法)。那麼,有沒有辦法,把其中的加法消除掉呢?經過觀察發現,其中的加法,是由於不知道這個點是內點仍是外點,因而就兩種狀況都算。可是,若是經過其它方法,已經能夠知道對應的這個點是真實點高斯分佈產生的,仍是外點均勻分佈產生的。那樣子,就能夠把大括號裏面的加法消除掉,只保留對應的一項。要麼是真實點高斯分佈產生的,要麼是外點均勻分佈產生的。爲了方便理解,能夠先想象一種狀況,就是它們全都是真實點高斯分佈產生的。在論文中,是在極線上搜索,在必定搜索範圍內可否找到極大值,若是能找到極大值,就把極大值測量點轉換成的
認爲是真實點高斯分佈產生的;若是不能找到極大值,就把最大值測量點轉換成的
認爲是外點均勻分佈產生的,其實這時候,也無所謂選取的最大值測量點的位置和轉換後的
的位置,由於產生它們的都是外點的均勻分佈
。
再回到原來的公式。
設表示這個測量點轉換成的
是不是真實點高斯分佈產生的。
,表示是真實點高斯分佈產生的。
,表示是外點的均勻分佈產生的。則其中的每一項,能夠表示以下,這也是最根本的推導。其中,
,來自於
。單個字母
表示某個取值的時候,
表示全部取值的機率累加,且
。要思考清楚各個變量之間的關係,參考《貝葉斯與維恩圖》。
(其中,(或者
),也能夠先看右邊的這項
(或者
),再看左邊的這項
(
),會更好理解。)
那麼,如今,咱們已經經過了以前的那種策略,知道了當前點是否內點,記爲,相比只知道
,又增長了信息。則在已知
、
的狀況下,
的機率如如下公式所示。由於最根本的貝葉斯公式就是,
。
上式中,有些是內點,有些是外點,根據來決定,各項的實際表達式會不一樣。爲了數學形式上的簡潔與統一,上式中的各項能夠用如下公式來表示,同時表示了內點和外點的狀況。
因此,上上式能夠簡潔地表示成,
咱們要算的公式中,自變量是,其它的量都是已知的。
是已知的,用
表示累加結果,
。
都是已知的常數,就算
會隨着
的變化而變化,那也不要緊,變量
的變化不通過它們影響因變量結果,因此它們的累乘結果能夠認爲是一個已知的常數。參考《從貝葉斯到Beta分佈》,其實最後要算的是各個(
組合)機率之間的比例,也能夠理解爲實際上是要歸一化的。因此,上式還能夠寫成更簡潔的形式。(《Video-based, Real-Time Multi View Stereo》的附加材料的第一部分講的就是這樣的推導,可是它轉成了
,又轉回來,反而有些麻煩)。
是一個
分佈。
是高斯分佈的累乘,根據高斯分佈的性質(以及2中的那個"隱含"高斯分佈機率的推導),仍然仍是高斯分佈。因此,就用
的形式來表示。
而後,就能夠很方便地迭代計算了。其中,比較好算,
能夠根據高斯分佈乘法的性質,從
開始,一步步迭代計算出來。
當時,上式中
展開相乘,結合高斯分佈乘法,能夠獲得,
由高斯分佈乘法可得,參考《高斯分佈的加減乘除法》《直觀理解高斯函數相乘》《卡爾曼濾波基礎》。
若是,則
,
。
因此,迭代一下後,獲得的新的表達式爲,
其中,,
。這樣子,每新來一個測量值,只須要迭代一下就能夠,不用再兩幅三維圖相乘。
(而另外一方面,若是不知道的話,是沒辦法明確推導出上面的這樣的Beta和高斯分離出來的公式的,只能用近似的方法。經過觀察最後的收斂的三維圖像,思考發現。當
必定時,累乘結果峯值的位置主要是由
來決定的。也就是
決定了曲線凸出來的地方,當曲線凸出來的地方的位置與直方圖的高值地方接近的時候,累乘結果就能取到較大的值。當
值必定時,
的分佈也是一箇中間凸的曲線。
的分佈和
的分佈是分別窮舉的,但不是獨立的,由於在
不一樣的地方,
的分佈會發生變化,
的頂點位置會發生變化。可是,爲了簡化計算,能夠認爲
和
是獨立的,因此分別用曲線去近似
的分佈和
的分佈。)
由於根據咱們的策略,咱們能夠知道這個測量點對應的是內點仍是外點。可是,咱們以前的策略只能斷定明顯的外點,若是不是明顯的外點的話,就認爲是內點,可是,真實的狀況是,這時候認爲的內點,其實仍是有多是外點的。那麼,就要考慮這種更真實的狀況。
當用以前的策略斷定當前測量點爲外點產生的時候,就認爲它是由外點產生的。直接使用第3部分中的迭代方法,更新這個外點。可是,當斷定不是外點的時候,就仍然仍是要用第2部分中的方法。
設以前的部分已經知足的形式,用公式表示以下。
則,若是新來一個測量點,沒有被判斷爲外點。則公式更新以下。
根據高斯分佈乘法的性質,處理上式中的,參考《高斯分佈的加減乘除法》。
用表示
,用
表示
。(注意,這裏與《Video-based, Real-Time Multi View Stereo》的附加材料裏的公式不同,由於我認爲《Video-based, Real-Time Multi View Stereo》的附加材料裏的
的表達式寫錯了。)則上上式能夠表示爲。
這時候,結果是,兩個形式的相加。至關於兩幅三維圖疊加(想象兩個高斯分佈在機率軸方向上疊加在一塊兒,造成了兩個山峯)。相加以後的結果,不會再是
的形式,或者其它的單一模型的形式。在這裏,只能近似地認爲,相加後的結果接近於
的形式,這要依賴於上式中的,(1)
和
很接近使得
接近於1;(2)
和
,
和
很接近,使得
和
很接近;(3)
和
兩個數都很大,使得
接近於
;(4)
很小,使得左邊項能夠忽略。
因此,若是近似地認爲,相加後的結果接近於的形式的話,則用公式表示以下。
用一階矩和二階矩近似的方法,把新的參數估計出來。
就是用新的單一模型的機率密度三維圖去近似舊的多模型疊加的機率密度的三維圖。讓二者的自變量軸(x、y軸)的一階矩和二階矩近似。用表示舊的多模型疊加的機率密度的三維圖,用
表示新的單一模型的機率密度三維圖。其實這個三維圖的
軸,就是表示
的那一個軸,是無窮大的,只是最後顯示的時候,取了中間的
部分。
參考《高斯分佈的各階矩》,圖上的
的一階矩爲
,
圖上的
的二階矩爲
,
參考《經常使用分佈函數及特徵函數》,圖上的
的一階矩爲
,
圖上的
的二階矩爲
,
圖上的
的一階矩爲,
圖上的
的二階矩爲,
圖上的
的一階矩爲,
圖上的
的二階矩爲,
因此,聯立方程,讓圖的矩去等於
圖的矩,也就是
圖上的參數所要知足的約束。
通過計算,最後獲得迭代公式,
至關因而用一個Beta分佈來近似的分佈,用一個高斯分佈來近似
的分佈。
因而,最終就推導出了這麼一種簡潔的迭代公式。每新來一個測量值,迭代一下能快速計算出新的峯值點。相比第二部分,不用再針對新的測量值窮舉全部的組合後再兩幅三維圖相乘;相比第三部分,更加接近真實的狀況。
深度濾波方法,理論推導很是優美,所有都由最簡潔的貝葉斯公式推導而來,它儘量地把全部的觀測信息都利用上;還能進行快速迭代,實際運行的效果也很棒。應用在三維重建中,可讓三維重建出來的模型更加真實;應用在VR\AR空間定位中,可讓跟蹤定位更加準確。相信它還能夠被應用在更多的跟蹤、建圖算法中。
您以爲,本文值多少?