姚巍巍,張 潔
(西南交通大學(xué) 機(jī)械工程學(xué)院,成都 610031)
隨著經(jīng)濟(jì)高速全面發(fā)展,我國對交通運輸?shù)男枨笤絹碓酱?軌道交通由于其便捷和運量大的特性,在我國交通運輸中的地位愈為重要.自2011年“四橫四縱”高速鐵路干線陸續(xù)建成通車以來,我國鐵路運輸?shù)乃俣群瓦\輸總量實現(xiàn)了質(zhì)的突破.鐵路運輸生產(chǎn)力的高速發(fā)展,對鐵路行車的安全保障提出了更高的要求.確保機(jī)車的平穩(wěn)運行已成為鐵路運輸部門的重中之重,提高鐵路機(jī)務(wù)部門對機(jī)車運行安全的監(jiān)控水平也成為當(dāng)務(wù)之急.
鐵路安全是一個復(fù)雜的系統(tǒng)工程,由鐵路運輸生產(chǎn)人員、鐵路設(shè)備和鐵路環(huán)境這3 部分所組成.隨著科技的發(fā)展,車輛設(shè)備和鐵路環(huán)境都有了較大的發(fā)展進(jìn)步,鐵路運輸生產(chǎn)人員逐漸成為提高鐵路行車安全的重要因素.因此對系統(tǒng)中的人加強監(jiān)管就顯得極為重要.
司機(jī)行為識別是目標(biāo)檢測的一個重要的應(yīng)用場景.在行車途中,司機(jī)的駕駛行為是否符合安全規(guī)范直接關(guān)系到全車人的人身安全,所以對司機(jī)進(jìn)行視頻監(jiān)控是一項重要的安防措施.現(xiàn)有的行為分析以人工挑選分析LKJ 中保存的視頻數(shù)據(jù)為主,抽樣不均勻、分析質(zhì)量不高等問題突出,且只用于司機(jī)的績效評定.實現(xiàn)實時自動分析以及預(yù)判的安全駕駛監(jiān)督系統(tǒng)已經(jīng)成為鐵路行業(yè)的迫切需求.
安全駕駛監(jiān)督系統(tǒng)離不開目標(biāo)檢測技術(shù)的發(fā)展.自2012年深度學(xué)習(xí)問世以來,其在圖像識別中表現(xiàn)出了極佳的效果,并逐漸取代了傳統(tǒng)特征機(jī)器學(xué)習(xí)的地位.在目標(biāo)檢測領(lǐng)域,一批高精度的算法不斷刷新了識別精度的上線,并逐漸為工業(yè)界所使用.然而,當(dāng)前國內(nèi)外大多數(shù)智能司機(jī)行為識別集中于汽車行業(yè),由于汽車內(nèi)部狹小,駕駛員人臉和手部等有明確的特征,可以達(dá)到實時行為識別的目標(biāo)[1-4].而對于機(jī)車來說,現(xiàn)有的系統(tǒng)一般搭載于昂貴的遠(yuǎn)程大型服務(wù)器上,只能在列車運行結(jié)束后收集運行保存的監(jiān)控視頻檢測,無法實現(xiàn)實時和隨車檢測,只能進(jìn)行司機(jī)非安全行為發(fā)生后的追查和定責(zé).
因此,采用一種低成本,可隨車一起運行的嵌入式設(shè)備,在其上部署可以實時運行的監(jiān)控系統(tǒng),以便實時傳回違章信息便成為一項極有意義的工作.為解決實時、高精度檢測司機(jī)安全駕駛監(jiān)督的問題,本文選擇玩手機(jī)這種較為難以肉眼識別的行為為例,對目標(biāo)檢測中檢測速度較快的YOLOv3-tiny[5,6]算法進(jìn)行了加速,最終將其成功的部署在了計算能力較低的嵌入式設(shè)備上部署,實現(xiàn)了較高精度下實時運行的目的.
為能夠確保數(shù)據(jù)的多樣性,本文采集多個鐵路局機(jī)務(wù)段貨車及客車的駕駛室原始視頻數(shù)據(jù),標(biāo)記其中出現(xiàn)手機(jī)的圖片共5491 張.標(biāo)注,從中隨機(jī)選擇4919張圖片(含5890 個手機(jī)對象)作為訓(xùn)練集,剩余的572張圖片(含892 個手機(jī)對象)作為驗證集,如表1 所示.
表1 司機(jī)駕駛室圖片數(shù)據(jù)集
為了對抗過擬合、提高樣本多樣性和圖片質(zhì)量,在數(shù)據(jù)集較少的情況下對數(shù)據(jù)進(jìn)行增強,采用雙邊濾波、隨機(jī)水平鏡像翻轉(zhuǎn)、隨機(jī)亮度改變和0°~10°隨機(jī)角度旋轉(zhuǎn)對數(shù)據(jù)集進(jìn)行擴(kuò)增,采用LabelImg 進(jìn)行人工畫框標(biāo)注,只標(biāo)注被遮擋面積比小于0.5 的手機(jī)圖片以確保精確性,如圖1 所示.
圖1 增強和標(biāo)注數(shù)據(jù)集
為實現(xiàn)在線實時高精度檢測,本文選取精度較高同時推理速度較快的YOLOv3 作為基礎(chǔ)網(wǎng)絡(luò).YOLOv3是一種one-stage(單階段)的目標(biāo)檢測深度學(xué)習(xí)算法,其集精確的和推理的快速性于一身,自其提出至今,在工業(yè)界已有了廣泛的應(yīng)用[7-10].YOLOv3 在Coco 和Pascal-voc 等開源數(shù)據(jù)集上均有不俗的表現(xiàn),其速度和精準(zhǔn)度在相同輸入大小的情況下均優(yōu)于SSD[11]、faster-RCNN[12]等主流算法,尤其是YOLOv3-tiny 網(wǎng)絡(luò)以其非??斓臋z測速度、較少的參數(shù)總量在嵌入式領(lǐng)域和邊緣計算受到親睞.YOLOv3 主要包含以下3 種網(wǎng)絡(luò),如表2 所示.
表2 YOLO 網(wǎng)絡(luò)對比
表2 中精度一欄是在Coco 測試數(shù)據(jù)集上得到的精度,檢測速度一欄是在嵌入式設(shè)備jetson Nano 中測試得到.可見雖然YOLOv3 和YOLOv3-spp 網(wǎng)絡(luò)的精度較高,但由于其復(fù)雜的網(wǎng)絡(luò)在計算量受限的嵌入式設(shè)備很難達(dá)成實時運行的目標(biāo).決定網(wǎng)絡(luò)運行消耗的時間由模型在每一層計算所耗時間和前后網(wǎng)絡(luò)層參數(shù)傳遞所耗時間決定,YOLOv3 和YOLOv3-spp 較深的網(wǎng)絡(luò)層數(shù)使得運行需要在完成上一層網(wǎng)絡(luò)推理之后才能傳入到下一層網(wǎng)絡(luò)進(jìn)行推理,對于嵌入式這種并行處理能力差的設(shè)備來說,如非直接縮減網(wǎng)絡(luò)的層數(shù),則僅對每層的參數(shù)進(jìn)行半精度優(yōu)化和剪枝也無法縮減網(wǎng)絡(luò)在前后傳遞中浪費的時間.而YOLOv3-tiny 的網(wǎng)絡(luò)層數(shù)較少,主要運行時間消耗在網(wǎng)絡(luò)每一層計算中,這就為優(yōu)化提夠了條件.盡管精度僅為YOLOv3 的一半,但由于文中針對的是單一司機(jī)違章行為目標(biāo)的目標(biāo)檢測而非coco 數(shù)據(jù)集中80 個類別的目標(biāo)檢測任務(wù),YOLOv3-tiny 針對此類任務(wù)仍有較好的性能和向下優(yōu)化的空間,如下文中的實驗所證.此外,YOLOv3-tiny在占用硬盤空間和運行內(nèi)存均處于優(yōu)勢.因此,我們選用YOLOv3-tiny算法作為實現(xiàn)實時違章檢測的主干網(wǎng)絡(luò).
YOLOv3-tiny 網(wǎng)絡(luò)結(jié)構(gòu)如圖2 所示.與雙階段目標(biāo)檢測算法,如faster-RCNN 等網(wǎng)絡(luò)不同的是,在輸入圖片經(jīng)過主體網(wǎng)絡(luò)推理后,YOLOv3 網(wǎng)絡(luò)直接通過3 個不同尺度(13×13,26×26,52×52)的輸出通道直接得到包含目標(biāo)框坐標(biāo)、目標(biāo)置信度和目標(biāo)框內(nèi)物體分類在內(nèi)的特征圖,最后經(jīng)過非極大值抑制算法(nms)去掉重復(fù)目標(biāo)后得到最終輸出結(jié)果.而YOLOv3-tiny 為了節(jié)省計算量,只在兩個尺度上輸出特征圖,分別為[B,3×(4+1+C),13,13]和[B,3×(4+1+C),26,26],其中B 為每次載入圖片的數(shù)量,3×(4+1+C)為輸出特征圖的通道數(shù),C 為每一類的概率,3×(4+1+C)代表特征圖上每個1×1 的點對三個anchor(錨定框)進(jìn)行目標(biāo)框的回歸,以此增強對不同大小物體的識別,如圖3 所示.
深度學(xué)習(xí)通過眾多的參數(shù)計算推理得到預(yù)測結(jié)果,其中有相當(dāng)多的參數(shù)都是冗余且對預(yù)測結(jié)果無影響的.當(dāng)模型訓(xùn)練時,原始網(wǎng)絡(luò)需要一個足夠大的參數(shù)空間以充分的尋找最優(yōu)解.但當(dāng)模型訓(xùn)練完之后,我們只需要保留最優(yōu)的參數(shù)也一樣可以達(dá)到和原參數(shù)空間一樣的效果.我們可以把剪枝視為在原有模型構(gòu)成的參數(shù)空間里中搜尋了一條最有價值的計算路徑[13],這樣模型的精度不會降低,而使模型運行的更有效率,這就是進(jìn)行模型剪枝的意義.本文采用模型剪枝的方法對訓(xùn)練后模型進(jìn)行保持原精度情況下計算量和參數(shù)總量的縮減.模型剪枝可以根據(jù)細(xì)粒度和粗粒度分為權(quán)重剪枝和通道剪枝兩類,通道剪枝方法由于其獨有的簡單、可行性、總計算量較小和不需要特殊的硬件庫的優(yōu)勢,在近幾年得到了相當(dāng)迅速的發(fā)展,并已實際應(yīng)用于一些工程中[14-16].通道剪枝本質(zhì)上從通道這一層面上對卷積層中的卷積核的重要性進(jìn)行區(qū)分,去除對網(wǎng)絡(luò)輸出結(jié)果影響小的卷積核,以此實現(xiàn)計算總量和模型體積的縮小.
圖2 YOLOv3-tiny 網(wǎng)絡(luò)
我們采用了對Batch Normalization 層(批標(biāo)準(zhǔn)化層,下稱為BN 層)進(jìn)行L1 懲罰的方式進(jìn)行通道剪枝.在神經(jīng)網(wǎng)絡(luò)的計算中,BN 層實際上進(jìn)行了兩步運算,如式(1)所示:(1)對輸入特征圖所有參數(shù)規(guī)整到均值為0,方差為1 的正態(tài)分布范圍內(nèi).(2)讓每個規(guī)整后所有參數(shù)在訓(xùn)練過程中學(xué)習(xí)到對應(yīng)的兩個調(diào)節(jié)因子γ 和β,對標(biāo)準(zhǔn)化后的值進(jìn)行微調(diào),使之更適于梯度下降.
其中,ai代表輸入的每個通道的特征圖,為Bl×Hl×Wl;u,σi分別是均值和方差;γi和βi是每個通道特征圖所對應(yīng)的兩個調(diào)節(jié)因子.實際上,γ 可以視為BN 層特征圖每一通道的權(quán)重,如果當(dāng)前輸入的通道Ci對應(yīng)的權(quán)重γi出現(xiàn)γi=0 或γi≈0 的情況,那么就會有γi×τ=0,特征圖對應(yīng)的輸出通道即全為常數(shù)0,不會再對接下來的運算產(chǎn)生影響.因此,我們可以利用BN 層中的縮放因子γ 衡量特征圖每個通道的重要性,當(dāng)γi=0 或者γi≈0 時,即可剪去γi對應(yīng)特征圖的通道,最終剪去γ=0 對應(yīng)的上下卷積層的卷積核,以此完成減少計算量和縮小模型體積的任務(wù),如圖4 所示.
圖3 YOLO 檢測過程圖
圖4 BN 層剪枝示意圖
然而,一般訓(xùn)練之后神經(jīng)網(wǎng)絡(luò)中的γ 值通常呈正態(tài)分布,并不會有很多參數(shù)等于或者靠近0.因此,我們需要在訓(xùn)練網(wǎng)絡(luò)的同時減小γ,這被稱之為稀疏化訓(xùn)練.通常使用L1 次梯度法稀疏每個BN 層的γ 值,如式(2)所示.
其中,u 代表損失函數(shù)的學(xué)習(xí)率;u ?l代表訓(xùn)練中原始損失函數(shù)的梯度,它是從損失的反向傳播中得出的;η 是超參數(shù),決定了L1 次梯度法的每次梯度下降大小,根據(jù)經(jīng)驗,η 應(yīng)在1e-4~1e-5 之間取得[15];sgn(γl- u?l)決定了L1 次梯度法的損失方向.
TensoRT 是NVIDIA 為深度學(xué)習(xí)的高速推理需求所推出的一個高性能深度學(xué)習(xí)推理平臺.它包括深度學(xué)習(xí)推理優(yōu)化器和運行器,可為深度學(xué)習(xí)推理應(yīng)用提供INT8 和FP16(半精度)優(yōu)化,例如視頻、語音識別、推薦系統(tǒng)和自然語言處理等.在深度學(xué)習(xí)的部署中,降低精度推斷可顯著減少應(yīng)用程序延遲,這是許多實時服務(wù),自動和嵌入式應(yīng)用程序的要求.
在搭建TensorRT 加速引擎時,需要將原模型轉(zhuǎn)化為TensorRT 可以讀取的形式,如caffe、onnx 的模型結(jié)構(gòu).TensorRT 自帶的接口NvcaffeParser 提供了Caffe 結(jié)構(gòu)模型中卷積層、激活層和池化層等常見層的接口,而YOLOv3-tiny 中的Upsample 層(上采樣層)及YOLO 層(檢測層)需要自行編寫后自定義插入.Upsample層實現(xiàn)了數(shù)據(jù)圖H,W 方向上的調(diào)整,放大輸入的特征圖以適應(yīng)聯(lián)結(jié)、矩陣加法等操作,常見的Upsample 方法有線性插值、最近鄰值等.YOLO 層實現(xiàn)了從特征圖中挑選置信度(confidence)大于預(yù)設(shè)值的目標(biāo)輸出的目的,并將挑選出的特征與錨定框大小計算回歸出目標(biāo)框真實位置和長寬值.本文將最近鄰值的Upsample層和YOLO 層添加到了TensorRT 加速引擎中.
TensorRT 通過實現(xiàn)模型簡化和半精度對模型進(jìn)行加速,其中模型簡化通過整合卷積層、激活層和BN 層為CBR 層實現(xiàn);半精度加速通過在平臺支持的情況下,將數(shù)據(jù)精度需求從32 位float (浮點數(shù))降低為16 位float,可極大的提升計算效率.
我們提出的算法總體流程如下:(1)首先進(jìn)行稀疏訓(xùn)練,在訓(xùn)練模型的同時使BN 層γ 因子盡可能地收縮;(2)當(dāng)稀疏訓(xùn)練完成時,執(zhí)行修剪以移除冗余參數(shù);(3)微調(diào)修剪后的模型以獲得最終模型;(4)搭建TensorRT 推理加速引擎,編寫自定義層;(5)將模型讀入TensorRT 加速引擎中,部署在嵌入式設(shè)備上.訓(xùn)練流程圖如圖5 所示.
圖5 訓(xùn)練部署流程
本文使用了Pytorch 框架完成YOLO算法的搭建,主要訓(xùn)練硬件設(shè)備為:①處理器:Intel 9400f;②GPU 顯卡:RTX2070 8G.操作系統(tǒng)為Ubuntu16.04,python 環(huán)境為python3.6.8.部署嵌入式平臺為較為廉價、適于工業(yè)部署的NVIDIA Jetson Nano,如圖6 所示.Jetson Nano 是NVIDIA 公司2019年新推出的嵌入式高性能開發(fā)板,其采用NVIDIA Maxwell?架構(gòu),配備128 個CUDA 核心,內(nèi)存為4 GB,搭載的運行環(huán)境為JetPack 4.2.
圖6 Jetson Nano
為提高顯存利用率,增加batch size(批大小),采用了NVIDIA 的apex 技術(shù)進(jìn)行混合精度訓(xùn)練.選取準(zhǔn)確率P (precision)、召回率R (recall)、平均精確率均值mAP (mean Average Precision)、F1 值、檢測速度和參數(shù)總量作為評價準(zhǔn)則.其中,precision 指的是被正確檢測出的物體占總被檢測出的物體的比例,recall 指被正確檢測出的物體占驗證集中所有物體的比例.precision和recall 一般情況下是成反比關(guān)系,即recall 越大,precision 越小,反之同理.而mAP 為目標(biāo)檢測任務(wù)中最重要的指標(biāo),決定了檢測的效果.mAP 一般通過改變檢測時置信度(confidence)閾值得到Precision-recall 曲線,計算Precision-recall 曲線的面積得到mAP 值.為了在計算機(jī)中更快速精確的求mAP 的大小,通常使用插值近似的方法,如式(3)所示.
本文同時以正常訓(xùn)練模式和稀疏化訓(xùn)練模式訓(xùn)練了兩個YOLOv3-tiny 模型,設(shè)置稀疏訓(xùn)練超參數(shù)η=1e-4 進(jìn)行訓(xùn)練.表3 展示了YOLOv3-tiny 網(wǎng)絡(luò)稀疏化訓(xùn)練后的各項指標(biāo),可見稀疏化訓(xùn)練后的各項指標(biāo)均處于相當(dāng)優(yōu)秀的水平,0.965 的mAP 保證了高精度檢測的目的,甚至要高于正常訓(xùn)練,這是因為稀疏化訓(xùn)練也可以視為進(jìn)行了L1 正則化,降低了模型對訓(xùn)練數(shù)據(jù)的過擬合.圖7 顯現(xiàn)了稀疏化訓(xùn)練后γ 系數(shù)的稀疏化水平.YOLOv3-tiny 網(wǎng)絡(luò)共有11 層BN 層,這11 層BN 層共有4512 個γ 系數(shù),40%的γ 參數(shù)的絕對值下降到0 值附近,滿足進(jìn)行剪枝的條件.隨后進(jìn)行剪枝并進(jìn)行微調(diào).
表3 YOLOv3-tiny 訓(xùn)練結(jié)果
圖7 稀疏化訓(xùn)練后全γ 系數(shù)分布圖
表4 展示了剪枝后各個卷積層變化情況,剪枝后的模型各卷積層通道大小由之前的2 的n 次方數(shù)變?yōu)椴辉儆幸?guī)律可循,這便是非結(jié)構(gòu)剪枝在現(xiàn)有模型中搜尋了一條最為有效的計算路徑的結(jié)果.
表4 剪枝后的模型各卷積層大小
表5 展示了剪枝后并微調(diào)后改進(jìn)模型(下文稱為Prune-YOLOv3-tiny)在Jetson Nano 上的表現(xiàn).可見在微調(diào)后,Prune-YOLOv3-tiny 模型的精度略有上升,而在檢測速度相較原模型提高了76.5%,計算總量降低為原模型的43.2%,在參數(shù)總量上降低為原模型的31.4%.盡管只有40%的γ 參數(shù)被剪去,模型參數(shù)總量依然下降很大.由表4 可見,Conv1、Conv2、Conv3 等參數(shù)較少的卷積層被剪去的較少,而如Conv6、Conv7、Conv8 等參數(shù)較多的卷積層剪去的參數(shù)較多,參數(shù)最多的Conv7 有高于一半的參數(shù)被剪去,這是剪枝后模型參數(shù)總量要更少的原因.而對于計算復(fù)雜度,參數(shù)最多的Conv7 層并非是計算量最大的層,考慮計算量需要綜合每層輸入輸出的特征圖大小.對YOLOv3-tiny 模型來說,Conv6 是模型計算量最大的層并沒有如Conv7 一樣被剪去一半以上,這是計算總量的縮小程度低于參數(shù)總量的原因.
表5 原網(wǎng)絡(luò)與改進(jìn)網(wǎng)絡(luò)對比
隨后,將原YOLOv3-tiny 模型加載到搭建好的TensorRT 加速引擎中以生成半精度加速的模型.表6展現(xiàn)了YOLOv3-tiny 模型在TensorRT 加速引擎中的效果.相較于原模型,TensorRT 加速的半精度模型的精度沒有變化,檢測速度提高52.9%,而參數(shù)總量沒有明顯下降.
表6 YOLOv3-tiny 在不同推理平臺上對比
最后,我們將Prune-YOLOv3-tiny 模型加載到搭建好的TensorRT 加速引擎中完成最終的加速模型(下文稱為最終模型),表7 展現(xiàn)了最終模型的效果評估.經(jīng)過模型剪枝和半精度加速的最終模型相較于原模型精度沒有下降,檢測速度提高了117.6%,而在參數(shù)總量上降低為原模型的39.5%.圖8 展示了最終模型的識別效果.
表7 原模型與最終加速模型對比
圖8 加速模型檢測效果
在這項工作中,我們成功的對目標(biāo)檢測中經(jīng)典的深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)YOLOv3-tiny 進(jìn)行了通道剪枝和半精度加速,在精度不變的情況下減少了改進(jìn)后神經(jīng)網(wǎng)絡(luò)的計算總量和參數(shù)總數(shù).我們在計算能力較低的嵌入式設(shè)備上成功部署了剪枝后的模型.所提出的模型在嵌入式設(shè)備可以達(dá)到37 幀每秒的檢測速度,與現(xiàn)有模型相比,我們的模型除了需要在稀疏化訓(xùn)練中增加一個η 超參數(shù)外,在速度和體積上均占有優(yōu)勢,而精確率、召回率和平均精確率均值不變,實現(xiàn)了高精度下實時檢測的目的.