您好,登錄后才能下訂單哦!
在沒有采用GPU的情況下,有可能實現具有實時性能的對象檢測模型嗎?faced是一個概念證明,可以為在CPU上實時運行的單個類對象(在本例中為faced)構建自定義對象檢測模型。
問題是什么?
在許多情況下需要單個類對象檢測。這意味著我們想要檢測屬于圖像中特定類的所有對象的位置。例如,我們可以檢測面部識別系統的面部或需要跟蹤人員的面部。
更重要的是,大多數時候我們希望實時運行這些模型。為了實現這一目標,我們提供了以x為速率提供樣本的圖像,并且我們需要一個模型,用于每個樣本以低于x的速率運行。然后,我們可以在圖像可用時立即處理。
現在解決此任務(以及計算機視覺中的許多其他任務)的最容易訪問和使用的解決方案是在先前訓練的模型上進行轉移學習(通常在大數據集上訓練的標準模型,如Tensorflow Hub或TF Object Detection API中的那些)。
https://github.com/tensorflow/models/blob/master/research/object_detection/g3doc/detection_model_zoo.md
有許多訓練有素的對象檢測架構(例如FasterRCNN、SSD或YOLO)可以在GPU上運行的實時性能中實現令人印象深刻的準確性。
GPU很昂貴,但在訓練階段是必需的。然而在推理中,具有專用GPU以實現實時性能是不可行的。所有通用對象檢測模型(如上所述)都無法在沒有GPU的情況下實時運行。然后,我們如何重新審視單個類對象的對象檢測問題,以實現CPU的實時性能?
主要思想:簡單的任務需要較少的可學習特征
所有上述架構都設計用于檢測多個對象類(在COCO或PASCAL VOC數據集上訓練)。為了能夠將每個邊界框分類為適當的類,這些體系結構需要大量的特征提取。這轉化為大量可學習的參數,大量的過濾器,大量的層。換句話說,這個網絡很大。
如果我們定義更簡單的任務(而不是多類邊界框分類),那么我們可以想到網絡需要學習更少的特征來執行任務。檢測圖像中的面部顯然比檢測汽車、人員、交通標志和狗(都在同一模型中)更簡單。深度學習模型為了識別面部(或任何單個類對象)所需的特征量將小于同時檢測數十個類的特征量。執行第一個任務所需的信息少于后一個任務。
單個類對象檢測模型需要較少的可學習功能。參數越少意味著網絡越小。較小的網絡運行得更快,因為它需要更少的計算。
那么,問題是:我們可以在CPU上實現實時性能但保持準確性有多大?
faced的主要概念是:建立盡可能小的網絡(希望)在CPU中實時運行,同時保持準確性。
架構
faces是兩個神經網絡的集合,都是使用Tensorflow實現的。
主要網絡
faced的主要架構主要基于YOLO的架構。基本上,它是一個全卷積網絡(FCN),通過一系列卷積層和池化層運行288×288輸入圖像(不涉及其他層類型)。
卷積層負責提取空間感知特征。匯集層增加了隨后的卷積層的感知域。
架構的輸出是9×9網格(與YOLO中的13×13網格相比)。每個網格單元負責預測面部是否在該單元內(相對于YOLO,每個單元可以檢測多達5個不同的對象)。
每個網格單元具有5個關聯值。第一個是包含面部中心的單元的概率p。其他4個值是檢測到的面部(相對于單元)的(x_center,y_center,width,height)。
主要架構
確切的體系結構定義如下:
2×[288×288圖像上的8個過濾卷積層]
最大池(288×288到144×144特征圖)
在144×144特征圖上的2×[16個過濾卷積層]
最大池(144×144到72×72特征圖)
72×72特征圖上的2×[32個過濾卷積層]
最大池(72×72到36×36特征圖)
36×36特征圖上的2× [64個過濾卷積層]
最大池(36×36到18×18特征圖)
18×18特征圖上的2×[128個過濾卷積層]
最大池(18×18到9×9特征圖)
最大池(18×18到9×9特征圖)
9×9特征圖上的4×[192個過濾卷積層]
9×9特征圖上的5個過濾卷積層,用于最終網格
所有激活功能都是leaky_relu。
faced有6,993,517個參數。YOLOv2有51,000,657個參數。它的尺寸是YOLO尺寸的13%!
輔助網絡
(x_center,y_center,width,height)主網的輸出不如預期的那么準確。因此,實現了一個小型卷積神經網絡(CNN),以將包含面部的小圖像(用主體系結構輸出裁剪)作為輸入,并在面部的真實邊界框上輸出回歸。
網絡采用包含面部的裁剪并預測正確的邊界框
它的唯一任務是補充和改進主體系結構的輸出坐標。
該網絡的特定體系結構不相關。
數據集
兩個網絡都在WIDER FACE數據集上進行了訓練。
WIDER的多場景
"WIDER FACE數據集是一個人臉檢測基準數據集。我們選擇了32,203張圖像,標記了393,703張人臉,其尺寸、姿勢和遮擋程度都有很高的變化,如樣本圖像所示。
訓練
訓練是在Nvidia Titan XP GPU上完成的。訓練時間約需20小時。批量歸一化技術用于幫助收斂和丟失(以40%的速率)作為正則化方法以避免過度擬合。
推理和非最大抑制
當使用faced推理時,首先將圖像大小調整為288×288以便饋入網絡。圖像位于FCN下方,提供上述9×9網格輸出。
每個單元具有包含圖像的概率p。通過可配置的閾值過濾單元(僅保留p>t的單元)。對于那些保留的單元格,使用單元格(x_center,y_center,width,height)定位人臉。
在某些情況下,多個單元可以競爭同一個面部。假設面部中心位于4個單元格相交的確切位置。這4個單元可能具有更高的p(在單元內包含面部中心的概率)。如果我們保留所有單元格并投影每個單元格的面部坐標,那么我們將看到相同的面部周圍有4個類似的邊界框。這個問題通過一種稱為非最大抑制的技術得以解決。結果如下圖所示:
非最大抑制示例
性能 faced能夠在推理上達到以下速度:
考慮到YOLOv2在i5 2015 MBP上無法達到1FPS,相當不錯。
結果
讓我們看看一些結果!
面部圖像
現在讓我們看看faced和Haar Cascades之間的比較,這是一種不使用深度學習的計算機視覺傳統方法。兩種方法都在相似的速度性能下運行faced表現出更高的準確性。
Haar Cascades [左] vs faced [右]
faced怎么用?
faced是一個非常簡單的程序,既可以嵌入Python代碼中,也可以作為命令行程序使用。
登錄github庫可以獲得進一步說明:
https://github.com/iitzco/faced
結論
faced是一個概念證明,在場景中,你并不總是需要依賴于通用的訓練模型,因為這些模型對于你的問題和性能問題來說過于簡單。不要過高估計花費時間設計特定于你的問題的自定義神經網絡架構的能力。這些特定網絡將是比一般網絡更好的解決方案。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。