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