Paper Reading:A Survey of Deep Learning-based Object Detection

有夢想的coder發表於2020-11-21

摘要
介紹了文章的大致思路和結構:
1.介紹,經典的目標檢測演算法,資料集
2.分析比對,各種目標檢測演算法,包括一階段和兩階段的
3.介紹,傳統和新的應用,以及一些目標檢測的其他分支
4.討論,用目前這些演算法來構建有效的系統,目標檢測演算法未來的發展方向
相關背景
目標檢測即找出影像中所有感興趣的物體,包含物體定位和物體分類兩個子任務,同時確定物體的類別和位置。

傳統目標檢測的方法一般分為三個階段:
1.在給定的影像上選擇一些候選的區域,
2.對這些區域提取特徵,
3.使用訓練的分類器進行分類。
(1)區域選擇:這一步是為了對目標的位置進行定位。比如最早採用滑動視窗的策略對整幅影像進行遍歷,而且需要設定不同的尺度,不同的長寬比。
(2)特徵提取:常用的特徵有 SIFT、HOG等。
(3)分類:根據第二步提取到的特徵對目標進行分類,分類器主要有 SVM,AdaBoost 等。
基於深度學習的目標檢測演算法
目前主流的目標檢測演算法主要是基於深度學習模型,大概可以分成兩大類別:
(1)One-Stage目標檢測演算法,這類檢測演算法不需要Region Proposal階,比較典型的演算法有 SSD、YOLO、YOLOv2、YOLOv3和CornerNet;
(2)Two-Stage目標檢測演算法,這類檢測演算法將檢測問題劃分為兩個階段,第一個階段首先產生候選區域(Region Proposals),包含目標大概的位置資訊,然後第二個階段對候選區域進行分類和位置精修,主要有R-CNN以及其衍生的各種演算法。
目標檢測模型的主要效能指標是檢測準確度和速度,其中準確度主要考慮物體的定位以及分類準確度。一般情況下,Two-Stage演算法在準確度上有優勢,而One-Stage演算法在速度上有優勢。
Two-stage (基於候選區域的目標檢測)
R-CNN(2014年):第一個把CNN用到目標檢測的演算法,並且效果遠好於傳統演算法。思路還是和以前的傳統演算法類似,只是特徵抽取使用了CNN。 R-CNN生成Proposals的方法是傳統方法Selective Search,主要思路是通過影像中的紋理、邊緣、顏色等資訊對影像進行自底向上的分割,然後對分割區域進行不同尺度的合併,每個生成的區域即一個候選Proposal。選擇性搜尋(Selective Search )就是一種典型的候選區域方法。演算法原理如下:首先將每個畫素作為一組。然後,計算每一組的紋理,並將兩個最接近的組結合起來。這張圖第一行展示瞭如何使區域增長,第二行中的藍色矩形代表合併過程中所有可能的 ROI。
R-CNN 利用候選區域方法建立了約 2000 個 ROI。這些區域被轉換為固定大小的影像,並分別送到卷積神經網路中。之後使用SVM對區域進行分類,使用線性迴歸損失來校正邊界框,以實現目標分類並得到邊界框。以下是 R-CNN 整個系統的流程圖

Fast R-CNN(2015年):R-CNN中有很多區域是彼此重疊的。如果我們有 2000 個候選區域,且每一個都需要獨立地饋送到 CNN 中,那麼對於不同的 ROI,我們可能需要重複提取很多次特徵。因此 R-CNN 的訓練和預測速度非常慢。 直接使用cnn得到的特徵圖代替原圖來檢測目標 這樣可以提高演算法執行速度。
思路上有了很大的一個改進,即輸入整張圖片到網路中,共享卷積層先做特徵抽取再切圖,並且用RoI Pooling來統一二階段的輸入特徵大小,從而極大提升了速度,除了切圖部分其他部分都連起來了。Fast R-CNN 選擇了 VGG16 中的卷積層 conv5 來生成 ROI區域在對應的特徵圖上的對映特徵圖塊,並用於目標檢測任務中。我們使用 ROI 池化將特徵圖塊轉換為固定的大小,並送到全連線層進行分類和定位。因為 Fast-RCNN 不會重複提取特徵,所以它能顯著地減少處理時間。
Faster R-CNN(2015年,Fast R-CNN提出3個月後,由何凱明等人提出):Fast R-CNN 依賴於外部候選區域方法,如選擇性搜尋。但這些演算法在 CPU 上執行且速度很慢。Faster R-CNN 採用區域生成網路(Region Proposal Network,RPN)代替了候選區域方法。
RPN
區域生成網路(RPN)將前面卷積網路的輸出特徵圖作為輸入,比如VGG16的conv5特徵圖。它在特徵圖上滑動一個 3×3 的卷積核,以使用卷積網路構建與類別無關的候選區域。使用VGG網路提取特徵的話,每個 3x3 區域會得到一個512維的特徵向量,然後送到兩個獨立的全連線層,以預測邊界框和兩個目標分數(是目標或者不是目標)。

