文/程劍 劉海濤 張琦珺
目標檢測作為圖像處理和計算機視覺領域的重要課題,在警戒安防、交通監控、人機交互等工程應用中扮演著重要的角色。受限于光照、角度、遮擋等因素,傳統檢測算法在復雜的工程環境下表現鮮有出彩。
2014年基于候選區域的深度學習檢測算法R-CNN一經提出,其以驚艷的檢測效果擊敗了一眾經典算法,一舉奪得了目標檢測領域的頭籌。此后此類算法得到了研究者們的重點關注,短時間內獲得飛速長足的發展。先是出現了R-CNN的改進算法Fast R-CNN、Faster R-CNN,后又有基于回歸的檢測方法,如YOLO、SSD、YOLOv2、DSSD、YOLOv3等,在保證準確率的前提下,也滿足了工業實時性的要求。
如今在要求穩定精準快速的目標識別工程項目上,深度學習檢測算法已經不可或缺。籠統來說,這些檢測算法都需要將輸入圖像經過深層的卷積神經網絡提取出高維特征,再利用這些特征來定位和分類圖像中物體。以YOLOv3為例,基礎網絡和yolo網絡共有105層,其中含有大量矩陣卷積操作,浮點計算量相較于經典算法不可同日而語。因此,深度學習算法往往需要運行在高性能的GPU服務器上,這就為實際工程應用帶來了不便。往往在項目中,既要滿足算法速度和精度的要求,也要考慮到復雜苛刻的工程環境以及系統部署的方便簡易性,同時還要兼顧成本和功耗,如何在移動端平臺AI芯片上實現實時的深度學習檢測算法便顯得尤為重要,成為了當下的研究熱點。
目前的AI芯片大致可以分為兩類。第一類是一種協處理器,獨立于主處理器之外,只用來專門計算神經網絡前向過程,一般價格低廉且通用性強;第二類則是將CPU、GPU、DSP等都集成到SoC中,這樣內部數據在各種計算內核之間的遷移得到優化,整體流程耗時降低,且一般體積更小、功耗更低。
本文以地鐵站客流統計為例,在服務器上訓練出SSD模型,利用SNPE SDK (Snapdragon Neural Processor Engine SDK)將模型轉為Kryo和Adreno支持的dlc(Deep Learning Container)格式,運行于高通驍龍835芯片上。另外對模型做了針對性的優化,降低了在手機上運行時的內存需要和時間損耗,增強了模型的抗虛警能力。實驗結果表明,算法檢測結果準確,每幀檢測耗時約45ms,滿足工程應用要求。
SSD是Wei Liu在ECCV 2016上提出的一種one-stage目標檢測算法。區別于R-CNN的先提取候選區域再分類的流程,SSD的整個檢測過程只需要一步,在一次前向過程中就能完成預選框選擇、預選框特征提取、目標分類、目標定位這些操作。SSD的結構使其便于訓練和優化,同時也提高了檢測速度。
SSD的網絡結構如圖1所示,可以看出網絡由兩個部分構成。左側的VGG-16為SSD的基礎網絡,主要負責對圖像做卷積操作,加深網絡以提高擬合性能。其中的Conv4_3層與右側增加的5個特征層則每層產生三個輸出,直接作用到目標識別。第一個輸出是預選框的坐標和回歸權值參數第二個輸出是經過一次批標準化(batch norm)和卷積后產生的給預選框分類的置信度向量第三個輸出同樣需要經過一次批標準化和卷積,用于給預選框坐標回歸,其中n為預選框的序號,假設該層共產生預選框N個,則。
經過一次網絡前向后便能得到上述的輸出。由于置信度向量遵循softmax原則,因此有:

挑選出每個預選框中最大置信度對應的序號k,即為該預選框的類別。再通過預選框坐標和其回歸向量,即可計算出真實目標位置,對每一個預選框,計算方法如下式2所示:

SSD利用了6層特征來生成、調整、分類預選框,最后經過非極大值抑制的篩選即可獲得正確的目標位置信息,由于多尺度的特征映射在原圖上代表不同感受野,因此SSD的特征金字塔結構使其檢出率得到進一步提升。
SNPE是高通公司專門為運行神經網絡設計的處理引擎,可以使神經網絡模型運行在GPU上,速率比CPU快4倍。用戶在訓練生成自己的模型后,利用官方提供的SDK轉成指定格式方可運行于GPU上。然而目前SNPE只支持Caffe、TensorFlow、Caffe2三種框架,且僅能加速指定的一些層,當用戶模型中出現了支持列表之外的層時,可以利用SNPE提供的用戶自定義接口予以完善。
SNPE作為一個為集成AI芯片提供神經網絡加速服務的引擎,為實現移動端平臺的目標檢測提供了便利。
本文利用SNPE在驍龍835芯片上實現目標檢測的開發工作流程如圖2所示。
首先在服務器上基于開源的Caffe框架設計并訓練一個SSD檢測模型。接下來利用SNPE(版本 1.15.0)提供的SDK接口,將模型的網絡配置文件和網絡權重文件合并后轉換為dlc格式,在SNPE上成功加載并在GPU內核上運行。圖中虛線以上部分的工作是可以在移動設備之外調試進行的,虛線以下則只能在移動端設備上完成。

