尹彥卿,龔華軍,王新華
(南京航空航天大學(xué) 自動(dòng)化學(xué)院,南京 210000)
目標(biāo)檢測(cè)是指從場(chǎng)景中區(qū)分出不同對(duì)象,定位每個(gè)對(duì)象的邊界框并判別其類型的技術(shù)。如何實(shí)現(xiàn)精確的目標(biāo)檢測(cè)是計(jì)算機(jī)視覺(jué)領(lǐng)域一個(gè)基礎(chǔ)性難題,引起了研究人員的廣泛關(guān)注。
隨著深度學(xué)習(xí)技術(shù)的發(fā)展,許多基于卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Network,CNN)的目標(biāo)檢測(cè)方法都已具備優(yōu)越的檢測(cè)性能。例如,特征金字塔網(wǎng)絡(luò)(Feature Pyramid Network,FPN)算法在coco數(shù)據(jù)集上的檢測(cè)精度達(dá)到59.1%,但該算法由于網(wǎng)絡(luò)參數(shù)繁多、計(jì)算復(fù)雜,即使在Titan GPU上,其檢測(cè)速度也僅能達(dá)到6 frame/s,難以實(shí)現(xiàn)實(shí)時(shí)目標(biāo)檢測(cè)[1]。
2018年,YOLOv3目標(biāo)檢測(cè)算法被提出,它將目標(biāo)檢測(cè)視作一個(gè)回歸問(wèn)題,通過(guò)一個(gè)神經(jīng)網(wǎng)絡(luò)同時(shí)輸出目標(biāo)的位置和類別,在幾乎不損失識(shí)別精度的前提下,其檢測(cè)速度明顯提升。在Titan-X GPU上,YOLOv3-416網(wǎng)絡(luò)的運(yùn)行速度達(dá)35 frame/s,可用于實(shí)現(xiàn)對(duì)視頻信息的實(shí)時(shí)檢測(cè)[2-4]。
盡管YOLOv3在強(qiáng)大的GPU上具有實(shí)時(shí)檢測(cè)性能,但高端GPU價(jià)格昂貴、體積巨大,通常僅能在服務(wù)器上安裝,極大地限制了YOLO算法的應(yīng)用場(chǎng)景。在智能手機(jī)、無(wú)人機(jī)、無(wú)人車等常見(jiàn)的嵌入式設(shè)備上,計(jì)算資源和內(nèi)存都非常有限,因此,嵌入式設(shè)備上的實(shí)時(shí)目標(biāo)檢測(cè)仍是一大挑戰(zhàn)。YOLOv3的研究者還提出了一種tiny-YOLOv3網(wǎng)絡(luò),其網(wǎng)絡(luò)結(jié)構(gòu)簡(jiǎn)單,可在嵌入式設(shè)備上進(jìn)行實(shí)時(shí)檢測(cè),但其mAP值僅為33.1%,無(wú)法兼顧實(shí)時(shí)性和檢測(cè)準(zhǔn)確度[5]。
本文提出一種基于YOLOv3的嵌入式平臺(tái)實(shí)時(shí)視頻目標(biāo)檢測(cè)算法。該算法運(yùn)用半精度推理策略,在幾乎不損失檢測(cè)精度的情況下提高檢測(cè)速度,同時(shí),利用視頻目標(biāo)運(yùn)動(dòng)自適應(yīng)推理策略,降低深度網(wǎng)絡(luò)推理的運(yùn)行頻率,進(jìn)一步提高視頻目標(biāo)檢測(cè)的幀率。結(jié)合上述2種策略,在NVIDIA Tegra系列嵌入式GPU平臺(tái)上實(shí)現(xiàn)實(shí)時(shí)、準(zhǔn)確的目標(biāo)檢測(cè)[6-7]。
為了保證計(jì)算精度,目前主流算法框架的深度網(wǎng)絡(luò)權(quán)值均使用單精度浮點(diǎn)數(shù)據(jù)類型進(jìn)行保存。單精度浮點(diǎn)類型在計(jì)算機(jī)中較為常見(jiàn),但其在存儲(chǔ)時(shí)需要4 Byte的空間,且計(jì)算復(fù)雜度較高。在IEEE 754標(biāo)準(zhǔn)中定義了一種半精度浮點(diǎn)類型[8],其在CUDA編程環(huán)境中又稱為Half類型。半精度浮點(diǎn)類型需要2 Byte存儲(chǔ)空間,其優(yōu)勢(shì)在于GPU中的計(jì)算硬件可在一個(gè)周期內(nèi)同時(shí)完成2個(gè)半精度浮點(diǎn)類型的運(yùn)算,大幅提高計(jì)算速度。2種數(shù)據(jù)類型的比較如表1所示。
表1 單精度與半精度類型的比較
由表1可知,2種數(shù)據(jù)類型的性能差異主要體現(xiàn)在數(shù)值范圍與精度上。在數(shù)值范圍方面,根據(jù)本文在coco數(shù)據(jù)集上的測(cè)試結(jié)果,YOLOv3網(wǎng)絡(luò)權(quán)值和激活值普遍分布在±20之內(nèi),故2種數(shù)據(jù)類型的數(shù)值范圍均能滿足要求。在精度方面,由于網(wǎng)絡(luò)訓(xùn)練時(shí)反向傳播算法需要計(jì)算權(quán)值的梯度,權(quán)值的一點(diǎn)微小變化都會(huì)對(duì)結(jié)果產(chǎn)生較大影響,因此在訓(xùn)練過(guò)程中,權(quán)值的精度至關(guān)重要,只能使用單精度類型儲(chǔ)存。在本文算法的網(wǎng)絡(luò)推理過(guò)程中,推理速度是最重要的影響因素,因此,半精度類型權(quán)值的精度損失對(duì)網(wǎng)絡(luò)推理結(jié)果的影響程度,將直接決定能否使用半精度推理策略進(jìn)行YOLO網(wǎng)絡(luò)加速。
將待檢測(cè)的目標(biāo)類別數(shù)記作C,則YOLO網(wǎng)絡(luò)對(duì)每個(gè)檢測(cè)目標(biāo)的輸出結(jié)果為一個(gè)五元組(c,x,y,w,h)和一個(gè)長(zhǎng)度為C的向量(P1,P2,…,PC),其中,Pi表示目標(biāo)屬于第i類的分類概率,c表示目標(biāo)存在的概率,(x,y,w,h)表示目標(biāo)的位置和大小,其含義是實(shí)際目標(biāo)框相對(duì)于一個(gè)固定預(yù)設(shè)框的位置偏移和長(zhǎng)寬比例,而不是目標(biāo)框的絕對(duì)坐標(biāo)。實(shí)際輸出目標(biāo)框相對(duì)于預(yù)設(shè)框的位置關(guān)系如圖1所示。
圖1 實(shí)際目標(biāo)框相對(duì)于預(yù)設(shè)框的位置和大小
令每個(gè)網(wǎng)格距離圖片左上角的像素距離分別為cx、cy,每個(gè)預(yù)設(shè)框的寬高為pw、ph,σ函數(shù)表示將范圍在0~1的輸入線性映射到網(wǎng)格的實(shí)際長(zhǎng)寬范圍,則物體實(shí)際在圖像中的位置和大小如下:
σ(x)=32x
bx=σ(x)+cx
by=σ(y)+cy
bw=pwew
bh=pheh
本文在coco數(shù)據(jù)集上分別進(jìn)行單精度和半精度推理實(shí)驗(yàn)。根據(jù)實(shí)驗(yàn)結(jié)果的統(tǒng)計(jì)數(shù)據(jù),對(duì)于YOLO網(wǎng)絡(luò)最終輸出的激活值,使用半精度類型運(yùn)算與單精度類型運(yùn)算的誤差在±0.001以內(nèi)。下面將逐一分析該誤差對(duì)網(wǎng)絡(luò)輸出變量的影響:
1)目標(biāo)存在概率c。本文算法以0.5為閾值判斷是否存在目標(biāo),將低于0.5的值判定為背景。c的取值范圍為0~1,因而在絕大多數(shù)情況下,該誤差不足以影響c相對(duì)于閾值的關(guān)系,其對(duì)判定結(jié)果基本沒(méi)有影響。
2)目標(biāo)分類概率Pi。算法通過(guò)argmax函數(shù)選取其中最大值的下標(biāo)i作為目標(biāo)分類的結(jié)果。Pi的分布范圍為0~1,而正確的目標(biāo)分布概率普遍在0.9以上。因此,該誤差不能改變最大值的分布,因而可認(rèn)為該誤差對(duì)于目標(biāo)分類結(jié)果幾乎沒(méi)有影響。
3)目標(biāo)位置(x,y)。經(jīng)過(guò)σ函數(shù)線性映射后,目標(biāo)位置(x,y)的誤差在0.032像素以內(nèi),而該誤差經(jīng)過(guò)指數(shù)函數(shù)放大后,其對(duì)目標(biāo)大小(w,h)產(chǎn)生的誤差也在1像素以內(nèi)。因此,可認(rèn)為該誤差對(duì)于目標(biāo)定位位置影響較小。
綜上所述,使用半精度類型取代單精度類型進(jìn)行網(wǎng)絡(luò)權(quán)值和激活值的表示,對(duì)于網(wǎng)絡(luò)輸出結(jié)果基本沒(méi)有影響,但可以大幅加快推理速度和降低存儲(chǔ)要求,便于在嵌入式平臺(tái)上進(jìn)行推理。
需要注意的是,并非所有嵌入式設(shè)備均支持半精度浮點(diǎn)類型運(yùn)算。自Tegra X1以后,NVIDIA的嵌入式GPU平臺(tái)也支持原生的半精度計(jì)算指令,因此,本文選用Tegra系列的最新處理器TX2進(jìn)行YOLOv3網(wǎng)絡(luò)半精度推理的實(shí)現(xiàn)。TX2處理器的核心板大小僅為5 cm×8 cm,但其能夠?yàn)樯疃葘W(xué)習(xí)應(yīng)用提供超過(guò)1 Tflops的浮點(diǎn)運(yùn)算性能,同時(shí)功耗低于7.5 W,故適合在視頻監(jiān)控?cái)z像頭、無(wú)人機(jī)、機(jī)器人等嵌入式平臺(tái)上部署應(yīng)用[9]。
在進(jìn)行CUDA編程時(shí),需要使用內(nèi)置的Half 2類型對(duì)半精度運(yùn)算進(jìn)行加速。Half 2類型為2個(gè)半精度類型在顯存中的組合,其結(jié)構(gòu)如圖2所示。其中,S為符號(hào)位,E為階碼,M為尾數(shù)。Half 2類型在計(jì)算時(shí)將2個(gè)半精度類型同時(shí)輸入32位GPU,可在一個(gè)周期內(nèi)同時(shí)完成2個(gè)半精度浮點(diǎn)類型的運(yùn)算。
圖2 Half 2類型在顯存中的存儲(chǔ)結(jié)構(gòu)
由于需要2個(gè)半精度類型同時(shí)運(yùn)算才能起到加速效果,因此在YOLO網(wǎng)絡(luò)推理時(shí)要盡量保證所有的操作均為內(nèi)存中相鄰兩組操作數(shù)的計(jì)算,避免計(jì)算資源的浪費(fèi)[10]。在嵌入式GPU平臺(tái)上使用半精度類型進(jìn)行推理的主要過(guò)程如下[11]:
1)讀入待檢測(cè)的圖像數(shù)據(jù)和網(wǎng)絡(luò)權(quán)值數(shù)據(jù),送入顯存,并在GPU中轉(zhuǎn)換成半精度類型。
2)使用CUDNN提供的卷積運(yùn)算接口API進(jìn)行卷積計(jì)算,在設(shè)置參數(shù)時(shí),將數(shù)據(jù)類型選為半精度類型[12]。
3)進(jìn)行偏置、正則化等計(jì)算。首先將參數(shù)在顯存中拷貝一份,然后使用Half 2類型進(jìn)行計(jì)算,以達(dá)到最大的加速效果。以偏置計(jì)算為例,其Half 2類型的快速計(jì)算過(guò)程如圖3所示。
4)在GPU中將計(jì)算結(jié)果轉(zhuǎn)換成單精度類型,并傳回內(nèi)存中由CPU進(jìn)行最終處理,然后輸出檢測(cè)結(jié)果。
圖3 Half 2類型的快速偏置計(jì)算
考慮到本文算法主要應(yīng)用于視頻目標(biāo)檢測(cè),目標(biāo)信息在視頻中的相鄰幀之間具有連續(xù)性,因而并不需要對(duì)每一幀圖像進(jìn)行完整的深度網(wǎng)絡(luò)推理。為進(jìn)一步提高視頻目標(biāo)檢測(cè)的速度,本文引入運(yùn)動(dòng)自適應(yīng)推理的策略來(lái)判斷視頻幀是否需要重新進(jìn)行完整的深度推理[13]。
對(duì)于新輸入的視頻幀,使用三幀差分法進(jìn)行運(yùn)動(dòng)估計(jì)[14]。當(dāng)前幀、上一幀、上上幀的圖像分別記為It、It-1、It-2,則三幀差分的結(jié)果如下:
Mmovement=(It-It-1)∩(It-1-It-2)
對(duì)三幀差分法得到的運(yùn)動(dòng)圖進(jìn)行閾值化、形態(tài)學(xué)處理和濾波后,即可得到圖像中的運(yùn)動(dòng)區(qū)域。對(duì)于相對(duì)上一幀運(yùn)動(dòng)較大的視頻幀,需要運(yùn)行一次完整的深度推理,重新檢測(cè)圖像中的目標(biāo)位置和分類;對(duì)于相對(duì)上一幀運(yùn)動(dòng)不大的視頻幀,則使用粒子濾波來(lái)進(jìn)行視頻目標(biāo)跟蹤,并更新之前檢測(cè)出的目標(biāo)位置。考慮到粒子濾波器在進(jìn)行長(zhǎng)時(shí)間的目標(biāo)跟蹤時(shí)容易出現(xiàn)漂移、跟蹤失敗的情況,設(shè)置強(qiáng)制深度推理間隔為m,即在進(jìn)行m幀的粒子濾波后,對(duì)第m+1幀強(qiáng)制使用深度推理重新檢測(cè)目標(biāo)位置。每次完成深度推理后,將深度網(wǎng)絡(luò)的檢測(cè)結(jié)果作為粒子濾波器的初始值,重新初始化粒子濾波器[15-17]。整個(gè)過(guò)程如圖4所示。
圖4 視頻運(yùn)動(dòng)自適應(yīng)推理流程
在TX2平臺(tái)上進(jìn)行測(cè)試后發(fā)現(xiàn),GPU加速后的三幀差分法耗時(shí)5 ms,對(duì)單個(gè)目標(biāo)進(jìn)行粒子濾波跟蹤耗時(shí)3 ms,比進(jìn)行一幀深度推理的耗時(shí)要少。當(dāng)視頻中的目標(biāo)個(gè)數(shù)較少,例如,將幀差法與粒子濾波的耗時(shí)忽略不計(jì)時(shí),整個(gè)算法運(yùn)行幀率的上限為深度推理運(yùn)行幀率的m倍。根據(jù)本文的測(cè)試結(jié)果,m取1~3時(shí)較為合適。當(dāng)m取值較大時(shí),算法的幀率上限有所提升,但其輸出對(duì)于粒子濾波結(jié)果的依賴性較強(qiáng),準(zhǔn)確度有所下降。若視頻中的目標(biāo)個(gè)數(shù)較多,對(duì)目標(biāo)逐個(gè)進(jìn)行粒子濾波跟蹤的耗時(shí)增大,在這種情況下,可考慮使用CamShift等相對(duì)更快的視頻目標(biāo)跟蹤算法降低耗時(shí),進(jìn)一步改善算法的實(shí)時(shí)性[18]。
本文算法的所有評(píng)估工作均在NVIDIA TX2嵌入式平臺(tái)上進(jìn)行,處理器運(yùn)行于高性能模式,軟件環(huán)境為CUDA 9.0、CUDNN 7.1。本文利用coco數(shù)據(jù)集對(duì)不同輸入尺度下單精度網(wǎng)絡(luò)和半精度網(wǎng)絡(luò)的單幀圖片推理性能進(jìn)行測(cè)試。由于coco數(shù)據(jù)集中全部為靜態(tài)圖像,因此僅啟動(dòng)半精度推理加速策略,視頻目標(biāo)跟蹤策略沒(méi)有明顯的效果[19],結(jié)果如表2所示。
表2 不同輸入尺度下單精度與半精度推理性能的對(duì)比
由表2可以看出,在不同的輸入尺度下,本文的半精度推理策略相對(duì)于其他2種策略有3倍左右的加速效果,同時(shí)其mAP值損失不到0.3%,檢測(cè)精度明顯優(yōu)于tiny-YOLO和單數(shù)度YOLOv3實(shí)時(shí)目標(biāo)檢測(cè)算法,使YOLO算法在嵌入式設(shè)備上的推理性能大幅提升。
本文選用ILSVRC視頻目標(biāo)檢測(cè)(VID)數(shù)據(jù)集對(duì)算法的性能進(jìn)行測(cè)試[20]。該數(shù)據(jù)集包含數(shù)千個(gè)完全標(biāo)注的視頻片段,每個(gè)片段的長(zhǎng)度為56幀~458幀。在2段視頻中各截取4幀相鄰圖片,如圖5所示。
圖5 ILSVRC VID測(cè)試序列中的檢測(cè)結(jié)果
在圖5中,第1幀與第4幀圖片的檢測(cè)結(jié)果由深度網(wǎng)絡(luò)推理得到,中間2幀圖片的檢測(cè)結(jié)果為粒子濾波跟蹤得到??梢钥闯?如果視頻畫面中的目標(biāo)運(yùn)動(dòng)不太明顯,通過(guò)粒子濾波能夠可靠地跟蹤深度網(wǎng)絡(luò)檢測(cè)到的目標(biāo)位置,降低深度推理的運(yùn)行頻率,大幅節(jié)省計(jì)算量。在完整的ILSVRC VID測(cè)試數(shù)據(jù)集上,本文算法與原始YOLO算法的實(shí)驗(yàn)結(jié)果對(duì)比如表3所示。
表3 ILSVRC VID數(shù)據(jù)集上的視頻目標(biāo)檢測(cè)結(jié)果對(duì)比
從表3可以看出,本文的嵌入式實(shí)時(shí)視頻目標(biāo)檢測(cè)算法在深度推理間隔為2時(shí),可通過(guò)視頻目標(biāo)運(yùn)動(dòng)自適應(yīng)推理策略將深度推理運(yùn)行次數(shù)減少66%,結(jié)合半精度推理策略,可在TX2嵌入式平臺(tái)上將運(yùn)行幀率提高至28.2 frame/s,同時(shí)mAP值損失很低,檢測(cè)精度仍與原始YOLOv3網(wǎng)絡(luò)相當(dāng)。增大深度推理間隔可得到更高的幀率,但也會(huì)導(dǎo)致目標(biāo)檢測(cè)精度降低。
考慮到ILSVRC VID數(shù)據(jù)集中的測(cè)試序列長(zhǎng)度普遍較短,且在同一個(gè)測(cè)試序列中出現(xiàn)的目標(biāo)個(gè)數(shù)較少,大部分為單個(gè)目標(biāo)面積較大的視頻序列,其目標(biāo)檢測(cè)難度較低,因此,本文選取一段高速公路監(jiān)控?cái)z像頭拍攝的視頻進(jìn)行復(fù)雜場(chǎng)景下的多目標(biāo)檢測(cè)實(shí)驗(yàn)。從測(cè)試視頻中截取2幀相鄰的畫面,檢測(cè)結(jié)果如圖6所示。由圖6可以看出,在復(fù)雜場(chǎng)景下,當(dāng)視頻中出現(xiàn)多個(gè)目標(biāo)且每個(gè)目標(biāo)的面積均較小時(shí),本文算法依然具有良好的檢測(cè)效果,可以應(yīng)用于實(shí)際工程中。
圖6 測(cè)試序列中的視頻目標(biāo)檢測(cè)結(jié)果
本文提出一種基于YOLOv3的嵌入式平臺(tái)實(shí)時(shí)視頻目標(biāo)檢測(cè)算法。通過(guò)半精度推理策略和視頻目標(biāo)運(yùn)動(dòng)自適應(yīng)推理策略改進(jìn)原始YOLO算法在嵌入式設(shè)備上的性能,提高算法的檢測(cè)速度。實(shí)驗(yàn)結(jié)果表明,該算法在NVIDIA TX2嵌入式平臺(tái)上進(jìn)行單次推理的速度比原始YOLO算法快3倍以上,其在ILSVRC VID數(shù)據(jù)集上可實(shí)現(xiàn)28.2 frame/s的實(shí)時(shí)檢測(cè),且檢測(cè)精度與YOLOv3算法幾乎相同。下一步將繼續(xù)優(yōu)化YOLO算法在嵌入式平臺(tái)上的部署策略,以實(shí)現(xiàn)深度學(xué)習(xí)目標(biāo)檢測(cè)算法在更多設(shè)備上的應(yīng)用。