初探:
NOTE: 該文適合手端咖啡劲妙,在暖和的下午慢慢享用煞烫,語言較為通俗隨性昏滴,更像是一篇故事猴鲫。要了解更多的技術(shù)細(xì)節(jié),可以移步文末的技術(shù)報告與代碼鏈接(https://github.com/huangchaoxing/Vision-based-steering-angle-prediction)谣殊》鞴玻【備好梯子,部分鏈接需要上墻】
最近這一年對端到端的自動駕駛比較感興趣。所謂端到端自動駕駛姻几,就是模型直接通過輸入的圖像或者視頻信息得到汽車駕駛行為的指令(方向盤轉(zhuǎn)角宜狐,油門大小,踩剎車的程度)蛇捌。在 deep learning 時代之前抚恒,許多汽車自動駕駛行為的指令需要通過圖像的預(yù)處理得到一些人工的特征信息進(jìn)而計算得出。其實(shí)络拌,神經(jīng)網(wǎng)絡(luò)直接開車早在1989年就已經(jīng)實(shí)現(xiàn)了俭驮,當(dāng)時的模型很淺而且輸入也是作了簡化的。2016年的時候,英偉達(dá)率先提出了利用CNN(卷積神經(jīng)網(wǎng)絡(luò))直接將車載攝像頭的圖像映射到方向盤轉(zhuǎn)角的方法混萝,這讓整個過程變得省時省力又舒心:)遗遵。 這種自動駕駛行為其實(shí)是一種模仿學(xué)習(xí)(或者叫行為克隆)逸嘀,需要事先收集人類開車時的圖像以及這幅圖所對應(yīng)的方向盤轉(zhuǎn)角车要,然后通過監(jiān)督學(xué)習(xí)學(xué)習(xí)的方法讓CNN去擬合一個從圖像到方向盤轉(zhuǎn)角的映射~ 這樣我們就能隨意逮蝦戶了。
我本人第一次接觸到這個領(lǐng)域完全是出于對GTA V這款游戲的喜愛翼岁。一次偶然的機(jī)會我在Python 博主 sentdex的youtube頻道上看到了一個用分類方法玩GTA 的視頻(基于tensorflow)。后來我自己又如法炮制地用Pytorch制作了一個用CNN分類的方法在GTA V里開飛機(jī)的玩具project司光。這個開飛機(jī)的模型其實(shí)十分簡陋琅坡,唯一能做到的就是讓飛機(jī)在天上別掉下來(當(dāng)然也可以避開高樓,高山和大海哈)飘庄,當(dāng)然還是有一定的娛樂性的脑蠕,畢竟你要先親自玩游戲開飛機(jī)呀。2019年春節(jié)的時候跪削,我在參加澳大利亞機(jī)器人視覺中心的機(jī)器人視覺夏令營時,有一個workshop的環(huán)節(jié)需要訓(xùn)練一個CNN然后把它部署到一個小車上迂求,從而讓小車可以在車道上安全行駛碾盐。這個其實(shí)可以說是英偉達(dá)模型的玩具版本。我們要實(shí)現(xiàn)在車道上遙控開車揩局,然后讓CNN去擬合小車根據(jù)輸入圖像的行為毫玖。在這里放一個鏈接給大家過過眼癮。我訓(xùn)練的模型比較菜(最終比賽成績排名9/13,逃)凌盯,這個效果是來自帝國理工的博士生和田健太郎先生的作品付枫。
真實(shí)世界:
隨著一個男人的成長,他的玩具也會一直變大驰怎。轉(zhuǎn)眼到了做computer vision學(xué)期project的時候了阐滩,我也決定探索一下真實(shí)世界里的開車。2月底的一個下午县忌,我和同學(xué)驅(qū)車到堪培拉Fyshwick入手了RTX2070+9代i5掂榔,折騰正式開始。在端到端駕駛領(lǐng)域症杏,有幾個benchamark的數(shù)據(jù)集:Udacity装获,Comma-ai,dbnet, DeepDrive 等厉颤。我嘗試地在Comma-ai上訓(xùn)練了一下英偉達(dá)的結(jié)構(gòu)穴豫,但發(fā)現(xiàn)這個數(shù)據(jù)集里低速情況和人為的規(guī)劃性故意直角轉(zhuǎn)彎實(shí)在有點(diǎn)多,模型非常難收斂逼友。低速行駛下的行為以及直角轉(zhuǎn)彎等往往會被視作是一種人類提前規(guī)劃的行為精肃,而非單一的被動反應(yīng)秤涩。經(jīng)過幾番權(quán)衡后,我啟用了一個叫SullyChen的數(shù)據(jù)集肋杖。這個數(shù)據(jù)集是由美國學(xué)生SullyChen收集的溉仑。駕駛的地方是洛杉磯的市郊,有著開闊的視野和眾多彎曲的海岸山路(腦海里一片加州陽光的美景状植,這不就是現(xiàn)實(shí)版的GTA V 洛圣都嗎)浊竟。這里總共是兩個數(shù)據(jù)集共10萬余張車載照相機(jī)以20 Hz收集到的圖像以及對應(yīng)的方向盤轉(zhuǎn)角。然而津畸,并不是所有的數(shù)據(jù)都適合拿來進(jìn)行訓(xùn)練和測試的振定。在6萬張的數(shù)據(jù)集中,因?yàn)楫?dāng)中有很長一段的山間停車場小路的兜兜轉(zhuǎn)轉(zhuǎn)(甚至有大角度掉頭)肉拓,我們不得不把這段予以剔除后频。然而,這就導(dǎo)致了整個視頻的不完整暖途,會給后期利用視頻流的訓(xùn)練帶來麻煩卑惜。于是乎我們干脆把這個數(shù)據(jù)集作為測試集的來源,在其中挑選了兩段分別代表城市行駛和盤山公路行駛的視頻片段作為測試集(共33000幀左右)驻售。另外一個擁有四萬多幀的數(shù)據(jù)集名正言順地成為了訓(xùn)練集露久,其中最開始的在地下車庫駛出路面的片段被剔除。至于數(shù)據(jù)增廣欺栗,我們采用的是亮度抖動以模擬路面陽光和陰影的變化毫痕。我們還對圖像實(shí)施了拉伸(壓扁)以凸顯路面的趨勢。
在模型結(jié)構(gòu)上迟几,我們決定采用比較淺的模型消请,畢竟英偉達(dá)的模型也不是很深,幾層足矣类腮‰總的來說是兩塊卷積塊+兩個全連接層。因?yàn)樽詈笠敵鲆粋€方向盤的數(shù)值(回歸問題)存哲,所以最后的輸出個數(shù)設(shè)置為一因宇。自然而然地,損失函數(shù)采用L2范數(shù)祟偷,即prediction和ground-truth的差之平方察滑。首先,我們采取的是單幀輸入得到方向盤輸出的方法修肠。實(shí)際的效果并不算太理想贺辰,方向盤轉(zhuǎn)角誤差可達(dá)20度。其實(shí),人類在真實(shí)開車過程中往往不會一幀一幀地想我需要怎么去操作方向盤饲化,而是會基于一種短期的變化趨勢來決定自己的操作莽鸭。我們抱著試試看看的態(tài)度把三幀的圖像堆疊到了一起并送入神經(jīng)網(wǎng)絡(luò),城市公路上的誤差一下子去到了7點(diǎn)多度吃靠,而山路上的誤差也去到了15度以下硫眨。這證明序列性的信息對開車是很有幫助的!
時光記憶
如何利用時間上的信息來提升模型性能成了我們要考慮的問題巢块。RNN(循環(huán)神經(jīng)網(wǎng)絡(luò))和LSTM(長短時記憶)的名字此時不時回蕩在耳邊礁阁,但梯度累計消失(爆炸),過擬合以及不穩(wěn)定的問題同樣是要考慮的問題族奢。最終姥闭,還是簡單主義占了上風(fēng)。雙流CNN的方法進(jìn)入了我們的視野(如下圖)越走。
所謂雙流CNN,便是使用兩組CNN棚品,一組CNN提取的是RGB信息(普通照片)的特征,而另一組CNN負(fù)責(zé)提取時間信息(通常是光流廊敌,把兩幀之間像素的移動速度投影到圖像空間)中的特征铜跑。最后兩組特征融合在一起并得到要輸出的值。該方法一開始用于視頻動作識別和動作預(yù)測骡澈。相應(yīng)地疼进,在這里我們的RGB流輸入的是三診堆疊的圖像,時間流則是體現(xiàn)三幀之間變化的兩幀光流圖秧廉。
廢話不多說,直接上演示結(jié)果:
https://www.bilibili.com/video/av53174716
好八拣帽,一個學(xué)期下來實(shí)在太累了疼电,細(xì)節(jié)的東西就不寫了。更多的就看項(xiàng)目鏈接里的內(nèi)容吧减拭。我要和朋友開車去新南威爾士州吃飯了(餓)蔽豺。