今天在 Tensorflow公號(hào)看到推文Pixelopolis:由 TensorFlow Lite 構(gòu)建無(wú)人駕駛微型汽車(chē) ,作者介紹了他們?cè)诮衲闓oogle I/O大會(huì)上展示的TensorFlot Lite構(gòu)建的無(wú)人駕駛微型汽車(chē)的展品:Pixcelopolis。

▲ TensorFlow Lite構(gòu)建的無(wú)人駕駛微型車(chē)
每輛微型汽車(chē)都裝配有一部 Pixel 手機(jī),使用手機(jī)上的攝像頭檢測(cè)和理解周?chē)男盘?hào)。手機(jī)使用了 Pixel Neural Core 邊緣計(jì)算芯片( Edge TPU 支持的機(jī)器學(xué)習(xí)),可感應(yīng)車(chē)道、避免碰撞和讀取交通標(biāo)志。
相比于基于云計(jì)算來(lái)實(shí)現(xiàn)視頻處理和物體檢測(cè),邊緣計(jì)算可以減少延遲對(duì)控制的影響(也許在5G下延遲影響小一點(diǎn))。

▲ 通過(guò)手機(jī)識(shí)別各種目標(biāo)的Pixelpolis
下圖是整個(gè)展品的布局,模仿了一個(gè)小型城鎮(zhèn)廣場(chǎng)周?chē)慕煌ōh(huán)境。參觀者可以通過(guò)手機(jī)端的一個(gè)應(yīng)用模擬“站點(diǎn)”來(lái)選擇出現(xiàn)的目的地。展品中的微型車(chē)就可以駕駛到目的地,整個(gè)過(guò)程用戶可以查看車(chē)輛周?chē)约八鶛z測(cè)到的物體。

▲ 演示區(qū)的道路設(shè)計(jì)
車(chē)模所有對(duì)外界的感知都來(lái)自于微型車(chē)膜前面的手機(jī)攝像頭,有它獲取前方的圖片并手機(jī)內(nèi)部署的神經(jīng)網(wǎng)絡(luò)完成車(chē)道保持、停車(chē)定位、障礙檢測(cè)等。通過(guò)手機(jī)底部的USB-C接口擴(kuò)展來(lái)與底層控制板通訊,完成電機(jī)控制等。

▲ 手機(jī)應(yīng)用程序與Pixelopolis交互

▲ 手機(jī)端可以查看車(chē)輛周?chē)鶛z測(cè)到的物品
展品作者采取了與 論文:End-to-end Learning for Self-Driving Cars中相類似的技術(shù)錄像,使用卷積神經(jīng)網(wǎng)絡(luò)(CNN)來(lái)檢測(cè)每幀圖像內(nèi)的交通指示線,并給出方向盤(pán)的調(diào)整量。增加了LSTM利用前期拍攝的多個(gè)圖像幀進(jìn)行改進(jìn)。

▲ CNN 模型的輸入和輸出
控制器的模型很簡(jiǎn)單,下面代碼就給出了網(wǎng)絡(luò)的結(jié)構(gòu)構(gòu)成。
net_in = Input(shape = (80, 120, 3))
x = Lambda(lambda x: x/127.5 - 1.0)(net_in)
x = Conv2D(24, (5, 5), strides=(2, 2),padding="same", activation='elu')(x)
x = Conv2D(36, (5, 5), strides=(2, 2),padding="same", activation='elu')(x)
x = Conv2D(48, (5, 5), strides=(2, 2),padding="same", activation='elu')(x)
x = Conv2D(64, (3, 3), padding="same",activation='elu')(x)
x = Conv2D(64, (3, 3), padding="same",activation='elu')(x)
x = Dropout(0.3)(x)
x = Flatten()(x)
x = Dense(100, activation='elu')(x)
x = Dense(50, activation='elu')(x)
x = Dense(10, activation='elu')(x)
net_out = Dense(1, name='net_out')(x)
model = Model(inputs=net_in, outputs=net_out)
一個(gè)神經(jīng)網(wǎng)絡(luò)是否能夠達(dá)到很好的性能,關(guān)鍵在于如何準(zhǔn)備好讓它學(xué)習(xí)的訓(xùn)練樣本。為此。作者使用Unity, Udacity來(lái)構(gòu)建了模擬器,自動(dòng)生成訓(xùn)練車(chē)輛的圖像數(shù)據(jù)。
通過(guò)在軌道上設(shè)置多個(gè)路徑點(diǎn), 微型汽車(chē) 可以行駛到不同的地點(diǎn),并從中收集數(shù)據(jù)。在此模擬器中,我們每 50 毫秒收集一次圖像數(shù)據(jù)和轉(zhuǎn)角數(shù)據(jù)。

