張濤
(四川大學計算機學院,成都610065)
目標檢測是目前計算機視覺領域一個極為重要的分支,在實際的生產(chǎn)中應用極為廣泛。目標檢測的主要目的是將輸入的圖像中的物體檢測出來,得到該物體的具體類別、位置坐標信息以及其相應的置信度。隨著2012年AlexNet[1]在ImageNet圖像識別比賽中的碾壓式勝出,通過構建以CNN網(wǎng)絡的形式深度學習模式開始大放異彩。隨著深度學習的高速發(fā)展,目標檢測也搭上了深度學習的快車。從此,目標檢測進入了新的時代。
首先,RBG的Faster R-CNN[2]開啟了目標檢測的新時代,目標檢測進入了two-stage時代。此后,各種目標檢測框架如雨后春筍般出現(xiàn),如YOLO[3]、SSD[4]、RetinaNet[5],等等,為目標檢測領域注入了鮮活的血液。目前,目標檢測框架基本上都呈現(xiàn)出端到端的訓練方式,即只需要在神經(jīng)網(wǎng)絡的輸入端喂入數(shù)據(jù),便可以直接在輸出端得到想要的結果。這使得以神經(jīng)網(wǎng)絡作為托底的目標檢測變得十分的簡單易用,我們只需要制作好自己的數(shù)據(jù)集,便完全可以將整個神經(jīng)網(wǎng)絡當做一個黑盒來進行處理。
在家兔解剖實驗過程中,我們需要針對解剖過程的每一步,都做相應實驗的正確性判斷。這就需要我們首先將家兔和一些操作器具檢測出來,再進行相應的邏輯判斷。由于深度學習在目標檢測的應用中已經(jīng)十分成熟,我們將采用深度學習的方式進行檢測。
與此同時,由于目標試驗臺的機器性能較弱,缺少GPU的支持,只能依靠CPU進行模型的推理。所以,這就要求我們找到一個模型復雜度低,但識別精確度不降的目標檢測框架,正是基于以上的諸多考量,最終采取了以MobileNet[6]為骨干網(wǎng)絡的SSD作為目標檢測框架。
首先,需要對圖片數(shù)據(jù)進行分析,主要是包括類別數(shù)量的分布,類別的長寬比分布,通過分析來判定是否存在較大的尺度差異性,是否存在小目標以及類別是否存在嚴重的不均衡性。
在我們的數(shù)據(jù)集中,需要進行識別的物體一共為5類:家兔、操作者的手、止血鉗、家兔傷口以及家兔耳朵。這幾類物體都屬于大物體,且尺度都較為統(tǒng)一,屬于比較規(guī)則的數(shù)據(jù)集。神經(jīng)網(wǎng)絡網(wǎng)絡對于大目標的檢測游刃有余,我們只需要更多地關注訓練出來的模型的泛化能力。所以,我們需要采集不同的場景下的圖像,使得模型都能正常工作。
數(shù)據(jù)集中的圖像主要分為以下四場場景:①光線昏暗的環(huán)境;②光線很強,色調為白色的環(huán)境;③光線很強,色調為黃色的環(huán)境;④光線正常的環(huán)境。
圖1 四種常見的數(shù)據(jù)場景
由于數(shù)據(jù)之間存在較為明顯的色調差距,直接將數(shù)據(jù)進行輸入訓練,顯然魯棒性不足。因此,我們除了對數(shù)據(jù)進行常規(guī)的數(shù)據(jù)增強處理之外,還主要針對以上場景做了一些特別的處理,例如:隨機變換圖像亮度;隨機變換圖像的顏色通道;隨機變換圖像的對比度;隨機變換圖像的飽和度;隨機變換圖像的色度等等。這么做的主要目的是為了將色調和飽和度對于訓練過程的干擾降到最小。
隨著基礎骨干網(wǎng)絡的發(fā)展,從VGG[7]、GoogLeNet[8]、ResNet[9]……基礎網(wǎng)絡的深度變得越來越深,緊隨而來的就是模型參數(shù)量的大幅上升,這就意味著模型的訓練所需要的花費的時間將變得越來越久。這些龐大的模型在缺少GPU或移動或嵌入式設備上是很難被應用的。這些模型參數(shù)量過于龐大,這些設備往往面臨著內存不足、處理器性能弱的問題。但這些場景又需要做到低延遲,即響應速度快。這就陷入了矛盾的境地。
我們在衡量一個模型的時,除了要考慮其精度之外,還需要考慮其復雜度。而模型的復雜度主要體現(xiàn)在以下兩個方面:①計算量,②參數(shù)個數(shù)。
針對計算量,在深度學習中有一個概念:FLOPs,即Floating Point Operations(浮點運算數(shù)量),它主要反映的是模型所需要的算力。若不考慮激活函數(shù)的情況下,一個卷積層的運算量為:
其中,Ci:輸入通道,K:卷積核大小,HW:輸出的特征圖大小,C0:輸出通道
參數(shù)量則主要用于衡量模型所需要的內存大小,而參數(shù)量的大小輸入圖像大小無關,它是模型本身的屬性。
表1 常見基礎網(wǎng)絡模型復雜度
為了解決以上痛點,主流的研究方法分為以下兩種:①針對已經(jīng)訓練好的模型,可以采取量化的方式,將復雜的模型進行壓縮,從而得到較小的模型;②從頭設計新的基礎網(wǎng)絡進行訓練,從而得到模型。這兩種方式都是在保證模型精度不變的基礎上,適當降低模型的參數(shù)量,從而提升模型的訓練和推理能力。
Google提出的MobileNet就是基于以上的第二種思路,引入了深度可分離卷積,即可以分為Depthwise convolution和Pointwise convolution兩種操作。其中,Depthwise convolution針對每個輸入通道采用不同的卷積核,即一個卷積核對應一個輸入通道;而Pointwise convolution則是采用1×1卷積核的普通卷積。其大致結構如圖2。
采用以上結構,整個網(wǎng)絡的參數(shù)量得到大幅降低。
SSD目標檢測算法是一種one-stage算法,它的主要創(chuàng)新之處在于:①SSD利用基礎網(wǎng)絡,提取了不同尺度的feature map來進行檢測,即在大的feature map上來檢測小物體,在小的feature map上檢測大物體。這是因為隨著網(wǎng)絡層數(shù)的加深,提取出來的feature map所包含的語義信息也會更加多,但位置信息也會損失較為嚴重。②SSD將Faster R-CNN中的anchor引入了進來,預設不同尺度和長寬比的先驗框。
圖2 標準卷積與Depthwise卷積的區(qū)別
圖3 SSD原理
SSD利用多尺度feature map來進行檢測,可以更好地利用神經(jīng)網(wǎng)絡的特性。加入預設的anchor機制,我們可以根據(jù)先驗知識來預設anchor的大小,從而可以是得檢測框架得到更加精確地檢測結果。
采用MobileNet-SSD作為檢測框架,是因為在沒有GPU的情況下,只采用普通CPU作為神經(jīng)網(wǎng)絡的推理引擎,這不得不促使我們尋求一種較為簡單的模型,其必須具備在不丟失精度的情況下,盡可能保證模型推理的速度。利用MobileNet作為backbone,可以大幅地降低模型的參數(shù);利用SSD的預設先驗框,可以更加精確地框選出待檢測物體。
MobileNet作為骨干網(wǎng)絡,可以大幅地降低原論文中以VGG作為骨干網(wǎng)絡時模型的復雜度。利用MobileNet提取出圖像的多層特征圖,我們再在多層特征圖上預設檢測框,最后利用非極大值抑制的方法,得到得分最高的檢測框,便是該物體的最佳檢測結果。
本文使用的數(shù)據(jù)集為8100張1920×1080的圖片,經(jīng)過精細標注、分類后,將數(shù)據(jù)集按7:2:1的比例分為訓練集、驗證集和測試集。在Intel Core i7 4790 CPU,32 GB RAM,NVIDIA GTX 1080Ti顯卡的實驗環(huán)境下,采用學習率lr=0.001,迭代訓練80000次。利用訓練得到的模型,我們在沒有GPU的Intel Core i5 9400f的主機上,跑出平均40fps的速度,且識別精度可以達到99%,基本上不存在漏檢或者誤檢。
圖4 MobileNet-SSD模型結構圖
同時,我們也進行了對比,如果利用VGG或者ResNet作為骨干網(wǎng)絡,則速率會大幅度降低,平均只能達到12fps,沒有辦法達到實時的效果。正是因為MobileNet巧妙的設計,使得整個模型的參數(shù)量大幅降低,在沒有GPU并行加速的環(huán)境下,利用CPU依然可以實現(xiàn)模型的快速推理。
圖5 實驗結果圖
本文主要是針對特定場景下,利用目標檢測框架,在保證檢測精度的情況下,引入更為輕量級的模型,使得我們可以在硬件條件受限的條件下,發(fā)揮出深度學習模型的優(yōu)勢。通過訓練深度學習模型,我們可以將模型應用到更加廣泛的、從未見過的場景下。利用MobileNet作為整個模型的backbone,可以大幅地降低模型的復雜度,為深度學習的應用帶來了更大的優(yōu)勢。由于本身數(shù)據(jù)集并不是很復雜,不存在非常多的小目標,所以神經(jīng)網(wǎng)絡顯得游刃有余。但業(yè)界目前對于像MS COCO這樣的數(shù)據(jù)集,里面包含了非常多的小目標,場景也極為復雜,十分貼合日常場景,諸多目標檢測方法仍很難達到十分高的精確度。