Introduction: Tracking, Fusion and Deep learning for ADAS
因為有計算機視覺和機器學習背景,上次和同事聊天中,同事建議我可以給一個小的Presentation來講一下相關內容。於是我就花了一天時間準備了一下,給全組人做了一個1個半小時的彙報,大家討論的也很熱烈,功夫沒白費。就把內容翻譯成中文,一方面記錄一下,另一方面也許有興趣的朋友也可以了解一下。
題目很大,關於追蹤,感測器融合和深度學習。就簡單的講一講,這樣受眾面也會更廣一些。
Tracking
卡爾曼濾波器可能很多人都聽說過,它真的不是過濾咖啡的裝置。它是一個optimal estimate (最優估計)。
什麼時候需要用它呢?
舉個例子,假如你要開車去機場接你的朋友, 你的車上有三種感測器,加速度感測器,速度感測器,以及GPS定位系統。
所有的這些感測器都能幫助你的汽車去尋找自己的位置。然而,這些感測器都有這樣或那樣的優點和缺點,都不完美。加速度感測器和速度儀都能實時更新,但是很容易累計錯誤。GPS可以提供絕對位置,但容易失去信號,雜訊也很大。怎麼辦呢?
此時此刻,卡爾曼老先生髮明了一個優美的演算法,用這個演算法就可以計算最優的汽車位置,即使感測器並不是很靠譜。
下圖首先列出了tracking的精神綱領: 貝葉斯濾波的數學公式。這個公式可以說是我最崇拜的一種看待世界的角度。一切皆隨機。
我們把汽車位置以及所有的觀測都看作是隨機變數,有均值和方差。然後通過貝葉斯公式,可以很容易推導出以下公式,當然我們有一些假設,比如馬爾科夫假設來簡化計算難度。
如果我們此時假設所有變數皆滿足高斯分布,並且所有的運動模型和觀測模型都是線性的,那麼我們就得到了卡爾曼濾波器。此時的update的過程,其實也可以看做是預測和測量的融合。
我們很容易找到卡爾曼濾波的公式,但看起來還是很複雜,到底公式的背後是什麼,如何推導,相信很多人都打了退堂鼓。其實不難,我們可以拿一個1D的例子來說明。
如果都是高斯假設,那麼我們如果按照貝葉斯公式,我們就相當於是將預測分布和測量分布直接相乘,也就是說直接讓兩個高斯密度函數相乘。我們會驚奇的發現,原來高斯乘以高斯,結果不僅僅是高斯,而且他的新的均值和方差竟然都是兩個高斯方差的加權平均,也就是說,其實說白了,就是用各自的方差作為權值,重新更新了一下。然後其實卡爾曼增益不過就是兩個權值的一種比例係數,方便後續計算而已。
So easy!
但是我們又要問了,那如果非高斯非線性,我們怎麼追蹤。呵呵,大師們早都已經解決了這個問題,我最喜歡的莫過於粒子濾波。背後的思想讓我拍手稱絕。
要了解粒子濾波,必須先了解蒙特卡洛方法。當年去摩納哥的蒙特卡洛賭場小玩老虎機,確實好玩又刺激。不過小賭怡情,大賭傷身,就玩了5歐,最後輸完了。
回歸正題,假設你要計算圓周率,你想簡單算,不想太複雜。那麼你可以用筆在紙上畫一個正方形,然後用圓規畫一個四分之一內接圓。接下來就是見證奇蹟的時刻,你抓一把豆子,均勻的撒在紙上矩形區域,並數落在圓形內部的豆子數目,和落在外面的豆子數目。然後你就可以根據豆子數目的比例,簡單的計算出圓周率。是不是很神奇!
同樣的思想用在追蹤問題上,就更不可思議了。你可以用一些樣本點來代替你需要的複雜分布,然後你就不再需要用這個複雜的分布來計算了,只需要這些採樣的樣本點就可以了。無論線性變換還是非線性變換,都很輕易的就可以計算出樣本點的變換,然後通過變換後的樣本點來統計新的均值和方差,就完成了複雜分布的非線性變換過程,夠簡單夠暴力?哈哈,是的。
當然代價就是你要計算每一個樣本點,計算開銷很大。
Multi-sensor fusion
感測器融合這個topic太火了,現在硬體平台上集成了一圈各式各樣的感測器,怎麼博採眾長海納百川,是個問題。
不過都難不倒貝葉斯老先生,在貝葉斯的眼裡,這些都是浮雲。
舉個例子,雷達和紅外攝像機的融合。雷達距離探測的非常準確,但是紅外攝像機方位角很準確,那麼如何結合兩者的優點呢。我們採用融合measurement likelihood方法來做,因為假設兩個感測器都是條件獨立的,意味著感測器並不互相影響。那麼我們只需要簡單的將兩個各自的likelihood的函數相乘,然後我們就會得到新的統一的likelihood function. 神奇的發現,最終的分布函數形狀變的更小更尖了,意味著新的likelihood具有更好的方位角和距離信息了。
是不是很神奇? 針對之前汽車的例子,我們也可以融合GPS, 加速度感測器以及速度感測器一起,做到博採眾長的追蹤。
Deep learning
神經網路已經有年頭了,但都沒有像最近這麼火,無敵了。我記得我第一次接觸是在本科的時候,數模競賽的時候。其實神經網路應該就是一種函數模擬器,只要你組織好input data和output data, 剩下的就交給神經網路去學習吧。當然你也要設計一個優美的loss function來告訴神將網路做人的底線和原則。
神經元是神經網路的基本組成單位,多輸入,單輸出,加一個非線性激活函數,如此簡單。就像樂高玩具一樣,你可以隨意組合你的神經元們,讓他變得更加強大和不可思議。這就是深度神經網路。
目前最熱門的應用還屬CNN, 卷積神經網路。如下圖所示,輸入是交通限速標誌,輸出是限速的具體速度值。當然要用反向傳播演算法來update神經網路里神經元的權重,下面這個圖就非常直觀明了:
另外一個其實應該更有意思的神經網路結構RNN (Recurrent Neural Network), 遞歸神經網路。有記憶的神經網路,因為有feedback的過程,所以很適合做序列數據的預測。之前有很長時間在用它來做tracking,效果一般但覺得很有前途。當然用它可以寫詩,寫音樂,或者寫代碼,以及翻譯等等工作,很像人類的思維方式,這恐怕才是人工智慧的未來。
最後總結一下,人類實在是太聰明了,發明了這麼多神奇的方法來解決問題。還是踏踏實實,謙虛的學習,永遠都在遠行的路上。路漫漫其修遠兮,吾將上下而求索。
推薦閱讀:
※未來自動駕駛汽車長什麼樣?
※自動駕駛行業的「命門」
※中國自動駕駛告別光說不練,完整測試政策將出台
※2018年科技新趨勢解讀與介紹:5G