▲ 模擬器中的軌道中上設(shè)有多個(gè)路徑點(diǎn)
大家都知道,軟件虛擬出的場(chǎng)景圖片和實(shí)際拍攝到的圖片會(huì)有很大的差別,包括光線、周?chē)h(huán)境以及其他的噪聲。為了使得訓(xùn)練的神經(jīng)網(wǎng)絡(luò)能夠適應(yīng)實(shí)際要求,需要對(duì)數(shù)據(jù)進(jìn)行增強(qiáng)。
他們將以下變量添加到場(chǎng)景中:隨機(jī)的 HDRI 球體(具有不同的旋轉(zhuǎn)模式和曝光值)、隨機(jī)的環(huán)境亮度和顏色以及隨機(jī)出現(xiàn)的車(chē)輛。

▲ 各種環(huán)境下的數(shù)據(jù)增強(qiáng)
下圖給出了經(jīng)過(guò)訓(xùn)練之后,卷積神經(jīng)網(wǎng)絡(luò)的第一層對(duì)于輸入圖片的輸出。可以看出,它已經(jīng)能夠很好地將圖片中道路信息邊緣信息能夠很好的提取,對(duì)于背景可以進(jìn)行有效的壓制。

▲ 第一層神經(jīng)網(wǎng)絡(luò)的輸出
使用神經(jīng)網(wǎng)絡(luò)進(jìn)行控制的一個(gè)最大的問(wèn)題,就是車(chē)模有時(shí)會(huì)出現(xiàn)莫名其妙的動(dòng)作。比如下面這個(gè)場(chǎng)景,明明已經(jīng)成功的拐過(guò)彎道,進(jìn)入平坦順直的道路,車(chē)模則抽風(fēng)地沖出跑道了。
這主要是因?yàn)樗?xùn)練的樣本沒(méi)有能夠均勻包含各種道路情況,模型比較脆弱。

▲ 早期版本中玩具車(chē)偏離了軌道
為此,在場(chǎng)景中添加了各種形狀的曲線,以豐富原來(lái)訓(xùn)練數(shù)據(jù)庫(kù)中大多數(shù)的直線軌道數(shù)據(jù)。

▲ (左)方形軌道與(右)彎曲軌道
功夫不負(fù)有心人,修正數(shù)據(jù)集不均衡的問(wèn)題后,車(chē)輛便開(kāi)始能夠在彎道處正確轉(zhuǎn)向。

▲ 車(chē)輛在彎道可以成功轉(zhuǎn)彎
似乎理性的增加數(shù)據(jù)可以提高車(chē)模的性能,但有時(shí)候僅僅采用小的技巧便可以解決大問(wèn)題。比如當(dāng)微型車(chē)模運(yùn)行到展品邊緣時(shí),就會(huì)看到很多展臺(tái)外面的場(chǎng)景。外面的場(chǎng)景多變,很難通過(guò)數(shù)據(jù)來(lái)表征這些變化。怎么辦?
作者就用了一個(gè)字:切!
將輸入圖像的下面四分之一切出來(lái),送入神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,就有效化解了上述的問(wèn)題。

▲ 展品上的軌道,以及在展品邊緣看到的圖像
為了能夠進(jìn)行車(chē)輛定位以及檢測(cè)其它干擾車(chē)輛,在手機(jī)Pixcel 4上的Neural Core Edge TPU上運(yùn)行了 ssd_mobilenet_edgetpu 模型,這是來(lái)自 TensorFlow 目標(biāo)檢測(cè)模型庫(kù) 。每幀檢測(cè)時(shí)間僅用6.6毫秒,在實(shí)時(shí)應(yīng)用中游刃有余。
為了是檢測(cè)神經(jīng)網(wǎng)絡(luò)模型能夠適應(yīng)展品場(chǎng)景需要,作者同樣使用了模擬器和真實(shí)場(chǎng)景中的數(shù)據(jù)來(lái)訓(xùn)練模型。為了提高檢測(cè)魯棒性,使用了 Unreal Engine 4 來(lái)隨機(jī)生成物體和背景。使用 labelImg 工具進(jìn)行對(duì)樣本進(jìn)行了手動(dòng)標(biāo)注。

