計算機視覺中目標檢測任務脈絡梳理


前言:本文主要梳理了目標檢測任務,包括目標檢測簡介、常用數據集、常用技巧,以及經典的兩段式和一段式模型。

1 目標檢測簡介

目標檢測(Object Detection)的目的是“識別目標並給出其在圖中的確切位置”,其內容可解構為三部分:識別某個目標(Classification);給出目標在圖中的位置(Localization);識別圖中所有的目標及其位置(Detection)。從這三點可以看出目標檢測的難度要比圖像分類大很多,后者只需要確定輸入的圖像屬於哪一類即可,而前者需要從圖像中自動摳出(crop)合適大小的patch,並確定它的類別。其中摳出patch這一步難度很大,因為1:圖像中目標個數不確定;2:目標的尺度和形狀(大小和寬高比)不確定。

傳統的目標檢測主要是采用滑動窗口法:利用一系列不同大小和寬高比的滑動窗口,在圖像上以一定步長來crop,從而得到一堆的小圖;然后將每個小圖送給后面的分類器(比如SVM或CNN)進行分類;之后再通過NMS來過濾掉重復的預測框。這個方法很經典,即從所有可能的小圖中過濾三次,留下來的就是檢測到的目標。后來的許多目標檢測算法也都是從這里做進一步的改進。

滑動窗口法的缺陷也很明顯:

  • 定位不准。第一步利用不同大小和寬高比的滑動窗口來過濾時,只能得到固定大小和寬高比的小窗口,所以絕大部分目標的尺寸都會有一定的偏移(框的不太准)。
  • 難以同時檢測距離較近的目標。
  • 計算量太大。這個是最大的問題,為了檢測出更多不同尺寸的目標,為了定位更准確,為了檢測出距離較近的目標,都不得不增加滑動窗口的個數,這就意味着超高的計算成本。

當前目標檢測算法主要有兩個分支,兩段式檢測算法和一段式檢測算法:

  • 兩段式典型算法:R-CNN,SPP,Fast R-CNN,Faster R-CNN,R-FCN,Mask R-CNN
  • 一段式典型算法:YOLO,SSD

兩段式目標檢測算法(比如R-CNN系列)的改進思路大方向主要有兩點:

  • 不再暴力的把所有小窗口都拿來做分類,而是先利用某些方法,從一大堆的小窗口中選出更可能是目標的候選框(region proposal),然后再拿去做分類。這就在一定程度上減少了計算成本。
  • 粗略選出的候選框即便包含目標,也很可能有偏移,因此采用邊框回歸這一神器來校正窗口的位置。

而一段式中SSD算法則更加直接,直接用不同大小和寬高比的錨框(anchor box,也叫預設框,default box)將圖像密密麻麻的鋪滿,然后再分別拿去做分類。這個思路實際上和滑動窗口法很相似,但高明之處在於:

  • 只利用CNN提取一次特征,把特征圖上各個像素和原圖上預設的錨框聯系起來,因此拿去做分類的並不是原圖中crop出來的小窗口,而是特征圖上各個像素對應的特征向量(這些特征向量就代表了對應感受野的局部語義特征)。
  • 和兩段式算法一樣,也利用邊框回歸器來校正錨框的准確位置。

從這些方向可以看出,當前目標檢測算法的主要思想是:在CNN提取圖像特征的基礎上,有針對性的crop部分窗口(或者預設特定尺寸的錨框)+邊框回歸器修正邊框位置。

2 目標檢測常用數據集

PASCAL VOC:包含20個類別。通常是用VOC07和VOC12的trainval並集作為訓練,用VOC07的測試集作為測試。

MS COCO:COCO比VOC更困難。COCO包含80k訓練圖像、40k驗證圖像、和20k沒有公開標記的測試圖像(test-dev),80個類別,平均每張圖7.2個目標。通常是用80k訓練和35k驗證圖像的並集作為訓練,其余5k圖像作為驗證,20k測試圖像用於線上測試。