對於特徵圖中的每一個位置,RPN 會做 k 次預測。因此,RPN 將輸出 4×k 個座標和每個位置上 2×k 個得分。下圖展示了 8×8 的特徵圖,且有一個 3×3 的卷積核執行運算,它最後輸出 8×8×3 個 ROI(其中 k=3)。下圖(右)展示了單個位置的 3 個候選區域。

Faster R-CNN 使用更多的錨點。它部署 9 個錨點框:3 個不同寬高比的 3 個不同大小的錨點框。每一個位置使用 9 個錨點,每個位置會生成 2×9 個目標分數和 4×9 個座標。
Mask R-CNN:Faster R-CNN在Instance Segmentation的改進版,增加了一個mask分支來完成mask任務。最重要的一個貢獻,在於提出了RoI Pooling的改進版ROIAlign,提升位置判別的精度。
One-stage
one-stage相較於two-stage,犧牲了精度提升了速度。
YOLO : 將物體分類和物體定位在一個步驟中完成。Yolo直接在輸出層迴歸bounding box的位置和bounding box所屬類別,從而實現one-stage。通過這種方式,Yolo可實現45幀每秒的運算速度,完全能滿足實時性要求(達到24幀每秒,人眼就認為是連續的)。CVPR2016發表的,從2015年的Faster R-CNN,可以比較容易的想到,直接用RPN或者類RPN做分類,直接一次性給判別結果。最直接的,把RPN的二分類改成多分類, YOLO系列演算法在構建迴歸目標時一個主要的區別就是如果將影像劃分成SxS的格子,每個格子只負責目標中心點落入該格子的物體的檢測;如果沒有任何目標的中心點落入該格子,則為負樣本。
單次檢測器通常需要在準確率和實時處理速度之間進行權衡。它們在檢測太近距離或太小的目標時容易出現問題。在下圖中,左下角有 9 個聖誕老人,但某個單次檢測器只檢測出了 5 個。
YOLOv2:針對YOLO做了一些改進,卷積層前加BN層,使用DarkNet等等。
YOLOv3:在YOLOv2之上的改進, 調整了網路結構;利用多尺度特徵進行物件檢測; 預測物件類別時用logistic取代了softmax。
網路架構
在基本的影像特徵提取方面,YOLO v3採用了稱之為Darknet-53的網路結構(含有52個卷積層1個全連線層),它借鑑了殘差網路residual network的做法,在一些層之間設定了快捷鏈路(shortcut connections)。DarkNet-53 主要由 3 × 3 和 1× 1 的卷積核以及類似 ResNet 中的快捷鏈路構成。相比 ResNet-152,DarkNet 有更低的 BFLOP(十億次浮點數運算),但能以 2 倍的速度得到相同的分類準確率。 每個殘差元件有兩個卷積層和一個快捷鏈路。
特徵金字塔網路(FPN)——利用多尺度特徵進行檢測 在YOLO v3更進一步採用了3個不同尺度的特徵圖來進行物件檢測。
結合上圖看,卷積網路在79層後,經過下方几個黃色的卷積層得到一種尺度的檢測結果。相比輸入影像,這裡用於檢測的特徵圖有32倍的下采樣。比如輸入是416x416的話,這裡的特徵圖就是13x13了。由於下采樣倍數高,這裡特徵圖的感受野比較大,因此適合檢測影像中尺寸比較大的物件。
為了實現細粒度的檢測,第79層的特徵圖又開始作上取樣(從79層往右開始上取樣卷積),然後與第61層特徵圖融合(Concatenation),這樣得到第91層較細粒度的特徵圖,同樣經過幾個卷積層後得到相對輸入影像16倍下采樣的特徵圖。它具有中等尺度的感受野,適合檢測中等尺度的物件。
最後,第91層特徵圖再次上取樣,並與第36層特徵圖融合,最後得到相對輸入影像8倍下采樣的特徵圖。它的感受野最小,適合檢測小尺寸的物件。
上面使用不同尺寸特徵圖進行預測的網路稱為特徵金字塔網路(FPN),是一種旨在提高準確率和速度的特徵提取器。
9種尺度的 anchor boxes
隨著輸出的特徵圖的數量和尺度的變化,先驗框的尺寸也需要相應的調整。YOLO2已經開始採用K-means聚類得到先驗框的尺寸,YOLO3延續了這種方法,為每種下采樣尺度設定3種先驗框,總共聚類出9種尺寸的先驗框。在COCO資料集這9個先驗框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。
分配上,在最小的13x13特徵圖上(有最大的感受野)應用較大的先驗框(116x90),(156x198),(373x326),適合檢測較大的物件。中等的26x26特徵圖上(中等感受野)應用中等的先驗框(30x61),(62x45),(59x119),適合檢測中等大小的物件。較大的52x52特徵圖上(較小的感受野)應用較小的先驗框(10x13),(16x30),(33x23),適合檢測較小的物件。
感受一下9種先驗框的尺寸,下圖中藍色框為聚類得到的先驗框。黃色框式ground truth,紅框是物件中心點所在的網格。
對於一個輸入影像,YOLO v3將其對映到3個尺度的輸出張量,代表影像各個位置存在各種物件的概率。
看一下YOLO v3共進行了多少個預測。對於一個416x416的輸入影像,在每個尺度的特徵圖的每個網格設定3個先驗框,總共有 13x13x3 + 26x26x3 + 52x52x3 = 10647 個預測。每一個預測是一個(4+1+80)=85維向量,這個85維向量包含邊框座標(4個數值),邊框置信度(1個數值),物件類別的概率(對於COCO資料集,有80種物件)。
對比一下,YOLO v2採用13x13x5 = 845個預測,YOLO v3的嘗試預測邊框數量增加了10多倍,而且是在不同解析度上進行,所以mAP以及對小物體的檢測效果有一定的提升。
SSD( Single-Shot MultiBox Detector):YOLO的改進版,針對YOLO的不足,加入了多尺度的特徵。SSD檢測演算法的網路結構如下圖所示,其中Backbone為VGG網路,使用不同階段不同解析度的feature maps進行預測。 SSD系列檢測演算法在確定正負樣本的時候通過交併比大小進行區分,當某一個Ground Truth的目標框與anchor的交併比最大且對應的交併比大於某一個閾值的時候,對應anchor即負責檢測該Ground Truth,即每一個anchor最多負責一個物體的檢測,同一個物體可能被多個anchor同時檢測。
RetinaNet:損失主要包括分類損失(Cls Loss)和定位損失(Loc Loss),常見的損失組合主要有如下兩種Cls Loss + Loc Loss(SSD系列演算法)、Cls Loss + Obj Loss + Loc Loss (YOLO系列演算法),其中YOLO系列演算法相比於SSD系列演算法多了Object Loss,即判斷對應區域是否為物體的損失。 One-Stage目標檢測演算法的正負樣本不均衡的問題比較嚴重,對於設計損失函式還會有一些針對創新。提出了Focal loss,解決one-stage裡普遍存在的類別不平衡問題。
將原先訓練 分類任務 慣用的 交叉熵誤差在這裡插入圖片描述
改為 FL (focal loss) 即可。
focal loss的標準公式:在這裡插入圖片描述