▲ 進(jìn)行目標(biāo)識(shí)別的數(shù)據(jù)庫(kù)
使用神經(jīng)網(wǎng)絡(luò)最大的工作量是在準(zhǔn)備訓(xùn)練數(shù)據(jù)集合。之后的網(wǎng)絡(luò)搭建和訓(xùn)練則非常容易,分分鐘搞定。檢查一下,網(wǎng)絡(luò)識(shí)別交通標(biāo)志的效果還是很不錯(cuò)的。

▲ 網(wǎng)絡(luò)識(shí)別效果
最后一個(gè)工作,就是需要將網(wǎng)絡(luò)部署到手機(jī)平臺(tái)上。這需要借助于TensorFlow Lite 將模型進(jìn)行個(gè)數(shù)轉(zhuǎn)換,并在Android下編寫(xiě)相應(yīng)的Python腳本來(lái)進(jìn)行部署。
作者還設(shè)想著,通過(guò)視覺(jué)SLAM能夠?yàn)樗麄兊倪@個(gè)展品增加車(chē)輛全程定位。真的是一個(gè)手機(jī)平臺(tái)可以練習(xí)很多算法。

▲ 視覺(jué)SLAM定位
為了實(shí)現(xiàn)一個(gè)頂著手機(jī)運(yùn)行的微型車(chē)膜,作者也是費(fèi)力不斷改進(jìn)機(jī)械結(jié)構(gòu),經(jīng)過(guò)了五代設(shè)計(jì)最終得到了一個(gè)合理的機(jī)械設(shè)計(jì)。可以將手機(jī)、控制板、電池、電機(jī)等集成在一個(gè)小巧乖致的微型車(chē)模中。

▲ 第一代設(shè)計(jì)

▲ 第二代設(shè)計(jì)

▲ 第三代射擊

▲ 第四代設(shè)計(jì)

▲ 第五代設(shè)計(jì)
下面給出了嵌入在車(chē)體內(nèi)部的控制板、電機(jī)、電池等配件。

▲ 底層運(yùn)動(dòng)控制單片機(jī)板

▲ (左)屏蔽罩和電機(jī),(右)電源插座、電源開(kāi)關(guān)、電機(jī)啟動(dòng)按鈕、電機(jī)重置按鈕、開(kāi)發(fā)板狀態(tài) LED、電機(jī)狀態(tài) LED

▲ 3000mAh 鋰離子電池(左)與 18650 鋰離子電池(右)
的確,一輛小小的微型車(chē)模,包括了計(jì)算機(jī)視覺(jué)、深度學(xué)習(xí)、傳感器融合、定位、路徑規(guī)劃、控制、系統(tǒng)集成等多個(gè)學(xué)科內(nèi)容。通過(guò)這個(gè)環(huán)節(jié)幾乎可以將一個(gè)專業(yè)所需要學(xué)習(xí)的多個(gè)課程集成在一起。這不,在Udacity平臺(tái)上,還真的提供了 無(wú)人駕駛汽車(chē)納米學(xué)位項(xiàng)目 供希望獲得全面培訓(xùn)的工程師和學(xué)生學(xué)習(xí)。
今天下午,教育部自動(dòng)化類高等教學(xué)委員會(huì)在清華召開(kāi)了院長(zhǎng)會(huì)議,其中李少遠(yuǎn)老師對(duì)今年大學(xué)生學(xué)科競(jìng)賽實(shí)踐教學(xué)進(jìn)行了總結(jié)。以在剛剛過(guò)去的暑期中,新冠疫情影響下,成功舉辦的全國(guó)大學(xué)生智能車(chē)競(jìng)賽為例,探索面向未來(lái)實(shí)踐發(fā)展。希望智能車(chē)競(jìng)賽為工科學(xué)生的大學(xué)期間專業(yè)課程實(shí)踐提供更好的鍛煉平臺(tái)。