四種結合使用方式:

  • 使用 VOC2007 的 train+val 和 VOC2012的 train+val 訓練,然后使用 VOC2007的test測試,這個用法是論文中經常看到的 07+12,研究者可以自己測試在VOC2007上的結果,因為VOC2007的test是公開的。
  • 使用 VOC2007 的 train+val+test 和 VOC2012 的 train+val訓練,然后使用 VOC2012 的test測試,這個用法是論文中經常看到的 07++12,這種方法需提交到VOC官方服務器上評估結果,因為VOC2012 test沒有公布。
  • 先在 MS COCO 的 trainval 上預訓練,再使用 VOC2007 的 train+val、 VOC2012的 train+val 微調訓練,然后使用 VOC2007的test測試,這個用法是論文中經常看到的 07+12+COCO 。
  • 先在 MS COCO 的 trainval 上預訓練,再使用 VOC2007 的 train+val+test、 VOC2012的 train+val 微調訓練,然后使用 VOC2012的test測試,這個用法是論文中經常看到的 07++12+COCO,需提交到VOC官方服務器上評估結果。

3 目標檢測中常用技巧

3.1 常用評估指標

mAP(mean of Average Precision):平均精確度(average precision)的平均(mean),是目標檢測中模型性能的衡量標准。方法是先獲取各個類別的PR曲線下面積(經過插值),然后對所有類別求平均值。

FPS(frame/per second):每秒幀數,用於評估算法的速度。一個算法好,要么是它的mAP高,要么是它的mAP和FPS的trade off很好。

交並比(intersection over union, IOU):預測框和真值框交集的面積除以這兩個矩形框並集的面積,取值為[0,1]。IOU度量了預測框和真值框的接近程度,IOU越大,兩個矩形框的重疊程度越高。

3.2 NMS(Non-max Suppression)

目標檢測可能會出現的一個問題是,模型會對同一目標做出多次預測,得到多個預測框。NMS旨在保留最接近真值框的那一個預測框,而抑制其他的預測框。NMS的做法是,首先,對每個類別,NMS先統計每個預測框屬於該類別的概率值,並將預測結果按該概率由高至低排序。其次,NMS排除那些概率值小於一定閾值的預測框。然后,NMS在剩余的預測框中,找到對應概率最大的預測框,將其輸出,並抑制和該預測框IOU大於一定閾值的預測框。重復上一步,直到所有的預測結果均被處理。

絕大部分目標檢測方法,最后都要用到NMS進行后處理。但這種方法存在一點問題:如果NMS的閾值設計的過小,則容易刪掉距離很近的不同目標;設計的過大,又容易增加重復檢測框。為了解決這個問題,2017年一篇論文提出Soft-NMS的方法,思想是不要粗魯地刪除所有IOU大於閾值的框,而是降低其置信度。

3.3 錨框(Anchor Box)

錨框+邊框回歸的思想是目標檢測中一種經典思想。即先使用預先定義大小和寬高比的矩形框(即錨框),將圖像密密麻麻的鋪滿,然后判斷各個錨框的類別,最后再利用邊框回歸對判斷為目標的錨框進行位置修正。使用錨框的原因包括:(1)圖像中的候選區域大小和寬高比不同,直接回歸比對錨框坐標修正訓練起來更困難。(2)特征圖中像素對應的特征向量代表了對應感受野下的局部語義特征,每個特征向量可能包含了不止一個目標,使用多個錨框可以同時對感受野內出現的多個目標進行預測。(3)使用錨框也可以認為這是向神經網絡引入先驗知識的一種方式。我們可以根據數據中真值框通常出現的形狀和大小設定一組錨框。錨框之間是獨立的,不同的錨框對應不同的目標,比如人對應高瘦的錨框,而車輛對應矮胖的錨框。

3.4 邊框回歸(Bounding-box Regression)

