細粒度物體檢測演算法的升級揭祕
EasyDL是百度大腦的定製化模型訓練和服務平臺,使用者通過EasyDL可以低成本地訓練自己的深度學習模型,從而獲得效果優異的定製化AI服務。自上線以來,EasyDL的使用者規模和使用場景迅速增長,也收到了深度學習業內人士的讚賞和青睞。在眾多模型使用場景中,小目標物體的檢測比較常見,一般的目標檢測演算法往往效果不理想;因此,EasyDL團隊針對小目標物體的檢測進行了專項優化,並取得了令人矚目的效果提升。
自AlexNet在2012年ImageNet比賽上展露頭角以來,計算機視覺各個方向和神經網路的聯絡變得越發緊密,物體檢測也不例外。2014年的RCNN[1]是代表之一,它在傳統的Selective Search基礎上,利用AlexNet來提取特徵進行分類。隨後在2016年,完全依靠神經網路完成端到端的識別和訓練的FasterRCNN[2]也同樣證明神經網路在物體檢測任務上的巨大優勢。本文我們會先簡單介紹FasterRCNN的檢測方案,然後針對各種後續改進,尤其是小目標檢測的改進內容,進行分類介紹。
FasterRCNN檢測方案使用CNN網路來提取特徵圖(feature map),然後在特徵圖的每個單元(cell)上基於錨框(anchor box)去做是否有物體的二分類任務,及物體相對於錨框位移的迴歸任務。這個階段被稱作Region Proposal Network(RPN)。一些方法把這裡的二分類任務加上關心的類別直接完成整個檢測任務,如YoloV1[3],被稱為 單階段(single stage)的檢測方法。
而FasterRCNN在RPN拿到候選框(Region of Interest, RoI)之後,會把特徵圖上所有候選框位置的區域摳出來,然後利用線性插值把它們調整到相同大小。這個操作被稱為RoI pooling。經過RoI pooling之後,原來特徵圖上的不同候選區都有了相同的大小,我們在後面去接卷積層和全連線層的頭部網路(head network)就可以預測最終的物體類別和物體位置了。所以FasterRCNN被稱為 兩階段(two stage)方法,RoI pooling就是連線這兩個階段的樞紐。
除了上面所說的主要網路結構外,FasterRCNN還有一些重要的訓練和預測的細節:在準備訓練資料時,會先將真實的標註框和網路錨框做匹配,匹配的原則是兩者的IoU要大於閾值(0.5),且IoU大者優先。由於會有大量的錨框匹配不到真實框,所以實際訓練時會對匹配不到真實框的負例錨框做取樣,保證它和匹配到真實框的正例錨框比例均衡。在第一階段和第二階段裡,一般分類的損失函式用交叉熵,框迴歸的損失函式用Smooth L1。在RPN預測候選框和第二階段預測檢測框的時候,還會對輸出結果做非極大值抑制(NMS)以減少輸出框數,並過濾大部分的背景框。可以看到在FasterRCNN中包含主體的CNN網路、錨框和RPN網路、RoI pooling、分類和迴歸損失函式、標註框和錨框匹配取樣、NMS等各個元件。
2016年,研究人員提出了SSD(Single Shot MultiBox Detector)[4]的單階段檢測模型,使得檢測的速度大大提升,並且精度更高。檢測速度提升來自於它去除了FasterRCNN裡的RoI pooling和第二個階段,因為當時還沒有GPU能實現高效的RoI pooling。精度的提升來自於它採用了不同尺度的多個特徵圖,如下圖所示。不同尺度的特徵圖上每個cell的感受野各有不同,因而更適合用來預測不同尺寸的物體。SSD仍然採用了錨框的方式(文章中稱為 default box),在6個不同尺寸的特徵圖上針對錨框做出預測,並對所有的預測結果做NMS後處理得到最終的預測框。在YoloV2[5]中,也採用了這種多尺度特徵圖的方式。
隨著檢測技術的發展,SSD模型也暴露了自己的缺點,雖然它利用多尺度特徵來預測不同尺寸的物體,但是對於小目標的檢測通常不佳。一般來說小目標的檢測結果來自最底層的特徵圖,比如上圖裡的Conv5_3 layer。但是它處於網路的前幾層,提取的語義特徵並不豐富,可能沒辦法提取到物體的抽象特徵。因而學者們就如何將高層豐富的語義特徵融合進底層特徵圖進行了嘗試。2017年,有研究者提出了DSSD(Deconvolutional Single Shot Detector)[6],網路結構如下圖。DSSD是在SSD的基礎上,加入了Deconvolution模組,將高層語義資訊豐富的特徵圖放大尺寸,然後和底層位置資訊豐富的特徵圖相加,得到更好的特徵用來預測小目標的物體。
2017年的另一項工作FPN(Feature Pyramid Networks)[7]就更著名了,它的思路跟上面類似。作者啟發於在傳統物體檢測方法中,影像金字塔是一個非常重要的手段,而且在深度學習方法流行之後多尺度的測試仍然能夠有效地提升檢測效果。而且SSD中多尺度特徵處理已經初步驗證了在CNN特徵層上做多尺度的有效性。FPN總體上分為兩個部分。第一個是 自底向上的部分:如在ResNet的網路裡不同大小的特徵圖會分為不同的stage,每個stage的最後一層特徵被選為相應級別(level)的特徵。第二個部分是 自頂向下的過程和側向連線,它採用上取樣的方式將頂層的特徵圖放大到上一個級別特徵圖的大小,然後與之融合。融合後的特徵便擁有了底層特徵的位置資訊和頂層特徵的語義資訊,能夠更好地完成小目標檢測任務。FPN能夠流行的另一個原因是它應用場景非常廣泛,既能應用在兩階段的FasterRCNN中,也可以用在單階段檢測方法如RetinaNet[8]中,還可以應用在例項分割MaskRCNN[9]中。
------分割線
FPN雖然帶來了檢測效果上的提升,但也帶來了計算量更多的問題(額外的上取樣和跳層計算)。SNIP中的實驗發現基於更大解析度影像(RetinaNet中通常訓練尺寸為(1333,800),此處放大至(2000, 1400))訓練的模型可以提高對小目標物體的檢測,但對中大物體的檢測反而會受到負面影響。訓練資料中那些尺寸非常大或非常小的object會影響訓練效果,因此這篇文章限定了不同尺寸的object在訓練過程中的梯度回傳。
SNIP[10]借鑑了Multi-Scale Training(MST)的思想,multi-scale training/testing最早見於[11],訓練時,預先定義幾個固定的尺度,每個epoch隨機選擇一個尺度進行訓練。測試時,生成幾個不同尺度的feature map,對每個Region Proposal,在不同的feature map上也有不同的尺度,我們選擇最接近某一固定尺寸(即檢測頭部的輸入尺寸)的Region Proposal作為後續的輸入。在[12]中,選擇單一尺度的方式被Maxout(element-wise max,逐元素取最大【cascade rcnn中就是】)取代:隨機選兩個相鄰尺度,經過Pooling後使用Maxout進行合併,如下圖所示。
常見的是multi-scale training只是從多個尺度中隨機挑選一個尺度去訓練,實際中還是單個尺度的訓練。而multi-scale test則是對單張圖片進行預測後一起進入NMS階段。
在MST方法中,由於訓練資料中尺寸極大或極小的目標會影響實驗結果,因此SNIP的做法就是隻對尺寸在指定範圍內的目標回傳損失(該範圍需接近預訓練模型的訓練資料尺寸);也就是說訓練過程實際上只是針對這些目標進行的,這樣就能減少domain-shift帶來的影響。又因為訓練過程採用了類似MST的做法,所以每個目標在訓練時都會有幾個不同的尺寸,那麼總有一個尺寸在指定的尺寸範圍內,因此很難出現漏掉目標的情況。
為了能對多尺度物體能進行更精準的識別並且能夠降低計算壓力,SNIPER[16]另闢蹊徑,對每個尺度大類下都維護一個重點關注區域(chips)。chips是圖片的某個scale上的一系列固定大小的(比如KxK個畫素)的以恆定間隔(比如d個畫素)排布的小窗(window),每個window都可能包含一個或幾個objects。
從原圖也可以看出,原圖中有一大部分的背景區域(沒被postive chip覆蓋的區域)被丟棄了,而且實際上網路真正輸入的是chip(比原圖解析度小很多),這對於減少計算量來說很重要。這個地方很巧妙,在不同的scale上擷取相同大小的chip,而且包含的是不完全相同的目標。這個方式很接近RCNN。對較小的目標起到一種zoom in的作用,而對較大的目標起到一種zoom out的作用。而對於網路來說,輸入的還是固定大小的chip,這樣的結構更加接近於分類問題網路的拓撲。由於訓練時使用的是較低解析度的chip,SNIPER能夠擺脫對較高解析度影像的依賴。所以batch也可以做的很大,比如可以做到每張卡20的batch。
目前主流的目標檢測方法大體分為兩類:single-stage和two-stage。然而還有另一類方法,雖然不是主流,但依然能取得SO他的效能,這就是anchor-free的方法,代表演算法有CornerNet、ExtremeNet、FSAF(CVPR2019)等。Anchor free based method一般採用bottom-up的思路,先生成帶有類別資訊和位置資訊的feature map。CornerNet[13]顧名思義,預測左上角和右下角來得到最後的bounding boxes。所以最基本的需要兩個feature map表示對應的Corner,文中稱為heatmap。如下圖所示,兩個heatmap分別表示top-left(左上角)和bottom-right(右下角)的corner,作者借鑑Associative Embedding method(NIPS2017)利用了兩個embedding層做grouping操作,將屬於同一個object的corner聚合都一起得到最後的bounding box。
模型的整體結構如下圖,backbone採用hourglass network以得到高質量的feature map,接兩個分支分別預測top-left Corner 和bottom-right Corner,兩個分支的結構完全一樣。
CornerNet-Lite[14]是CornerNet兩種變形的組合:一個是CornerNet-Saccade,基於attention機制,從而並不需要對圖片中的每個畫素做詳盡的處理。另一個是CornerNet-Squeeze,引入了新的複雜的backbone結構。結合這兩個變形可以應用到兩個重要情景中:在不降低準確率的情況下挺高效率,同時,在實時檢測過程中提高了準確率,CornerNet-Saccade即適合做離線處理,也適用於實時的檢測。
CornerNet-Saccade通過減少處理的畫素的個數來提高inference的效率。利用一種類似於人眼掃視的注意力機制,首先經過一個下采樣後的輸入圖片,生成一個attention map,然後再將其進行放大處理,接著進行後續模型的處理。這與之前原始的CornerNet在不同尺寸上使用全卷積是有區別的,CornerNet-Saccade通過選擇一系列高解析度的裁剪圖來提高效率及準確率。
CornerNet-Squeeze通過減少每個畫素的處理過程來加速inference,其結合了SqueezeNet及MobileNet的思想,同時,引入了一個新的backbone hourglass,利用了1x1的卷積,bottleneck層及深度分離卷積。
CornerNet珠玉在前,目標檢測問題變成了一個標準的關鍵點估計問題。我們僅僅將影像傳入全卷積網路,得到一個熱力圖,熱力圖峰值點即中心點,每個特徵圖的峰值點位置預測了目標的寬高資訊。模型訓練採用標準的監督學習,推理僅僅是單個前向傳播網路,不存在NMS這類後處理。
CenterNet[15]相比較傳統目標檢測而言(縮放16倍尺度),使用更大解析度的輸出特徵圖(縮放了4倍)因此更有利於小目標檢測。測試時可以使用flip增強,multiscale test增強的方式。其中flip的方式是直接將最後一層的feature map進行融合,MST則是通過nms的方式進行整合。
直觀上,當我們看到一幅圖片時,我們首先關注的是影像中比較醒目的影像。一般來說,這些醒目的影像往往在圖中所佔的比例比較大,而比例較小的目標往往會被我們忽略。資料集中也存在這種情況,很多影像中包含的小物體並沒有被標出。另外,小目標所在區域較小,在提取特徵的過程中,其提取到的特徵也會非常少,這些都不利於我們對小目標的檢測。
[17]通過分析COCO資料集,可以發現大部分的小目標都集中在一些少量的圖片中。這就導致在訓練的過程中,模型有一半的時間是學習不到小目標的特性的。另外,對於小目標,平均能夠匹配的anchor數量為1個,平均最大的IoU為0.29,這說明很多情況下,有些小目標是沒有對應anchor的,或者對應的anchor非常少,且即使有對應的anchor,他們的IoU也比較小,平均最大的IoU也才0.29。有如下兩種改進方法:
1)對於資料集中含有小目標圖片較少的情況,使用過度取樣(oversample)的方式,即多次訓練這類樣本。
2)對於第二類問題,則是對於那些包含小物體的影像,將小物體在圖片中複製多分,在保證不影響其他物體的基礎上,人工增加小物體在圖片中出現的次數,提升被anchor包含的概率。
目標檢測近兩年的進展放緩,但仍然有很多值得關注、值得深究的地方。結合現實條件來看,目標檢測在實際運用場景中仍有很多優化空間。百度大腦EasyDL也將持續把更多與場景結合的、深入優化預訓練的模型開放給使用者,加速推動AI的產業落地。
參考文獻
[1]. Ross Girshick, 2014, Rich feature hierarchies for accurate object detection and semantic segmentation
[2]. Shaoqing Ren, 2016, Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
[3]. Joseph Redmon, 2015, You only look once: Unified, real-time object detection
[4]. Wei Liu, 2016, SSD: Single Shot MultiBox Detector
[5]. Joseph Redmon, 2016, YOLO9000: Better, Faster, Stronger Joseph
[6]. Cheng-Yang Fu, 2017, DSSD : Deconvolutional Single Shot Detector
[7]. Tsung-Yi Lin, 2017, Feature Pyramid Networks for Object Detection
[8]. Tsung-Yi Lin, 2018, Focal Loss for Dense Object Detection
[9]. Kaiming He, 2018, Mask R-CNN
[10]. An Analysis of Scale Invariance in Object Detection – SNIP
[11].Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
[12].Object Detection Networks on Convolutional Feature Maps
[13].CornerNet: Detecting Objects as Paired Keypoints
[14].CornerNet-Lite: Efficient Keypoint Based Object Detection
[15].CenterNet :Objects as Points
[16].SNIPER: Efficient Multi-Scale Training
[17].Augmentation for small object detection
https://www.toutiao.com/a6746069579241357831/
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946223/viewspace-2659778/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SSD物體檢測演算法詳解演算法
- 「取長補短」的RefineDet物體檢測演算法演算法
- 揭祕Stripe欺詐檢測系統背後的機器學習演算法 - quastor機器學習演算法AST
- 揭祕騰訊第四次戰略升級
- AI影片物體檢測AI
- FCOS論文復現:通用物體檢測演算法演算法
- OPCV 移動物體檢測
- openCV檢測物體是否運動OpenCV
- 深度有趣 | 11 TensorFlow物體檢測
- App效能測試揭祕(Android篇)APPAndroid
- 揭祕高仿包包頂級多少錢
- 物體檢測實戰:使用 OpenCV 進行 YOLO 物件檢測OpenCVYOLO物件
- 【經典揭祕】集中式架構怎麼升級為分散式架構?架構分散式
- 物體檢測、影像分割技術概述
- 物聯網裝置OTA軟體升級之:升級包下載過程之旅
- 細粒度影象分類
- 記憶體池原理大揭祕記憶體
- 揭祕頂級高仿包包怎麼樣
- YoloDotNet v2.1:實時物體檢測的利器YOLO
- 從細節理解鎖的升級
- 揭祕ThreadLocalthread
- 揭祕instancetype
- 使用 Rust 和 OpenCV 進行物體檢測RustOpenCV
- 物體檢測(YOLO)示例:使用 C 語言YOLO
- 揭曉Java異常體系中的祕密Java
- oracle 細粒度審計(fga)Oracle
- oracle審計-細粒度(轉)Oracle
- Java 細粒度鎖續篇Java
- 揭祕得物客服IM全鏈路通訊過程
- Halcon缺陷檢測例項轉OpenCV實現(三) 物體凸缺陷檢測OpenCV
- 揭祕 YYModel 的魔法(下)
- AI學習筆記(十二)物體檢測(上)AI筆記
- 30秒輕鬆實現TensorFlow物體檢測
- 揭開單體應用程式的神祕面紗
- 揭開java記憶體模型的神祕面紗Java記憶體模型
- Java 中常見的細粒度鎖實現Java
- 《少女的王座》今日開測,專屬福利活動揭祕
- 揭祕JavaScript中“神祕”的this關鍵字JavaScript