SSD MultiBox 了解 - 基于深度學習的實時目标檢測
[原文-Understanding SSD MultiBox — Real-Time Object Detection In Deep Learning]
該部落客要對 SSD MultiBox 目标檢測技術進行介紹. 希望對于 MultiBox 算法以及 SSD 有更好的了解.
Figure 1. End-to-end 目标檢測例示[From Microsoft].
自從 2012 ImageNet Large-Scale Visual Recognition Challenge(ILSVRC) 中,AlexNet 相比較傳統計算機視覺(CV)方法,取得了較突出的成績,深度學習已經成為圖像識别任務中的主流方法. 在 CV 領域,CNN 擅長處理圖像分類任務. 圖像分類任務是基于類别标記的圖檔資料集,根據給定類别(classes),如 cat、dog 等,采用 CNN 網絡檢測圖檔中的物體類别.
Figure 2. cats 和 dogs 圖檔 [From Kaggle]
如今,深度學習已經比人類在圖像分類具有更高的準确度. 然而,人類不僅對圖檔分類,還對視野内的每個物體進行定位(localize)與分類(classify). 這就對于機器來說,想達到人類的表現,具有很大的挑戰. 實際上,如果目标檢測精度較高,則能使得機器更接近真實的場景了解.
Figure3. 圖檔是隻有 cat?還是隻有 dog? 或者兩者都有?[From Kaggle]
1. R-CNN(Region-Convolution Neural Network)
R-CNNs 是深度學習在目标檢測任務的較早應用.
寬泛來講,R-CNN 是 CNN 的一種特殊形式,能夠對圖檔中的 objects 進行位置确定和類别檢測. R-CNN 的輸出,一般是一系列的 bounding boxes 和每個檢測到的 object 的類别标簽. Bounding box 是對每個檢測到的 object 的近似比對. 如:
Figure 4. R-CNN 的輸出例示.
延伸:
- R-CNN
- Fast-R-CNN
- Faster-R-CNN
這些工作都在将 R-CNN 往更快、實時目标檢測的方向努力. 雖然目标檢測結果已經很好,但仍不是實時目标檢測器. 其遇到的主要問題有:
- 資料訓練不夠靈活,且比較耗時;
- 訓練是多階段(multiple phases)的,two-stages 方法,如 region proposal 訓練和分類器(classifier)訓練;
- 網絡模型的部署時間太慢,在測試資料集上.
新的網絡架構被提出,以克服 R-CNN 類方法的局限,如 YOLO - You Only Look Once 和 SSD - Single Shot Detector MultiBox . 下面即将對 SSD 進行介紹.
2. SSD - Single Shot MultiBox Detector
SSD 是 2016 年 11 月 C. Szegedy 等提出的方法,在目标檢測任務的實時性和精度方面達到了新的記錄 —— 在标準資料集上,如 PascalVOC 和 COCO,取得了 74% mAP(mean Average Precision),59 幀/秒.
為了更好的了解 SSD,這裡先對網絡結構名字解釋:
- Single Shot - 網絡一次 forward 來輸出 object localization 和 classification.
- MultiBox - Szegedy 等提出的一種 bounding box regression 技術.
- Detector - 網絡是目标檢測器,同時對檢測到的 objects 分類.
網絡結構:
Figure 5. SSD 網絡結構(input 是 300x300x3)
SSD 網絡結構是基于 VGG16 網絡的,去除了全連接配接層. 采用 VGG16 作為 base network 的原因是其在圖像分類任務的良好表現,以及其應用普遍性,遷移學習(transfer learning) 對于提升結果精度更有利. 去除原始 VGG 全連接配接層,而添加一系列輔助卷積層(從 conv6 卷積層開始),能夠提取多種尺度(multiple scales)的特征,并逐漸地降低後面層的輸入尺寸.
Figure 6. VGG 網絡結構 (input 是 224x224x3)
3. MultiBox
SSD 的 bounding box regression 是受 Syegedy 的 MultiBox 啟發. MultiBox 是一種快速的類别不可知(class-agnostic)邊界框坐标(bounding box coordinate) proposals 方法. 有趣的是,MultiBox 是采用的 Inception-style 的卷積網絡. 1×1 1 × 1 卷積起降維作用(width 和 height 保持不變).
Figure 7. MultiBox 的 location 和 confidence 多尺度卷積預測網絡結構
MultiBox 的 loss 函數包括兩部分(SSD同樣采用):
- Confidence Loss - 計算的 bounding box 内的 object 的類别置信度. 采用類别交叉熵( cross-entropy) 計算損失函數.
- Location Loss - 計算訓練集中網絡預測的 bounding box 與對應 ground truth box 的偏移程度. 采用 L2-Norm 計算損失函數.
MultiBox Loss 即為:
multibox_loss=confidence_loss+alpha∗location_loss m u l t i b o x _ l o s s = c o n f i d e n c e _ l o s s + a l p h a ∗ l o c a t i o n _ l o s s
其中 alpha a l p h a 參數控制兩個 loss 的貢獻度.
類似于其它深度學習任務,MultiBox 的目标是計算loss 函數的最優解時的參數值,使預測值盡可能的接近真實值.
4. MultiBox Priors 和 IoU
bounding box 生成.
MultiBox Priors,也被叫做 anchors(Faster RCNN),是預計算的,其是與原始 groundtruth boxes 分布很接近的固定尺寸的 bounding boxes.
MultiBox Priors 是根據其與 groundtruth boxes 的 IoU (Intersection over Union ratio) 大于 0.5 選取的.
雖然 IoU 大于 0.5 仍不夠好,但能夠為 bounding box regression 算法提供可靠的初始化 boxes,尤其是與随機坐标選取的 初始化 bounding boxes.
Figure 8. IoU 圖示(From Wikipedia)
是以,MultiBox 采用 Priors 作為預測的初始化 bounding boxes,并回歸與 groundtruth boxes 最接近的預測 boxes.
MultiBox 網絡結構,每個 feature map 單元包括 11 個 Priors(8x8, 6x6, 4x4, 3x3, 2x2)和隻有一個 1x1 的 feature map,最終每張圖檔得到共 1420 個 Priors,基本上包括了輸入圖檔的多種尺度(multiple scales) 範圍,以檢測不同尺寸的物體.
最終,MultiBox 隻保留 top K 的預測結果,其具有最小的 location(LOC) 和 confidence(CONF) losses.
5. SSD 對 MultiBox 的改進
5.1 Fixed Priors
與 MultiBox 不同的是,SSD 中每個 feature map 單元與一系列預設 bounding boxes 集相關聯,這些預設 bounding boxes 具有不同的次元和長寬比(dimensions and aspect ratios).
這些 Priors 是手工選取的;而 MultiBox 采用與 groundtruth boxes 的 IoU 大于 0.5 進行選取的.
理論上,SSD 能夠生成任何類型的輸入,而不需要對 priors 生成的預訓練階段.
例如,假設每個 feature map 單元有 b b 個 bounding boxes,每個預設 bounding box 配置了對角線的 2 個點 (x1,y1),(x2,y2)(x1,y1),(x2,y2),待分類目标類别數 c c , 給定的 feature map 尺寸為 f=m×nf=m×n,SSD 将計算該 feature map 的 f×b×(4+c) f × b × ( 4 + c ) 個值.
Figure 9. SSD 在 8x8 和 4x4 feature maps 的預設 boxes.
5.2 Location Loss
SSD 采用 smooth L1-Norm 來計算 location loss. 雖然不如 L2-Norm 精度高,但仍具有較高效率;且由于其不追求 bounding box 預測的 “像素級準确”,給了 SSD 更多可處理空間(例如,少許像素的偏差可能很難被發現.)
5.3 Classification
MultiBox 沒有進行目标分類,但 SSD 有對目标的分類. 是以,對于每個預測的 bounding box,将計算對資料集中全部 c c 類類别的預測值.
6. SSD 訓練與運作
6.1 資料集
目标檢測資料集包含 grountruth boxes 和對應的 class labels,且每個 bounding box 僅有一個對應的 class label.
可以采用 PASCAL VOC 和 COCO 資料集開始.
Figure 10. Pascal VOC 資料集圖檔及标注
6.2 預設 Bounding Boxes
推薦配置多種預設 bounding boxes,包含不同的尺度(scales) 和長寬比(aspect ratios),以捕捉盡可能多的 objects.
SSD 論文對每個 feature map 單元采用了 6 種 bounding boxes.
6.3 Feature Maps
Feature Map (如卷積層輸出) 是圖檔在不同尺度的特征表示. 采用 MultiBox 對多種 feature maps 進行計算,能夠增加 objects 最終被檢測、定位和分類的精度.
如下圖,給出了對于給定圖檔,網絡計算 feature maps 的過程:
Figure 11. VGG Feature Map 可視化(From Brown Uni)
6.4 Hard Negative Mining
SSD 訓練時,大部分 bounding boxes 的 IoU 較低,被記作 negative 訓練樣本,需要在訓練集中保持合适的 negative 樣本數.
訓練時不是使用全部的 negative 預測,而是保持 negative 和 positive 樣本的比例為 3:13:1. 采用 negative 樣本的原因是,網絡不僅要學習 positve 樣本的資訊,還需要學習造成不正确檢測的資訊.
Figure 12. hard negative mining 示例(From jamie Kang blog)
6.5 Data Augmentation
資料增廣對于深度學習應用比較重要,目标檢測中,其能夠使網絡對于輸入的不同 object 尺寸具有魯棒性.
SSD 根據原始圖檔裁剪生成新的訓練樣本,其與原始圖檔具有不同的 IoU 比例(如0.1, 0.3, 0.5 等),同時随機裁剪.
每張圖檔被随機水準翻轉,以對 objects 鏡像魯棒.
Figure 13. 水準翻轉圖檔示例(From Behavioural Cloning Blog)
6.6 NMS
SSD 對圖檔進行推斷時, 一次 forward 生成大量的 boxes,需要采用 NMS (Non-Maximum Suppression) 濾除大部分的 bounding boxes:當boxes 的 confidence 門檻值小于 ct c t (如 0.01) 與 IoU 小于 lt l t (如0.45) 時,則丢棄. 隻保留 top N N <script type="math/tex" id="MathJax-Element-60">N</script> 的預測結果.
這樣隻保留了網絡預測的最可能的預測值,更多的幹擾預測值被去除.
Figure 14. NMS 示例(From DeepHub tweet).
7. SSD Notes
- 更多預設 boxes 會影響速度,但能增加目标檢測精度;
- MultiBox 同樣能夠提高檢測精度,因為 MultiBox 檢測器對不同分辨率的 features 處理;
- 80% 的時間是 VGG16 base network 消耗的,也就是說,更快更有效的 base network 能夠提高 SSD 的效果;
- SSD 對于相似類别(如 animals) 的 objects 容易混淆,其原因很可能是 locations 是多種 objects 類别共享造成的;
- SSD-500( 512x512 輸入圖檔的最高分辨率輸出) 在 Pascal VOC上的 mAP 為 76.8%,但犧牲了效率,其速率為 22 幀/秒;SSD-300 達到一個好的時間和精度平衡, mAP=74.3%,59幀/秒.
- SSD 對于小物體的檢測效果較差,因為小物體不是在所有的 feature maps 中都出現. 增加輸入圖檔分辨率能夠緩解這樣問題,但不能完全解決.
8. SSD 實作
- Caffe-SSD
- TensorFlow-SSD
部落客打算将基于傳統計算機視覺技術實作的車輛檢測( Vehicle Detection) ,再采用 SSD 進行實作.
Teaching Cars To See — Vehicle Detection Using Machine Learning And Computer Vision
9. 相關
- YOLO9000: Better, Faster, Stronger
-
Mask R-CNN - 像素級的精确執行個體分割