邊框回歸是一個很重要的思想,當前大部分目標檢測算法都需要用邊框回歸來校正預測框的准確位置。對於窗口一般使用四維向量(x,y,w,h)來表示,分別表示窗口的中心點坐標和寬高,但是我們不能直接回歸這4個值,因為原圖的尺寸和目標的尺寸都是不固定的;不同尺寸的目標特征向量應該是一樣的,顯然不能指望同一個特征向量能回歸出不同的位置。因此需要對預測的形式做一個變換,即回歸的是錨框的偏移量\((t_x,t_y,t_w,t_h)\)這篇博客講的挺好。

3.5 FPN(Feature Pyramid Network)

目的:2016年提出,主要解決的是目標檢測中的多尺度問題,通過簡單的網絡連接改變,在基本不增加原有模型計算量情況下,大幅度提升小物體檢測的性能。

背景:在物體檢測里面,隨着網絡深度的加深,通常stride也會不斷的變大,當stride超過原圖中小目標的尺寸后,小目標的檢測性能會急劇下降。傳統的目標檢測方式通常都是在最后一個特征圖上做預測,這樣會對小目標檢測不利。為了解決這個問題,通常有兩種做法,一是利用圖像金字塔,得到不同分辨率的圖像,然后分別提取特征進行預測,缺點是計算量太大;二是類似SSD框架,直接從不同尺度的特征圖上引出預測器,來得到不同分辨率的語義信息,缺點是靠前面的特征圖雖然分辨率較高,但是高級語義信息提取不充分,所以對小目標檢測性能提升不明顯。

結構:FPN直接在原來的單網絡上做修改,整體結構中包括自下而上、自上而下和橫向連接三個部分,每個分辨率的 feature map 經過1x1卷積后和后一分辨率縮放兩倍的 feature map 做融合(這里是element-wise 相加)。通過這樣的連接,每一層預測所用的 feature map 都融合了不同分辨率、不同語義強度的特征。

3.6 OHEM(Online Hard Example Mining)

目的:從訓練過程着手,解決正負樣本不平衡帶來的問題。

背景:R-CNN在訓練SVM分類器時使用了困難樣本挖掘(hard negative mining)的思想,但Fast R-CNN和Faster R-CNN由於使用端到端的訓練策略並沒有使用困難樣本挖掘(只是設置了正負樣本的比例並隨機抽取)。CVPR2016的Training Region-based Object Detectors with Online Hard Example Mining(oral)將困難樣本挖掘(hard example mining)機制嵌入到SGD算法中,使得Fast R-CNN在訓練的過程中根據損失大小自動選取合適的候選框(region proposal)作為正負例訓練。實驗結果表明使用OHEM(Online Hard Example Mining)機制可以使得Fast R-CNN算法在VOC2007和VOC2012上mAP提高4%左右。

方法:選擇一些困難樣本作為訓練的樣本從而改善網絡參數效果。OHEM論文中將負樣本按照loss大小排序,選擇較大loss的樣本來回傳梯度,同時考慮到重疊情況,使用了NMS。值得注意的是,有些模型略有區別,沒有使用NMS,比如SSD中使用的OHEM就是按照正負樣本1:3的比例,來選取loss最大的負樣本,沒有做NMS。

3.7 Focal Loss

目的:2017年提出,從損失函數着手,解決正負樣本不平衡帶來的問題。

背景:

  • 作者認為one-stage和two-stage的表現差異主要原因是大量前景背景類別不平衡導致,於是設計了focal loss,並通過ResNet+FPN+FL設計了一個網絡結構RetinaNet來驗證效果。
  • 不平衡是目標檢測中常見的一個大問題,類別不平衡導致:正樣本的損失被淹沒在負樣本的損失里面,導致其沒有太多話語權;帶來困難容易樣本不均衡問題;
  • 常規解決不平衡問題:調整正負樣本權重、過采樣和欠采樣、OHEM(只保留loss高的樣本,忽略簡單樣本);(要么簡單粗暴、要么太復雜丑陋,而FL就比較優雅)
  • two-stage能解決類別平衡的原因:RPN階段可以濾掉大部分背景樣本(只留下一兩千);第二階段可以用采樣控制正負樣本1:3,或者OHEM來選出困難樣本。雖然一段式也可以用采樣或者困難樣本挖掘的方法,但效果仍然不夠。