圖1:SSD卷積神經網絡結構
正如第2節所說,SNPE作為一個問世不久的產品,目前功能尚不完善,還不支持對某些類型層的加速,本文生成的SSD模型中的“detection_out”層便不被支持。為了讓模型得以順利移植,本文在網絡中截去了這一層,并在SNPE之外單獨實現。“detection_out”層是整個網絡的輸出層,其層類型為“DetectionOutput”。該層獲取三個輸入:預選框分類的置信度向量;預選框坐標回歸向量;預選框的坐標和回歸權值參數。將這三個參數按照式2計算,即可得到真實目標的位置和類別信息,所以想要在網絡構架外重新實現該層,也需要同樣從網絡獲得這三個向量。因此我們在網絡最后新增一個concat層,連接“mbox_соnf_flаttеn”層和“mbox_loc”層,這樣整個模型在SNPE上做完前向之后,便可以得到上述的前兩個向量。至于第三個向量預選框的坐標則只和輸入圖像尺寸以及網絡結構相關,所以可以事先確定好,解析真實值時直接調用即可。
上小節討論了如何在移動端設備移植運行目標檢測算法,但由于SSD算法本身為服務器端設計,模型的尺寸結構相對于移動端設備而言太大,過于冗余復雜的結構會導致模型體積變大、輸出維數變高、運行時間變長等問題。為了使算法得以高效運行,本文對生成的SSD模型分別從基礎網絡選型和預選框篩選這兩個方面作了優化。
3.2.1 基礎網絡選型
正如第1節所論述,SSD模型結構由兩部分組成:基礎網絡和附加網絡。附加網絡是SSD的核心所在,實現了其特征金字塔等特性,所以一般其結構不予更改,而基礎網絡則只是負責提取特征所用,因此可以選用各種經典或新近的卷積神經網絡,例如VGG-16、Resnet、Densenet等,基礎網絡的選擇直接影響到了SSD的性能和計算復雜度。本文選用了Mobilenet[9]作為基礎網絡,顧名思義,該網絡設計初衷就是為了能在移動端便捷使用。Mobilenet與一般的卷積神經網絡不同,其基本單元是深度級可分離卷積,在相同權值參數數量的情況下,能減少數倍的計算量。自2017年首次發表之后,迄今論文應用量已逾900。

圖2:移動平臺檢測算法開發流程

圖3:SSD選取預選框的規則
3.2.2 預選框篩選
從式2可以看出,真實目標的位置信息是通過對預選框作坐標偏移得來的,因此預選框設置的合理準確與否直接影響到了最終結果。SSD的特征層生成預選框的規則如圖3所示。

圖4:地鐵客流統計待檢圖

以本文選用的Mobilenet為例。Mobilenet共計28層,我們利用了其中的6層特征用來目標檢測,假設輸入圖尺寸為300×300,這6層特征層尺寸分別是 19×19、10×10、5×5、3×3、2×2 和 1×1,而除了第一層沒有且只有1個外,其余5層都有且為2。由式3可計算得預選框數目為(1083+600+150+54+24+6),共1917個。圖4為地鐵站客流統計項目的一張待檢圖,可以看出該場景人群比較密集,人與人之間存在大幅重疊情況,因此只能通過檢測人頭來確定流量。
本文中,算法的主要目的是檢測站臺內出現的人頭數目,因此對于待檢目標的尺寸和位置已經有了先驗知識。我們知道人頭在整幅圖像中所占比例偏小,大多數近似正方形狀,且不會出現在圖中左上方劃線的區域,同時考慮到特征層越深,負責檢出越大目標的原則,本文對SSD的后5層預選框作了削減,刪去了所有同時也刪去了中心點位于劃線區域里的預選框,預選框數目從1917變為了922,約減少為原本的一半。經過篩取之后,模型的concat層的輸出維數大大降低,后續對預選框的選擇、調整和非極大值抑制等處理也減少了資源開銷,同時由于對預選框的位置做了限制,不應該出現目標的地方產生虛警的概率便大大降低,這些都為模型能在移動端平臺快速高效準確的運行產生積極影響。
本文算法運行于驍龍835芯片,詳細配置信息如下:

測試數據集為200張類似于圖4的地鐵站臺監控圖。在上述測試條件下,算法平均每幀耗時約45ms,而mAP(mean Average Precision)達到了0.723。
相比較于傳統經典算法,基于深度學習的目標檢測算法在精確性、魯棒性、泛化性等方面更有優勢,但深度學習算法往往需要運行在計算能力強大的服務器上,考慮到實際工程項目中對場地、資金預算、功耗的苛刻要求,深度學習目標檢測算法反而應用場景不多。本文實現了在移動端平臺的深度學習目標檢測算法,經數據集測試每幀處理速度約45ms,mAP為0.723,滿足一般實時性和精確性要求,對相關領域方面的研究具有一定啟發意義。