人工智能創(chuàng)意賽(國賽)-重慶郵電大學(xué)
本人完全了解第十五屆全國大學(xué)生智能汽車競賽關(guān)保留、使用技術(shù)報(bào)告和研究論文的規(guī)定,即: 參賽作品著作權(quán)歸參賽者本人,比賽組委會和贊助公司可以在相關(guān)主頁上收錄并公開參賽作品的設(shè)計(jì)方案、技術(shù)報(bào)告以及參賽模型車的視頻、圖像資料,并將相關(guān)內(nèi)容編纂收錄在組委會出版論文集中。
第1章 方案概述
1.1 系統(tǒng)概述
隨著互聯(lián)網(wǎng)的發(fā)展和技術(shù)進(jìn)步,深度學(xué)習(xí)技術(shù)已經(jīng)逐漸走進(jìn)我們生活,美顏?zhàn)耘?、人臉識別、自動駕駛、語音識別、自然語言處理等新技術(shù)深刻地改變了人類衣食住行各個(gè)方面。其中自動駕駛領(lǐng)域正是處于飛速發(fā)展的上升期,定將搭上5G的“快車”更加深刻全面地改變我們的生活。
深度學(xué)習(xí)的歷史淵源可以追溯到1943年,Warren McCulloch和Walter Pitts搭建出第一個(gè)神經(jīng)網(wǎng)絡(luò),并且明確了數(shù)學(xué)原理和算法結(jié)構(gòu)。但“深度學(xué)習(xí)”一詞直到2000年才和世人見面。還要?dú)w功于Geoffrey Hinton和RuslanSalakhutdinov在論文中揭示了了如何一次訓(xùn)練多層神經(jīng)網(wǎng)絡(luò)。
2012年,Google的算法已經(jīng)具備了識別貓的能力。2014年,谷歌從英國收購了人工智能初創(chuàng)公司DeepMind。2017年,谷歌DeepMind的算法AlphaGo掌握了復(fù)雜的圍棋游戲,并打敗棋手柯潔。Yolo、Resnet、VGG、GoogleNet等經(jīng)典網(wǎng)絡(luò)相繼問世。至此深度學(xué)習(xí)已經(jīng)在歷史的舞臺上粉墨登場。
▲ 圖1.1 深度學(xué)習(xí)在自動駕駛中的使用
深度學(xué)習(xí)智能車以官方統(tǒng)一提供的車模為硬件平臺,通過python編程語言,以開源框架百度飛槳 paddlepaddle作為軟件開發(fā)平臺,自主進(jìn)行對賽道數(shù)據(jù)的采集以及處理,采用卷積神經(jīng)網(wǎng)絡(luò)算法CNN構(gòu)建數(shù)據(jù)模型,并在基干深度學(xué)習(xí)平臺飛槳的一站式 AI 開發(fā)平臺AI Studio上進(jìn)行模型訓(xùn)練,最終使智能車實(shí)現(xiàn)對道路和交通標(biāo)志的識別。智能車的硬件系統(tǒng)以基于百度Edgeboard系列的高性能板卡作為主處理器,由帶編碼器差速底盤、直流電機(jī)、攝像頭等組成,在此硬件基礎(chǔ)上,要使智能車能自主移動并實(shí)現(xiàn)對交通標(biāo)志物的識別,則需要分別對車道線和標(biāo)志物進(jìn)行檢測和模型的搭建,通過手柄控制智能車前進(jìn)并通過攝像頭采集數(shù)據(jù)到板卡上并通過PC端傳回的模型對采集到的數(shù)據(jù)進(jìn)行推理,得到速度指令和轉(zhuǎn)向指令,使之完成任務(wù),實(shí)現(xiàn)路線如圖1.2所示。
▲ 圖1.2 系統(tǒng)實(shí)現(xiàn)路徑
在收集數(shù)據(jù)的階段,首先對攝像頭采集的圖像數(shù)據(jù)進(jìn)行了特殊的處理,以便于模型在訓(xùn)練過程中能夠提取更優(yōu)質(zhì)的特征,進(jìn)而更好的收斂。對于車道線、路標(biāo),我們都進(jìn)行了一系列的形態(tài)學(xué)操作,提高了訓(xùn)練集的質(zhì)量,從而達(dá)到更好的訓(xùn)練效果。
在目標(biāo)檢測階段,使用yolov3-tiny[20]、ssd-lite[22]、Fast Rcnn[21]三種目標(biāo)檢測網(wǎng)絡(luò)對智能車任務(wù)進(jìn)行測試,發(fā)現(xiàn)在各項(xiàng)比賽中表現(xiàn)優(yōu)異的二階段目標(biāo)檢測網(wǎng)絡(luò)FastRcnn在FPGA平臺上雖然準(zhǔn)確性較高,但是對單幀圖像的處理時(shí)間過長,不適合本次智能車的任務(wù),所以我們主要對一階段目標(biāo)檢測網(wǎng)絡(luò)yolov3-tiny和ssd-lite進(jìn)行了對比,在特征提取網(wǎng)絡(luò)相同的情況下,yolov3-tiny的性能優(yōu)于ssd-lite,最后我們采用了模型更輕量、速度更快的yolov3-tiny并對其進(jìn)行了人為的修改,并在網(wǎng)絡(luò)中引入cbam-block[10]、SE-block[9]等注意力機(jī)制來提升識別效果、并希望在速度和準(zhǔn)確性之間獲得一個(gè)平衡,平衡智能車在保持準(zhǔn)確性的前提下以更快的速度行駛。
在模型的深度層面,進(jìn)行了相關(guān)的實(shí)驗(yàn)來探究網(wǎng)絡(luò)深度帶來的精度提升的邊際效益遞減效應(yīng),逐漸地加深網(wǎng)絡(luò)直到精度滿足要求。因此智能車可以發(fā)揮出更好的性能。并且通過研究智能車的結(jié)構(gòu)和底層功能,采用修改自動運(yùn)行的代碼、設(shè)置采樣時(shí)的幀數(shù)、分辨率、等手段,嘗試去減小實(shí)驗(yàn)情況和部署情況的差異。與此同時(shí),許多的實(shí)際問題也達(dá)到了解決,比如各個(gè)標(biāo)志物的含義以及當(dāng)標(biāo)志物在不同位置時(shí)的反應(yīng)、紅綠燈的位置、加減速問題等。
▲ 圖1.3 總流程圖
第2章 問題描述
2.1數(shù)據(jù)的預(yù)處理
2.1.1光照強(qiáng)度對模型識別的影響
對于收集到的圖像,進(jìn)行自適應(yīng)二值化處理時(shí),但由于光照強(qiáng)度不同,得到的部分圖像存在著問題,賽道的部分軌跡由于光照而導(dǎo)致二值化圖像出現(xiàn)部分缺失,針對此現(xiàn)象對灰度圖像進(jìn)行處理。首先計(jì)算出亮度矩陣,將亮度矩陣與灰度圖進(jìn)行逐元素相乘,來削弱局部亮度,再進(jìn)行二值化處理,進(jìn)而在二值化圖像中保留全部賽道軌跡。
2.2 深度學(xué)習(xí)模型優(yōu)化與指令設(shè)定
從LeNet[23]到 Efficientnet[11],卷積神經(jīng)網(wǎng)路不斷刷新著識別性能和處理實(shí)際問題的能力,卷積神經(jīng)網(wǎng)絡(luò)已經(jīng)成為當(dāng)今圖像處理領(lǐng)域性能最為優(yōu)異的深度學(xué)習(xí)
模型,它能夠?qū)D像轉(zhuǎn)化為任意維度的向量,通過此思想,希望通過大量的數(shù)據(jù),將模型訓(xùn)練為具有對智能車的行駛具有指導(dǎo)意義的向量。對于智能車接收到的是圖片,輸出的是控制智能車的指令,因此可以通過神經(jīng)網(wǎng)絡(luò)的特性連接起輸入和輸出,可以通過訓(xùn)練自設(shè)計(jì)的卷積神經(jīng)網(wǎng)絡(luò)來訓(xùn)練出符合場景要求的神經(jīng)網(wǎng)絡(luò)。
2.2.1 特征提取網(wǎng)絡(luò)結(jié)構(gòu)
從 2012 年 Lenet[23]問世開始,人們便開始不斷探尋新的網(wǎng)絡(luò)結(jié)構(gòu),AlexNet[24]的出現(xiàn)進(jìn)一步證明了卷積神經(jīng)網(wǎng)絡(luò)的可行性,Vggnet[25]更是以卷積池化為基礎(chǔ)模塊,嘗試更深的深度,inception 系列[2,3,4,5,6]借鑒 Network in Network[1]的思想,著眼網(wǎng)路結(jié)構(gòu)的寬度,使用更少的計(jì)算資源,達(dá)到了更佳的計(jì)算效果,不同的版本提出了不同的網(wǎng)絡(luò)優(yōu)化方法,v2[3]提出了 batch normalization 的標(biāo)準(zhǔn)化方法稱為沿用至今的緩解網(wǎng)絡(luò)梯度消失的方法,v3[4]采用了深度可分離卷積同樣說明了新模塊對經(jīng)典網(wǎng)絡(luò)的改進(jìn)作用。Resnet 更是提出了殘差連接結(jié)構(gòu),解決了深層 cnn的梯度消失問題,以更深的結(jié)構(gòu)提取了更加優(yōu)質(zhì)的特征,自 resnet[7]之后的卷積神經(jīng)網(wǎng)絡(luò)的識別性能已經(jīng)超過了人類。但是我們并沒有停止對更加優(yōu)秀的網(wǎng)絡(luò)結(jié)構(gòu)的探索,Nasnet 結(jié)合強(qiáng)化學(xué)習(xí)的方法,人為限定搜索空間,嘗試使用神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)出最優(yōu)的網(wǎng)絡(luò)結(jié)構(gòu),mobilenet 系列[14,15,16,17]又嘗試以為微小的精度損失為代價(jià),換來更多的性能提升,使用了深度可分離卷積 bottleneck 等更加有效率的結(jié)構(gòu),來節(jié)省參數(shù)并能夠加速模型的推斷過程。這期間注意力機(jī)制的提出更是激發(fā)了人們對特征圖進(jìn)行深入研究的興趣,從 se-block[9]到 cbam-block[10],注意力機(jī)制正不斷地完善,最后 efficientnet[11]又對模型的深度、寬度、分辨率三個(gè)維度進(jìn)行了平衡,得到了非常優(yōu)質(zhì)的模型。
對 cnn 有了一定理解之后希望跟據(jù)實(shí)際需求來設(shè)計(jì)出符合需要的神經(jīng)網(wǎng)絡(luò),由于任務(wù)是讓智能車自行行駛在賽道上,所以對速度有很高要求,我們第一個(gè)想到的是與 mobilenet[14]類似的模型,來保證速度的同時(shí)獲得更高的精度。我們借鑒了 mobilenet 系列結(jié)構(gòu)[14,15,16,17]的思想,在網(wǎng)絡(luò)中大量使用了 mobilenext[17]網(wǎng)絡(luò)中大量出現(xiàn)的 sandglass-block 的結(jié)構(gòu),該模塊采用了殘差結(jié)構(gòu),殘差邊(residual path)中輸入的特征圖經(jīng)過深度可分離卷積對特征圖進(jìn)行降維得到 bottleneck,再利用 1*1 卷積和深度卷積對 bottleneck 進(jìn)行升維,并與恒等映射(identity mapping)相加,詳細(xì)結(jié)構(gòu)見圖 2.1 所示。我們在此模塊中引入 cbam-block[10],sandglass-block 是在 mobilenext[17]中被提出的,希望在模塊中的 bottleneck 中提取更加優(yōu)質(zhì)的特征,我們提出了自主研發(fā)的自適應(yīng)注意力 cbam 模塊,在原有的 cbam 模塊的基礎(chǔ)之上,在激活函數(shù)之前加入了 batch-normalization(bn)[3]層,這樣使得自適應(yīng) cbam 模塊在加到原有的 cnn 中的時(shí)候能夠保持原有的特征,而不受權(quán)重隨機(jī)初始化的影響。激活函數(shù)上我們采用了 h-sigmoid、ReLU6 來使得計(jì)算過程更加簡便以提高單位時(shí)間內(nèi)智能車識別圖像的張數(shù)。我們通過堆疊 sandglass-block來構(gòu)建基礎(chǔ)結(jié)構(gòu)最后采用全局平均池化代替全連接層,這樣的做法減少了大量的參數(shù),使得我們?nèi)磕P痛笮∽罱K維持在 5.2M 左右。
▲ 圖 2.1 sandglass-block 模塊
特征圖輸入 block 后先進(jìn)行深度卷積,再進(jìn)行 11 降維形成 bottleneck,接下來通過 11 卷積進(jìn)行升維,再進(jìn)行深度卷積,并且與殘差邊相加。
2.2.2 標(biāo)簽設(shè)置
標(biāo)簽的設(shè)置決定了模型學(xué)習(xí)的方向,顯然更希望模型能夠?qū)W習(xí)出不同形況下轉(zhuǎn)彎的"程度",所以放棄了傳統(tǒng)的 one-hot 標(biāo)簽,并且將本次任務(wù)轉(zhuǎn)化為回歸任務(wù),根據(jù)觀察發(fā)現(xiàn)智能車平穩(wěn)前進(jìn)的數(shù)值指令是 1500,對此結(jié)果進(jìn)行了縮放,對平穩(wěn)前進(jìn)、左轉(zhuǎn)、右轉(zhuǎn)的指令進(jìn)行轉(zhuǎn)換,編碼為 0 到 1 之間的小數(shù),方便神經(jīng)網(wǎng)絡(luò)進(jìn)行預(yù)測,得到預(yù)測結(jié)果后再進(jìn)行解碼,之后傳給智能車。
2.2.3 指令設(shè)定
通過給定的代碼得知 encode 過程是(數(shù)值指令-500/2000),但是 decode 過程卻是(數(shù)值指令*600+1200),這樣做不符合直覺,于是將 decode 過程改回了(數(shù)值指令-500/2000),我們也找到了速度的指令,并且跟據(jù)標(biāo)識牌來對應(yīng)速度的變化。
2.3 指令系統(tǒng)與執(zhí)行原則
2.3.1 標(biāo)志物作用范圍的標(biāo)定
通過對不同距離對識別到的標(biāo)識進(jìn)行調(diào)整測試后發(fā)現(xiàn),在較遠(yuǎn)處檢測出圖標(biāo)并且遵循圖標(biāo)的指令并不是所期望的結(jié)果(例如在斑馬線前停車的場景,智能車不應(yīng)該一檢測到遠(yuǎn)處的斑馬線就立即停下來),于是設(shè)定了 boundingbox 的左上角坐標(biāo)和圖像底邊中心線的歐式距離的閾值來保證只有識別出的圖標(biāo)與智能車在有效距離內(nèi)才會被執(zhí)行。
2.3.2 多標(biāo)志物同時(shí)出現(xiàn)的處理
注意到一張圖片中可能標(biāo)有多個(gè)標(biāo)志物,這時(shí)智能車將跟隨哪一個(gè)標(biāo)志物的指示將成為一個(gè)值得商榷的問題,首先嘗試使用類別得分大小來確定應(yīng)該遵從的標(biāo)志,但是類別得分只能表示網(wǎng)絡(luò)對標(biāo)志的識別結(jié)果的確定程度,并不說明該標(biāo)志是智能車該遵從的。對于這種情況,優(yōu)化并采取了以下的策略,找到圖像的下邊緣的中心點(diǎn),對于檢測到的 boundingbox 找到 boundingbox 的左上角的坐標(biāo),并計(jì)算該坐標(biāo)與圖像下邊緣的中心點(diǎn)的歐式距離。選擇距離最小的 boundingbox中的圖標(biāo)來遵循。這樣就解決了多圖標(biāo)問題。
2.3.3 網(wǎng)絡(luò)功能的合并
在實(shí)驗(yàn)中發(fā)現(xiàn)無論是圖像的識別任務(wù)還是檢測任務(wù),都需要對原始圖像進(jìn)行特征提取,得到優(yōu)質(zhì)的 feature map,于是決定在 Yolov3 tiny 中增加回歸分支來對檢測到的車道線進(jìn)行處理,并且將 yolov3 tiny 默認(rèn)的 darknet 特征提取網(wǎng)絡(luò)更改為 mobilenext 特征提取網(wǎng)絡(luò),這樣一來得到的 feature map 可以進(jìn)行兩個(gè)任務(wù),而不是每個(gè)任務(wù)分別提取一次 feature map。如圖 2.2 所示,我們在 yolo v3 tiny[20]中加入了新的分支結(jié)構(gòu)來來對車道線圖像進(jìn)行回歸預(yù)測。
▲ 圖 2.2 加入分支結(jié)構(gòu)的 yolov3 tiny
2.3.4 分支指令的相互影響
由于網(wǎng)絡(luò)結(jié)構(gòu)有兩條分支,都能夠用來發(fā)送指令,所以智能車在同時(shí)遇到轉(zhuǎn)彎標(biāo)識和 T 字路口的時(shí)候,會不斷收到相反的指令,是因?yàn)?T 字路口的彎道處,智能車習(xí)慣性的向右轉(zhuǎn),而標(biāo)志牌指示智能車向左轉(zhuǎn),并且兩個(gè)分支向智能車傳遞指令的速度有時(shí)差,智能車不斷收到相反的指令便會在不斷地左轉(zhuǎn)右轉(zhuǎn)中慢慢前進(jìn),等到視野中不見了標(biāo)識牌,標(biāo)志物檢測的分支便不再提供指令給智能車,智能車便會繼續(xù)右轉(zhuǎn)。我們針對這種情況想到了解決方案:當(dāng)智能車檢測到標(biāo)志物時(shí),暫時(shí)關(guān)閉圖像識別分支,只保留目標(biāo)檢測的分支。這樣智能車就不會受到噪音信號的干擾。并且準(zhǔn)確地識別標(biāo)志物。
第3章 技術(shù)方案
3.1 硬件架構(gòu)
深度學(xué)習(xí)智能車的硬件架構(gòu)簡單可靠,清晰可懂如圖 3.1 所示。其核心為EdgeBoard 高性能能計(jì)算板卡和基于 arduio 的驅(qū)動板,外圍包括藍(lán)牙手柄、電壓表、開關(guān)等。將模型部署到 EdgeBoard 板卡上后,輸入為攝像頭采集到的圖像,輸出為智能車的目標(biāo)速度和方向角和前方標(biāo)志物信息,arduio 驅(qū)動板和Edgeboard 通過串口連接,arduio 驅(qū)動板收到控制指令后,向四個(gè)自帶 PID 的總線電機(jī)發(fā)出 PWM 信號,從而實(shí)現(xiàn)智能車的可控移動。
▲ 圖 3.1 智能車硬件架構(gòu)圖
3.2 軟件綜述
整體采用由 sandglass-block 堆疊而成的特征提取網(wǎng)絡(luò)來進(jìn)行特征提取,并且將得到的特征圖傳入兩個(gè)任務(wù)分支來節(jié)約計(jì)算成本,引入自主改進(jìn)的自適應(yīng)cbam 模塊、近似激活函數(shù)來對網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行優(yōu)化。并且在兩個(gè)分支中分別采用對應(yīng)的損失函數(shù)。來在訓(xùn)練中同時(shí)滿足兩個(gè)任務(wù)的需求。
3.2.1 Sandglass-glock
Sandgalss-block 是在 mobilenext 網(wǎng)絡(luò)中提出的新結(jié)構(gòu),適合于移動端網(wǎng)絡(luò)來采用,我們采用類似的思路來構(gòu)建我們的網(wǎng)絡(luò),因?yàn)椴杉膱D片和 imagenet中的圖片有非常大的不同,所以解凍了更多部分的預(yù)訓(xùn)練權(quán)重來進(jìn)行訓(xùn)練
3.2.2 自適應(yīng) Cbam 模塊
原論文中提出的 cbam 模塊在開始訓(xùn)練時(shí)對與訓(xùn)練權(quán)重有破壞效果,因?yàn)閏bam 模塊權(quán)重的初始化是隨機(jī)的,訓(xùn)練開始時(shí) cbam 模塊成為了模型的噪音模塊,特征圖中的元素和隨機(jī)元素進(jìn)行了運(yùn)算,結(jié)果也相當(dāng)于完全隨機(jī),并不利于模型收斂,所以加入了 bn 層,并且將 bn 層中的 Gama、Beta 均為 0 初始化來讓初始化的 cbam 模塊不改變特征圖中的元素,在不斷地學(xué)習(xí)中給不同的元素賦予不同的權(quán)重。詳細(xì)原理和結(jié)構(gòu)見第四章解釋。
3.2.3 近似激活函數(shù)
受到 mobilenetv3 的啟發(fā),我們認(rèn)為近似激活函數(shù)對于模型的計(jì)算速度有可見的提升,并且我們在第五章的實(shí)驗(yàn)部分也看到了本次任務(wù)中對速度的實(shí)際提升效果。
3.2.4 車道線數(shù)據(jù)處理及任務(wù)實(shí)現(xiàn)方法
每張車到線上采集的圖片將對應(yīng)一個(gè)能夠傳給智能車的數(shù)值指令,該數(shù)值指令介于 900~2100 之間(從實(shí)驗(yàn)中得知)其中 1500 的數(shù)值指令表示智能車將徑直向前行駛。以每張圖片為輸入 x,每張圖片對應(yīng)的數(shù)值指令為標(biāo)簽 y,將車道線識別的任務(wù)轉(zhuǎn)換為回歸任務(wù),這樣優(yōu)化目標(biāo) φ 就可以表示為:
其中F為模型;L為損失函數(shù);w為權(quán)重;因?yàn)闃?biāo)簽。
3.2.5 標(biāo)志物數(shù)據(jù)采集和數(shù)據(jù)處理
使用預(yù)訓(xùn)練的 yolov3 模型對采集到的數(shù)據(jù)集進(jìn)行目標(biāo)檢測來篩選有標(biāo)志物的圖片,極大的省去了篩選有標(biāo)志物圖片的人工成本,后續(xù)我們使用labelimg 來對篩選得到的圖片進(jìn)行標(biāo)注。對每個(gè)標(biāo)志物圖片,均采用了亮度矩陣來抵消局部亮度對圖片整體的影響,此后我們對圖像進(jìn)行了二值化處理,來刪減掉圖片的多余特征。這樣處理的好處在于模型可以提取更加豐富的特征。
3.2.6 模型分支的增加
在 yolov3 tiny 模型的使用中發(fā)現(xiàn)用 cnn 得到指令再用 yolov3 tiny 模型檢測標(biāo)志物的效率是非常低下的,因?yàn)檫@個(gè)過程中產(chǎn)生了兩個(gè) feature map,消耗了很多不必要的計(jì)算資源,這個(gè)過程必然對智能車的單幀圖像處理速度造成一定的影響,所以在編寫代碼的過程中在 yolov3 tiny 模型中加入了回歸分支來對車道線圖片進(jìn)行回歸分析,原有框架對標(biāo)志物圖片進(jìn)行目標(biāo)檢測綜合二者的結(jié)果智能車發(fā)送指令,實(shí)驗(yàn)結(jié)果表明這種方法減少了近 43%處理單幀圖像的時(shí)間。
3.2.7 智能車自主運(yùn)行代碼的實(shí)現(xiàn)或優(yōu)化方案
在實(shí)際運(yùn)行中發(fā)現(xiàn),智能車自主運(yùn)行代碼的過程中不會留下預(yù)測的結(jié)果,這種特性不利于后續(xù)的調(diào)試,所以在代碼中加入了保留預(yù)測結(jié)果文件的部分,這樣就能夠讓我們在每次測試智能車之后看到智能車除了圖片之后得到的指令,并且根據(jù)指令的正確與否繼續(xù)對模型、智能車、代碼邏輯進(jìn)行優(yōu)化。
3.2.8 目標(biāo)檢測后,控制智能車移動的實(shí)現(xiàn)和優(yōu)化方案
重新寫出智能車移動的控制邏輯,在未識別到標(biāo)識的時(shí)候,智能車將遵循模型中回歸分支的指令,當(dāng)智能車在視野中識別到標(biāo)識的時(shí)候,模型將暫時(shí)關(guān)閉回歸分支,直到標(biāo)識消失在智能車的視野之中,在此之前,智能車將跟據(jù)標(biāo)志物的意義來給智能車下發(fā)指令,例如,識別到限速標(biāo)志將會發(fā)送給智能車一個(gè)改變速度的指令。在特殊場景,識別到標(biāo)志后則開環(huán)控制,由于只要給驅(qū)動板發(fā)送一個(gè)數(shù)據(jù)后,驅(qū)動板就會繼續(xù)運(yùn)行這一數(shù)據(jù),并不會改變運(yùn)行狀態(tài)。下面列出一些其中一些場景的代碼。
超車場景:
停車場場景
人行道場景
3.2.9 如影隨形項(xiàng)目解決方案
如影隨形場景中訓(xùn)練不同的權(quán)重,數(shù)據(jù)集為"綠手套"也就是手套集,具體數(shù)據(jù)集見圖 4.7 所示。并且創(chuàng)新性的加入手勢引導(dǎo)機(jī)制,跟蹤綠色拳頭,但是出現(xiàn)綠色手掌后進(jìn)行慢速后退,這樣可以增加項(xiàng)目成功性,提高完賽率。追蹤綠色拳頭目標(biāo)時(shí)使用 PD 算法使得追蹤變得平順,下面展示部分代碼。
3.3 軟硬件結(jié)合
EdgeBoard 深度學(xué)習(xí)計(jì)算卡將攝像頭采集到的視頻數(shù)據(jù),進(jìn)行抽幀處理成一張張圖片,通過優(yōu)秀計(jì)算能力將圖片作為模型輸入,通過 python 腳本進(jìn)行車道線預(yù)測和目標(biāo)物識別。然后 EdgeBoard 和驅(qū)動板通過串口進(jìn)行連接,EdgeBoard 發(fā)出前進(jìn)方向和前進(jìn)速度指令,驅(qū)動板收到信號后向 4 個(gè)自帶 PID的總線電機(jī)發(fā)出 PWM 信號,從而控制每個(gè)車輪的轉(zhuǎn)向,智能車是通過差速轉(zhuǎn)向的。因此既可以以實(shí)現(xiàn)軟硬件的結(jié)合,使智能車自主運(yùn)行在賽道上,實(shí)現(xiàn)沿車道線行駛和識別到具體標(biāo)志物做出反應(yīng)的功能。
第4章 方案實(shí)現(xiàn)
4.1 模型分支的增加
通過在 yolov3 tiny 中加入圖像回歸分支來處理該任務(wù),以節(jié)省計(jì)算成本,通過在新的回歸分支上對特征圖進(jìn)行 1*1 卷積,并且傳入全連接層再進(jìn)行輸出得到回歸結(jié)果。由于訓(xùn)練過程中由于我們有兩個(gè)優(yōu)化目標(biāo)(回歸預(yù)測得到方向指令,目標(biāo)檢測得到標(biāo)志物類別及預(yù)測框)所以在訓(xùn)練中采用了雙損失函數(shù),對于回歸任務(wù)采用了 L2 loss 來懲罰與結(jié)果偏離較大的回歸預(yù)測,對于目標(biāo)檢測任務(wù)我們采用了默認(rèn)的 yolo_loss,要保證兩個(gè)損失函數(shù)對在梯度反向傳播時(shí)對特征提取網(wǎng)絡(luò)的影響是大致相同的,所以在回歸分支中引入了α因子來平衡兩個(gè)損失函數(shù)的影響,這樣回歸分支的損失函數(shù)由 變?yōu)榱?span style=""> 根據(jù)我們的實(shí)驗(yàn), 的值為 0.85 時(shí)我們得到了比較好的結(jié)果。
:Anchor[i]的預(yù)測概率; :Anchor[i]是正樣本, ;Anchor[i]是負(fù)樣本:
4.2 自適應(yīng) cbam 模塊實(shí)現(xiàn)
Inception v2 中提出的 batch normalization 方法被廣泛地用于緩解梯度消失問題,但是網(wǎng)絡(luò)又能夠通過學(xué)習(xí)來抵消 bn 層(當(dāng)網(wǎng)絡(luò)學(xué)習(xí)出來的 beta、gama 為 0時(shí),bn 層部隊(duì)網(wǎng)絡(luò)產(chǎn)生任何影響)
$$\mu _B \leftarrow {1 \over m}\sum\limits_{i = 1} m {x_i } \space \space \space \sigma _B2 \leftarrow {1 \over m}\sum\limits_{i = 1} m {\left( {x_i - \mu _B } \right)2 } \hat x_i {} \leftarrow {{x_i - \mu _B } \over {\sqrt {\sigma _B2 + \varepsilon } }}\space \space \space y_i \leftarrow \gamma \hat x_i + \beta = BN_{\gamma ,\beta } \left( {x_i } \right) $$
將這一思路引入 cbam 模塊中便得到了自適應(yīng) cbam 模塊(Adaptive cbamblock)公式原理見下圖 4.1 所示。原來的 cbam 模塊:特征圖經(jīng)過通道注意力機(jī)制和空間注意力機(jī)制的模塊得到帶有注意力權(quán)重的特征圖。
▲ 圖 4.1 cbam 模塊
改進(jìn)的自適應(yīng) cbam 模塊的通道注意力部分:原來的兩個(gè)向量合并之后傳入bn 層并傳入 2*sigmoid 函數(shù),最后得到輸出。如圖 4.2 所示。
▲ 圖 4.2 自適應(yīng) cbam 模塊通道注意力部分
改進(jìn)的自適應(yīng) cbam 模塊的空間注意力部分:在原來的卷積層之后加入了bn 層并傳入 2*sigmoid 函數(shù),最后得到輸出,如圖 4.3 所示。
▲ 圖 4.3 自適應(yīng) cbam 模塊空間注意力部分
4.3 車道線數(shù)據(jù)處理
使用 opencv-python 將圖像轉(zhuǎn)化為灰度圖,再進(jìn)行二值化處理,產(chǎn)生的圖像存在缺失問題,將圖像分為 16 個(gè)小塊,并將小塊中的像素值求平均值 ,求出圖像的平均值 ,亮度矩陣為的長寬為圖像的長寬,元素的值即為 ,將亮度矩陣和原始灰度圖逐元素相乘,得到新的經(jīng)過亮度處理的灰度圖,再經(jīng)過二值化處理如圖 4.4 所示,處理后的圖像便沒有了缺失問題。
▲ 圖 4.4 優(yōu)化后的圖像對比
4.4 標(biāo)志物的采集優(yōu)化
對標(biāo)志物圖片進(jìn)行多角度、多尺度的采集,而不只是智能車沿車道線行駛時(shí)采集的數(shù)據(jù)能夠達(dá)到更好的數(shù)據(jù)采集效果。數(shù)據(jù)集部分截圖如圖 4.5 所示。
▲ 圖 4.5 部分?jǐn)?shù)據(jù)集
通過僅開啟智能車的攝像頭來采集標(biāo)志物圖片得到的的數(shù)據(jù)不會參雜沒有標(biāo)志物的數(shù)據(jù)方便人工標(biāo)注數(shù)據(jù),并且由于收集到的這些數(shù)據(jù)更加優(yōu)質(zhì),更加全面,模型能夠?qū)W習(xí)到更多的特征,進(jìn)而達(dá)到更好的識別效果。在處理這些數(shù)據(jù)時(shí),采用調(diào)節(jié)對比度、調(diào)節(jié)飽和度、壓制高光、提高對比度、銳度、增加細(xì)節(jié)的方法會進(jìn)一步改進(jìn)模型的識別效果,如圖 4.6 所示。
▲ 圖 4.6 數(shù)據(jù)集優(yōu)化
對于如影隨形項(xiàng)目,我們選擇目標(biāo)為"綠手套",并加入手勢控制增大控制的靈活性以提高項(xiàng)目完成性,我們采集的數(shù)據(jù)集部分如圖 4.7 手套集所示。
▲ 圖 4.7 手套集部分?jǐn)?shù)據(jù)集
4.5 模型訓(xùn)練
由于模型中的不同分支有不同的作用,所以對兩個(gè)分支分別采用了不同的損失函數(shù),對于回歸分支我們采用了常見的 L2 loss,對于檢測分支我們采用了yolov3 tiny 中的默認(rèn)損失函數(shù),并且引入了 因子來權(quán)衡兩者的影響。訓(xùn)練過程中我們采用了標(biāo)準(zhǔn)的 RMSProp 作為優(yōu)化器,decay 參數(shù)和 momentum 參數(shù)都設(shè)置為了 0.9 并且將 weight decay 參數(shù)設(shè)置為了 0.00004,學(xué)習(xí)率初始化為0.45,隨后每一輪中學(xué)習(xí)率下降 0.02,采用百度飛漿平臺的 tesra v100 進(jìn)行訓(xùn)練200 輪得到模型。得到的實(shí)時(shí)監(jiān)測的部分圖片如圖 4.8 所示。
▲ 圖 4.8 實(shí)時(shí)監(jiān)測網(wǎng)絡(luò)訓(xùn)練效果圖
4.6 特征提取網(wǎng)絡(luò)結(jié)構(gòu)
利用 sandglass 模塊構(gòu)造的特征提取網(wǎng)絡(luò)如表 4.1 所示,在網(wǎng)絡(luò)的第一層有一個(gè) 32 通道的卷積層,在這之后,利用 sandglass-block 不斷堆疊,詳細(xì)的網(wǎng)絡(luò)結(jié)構(gòu)被列舉在表格中。詳細(xì)的 sandglass-block 的結(jié)構(gòu)也被列舉在表 4.2 中。
▲ 表 4.1 特征提取網(wǎng)絡(luò)結(jié)構(gòu)表 ▲ sandglass-block 結(jié)構(gòu)表
4.7 采用近似的激活函數(shù)
將原網(wǎng)絡(luò)中的激活函數(shù)進(jìn)行近似處理,使用了
這樣防止了 relu 得到的激活值過大,并且簡化了
4.8 將自適應(yīng) cbam 加入 sandglass-block
將 cbam 模塊引入 sandblock 模塊的方式類似于[10]中將 cbam 模塊引入resnet block 的方式如圖 4.8 所示,我們將自適應(yīng) cbam 模塊置于 sandglass-block中深度卷積和 1*1 卷積之間,在所有相鄰的卷積層之間放置 cbam 模塊會導(dǎo)致模型精度的下降,所以我們放棄了這種做法,具體細(xì)節(jié)見第五章測試分析。
▲ 圖 4.8 cbam 模塊在 resnet 中的引入
sandglass-block 借鑒了這種引入的方式在相鄰的兩個(gè)卷積層之間加入 cbam 模塊如圖 4.9 所示。
▲ 圖 4.9 加入 cbam 模塊之后的 snadglass-block
第5章 測試分析
5.1 激活函數(shù)比較
經(jīng)過近似之后的激活函數(shù)進(jìn)行了 20 次性能上的對比測試結(jié)果如圖 5.1 所示,發(fā)現(xiàn)近似后的激活函數(shù)對速度有大約 4%的提升,測試的平均結(jié)果如表 5.1 所示。
▲ sandglass-block 結(jié)構(gòu)表 ▲ 圖 5.1 激活函數(shù)測試結(jié)果圖
結(jié)果在預(yù)期之內(nèi),因?yàn)橹笖?shù)運(yùn)算相比于線性運(yùn)算有更大的計(jì)算量。如果是在深層的網(wǎng)絡(luò)之中這將是很龐大的計(jì)算量。
5.2 深度可分離卷積
深度可分離卷積由 deepwise 卷積變化而來,近年來成為非常受歡迎的卷積方式,該模塊參數(shù)大大減少,能夠是在不損失過多精度的前提下減少運(yùn)算次數(shù),并且減小模型大小。我們在網(wǎng)絡(luò)結(jié)構(gòu)中采用了深度可分離卷積來減少模型處理單張圖片所用時(shí)間,我們通過 20 次的實(shí)驗(yàn)測試,結(jié)果如圖 5.2 所示,對比了未采用深度可分離卷積的模型和采用了深度可分離卷積的模型在兩個(gè)任務(wù)中的識別準(zhǔn)確性。測試結(jié)果如表 5.2 所示。
▲ 表 5.2 深度可分離卷積和卷積的比較表 ▲ 圖 5.2 深度可分離卷積測試結(jié)果圖
從表中可以看出,和卷積相比,深度可分離卷積可以節(jié)省了 30%以上的參數(shù)量,并且達(dá)到了相差不多的準(zhǔn)確性。這是因?yàn)楸痪矸e的 feature map 中有很多冗余的特征,深度可分離卷積用更少的參數(shù)試圖提取特征這種行為也可以看作是一種正則化手段,來抑制過擬合,這種 deepwise 卷積和 pointwise 卷積的結(jié)合使得不同通道的 feature map 之間建立了聯(lián)系。
5.3 注意力機(jī)制比較
對兩種注意力機(jī)制進(jìn)行了對比試驗(yàn),cbam-block 效果更好,有更高的精度,這和它更復(fù)雜的結(jié)構(gòu)有關(guān)。Se-block 只是建立了通道之間的聯(lián)系,利用 pointwise卷積來讓網(wǎng)絡(luò)判斷出更加重要的通道。而 cbam 模塊是進(jìn)一步探究了更加重要的位置(spital space),兩者的對比試驗(yàn)如圖 5.3、表 5.3 所示。
▲ 表 5.3 不同注意力機(jī)制模塊的比較表 ▲ 圖 5.3 深度可分離卷積測試結(jié)果圖
從表 5.3 中可以看出 cbam 的引入讓模型具有更高的效率。但是根據(jù)研究發(fā)現(xiàn) cbam 模塊在網(wǎng)絡(luò)剛開始訓(xùn)練的時(shí)候會對預(yù)訓(xùn)練的權(quán)重產(chǎn)生影響,預(yù)訓(xùn)練的權(quán)重經(jīng)過隨機(jī)初始化權(quán)重的卷積使得預(yù)訓(xùn)練權(quán)重失去了意義。為了解決這個(gè)問題,在此基礎(chǔ)上改進(jìn)了 cbam 模塊, "自適應(yīng) cbam 模塊"在該模塊中我們引入了 bn層(batch-normalization)通過特定的初始化參數(shù),使得 cbam 模塊在訓(xùn)練初期不發(fā)揮作用,只有在訓(xùn)練了一段時(shí)間之后再發(fā)揮作用。從而讓模型更快的收斂。
5.4 殘差連接
在 sandglass-block 中引入了殘差連接,但是想要進(jìn)一步探究殘差連接是否像預(yù)想的一樣起積極作用。在實(shí)驗(yàn)中移除了 sandglass-block 中的殘差連接來測試模型的性能。測試結(jié)果如圖 5.4、表 5.4 所示。
▲ 圖 5.4 殘差連接測試結(jié)果圖 ▲ 表 5.4 有無殘差連接比較表比較表
發(fā)現(xiàn)從模型訓(xùn)練的時(shí)間來說,有殘差結(jié)構(gòu)的 sandglass-block 訓(xùn)練時(shí)間更短,從精度上來說有殘差結(jié)構(gòu)的 sandglass-block 有更強(qiáng)大的特征提取能力和泛化能力,認(rèn)為殘差結(jié)構(gòu)的引入打破了網(wǎng)絡(luò)深度的限制,很好的緩解了梯度消失的問題。
5.5 Bottleneck 的位置安排
Bottleneck 在構(gòu)建模型的基礎(chǔ)模塊中的位置對模型整體有著非常大的影響,自從 mobilenetv2 提出以后,在 bottleneck 之間建立起殘差連接的結(jié)構(gòu)就受到了人們的關(guān)注,但在低維度的 bottleneck 之間建立殘差連接使得網(wǎng)絡(luò)中蘊(yùn)含的特征受到了限制,更傾向于在高維度的 feature map 之間建立殘差連接,進(jìn)而使得特征更好的保留下來,所以將 bottleneck 的位置放到 block 的中間,也就是原始bottleneck 結(jié)構(gòu)的思想。于是選擇了 mobilenext 中的 sandglass-block 模塊構(gòu)建網(wǎng)絡(luò),此模塊和原始 bottleneck 結(jié)構(gòu)的差異在于我們在計(jì)算過程中使用更少的參數(shù),因?yàn)樯疃瓤煞蛛x卷積的存在,使得讓改造后的 bottleneck 模塊不耗費(fèi)過多的算力。
▲ 圖 5.5 三種不同的殘差 bottleneck 模塊圖 圖(a):經(jīng)典的 bottleneck 模塊,最早見于 resnet[7]; 圖(b):mobilenetv2 提出的bottleneck residual block; 圖(c):mobilenext 中提出的 sandglass-block 模塊
5.5 自適應(yīng) cbam 模塊在 sandglass-block 中的位置
嘗試了四種 cbam 模塊的位置,最后發(fā)現(xiàn)只有將自適應(yīng) cbam 置于兩對深度卷積和 1*1 卷積之間的效果最好,原因是 cbam 的注意力機(jī)制使得一部分bottleneck 中經(jīng)過壓縮的信息傳遞不到下一層,信息的損失進(jìn)而削弱了模型的泛化能力,具體實(shí)驗(yàn)數(shù)據(jù)如圖 5.6、表 5.5 所示、四種改良結(jié)構(gòu)如圖 5.7 所示。
▲ 表 5.5 不同改良結(jié)構(gòu)的比較表 ▲ 圖 5.6 不同改良結(jié)構(gòu)的測試結(jié)果圖 ▲ 圖 5.7 cbam 注意力機(jī)制在 sandglass-block 中的四種改良結(jié)構(gòu)
(a)圖為我們最終采用的結(jié)構(gòu)分別在降維之前和升維之后加入 cbam 結(jié)構(gòu)。b、c、d 圖分別是在不同位置加入 cbam 結(jié)構(gòu)的模塊。
5.6 智能交通的真實(shí)賽道的元素測試
經(jīng)過測試可以發(fā)現(xiàn),坡道、人行道可以成功完成啟停場景,限速場景正常減速、取消限速恢復(fù)速度,超車場景變道超車,十字場景順利通過,左轉(zhuǎn)場景原地左轉(zhuǎn),停車場景倒車入庫,如圖 5.8 所示。
▲ 圖 5.8 智能交通元素實(shí)測
5.7 如影隨形復(fù)雜場景測試
在強(qiáng)烈的陽光下布置錐桶障礙,由人指導(dǎo)智能車完成避障,可以發(fā)現(xiàn)系統(tǒng)魯棒性很強(qiáng),在復(fù)雜的光線場景中也可以準(zhǔn)確跟蹤目標(biāo),并且加入倒車手勢極大提高了成功率。測試圖如 5.9 所示。
▲ 圖 5.9 如影隨形實(shí)測
第6章 作品總結(jié)
經(jīng)過大量的實(shí)踐與探索,最終使得智能車能夠如愿自動行駛在賽道上,并且在性能方面表現(xiàn)突出,通過替換、修改網(wǎng)絡(luò)結(jié)構(gòu),選擇了適合本次任務(wù)的mobilenext-yolov3-tiny 模型,對激活函數(shù)進(jìn)行近似處理(ReLU6、h-sigmoid)來以微小的準(zhǔn)確率為代價(jià),換來了識別速度的顯著提升。
另外,近段時(shí)間流行的注意力機(jī)制也在我們的設(shè)計(jì)思想中得以體現(xiàn),通過對不同通道的特征圖進(jìn)行線性變換來讓網(wǎng)絡(luò)學(xué)習(xí)出更重要的通道,以達(dá)到更高的精度和準(zhǔn)度。
對數(shù)據(jù)的種種處理使得我們的模型更加關(guān)注的是賽道的幾何特征,即使換了新賽道也同樣能夠流暢行駛。對模型的深層次思考和對實(shí)際問題的周到考慮使得智能車任務(wù)能夠達(dá)到更高的準(zhǔn)確率,借鑒了許多模型的思想,也致力于解決移動端部署問題,希望用更少的計(jì)算資源達(dá)到更佳的效果。
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!