簡介
Michal Nand[1] 在網(wǎng)站 HACKADAY.IO 上通過博文 Motoku Uprising ?Deep Neural Network 介紹了他利用卷積神經(jīng)網(wǎng)絡(luò)來幫助控制巡線智能車更加平穩(wěn)快速運(yùn)行的技術(shù)方案。特別是對神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)、訓(xùn)練、部署等方面進(jìn)行了詳細(xì)的介紹。
智能車的任務(wù)相對比較簡單,就是在平面賽道上,沿著彩色導(dǎo)引線(大部分是黑色)從出發(fā)點(diǎn)運(yùn)行到終點(diǎn)并折返到出發(fā)點(diǎn)。其中賽道上一段有一塊磚頭作為障礙物。
▲ 利用神經(jīng)網(wǎng)絡(luò)控制的巡線智能車
在作者的方案中,智能車運(yùn)行大部分控制算法都采用了常規(guī)的 PID、邏輯判斷都算法。他使用了 CNN 根據(jù)車模運(yùn)行過程中,通過傳感器搜集到的二維路面數(shù)據(jù)來對賽道的種類進(jìn)行分類判斷,并通過調(diào)整車模速度來適應(yīng)不同賽道的情況,達(dá)到又快又穩(wěn)的目的。
□ 機(jī)械結(jié)構(gòu)
1. 硬件構(gòu)成
這款智能車的硬件配置包括有:
嵌入式控制器:STM32F303,Cortex M4F 72MHz
電機(jī)驅(qū)動器:使用了 TI DRV8834 低電壓雙相步進(jìn)電機(jī)驅(qū)動器
電機(jī)型號:Pololu HP 電機(jī),減速齒輪箱 1:30,帶有磁編碼器
輪胎:Poloku 28mm 的輪胎,高黏著力
慣性導(dǎo)航器件:LSM6DS0
巡線傳感器:八個綠光(540nm)光電傳感器,三個紅外障礙日干起
電源:180mAh, LiPol 2S
編程結(jié)構(gòu):使用 USB 通過 Bootloader 完成程序下載。
▲ 智能車的硬件構(gòu)成
2. 組成器件
□ 控制算法
1. 控制調(diào)試界面
“磨刀不誤砍柴工”。作者還是利用 OPENGL 開發(fā)了用于調(diào)試的應(yīng)用軟件??梢酝ㄟ^界面:
顯示八個巡線光電傳感器的原始數(shù)值
顯示電機(jī)的狀態(tài):速度、編碼器值
顯示慣性傳感器的狀態(tài);
顯示神經(jīng)網(wǎng)絡(luò)分類處理過程
顯示通過串口獲得的 原始數(shù)據(jù)
▲ 編程調(diào)試界面
2. 智能車控制軟件要點(diǎn)
智能車軟件的主要的功能和指標(biāo)為:
通過二次插值算法,通過八個光電傳感器獲得更加精確的賽道到引線位置
主程序控制頻率為:200Hz
方向調(diào)節(jié)器:采用 PD 進(jìn)行方向控制
電機(jī)速度控制:采用雙串級 PID 控制完成電機(jī)速度控制
對賽道到引線預(yù)測:在直線賽道加速前行;在曲線拐彎時剎車慢行;通過深度神經(jīng)網(wǎng)絡(luò)進(jìn)行賽道識別和控制
控制軟件使用 C++編程
神經(jīng)網(wǎng)絡(luò)訓(xùn)練:采用 GPU 加速網(wǎng)絡(luò)訓(xùn)練
▲ 智能車的軟件控制框架
3. 神經(jīng)網(wǎng)絡(luò)用于引導(dǎo)線的預(yù)測
利用深度卷積神經(jīng)網(wǎng)絡(luò)完成對導(dǎo)引線的預(yù)測和分類:
根據(jù)導(dǎo)引線的種類控制運(yùn)行速度:直線時快速通過,曲線時減速慢行
使用 DenseNet:稠密連接卷積神經(jīng)網(wǎng)絡(luò)完成對賽道引導(dǎo)線類型的分類
輸入數(shù)據(jù)為 8×8 傳感器數(shù)據(jù)矩陣??偣灿邪藗€配列成直線的光電傳感器,使用運(yùn)行前后相鄰八條數(shù)據(jù)組成 8×8 的數(shù)據(jù)矩陣
輸出物種曲線類型:兩種右拐,兩種左拐,一種直線
▲ 神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)圖
訓(xùn)練樣本采用人工生成的仿真數(shù)據(jù)訓(xùn)練神經(jīng)網(wǎng)絡(luò):
訓(xùn)練樣本的個數(shù):25000
測試樣本的個數(shù):5000
數(shù)據(jù)增強(qiáng):Luma 噪聲, White 噪聲
▲ 輸入訓(xùn)練數(shù)據(jù)樣本
下圖給出了 DenseNet 的網(wǎng)絡(luò)結(jié)構(gòu)。由于是部署在單片機(jī) STM303 中允許,作者在網(wǎng)絡(luò)的魯棒性以及運(yùn)行速度方面進(jìn)行了權(quán)衡。網(wǎng)絡(luò)運(yùn)行頻率為 200Hz,所以網(wǎng)絡(luò)執(zhí)行時間必須小于 5 毫秒。為了達(dá)到這個目的,作者選擇了 DenseNet 來提高計算效率,它比純卷積神經(jīng)網(wǎng)絡(luò)使用更少的卷積核。
▲ 神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)
最終網(wǎng)絡(luò)的識別準(zhǔn)確率達(dá)到了 95% 的精度。
4. 網(wǎng)絡(luò)最終結(jié)構(gòu)
CNN 神經(jīng)網(wǎng)絡(luò)的結(jié)果參數(shù)如下:
?
▲ 神經(jīng)網(wǎng)絡(luò)的各層結(jié)構(gòu)參數(shù)
5. 將網(wǎng)絡(luò)部署到單片機(jī)中
為了能夠在 32 位單片機(jī)中執(zhí)行神經(jīng)網(wǎng)絡(luò),對網(wǎng)絡(luò)進(jìn)行了如下的改動:
將所有的浮點(diǎn)數(shù)修改成 int8_t
將尺度權(quán)重轉(zhuǎn)換到 8bit 范圍
使用雙緩存技巧節(jié)省內(nèi)容,公用兩個內(nèi)存緩存來計算所有層的數(shù)據(jù)
▲ 雙內(nèi)存緩存的模式
※ 結(jié)論
通過本文作者介紹的車??刂浦械?CNN 網(wǎng)絡(luò)的應(yīng)用,了解了對于嵌入式單片機(jī)中使用神經(jīng)網(wǎng)絡(luò)的一般方法。
本文中的神經(jīng)網(wǎng)絡(luò)應(yīng)用還屬于輔助控制方面。也許通過部署更加強(qiáng)大算力的單片機(jī),使用更加復(fù)雜的算法可以完成智能車自主學(xué)習(xí)的目標(biāo)。這方面也為今年全國大學(xué)生智能汽車競賽中的 AI 電磁組給出了一定的參考意義。
參考資料
[1]Michal Nand: https://hackaday.io/michalkenshin