本質改進點在於,在原本的 交叉熵誤差 基礎上乘上在這裡插入圖片描述
這一權重。
乘上了該權重,量大的類別所貢獻的loss被大幅砍削,量少的類別所貢獻的loss幾乎沒有多少降低。這樣訓練過程中量少的類別能得到平衡。

Mask R-CNN是繼承於Faster R-CNN (2016)的,Mask R-CNN只是在Faster R-CNN上面加了一個Mask Prediction Branch (Mask 預測分支),並且改良了ROI Pooling,提出了ROI Align。

資料集&評估矩陣
早期的資料集:人臉識別、行人識別
通用資料集:PASCAL VOC、MS COCO、ImageNet-loc
通用目標檢測演算法分析
特徵抽取(主幹網路)
以FPN為代表(PFPNet、WeaveNet等),由於物體的大小差異,考慮從不同的層抽取資訊來判別不同大小的物體。
另一個思路是從不同物體間的語義關係出發來幫助識別遮擋和小物體,個人理解總體來說就是把box之間的資訊加入到網路中。(例如R-DAD中,作者把一個anchor再切成上下左右的子anchor,在整個anchor中再加入子anchor的資訊,有利於重疊的box間的資訊提取。還有一系列其他的文章,後續有需要和時間再細看)
再就是注意力機制,以及可變卷積等等。
提升位置精度
位置精度的衡量標準,主要是IoU。大部分的論文就圍繞IoU做文章,一種是設計新的regression loss,在loss中考慮IoU;另一種是設計變種IoU。具體的,在Unitbox中使用-ln(IoU)作為loss代替regression的l2 loss,在Generalized Intersection over Union中,重新定義了一種新的IoU作為更合適的衡量標準。IoU-Net中提出在第一階段新增一個輸出來預測IoU,這樣可以接入程度資訊。
解決負樣本的不平衡
two-stage方法在第一個階段已經篩選了大量的anchor,故樣本不平衡問題相對不大,而在one-stage中則沒有。一般的方法有hard negative mining(OHEM)。也有許多其他的演算法如Libra r-cnn等等用特定的抽樣方法而不是隨機抽樣(IoU-balanced sampling)。
另一種就是Focal loss及其他的一些loss(Average-Precision loss),通過調整正負樣本的loss值解決問題。
提升NMS方法
Relation network中用模型保留了一部分不使用NMS的框。在IoU-Net中使用IoU而不是類別的confidence作為選框依據。另外還有adaptive-NMS,soft-NMS、softer-NMS等等。
結合one-stage和two-stage
一般把是否有ROI作為one-stage與two-stage的判別標準,RefineDet及後續的AlignDet等。
複雜情況的處理
小物體及遮擋物體,許多是人臉識別或是行人識別的場景。有ssd及其變種,也有PGAN,tiny face等等。
尺度跨度太大的物體,一般有3種解決思路:原圖縮放到不同尺度來訓練,多種大小的filters,設定不同大小的anchor。
anchor-free
這兩年挺多的anchor-free的論文,Fcos、Foveabox、CornerNet、CenterNet、Dubox等等,今年非常多~
training from scratch(不預訓練)
用預訓練模型可能會存在幾個問題(如網路結構相對固定,不同場景存在差異等等),於是有DetNet、DSOD、ScratchDet等演算法,以及何愷明的Rethinking等等的論文,開始去思考和探索如何設計網路來提升檢測。
設計新結構
DetNet,新的backbone。以及Light-head r-cnn: In defense of two-stage object detector,解決兩階段演算法的頭部計算量太大問題。
加速
mobile等裝置上的應用,需要實時高速的模型,故而有一系列的這方面的演算法(一階段的YOLO、SSD等等)
更快更準確
有一些結合one-stage與two-stage的工作;