要點:

  • 伽馬項用於調節困難樣本和容易樣本的權重,當概率值越大(說明樣本越容易),則權重下降的越厲害;伽馬值越大,這種壓縮權重的影響越大;
  • \(\alpha_t\)用於調節正負樣本的權重。在二分類情況下,正樣本的\(\alpha_t=\alpha\),負樣本的\(\alpha_t=1-\alpha\);在多元分類情況下,將\(\alpha_t\)設置為一個列表,表明各個類別的權重。

4 目標檢測經典算法

當前目標檢測算法主要有兩個分支,兩段式檢測算法和一段式檢測算法,下面依次介紹。

由於資料中候選框和RoI(Region of Interest)這兩個概念的使用比較混亂,為避免混淆,本文中候選框(region proposal)特指原圖像中的候選框,RoI特指候選框對應特征圖上的特征區域。

4.1 兩段式檢測算法

兩段式檢測算法也稱為基於區域(Region-based)的方法,主要思想是先選出一部分包含目標可能性較大的候選框,然后再做進一步的分類和邊框回歸,過程分為兩個階段,因此叫兩段式。典型代表有R-CNN,SPP,Fast R-CNN,Faster R-CNN,R-FCN,Mask R-CNN,這些剛好也是按照時間順序,在前人基礎上一步一步發展起來的。

4.1.1 R-CNN

2013年由rbg提出,是利用卷積神經網絡來做目標檢測的開山之作,意義重大。

檢測過程:

  • 輸入測試圖像,利用選擇性搜索Selective Search算法在圖像中提取2000個左右的可能包含物體的候選框;
  • 因為取出的候選框大小各不相同,所以需要將每個候選框縮放(warp)成統一的227x227的大小並輸入到CNN,將CNN的fc7層的輸出作為提取到的特征;
  • 將每個候選框提取到的CNN特征輸入到SVM進行分類;
  • 對那些識別出目標的特征向量,送到邊框回歸器中校正窗口,生成預測窗口坐標。

訓練過程:

  • 步驟一,訓練CNN:首先下載(或者訓練)一個分類模型(比如AlexNet);然后對模型進行微調,即將分類數從1000改為20,比如20個物體類別 + 1個背景,訓練完之后去掉最后一個全連接層。
  • 步驟二,提取特征:提取圖像的所有候選框(選擇性搜索Selective Search);針對每一個區域,將每個候選框縮放(warp)后輸入到CNN,將第五個池化層的輸出(就是對候選框提取到的特征)存到硬盤。
  • 步驟三,訓練分類器:針對每一個類別,訓練一個SVM分類器(二分類),是就是positive,反之nagative。
  • 步驟四,訓練邊框回歸器:針對每一個類別,訓練一個對應的邊框回歸器。

注意:

  • 針對每一個類別,都有一個SVM分類器,采用OVR方法完成多類別的分類;(林軒田老師在機器學習基石課上說這種方法不好,因為采用硬分類器的OVR會導致有些樣本無法歸類,或者被歸為不同的類,所以應該用軟分類LR)(個人理解:此處用SVM分類器,可能是圖像特征空間維度特別大,所以各類別的特征之間離得很遠,故不需擔心這種問題)

R-CNN缺點:

  • 訓練分為多個階段,需要微調網絡+訓練SVM+訓練邊框回歸器,步驟繁瑣:
  • Selective Search選出來的候選框大小不一,都要經過縮放之后再提取特征,會丟失一些信息;
  • 每張原圖約有2000張候選框,每個都要進行特征提取,導致大量的重復計算(很多候選區域重疊),一方面耗時(使用GPU,VGG16模型處理一張圖像需要47s),另一方面提取出的特征占用大量磁盤空間(5000張圖像產生幾百G的特征文件)。

4.1.2 SPP-Net

