孫順遠,楊 挺
(1.江南大學輕工過程先進控制教育部重點實驗室,江蘇無錫 214122;2.江南大學物聯(lián)網(wǎng)工程學院,江蘇無錫 214122)
嵌入式儀表能夠測量、計算各種物理參數(shù)。隨著儀表的廣泛使用,使得人工讀數(shù)的成本不斷增加。使用更高效的方式進行儀表檢測成為新的研究熱點,其中基于圖像的儀表檢測得到了廣泛的關注。由于工業(yè)環(huán)境的復雜性,在雨、霧、強光等干擾嚴重的環(huán)境中使用傳統(tǒng)的圖像處理往往難以應對。而基于深度學習的目標檢測算法通過訓練極端環(huán)境下的圖像,能夠很好地解決此類問題。
針對儀表自動檢測問題,國內(nèi)外學者提出了多種檢測策略。邢浩強等[1]通過構(gòu)建9層卷積神經(jīng)網(wǎng)絡提取儀表特征以解決儀表目標的定位。徐發(fā)兵等[2]在YOLO9000[3]模型的基礎上添加濾波器和批量標準化,并且對于錨框尺寸的選取采用k-means聚類的方式,加快包圍框(Bounding box)的回歸。司朋偉等[4]利用Faster RCNN[5]網(wǎng)絡生成候選集,再將其中位于高置信度的目標區(qū)域經(jīng)過篩選建立特征模板,實現(xiàn)對儀表類型的識別與定位。文獻[6-7]利用形態(tài)學方式,增強目標區(qū)域特征以進行定位。
由于儀表體積普遍較小,在檢測時往往會出現(xiàn)漏檢的現(xiàn)象。因此,加強對于小目標的檢測至關重要。YOLOv3[8]使用了復雜的DarkNet-53來提取特征,并且加入特征金字塔網(wǎng)絡 (FPN),提升了小物體的檢測精度。DSSD[9]利用反卷積來提取更多上下文信息。DSOD[10]中將基礎網(wǎng)絡由VGG-16變?yōu)镈enseNet[11],使得模型可以從零開始訓練并收斂。FSSD[12]借鑒了特征金字塔網(wǎng)絡的思路,將網(wǎng)絡較低層的特征引入到較高層當中,提升了小物體的檢測精度。RSSD[13]中增加池化和反卷積,提升了特征金字塔中各個分支的通道數(shù)。
對于儀表讀數(shù)識別問題,陳剛等[14]將數(shù)碼字符切割后進行七段特征檢測,以進行儀表數(shù)碼的快速識別。劉晶[15]利用連通域的方式實現(xiàn)對圖像區(qū)域的定位分割,采用OAO分類將其拓展到多分類以實現(xiàn)數(shù)字識別。
在儀表定位和類型判別中,為加快模型運行速度,提高算法準確率,不僅要降低計算量,還要改進優(yōu)化策略。本文主要的改進如下:(1)將ResNet-50[16]作為基礎網(wǎng)絡,不僅降低了模型的大小和計算復雜度,而且可以充分提取圖片的特征。(2)加入特征金字塔網(wǎng)絡結(jié)構(gòu),將底層中的細節(jié)信息與高層中的語義信息進行結(jié)合。(3)使用GIoU[17](generalized intersection over union)作為評判預測框與真實框的距離指標,并將其作為損失函數(shù),使得包圍框(Bounding Box)的回歸更高效。
在使用目標檢測算法確定數(shù)字式儀表位置后,通過構(gòu)建4層卷積神經(jīng)網(wǎng)絡提取數(shù)字特征。在數(shù)字識別時,先對儀表圖像進行預處理,濾除表盤周圍的文字和噪聲,再對其進行二值化、輪廓檢測、提取數(shù)字區(qū)域,最后利用網(wǎng)絡讀取示數(shù)。
SSD(single shot multibox detector)網(wǎng)絡結(jié)構(gòu)由基礎網(wǎng)絡VGG16增加6個卷積層和檢測網(wǎng)絡2部分組成,分別用于特征提取和多尺度的預測。網(wǎng)絡結(jié)構(gòu)如圖1所示。
圖1 SSD算法框架圖
SSD中引入預選框(default box),抽取網(wǎng)絡中的6張?zhí)卣鲌D,并以每個點為中心,生成一系列同心的預選框。再將中心點的坐標乘上步長,將其映射到原始圖片。其中第1、5和6張?zhí)卣鲌D上生成4個預選框,其余特征圖上生成6個預選框,一共生成8 732個預選框。
SSD的損失函數(shù)與其他目標檢測算法相似,整個損失函數(shù)分為2部分:預選框與真實框的類別損失(confidence loss)以及定位損失(localization loss),公式如下所示:
(1)
式中:Lconf(x,c)為類別損失值;Lloc(x,l,g)為定位損失值;N指用于前景分類的默認框;α為定位損失占總損失值的權(quán)重。
在測試階段,SSD網(wǎng)絡預測出預選框的偏移量,通過解碼求出預測框的位置。將置信度超過閾值的預測框篩選出來,并對其進行非極大值抑制(NMS),最終得出檢測結(jié)果。
1.2.1 基礎網(wǎng)絡改進
為了在不降低模型運行速率的前提下提高準確率,需要選擇模型復雜度不高的基礎網(wǎng)絡。因此,在PyTorch框架下對VGGNet、GoogLeNet、ShuttleNet、MobileNet、Inception和ResNet進行測試,運行環(huán)境為NVIDIA GTX 1080,測試集為ImageNet2012,批量大小為32,結(jié)果如表1所示。
表1 分類網(wǎng)絡在ImageNet2012下的對比
其中FLOPs代表了網(wǎng)絡需要的浮點計算數(shù),其數(shù)值越大代表著網(wǎng)絡的復雜度越高,往往運行的速度會變慢,占用的內(nèi)存變大。從表1中可知原本的基礎網(wǎng)絡VGG-16計算量大,精度不高,而GoogleNet、ShuffleNet 和MobileNet-v2 雖然計算量小了,但是精度沒有提升。使用Inception-v3后,精度得到了提升,但是速度變慢很多。
最后,為了在保證速度的前提下,提高網(wǎng)絡的精度,本文選取ResNet-50作為基礎網(wǎng)絡。
1.2.2 特征金字塔網(wǎng)絡
對于卷積神經(jīng)網(wǎng)絡,不同深度對應不同層的語義信息。底層分辨率較高,感受視野小,學到的主要是細節(jié)信息,高層分辨率低,感受視野大,主要是語義信息。SSD算法雖然復用了不同層上的特征圖,但是并沒有將底層和高層的特征融合,這導致了極大的語義間隔,其網(wǎng)絡結(jié)構(gòu)如圖2(a)所示。
特征金字塔原理:先從下采樣中抽取一部分特征圖,并對其進行上采樣,構(gòu)建自頂向下的通道,再將上采樣的特征圖與原特征圖進行融合,最后利用融合的特征圖進行預測,其網(wǎng)絡結(jié)構(gòu)如圖2(b)所示。使用特征金字塔網(wǎng)絡,將細節(jié)信息和語義信息進行融合,可以進一步提高分類和定位的準確率。
圖2 特征提取方法的對比
1.2.3 定位損失函數(shù)改進
IoU是目標檢測中的重要概念,在基于錨框的檢測框架中,它不僅可以用來確定正負樣本,而且可以用來判斷預測框與真實框之間的距離。在SSD的位置回歸任務中,判斷預測框與真實框之間距離最恰當?shù)闹笜司褪荌oU,但是采用Smooth L1 loss的回歸損失函數(shù)卻不適合,如圖3所示,在Smooth L1 loss和Smooth L2 loss損失值相同的情況下,位置回歸的效果卻相差甚遠。
圖3 位置回歸中不同評價指標的值
然而直接使用IoU作為損失函數(shù)會出現(xiàn)2個問題:(1)當預測框與真實框交集為0時,根據(jù)定義得IoU=0,此時梯度為0,無法回傳訓練。(2)IoU不能正確反映2個框是如何重疊的。如圖4所示,此時IoU的值都是0.33,但是它們的回歸效果是不一樣的,左側(cè)的效果最好,右側(cè)的效果最差。
圖4 相同IoU值下的回歸效果
考慮到使用IoU作為損失函數(shù)導致的問題,本文采用GIoU作為指標。IoU和GIoU具體表達式如下:
(2)
GIoU=IoU-|C(A∪B)|/|C|
(3)
GIoU作為損失函數(shù)時,計算公式如下所示:
LGIoU=1-GIoU
(4)
式中:A為預測框的面積;B為真實框的面積;C為能同時包圍2個框的最小區(qū)域的面積。
GIoU與IoU相比主要優(yōu)勢為:IoU的取值范圍是[0,1],而GIoU取值范圍為[-1,1]。當預測框與真實框重合的時候取到1,當兩者之間不相交且距離無限遠時取最小值-1。IoU只關注重疊區(qū)域,而GIoU不僅關注重疊區(qū)域,還關注其余非重疊區(qū)域,因此GIoU能夠更好的衡量2個框之間距離。
在進行數(shù)字檢測前,首先訓練模型,訓練集為0~9的圖片共50張,像素均為28×28,部分數(shù)據(jù)集如圖5所示,構(gòu)建4層卷積網(wǎng)絡如表2所示,最后經(jīng)過2次全連接層,輸出為10×1的向量。采用AdamOptimizer優(yōu)化方法,一共迭代500次。
圖5 訓練集部分數(shù)據(jù)
表2 特征提取卷積層參數(shù)
訓練結(jié)束后,對圖像進行預處理。先將圖像變?yōu)榛叶葓D,再進行二值化,接著對其進行開運算,以消除數(shù)碼管之間的間隙。最后加載權(quán)重讀取儀表示數(shù)。運行結(jié)果如圖6所示。
圖6 數(shù)字儀表檢測
本文實驗在Ubuntu 16.04 LTS、CUDA10.0、cuDNN7.5、NVIDIA GeForce GTX 1080的系統(tǒng)下進行,深度學習框架是PyTorch 1.1.0,環(huán)境語言為python3.6。使用VOC數(shù)據(jù)格式對800張儀表圖像進行標注并訓練,在200張儀表圖像上進行測試。使用小批量隨機梯度下降(SGD)進行訓練,動量設置為0.9,初始學習率為0.001,權(quán)重衰減率為0.000 5,最小批量是16。當?shù)螖?shù)到達6 000、8 000、10 000時學習率降為先前的1/10,一共訓練200個epoch。
在目標檢測中,常使用平均精度(mAP)作為評價不同算法精度的指標。其主要由查準率和查全率組成,公式分別為:
(5)
(6)
式中:precision為模型預測為正例中真正例的比率,即預測的準確性;recall為所有正例中被正確預測出的比率;TP為真正例,指模型正確預測出物體;FP為假正例,指模型預測錯誤,預測出不存在的物體;FN為假反例,指模型漏檢,沒有預測出物體。
在一個類別中對預測結(jié)果排序,可以得到一條查準率-查全率(precision-recall)曲線,曲線下的面積即為AP值,對所有類別的AP值求平均,可得mAP值。實驗結(jié)果如表3所示。
表3 不同算法在測試集下的結(jié)果
由表3可知,在分辨率為300×300情況下,改進后的SSD與改進前相比mAP提升了4.6%,運行速度也稍有提升。圖7為使用改進SSD算法后在測試集上的檢測圖,在保證速度的前提下,能更精確的識別目標。
圖7 儀表定位檢測
在200張儀表圖像中數(shù)字共有763個,利用本文算法對其進行數(shù)字檢測,得到98.3%識別率,檢測效果如圖8所示。
圖8 儀表讀數(shù)
本文提出了基于SSD的改進算法,將基礎網(wǎng)絡由VGG-16變?yōu)镽esNet50,在保證速度的前提下提取圖片中更多特征信息。加入特征金字塔結(jié)構(gòu),將圖片中的語義信息與細節(jié)信息進行融合,提高了模型對于小目標的檢測精度。最后,引入GIoU這一評估指標,不僅關注預測框與真實框的重疊區(qū)域,還關注非重疊區(qū)域,使用GIoU Loss作為損失函數(shù)使得位置回歸更加準確。在表盤數(shù)字檢測中,利用卷積神經(jīng)網(wǎng)絡充分提取數(shù)字特征。實驗結(jié)果表明,本文提出的算法在NVIDIA GeForce GTX 1080環(huán)境、儀表測試集上達到78.9 mAP,數(shù)字識別率達到98.3%,此算法檢測效果好。后續(xù)將繼續(xù)簡化模型,提升算法的運行速度與檢測精度,以應對更為復雜的場景。