應用與分支
人臉檢測
Hyperface,Wasserstein cnn,Adaacos,ArcFace等等,詳見Deep face recognition: A survey,詳細介紹各種深度學習的人臉檢測方法
行人檢測
具體參看Computer vision and deep learning techniques for pedestrian detection and tracking: A survey
總結與展望
gpu等算力的發展,使得深度學習及目標檢測成為可能。目標檢測朝著更準、更快的方向發展,發展的方向有新的結構、新的特徵提取、提升處理速度、從頭訓練、anchor-free、特定場景(小物體、遮擋物體)、one-stage與two-stage融合、NMS優化、正負樣本不平衡、更準確定位、更準確分類等等。並且,目標檢測在各領域(公共安全、軍事、交通、醫學、生活等等)的應用也越來越廣泛和成熟。接下來是幾個方向的展望:
one-stage與two-stage融合
two-stage過程中有個比較耗時費力的選框過程(比如RoI Pooling和NMS)。而one-stage的準確率一直相對較差一些。如何結合one-stage與two-stage的優點(前者更快,後者更準)是一個挑戰。
ps:如果我想更準一些,是否可以重新考慮stage?比如Cascade就是拉長stage的感覺。
視訊目標檢測
在視訊目標檢測中,運動模糊、視訊散焦、運動目標模糊、目標運動劇烈、目標小、遮擋和截斷等問題使得該任務在現實場景和遙感場景中難以獲得良好的效能。深入研究移動目標和視訊等更復雜的源資料是未來研究的重點之一。
高效的後處理方法
類似NMS之類的,對預測框的進一步處理的方法也對準確率有很大的影響。
弱監督目標檢測
多領域目標檢測
3D目標檢測
顯著目標檢測(SOD)
無監督目標檢測
多工目標檢測
多源資訊輔助(比如文字資訊)
終端目標檢測系統
醫學影像和輔助診斷
遙感目標檢測
基於GAN的目標檢測

相關文章