2014年何愷明提出SPP-Net,解決了R-CNN中兩個大問題:一是每個候選框都要送到CNN中提取特征;二是每個候選框都要縮放成固定大小。SPP-Net利用CNN,只提取一次圖像的特征,將各個候選框的坐標映射到特征圖上,從而直接得到各個候選框的特征區域(ROI),避免了R-CNN中對各個候選框重復地提取特征;使用空間金字塔池化,使得任意大小的ROI都能夠轉換成固定大小的特征向量。

檢測過程:

  • 第一步同R-CNN,利用Selective Search算法在圖像中提取2000個左右的可能包含物體的候選框;
  • 將原圖輸入ZF-5網絡,提取出圖像的特征(通道個數為256維);
  • 利用stride映射方法,將各個候選框坐標直接映射到特征圖上,從而得到各個候選框對應的ROI;
  • 利用空間金字塔網絡,將上一步得到的ROI轉換成固定大小的輸出(12800維);
  • 將上一步得到的12800維向量接上fc6和fc7,之后去做分類和邊框回歸。

空間金字塔池化的具體過程:針對任意一張ROI,用一張6x6的格子模板將其切成36塊;同理,繼續用3x3、2x2、1x1的格子將其切分成不同尺度的塊(總共可以切成50塊),然后做最大池化,從而得到了50x256=12800維的特征向量。(上圖為示意圖,其中只有4x4、2x2、1x1的格子,因此輸出的是21x256=5376維的特征向量)

如何將原圖候選框映射到特征圖上:在文章的附錄A中直接給出了一個簡單的計算公式,即對於top/left坐標 \(x'= \lfloor x/S \rfloor + 1\),對於bottom/right坐標 \(x'= \lceil x/S \rceil - 1\)。其中\(x'\)表示特征圖中的坐標,\(x\)表示原圖中坐標,S表示stride,即下采樣倍數。

4.1.3 Fast R-CNN

2015年rbg提出Fast R-CNN,吸收了SPP-Net中這兩個巧妙的解決方案,並針對損失函數做了優化。Fast R-CNN和R-CNN相比,訓練時間從84小時減少到9.5小時,測試時間從47秒減少到0.32秒,並且在PASCAL VOC 2007上測試的准確率相差無幾,約在66%-67%之間。

針對R-CNN的主要改進點:

  • 吸收SPP Net的思想,只對原圖做一次特征提取,然后將選擇出來的候選區域映射到特征圖上,直接從特征圖上得到ROI;
  • 將VGG最后一層池化層換成ROI池化層(即單層SPP),可以將不同尺度的ROI轉化為固定的尺寸,便於和后面全連接層對接;
  • 將分類器由SVM換成softmax,將邊框回歸器的損失換成smooth L1損失,然后將兩個損失函數合並成一個多任務損失函數(multi-task loss),將邊框回歸器和分類器放在一塊訓練,這樣整個的訓練過程是端到端的(除去Region Proposal提取階段)。(smooth L1 loss讓loss對於離群點更加魯棒,即:相比於L2損失函數,其對離群點、異常值(outlier)不敏感,梯度變化相對更小,訓練時不容易跑飛。)

4.1.4 Faster R-CNN

經過對R-CNN的改進,Fast R-CNN可以把處理一張圖像的時間從47s降到0.32s(不包括提取候選框的時間),但Selective Search在原圖像上提取候選框這一步的時間接近2s,所以整個檢測環節的瓶頸就卡在這一步。於是,2015年任少卿等人提出Faster R-CNN,直接把Selective Search提取候選框這一步換成RPN(Region Proposal NetWork)即Faster R-CNN = RPN + Fast R-CNN。RPN(Region Proposal Networks)的結構很簡單,只有兩層卷積,利用一個分類器和一個邊框回歸器,直接從特征圖上提取ROI,然后送到后面進一步細分。經過改進,Faster R-CNN將特征抽取(feature extraction)、ROI提取、邊框回歸、分類都整合在了一個網絡中,把處理一張圖像的時間從2s降到了0.2s(包括提取候選框的時間)。

RPN運行機制:

  • 利用CNN(比如ZFNet、VGG16、ResNet)提取圖像特征;
  • 利用3x3卷積核對整張特征圖進行卷積,得到尺寸不變的特征圖,其中每個像素對應的256維特征向量代表了對應感受野的局部語義特征;每個像素點對應k個錨框,這里k=9,因此需要獲得每個錨框的類別概率和偏移量;
  • 對於每個256維特征向量,分別通過1x1卷積,得到2x9的分類結果和4x9的回歸結果;
  • 將RPN輸出的前景和偏移量映射回原圖,得到一堆的預測框,經過NMS和TopN處理后即可得到一堆的候選框;
  • 將候選框坐標通過Fast R-CNN中stride映射的方式,map到整張特征圖上,即可得到一堆候ROI。

注意:

  • RPN中使用3x3進行卷積,卷積結果對應的感受野:ZFNet是171,VGG16是228;而Faster R-CNN實際使用了3組大小(128×128、256×256、512×512)、3組長寬比(1:1、1:2、2:1),共計9個錨框。換句話說,感受野大致和中等錨框的尺寸一致,但小於大錨框的尺寸,作者解釋這樣也是可行的。
  • 基於ResNet101的Faster R-CNN,ROI池化層插在第四個卷積模塊的輸出后面,而非第五個,即利用第四個卷積模塊的輸出作為提取到的圖像特征,所有的計算只共享前面91層(1+(3+4+23)x3=91)。
  • 可參考RPN 解析一文讀懂Faster RCNN.

4.1.5 R-FCN

Faster R-CNN在ROI pooling之后,需要對每個ROI單獨進行兩分支預測,比如基於ResNet101時,所有的計算只共享前面91層卷積,而摳出來的各個ROI都不得不單獨跑一遍后10層卷積。2016年微軟戴季峰等人提出R-FCN,旨在使幾乎所有的計算共享,以進一步加快速度。

主要思路:

  • 對於region-based的檢測方法,以Faster R-CNN為例,實際上是分成了幾個subnetwork,第一個用來在整張圖上做比較耗時的conv,這些操作與region無關,是計算共享的。第二個subnetwork是用來產生候選框(如RPN),第三個subnetwork用來分類或回歸(如Fast RCNN),這個subnetwork和region是有關系的,必須每個region單獨跑網絡,銜接在這個subnetwork和前兩個subnetwork中間的就是ROI pooling。我們希望的是,耗時的卷積都盡量移到前面共享的subnetwork上。
  • 但是直接將ROI池化層放到ResNet101的第五個卷積模塊后面會導致效果變差,因為網絡太深,導致出來的特征圖尺寸不夠,難以攜帶足夠的信息,特別是位置信息,於是設置一個位置敏感得分圖,用來保留位置信息。
  • 因此R-FCN的做法是,從conv4引出RPN獲得ROI,再將ROI映射到得分圖上,通過位置敏感ROI池化(position sensitive roi pooling)的方法獲得ROI池化特征圖。(Faster R-CNN是從conv4特征圖上摳出ROI特征區域后,用普通ROI池化的方法得到ROI池化特征圖的)

具體細節可參考源碼。以k=7, C=20為例,假設ResNet的輸出為100x100x2048,則數據流如下所示:

R-FCN的網絡結構:

  • 基礎conv網絡是ResNet101,將全局平均池化和fc層去掉,換成1x1的卷積層以減少通道數(由2048轉成1024),即這101層卷積網絡是共享的。
  • 針對上一步中101層網絡的輸出,采用\(k^2 * (C+1)\)個1x1卷積核來卷積,得到\(k^2\)組特征圖,其中每組有C+1個通道(即總通道數為1029),即稱為位置敏感得分圖rfcn_cls,其寬高不變。另一條路徑rfcn_bbox類似,輸出通道數8x7x7=392。
  • RPN從conv4的輸出引出分類器和回歸器,映射到原圖上,得到一堆候選框。
  • 將候選框映射到rfcn_cls上(實現時直接除以stride=16),並通過位置敏感ROI池化的方法,得到大小為7x7,通道數為21的ROI池化特征圖,再經過全局平均池化和softmax之后輸出分類結果;另一路類似,得到回歸結果。
  • 位置敏感ROI池化和Faster R-CNN中普通ROI池化不同,后者只需要把ROI切成7x7個格子,每個格子做最大池化即可,而前者將ROI切成7x7個格子后,每個格子取自不同的組,然后再做池化(如第一幅圖中位置敏感池化后,特征圖中每一個格子都對應不同的顏色,注意圖中只是分類那一支,且取k=3)。

4.1.6 Mask R-CNN

2017年何愷明提出Mask R-CNN,綜合了很多此前優秀的研究成果,可以同時進行目標檢測和實例分割。簡單而言,Mask R-CNN = ResNet + FPN + Faster R-CNN + Mask,並通過RoI Align和特殊的mask損失進一步提升性能。

模型細節:

  • 沿用了Faster R-CNN的思想:即利用RPN獲取候選框,再映射到特征圖上摳出RoI,經過池化后得到固定大小的RoI,之后就送去做分類和回歸。但Mask R-CNN在RoI之后又加了另一個Mask分支,用於做實例分割。即每個RoI在池化后有兩路分支head:分類和回歸head、mask head。
  • Backbone有多種選擇,比如ResNet50、ResNet101、ResNeXt50、ResNeXt101,用network-depth-features來表示,比如常用的ResNet-50-C4,表示采用的是ResNet50上第4個卷積模塊的輸出特征圖;另外還可以選擇帶或者不帶FPN,比如ResNeXt-101-FPN表示采用的是ResNeXt101上FPN輸出的特征圖。這里只以ResNet-101-FPN為例。
  • ResNet-FPN的架構,是從P2、P3、P4、P5、P6特征圖引出RPN,經過后處理得到一堆的候選框,然后針對每個候選框,從P2、P3、P4、P5這四個特征圖上通過公式 \(k = \lfloor k_0 + log_2(\frac{\sqrt{wh}}{224}) \rfloor\) 選擇一個特征圖(\(k_0\)通常選4),來摳出對應的RoI。
  • 普通的RoI池化層在兩個地方做了取整操作:一是將候選框映射到特征圖上摳出RoI時,一是進行RoI池化時。這對目標檢測任務影響不大,但由於mask分支是像素級別的預測,因此需要更精細的坐標對應。所以將普通RoI池化層換成RoI Align層,即在這兩步中保留浮點數,在池化時采用雙線性插值的方法獲得固定大小的池化特征圖。
  • 上一步得到RoI池化特征圖之后,分別送到兩個分支,分類和回歸分支仍然用Fast R-CNN,mask分支采用FCN的方式獲得像素級別的mask模板,通道數為類別個數80,其中每一層的mask都代表了對應的類別概率。(注意這里的類別概率是各個像素上每一個類別進行sigmoid激活)
  • 特殊的損失函數:FCN是對每個像素進行多類別softmax分類,然后計算交叉熵損失,而這里不同。區別1:mask分支輸出的80層mask,並非是80個類別進行softmax激活,而是每一個類別進行sigmoid激活;區別2:對於每一個像素來說,計算損失時,並非是直接拿80個類別的概率來計算交叉熵損失,而是這個像素屬於哪個類別,就拿那個類別對應的概率值來計算二值交叉熵。這樣就避免了類間競爭,讓其他類別不再貢獻損失(如果用softmax計算交叉熵,則其他類別會間接貢獻損失)。
  • 下圖是兩種head配置,分別是利用ResNet-C4和ResNet-FPN的backbone。

4.2 一段式目標檢測

一段式目標檢測的算法主要代表是YOLO(v1/v2/v3)和SSD。由於圖像只需前饋網絡一次,速度通常更快,可以達到實時。

(這一段還在整理中...)

Reference:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM