轉:目標檢測算法總結 【深度學習】目標檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)

【深度學習】目標檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)

目標檢測是不少計算機視覺任務的基礎,不論咱們須要實現圖像與文字的交互仍是須要識別精細類別,它都提供了可靠的信息。本文對目標檢測進行了總體回顧,第一部分從RCNN開始介紹基於候選區域的目標檢測器,包括Fast R-CNN、Faster R-CNN 和 FPN等。第二部分則重點討論了包括YOLO、SSD和RetinaNet等在內的單次檢測器,它們都是目前最爲優秀的方法。html

1、基於候選區域的目標檢測器

1.1  滑動窗口檢測器

  自從 AlexNet 得到 ILSVRC 2012 挑戰賽冠軍後,用 CNN 進行分類成爲主流。一種用於目標檢測的暴力方法是從左到右、從上到下滑動窗口,利用分類識別目標。爲了在不一樣觀察距離處檢測不一樣的目標類型,咱們使用不一樣大小和寬高比的窗口。算法

滑動窗口(從右到左,從上到下)windows

  咱們根據滑動窗口從圖像中剪切圖像塊。因爲不少分類器只取固定大小的圖像,所以這些圖像塊是通過變形轉換的。可是,這不影響分類準確率,由於分類器能夠處理變形後的圖像。數組

將圖像變形轉換成固定大小的圖像網絡

  變形圖像塊被輸入 CNN 分類器中,提取出 4096 個特徵。以後,咱們使用 SVM 分類器識別類別和該邊界框的另外一個線性迴歸器架構

滑動窗口檢測器的系統工做流程圖函數

  下面是僞代碼。咱們建立不少窗口來檢測不一樣位置的不一樣目標。要提高性能,一個顯而易見的辦法就是減小窗口數量。post

for window in windows patch = get_patch(image, window) 
  results = detector(patch)

1.2  選擇性搜索

  咱們不使用暴力方法,而是用候選區域方法(region proposal method)建立目標檢測的感興趣區域(ROI)選擇性搜索(selective search,SS)中,咱們首先將每一個像素做爲一組。而後,計算每一組的紋理,並將兩個最接近的組結合起來。可是爲了不單個區域吞噬其餘區域,咱們首先對較小的組進行分組。咱們繼續合併區域,直到全部區域都結合在一塊兒。下圖第一行展現瞭如何使區域增加,第二行中的藍色矩形表明合併過程當中全部可能的 ROI性能

圖源:van de Sande et al. ICCV'11學習

1.3  R-CNN

  R-CNN 利用候選區域方法建立了約 2000 個 ROI。這些區域被轉換爲固定大小的圖像,並分別饋送到卷積神經網絡中(將原始圖像根據ROI切割、reshape再送進NN學習)。該網絡架構後面會跟幾個全鏈接層,以實現目標分類並提煉邊界框。

  使用候選區域、CNN、仿射層來定位目標。如下是 R-CNN 整個系統的流程圖:

  經過使用更少且更高質量的 ROI,R-CNN 要比滑動窗口方法更快速、更準確。

ROIs = region_proposal(image)
for ROI in ROIs: patch = get_patch(image, ROI) results = detector(pach)

 

  • 邊界框迴歸器

  候選區域方法有很是高的計算複雜度。爲了加速這個過程,咱們一般會使用計算量較少的候選區域選擇方法構建 ROI,並在後面使用線性迴歸器(使用全鏈接層)進一步提煉邊界框。

從RCNN到SSD,這應該是最全的一份目標檢測算法盤點

使用迴歸方法將藍色的原始邊界框提煉爲紅色的

1.4  Fast R-CNN

  R-CNN 須要很是多的候選區域以提高準確度,但其實有不少區域是彼此重疊的,所以 R-CNN 的訓練和推斷速度很是慢。若是咱們有 2000 個候選區域,且每個都須要獨立地饋送到 CNN 中,那麼對於不一樣的 ROI,咱們須要重複提取 2000 次特徵。(R-CNN不少卷積運算是重複的

  此外,CNN 中的特徵圖以一種密集的方式表徵空間特徵,那麼咱們能直接使用特徵圖代替原圖來檢測目標嗎?

直接利用特徵圖計算 ROI

  Fast R-CNN 使用特徵提取器(CNN)先提取整個圖像的特徵,而不是從頭開始對每一個圖像塊提取屢次。而後,咱們能夠將建立候選區域的方法直接應用到提取到的特徵圖上。例如,Fast R-CNN 選擇了 VGG16 中的卷積層 conv5 輸出的 Feture Map 來生成 ROI,這些關注區域隨後會結合對應的特徵圖以裁剪爲特徵圖塊,並用於目標檢測任務中。咱們使用 ROI 池化將特徵圖塊轉換爲固定的大小,並饋送到全鏈接層進行分類和定位。由於 Fast-RCNN 不會重複提取特徵,所以它能顯著地減小處理時間。

將候選區域直接應用於特徵圖,並使用 ROI 池化將其轉化爲固定大小的特徵圖塊

  如下是 Fast R-CNN 的流程圖:

  在下面的僞代碼中,計算量巨大的特徵提取過程從 For 循環中移出來了,所以速度獲得顯著提高。Fast R-CNN 的訓練速度是 R-CNN 的 10 倍,推斷速度是後者的 150 倍。

feature_maps = process(image)
ROIs = region_proposal(feature_maps) for ROI in ROIs: patch = roi_pooling(feature_maps, ROI) results = detector2(patch)

  Fast R-CNN 最重要的一點就是包含特徵提取器、分類器和邊界框迴歸器在內的整個網絡能經過多任務損失函數進行端到端的訓練,這種多任務損失即結合了分類損失和定位損失的方法,大大提高了模型準確度。

  • ROI 池化

  由於 Fast R-CNN 使用全鏈接層,因此咱們應用 ROI 池化將不一樣大小的 ROI 轉換爲固定大小。

  爲簡潔起見,咱們先將 8×8 特徵圖轉換爲預約義的 2×2 大小。

  • 下圖左上角:特徵圖。

  • 右上角:將 ROI(藍色區域)與特徵圖重疊。

  • 左下角:將 ROI 拆分爲目標維度。例如,對於 2×2 目標,咱們將 ROI 分割爲 4 個大小類似或相等的部分。

  • 右下角:找到每一個部分的最大值,獲得變換後的特徵圖。

輸入特徵圖(左上),輸出特徵圖(右下),ROI (右上,藍色框)

  按上述步驟獲得一個 2×2 的特徵圖塊,能夠饋送至分類器和邊界框迴歸器中。

1.5  Faster R-CNN

  Fast R-CNN 依賴於外部候選區域方法,如選擇性搜索。但這些算法在 CPU 上運行且速度很慢。在測試中,Fast R-CNN 須要 2.3 秒來進行預測,其中 2 秒用於生成 2000 個 ROI。

feature_maps = process(image)
ROIs = region_proposal(feature_maps)  # Expensive! for ROI in ROIs patch = roi_pooling(feature_maps, ROI) results = detector2(patch)

  Faster R-CNN 採用與 Fast R-CNN 相同的設計,只是它用內部深層網絡代替了候選區域方法。新的候選區域網絡(RPN)在生成 ROI 時效率更高,而且以每幅圖像 10 毫秒的速度運行。

Faster R-CNN 的流程圖與 Fast R-CNN 相同

外部候選區域方法代替了內部深層網絡

  • 候選區域網絡(RPN)

  候選區域網絡(RPN)將第一個卷積網絡的輸出特徵圖做爲輸入。它在特徵圖上滑動一個 3×3 的卷積核,以使用卷積網絡(以下所示的 ZF 網絡)構建與類別無關的候選區域。其餘深度網絡(如 VGG 或 ResNet)可用於更全面的特徵提取,但這須要以速度爲代價。ZF 網絡最後會輸出 256 個值,它們將饋送到兩個獨立的全鏈接層,以預測邊界框和兩個 objectness 分數,這兩個 objectness 分數度量了邊界框是否包含目標。咱們其實可使用迴歸器計算單個 objectness 分數,但爲簡潔起見,Faster R-CNN 使用只有兩個類別的分類器:即帶有目標的類別不帶有目標的類別

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

  此處有 3 種猜測,稍後咱們將予以完善。因爲只須要一個正確猜測,所以咱們最初的猜測最好涵蓋不一樣的形狀和大小。所以,Faster R-CNN 不會建立隨機邊界框。相反,它會預測一些與左上角名爲「錨點」的參考框相關的偏移量(如x、y)。咱們限制這些偏移量的值,所以咱們的猜測仍然相似於錨點。

  要對每一個位置進行 k 個預測,咱們須要以每一個位置爲中心的 k 個錨點。每一個預測與特定錨點相關聯,但不一樣位置共享相同形狀的錨點。

  這些錨點是精心挑選的,所以它們是多樣的,且覆蓋具備不一樣比例和寬高比的現實目標。這使得咱們能夠以更好的猜測來指導初始訓練,並容許每一個預測專門用於特定的形狀。該策略使早期訓練更加穩定和簡便。

圖源:https://arxiv.org/pdf/1506.01497.pdf

  Faster R-CNN 使用更多的錨點。它部署 9 個錨點框:3 個不一樣寬高比的 3 個不一樣大小的錨點框。每個位置使用 9 個錨點,每一個位置會生成 2×9 個 objectness 分數和 4×9 個座標。

  • R-CNN 方法的性能

  以下圖所示,Faster R-CNN 的速度要快得多。

1.6  基於區域的全卷積神經網絡(R-FCN)

  假設咱們只有一個特徵圖用來檢測右眼。那麼咱們可使用它定位人臉嗎?應該能夠。由於右眼應該在人臉圖像的左上角,因此咱們能夠利用這一點定位整我的臉。

  若是咱們還有其餘用來檢測左眼、鼻子或嘴巴的特徵圖,那麼咱們能夠將檢測結果結合起來,更好地定位人臉。

  如今咱們回顧一下全部問題。在 Faster R-CNN 中,檢測器使用了多個全鏈接層進行預測。若是有 2000 個 ROI,那麼成本很是高。

複製代碼
feature_maps = process(image)
ROIs = region_proposal(feature_maps) for ROI in ROIs patch = roi_pooling(feature_maps, ROI) class_scores, box = detector(patch) # Expensive! class_probabilities = softmax(class_scores)
複製代碼

 

  R-FCN 經過減小每一個 ROI 所需的工做量實現加速(去掉了全鏈接層)。上面基於區域的特徵圖與 ROI 是獨立的,能夠在每一個 ROI 以外單獨計算。剩下的工做就比較簡單了,所以 R-FCN 的速度比 Faster R-CNN 快。

複製代碼
feature_maps = process(image)
ROIs = region_proposal(feature_maps) score_maps = compute_score_map(feature_maps) for ROI in ROIs V = region_roi_pool(score_maps, ROI) class_scores, box = average(V) # Much simpler! class_probabilities = softmax(class_scores)
複製代碼

  如今咱們來看一下 5 × 5 的特徵圖 M,內部包含一個藍色方塊。咱們將方塊平均分紅 3 × 3 個區域。如今,咱們在 M 中建立了一個新的特徵圖,來檢測方塊的左上角(TL)。這個新的特徵圖以下圖(右)所示。只有黃色的網格單元 [2, 2] 處於激活狀態。

在左側建立一個新的特徵圖,用於檢測目標的左上角

  咱們將方塊分紅 9 個部分,由此建立了 9 個特徵圖,每一個用來檢測對應的目標區域。這些特徵圖叫做位置敏感得分圖(position-sensitive score map),由於每一個圖檢測目標的子區域(計算其得分)。

生成 9 個得分圖

  下圖中紅色虛線矩形是建議的 ROI。咱們將其分割成 3 × 3 個區域,並詢問每一個區域包含目標對應部分的機率是多少。例如,左上角 ROI 區域包含左眼的機率。咱們將結果存儲成 3 × 3 vote 數組,以下圖(右)所示。例如,vote_array[0][0] 包含左上角區域是否包含目標對應部分的得分。

將 ROI 應用到特徵圖上,輸出一個 3 x 3 數組

  將得分圖(Feature Map)和 ROI 映射到 vote 數組的過程叫做位置敏感 ROI 池化(position-sensitive ROI-pool)。該過程與前面討論過的 ROI 池化很是接近。

將 ROI 的一部分疊加到對應的得分圖上,計算 V[i][j]

  在計算出位置敏感 ROI 池化的全部值後,類別得分是其全部元素得分的平均值。

ROI 池化

  假如咱們有 C 個類別要檢測。咱們將其擴展爲 C + 1 個類別,這樣就爲背景(非目標)增長了一個新的類別。每一個類別有 3 × 3 個得分圖,所以一共有 (C+1) × 3 × 3 個得分圖。使用每一個類別的得分圖能夠預測出該類別的類別得分。而後咱們對這些得分應用 softmax 函數,計算出每一個類別的機率。

  如下是數據流圖,在咱們的案例中,k=3。

 

1.7  R-CNN系列總結

  咱們首先了解了基礎的滑動窗口算法:

for window in windows patch = get_patch(image, window) results = detector(patch)

  而後嘗試減小窗口數量,儘量減小 for 循環中的工做量。

ROIs = region_proposal(image)
for ROI in ROIs patch = get_patch(image, ROI) results = detector(patch)

 

2、單次目標檢測器

  第二部分,咱們將對單次目標檢測器(包括 SSD、YOLO、YOLOv二、YOLOv3)進行綜述。咱們將分析 FPN 以理解多尺度特徵圖如何提升準確率,特別是小目標的檢測,其在單次檢測器中的檢測效果一般不好。而後咱們將分析 Focal loss 和 RetinaNet,看看它們是如何解決訓練過程當中的類別不平衡問題的。

2.1  單次檢測器

  Faster R-CNN 中,在分類器以後有一個專用的候選區域網絡。

Faster R-CNN 工做流

  基於區域的檢測器是很準確的,但須要付出代價。Faster R-CNN 在 PASCAL VOC 2007 測試集上每秒處理 7 幀的圖像(7 FPS)。和 R-FCN 相似,研究者經過減小每一個 ROI 的工做量來精簡流程。

feature_maps = process(image)
ROIs = region_proposal(feature_maps) for ROI in ROIs patch = roi_align(feature_maps, ROI) results = detector2(patch) # Reduce the amount of work here!

  做爲替代,咱們是否須要一個分離的候選區域步驟?咱們能夠直接在一個步驟內獲得邊界框和類別嗎?

feature_maps = process(image)
results = detector3(feature_maps) # No more separate step for ROIs

  讓咱們再看一下滑動窗口檢測器。咱們能夠經過在特徵圖上滑動窗口來檢測目標。對於不一樣的目標類型,咱們使用不一樣的窗口類型。之前的滑動窗口方法的致命錯誤在於使用窗口做爲最終的邊界框,這就須要很是多的形狀來覆蓋大部分目標。更有效的方法是將窗口當作初始猜測,這樣咱們就獲得了從當前滑動窗口同時預測類別和邊界框的檢測器。

基於滑動窗口進行預測

  這個概念和 Faster R-CNN 中的錨點很類似。然而,單次檢測器會同時預測邊界框和類別。例如,咱們有一個 8 × 8 特徵圖,並在每一個位置作出 k 個預測,即總共有 8 × 8 × k 個預測結果。

64 個位置

  在每一個位置,咱們有 k 個錨點(錨點是固定的初始邊界框猜測),一個錨點對應一個特定位置。咱們使用相同的錨點形狀仔細地選擇錨點和每一個位置。

使用 4 個錨點在每一個位置作出 4 個預測

  如下是 4 個錨點(綠色)和 4 個對應預測(藍色),每一個預測對應一個特定錨點。

4 個預測,每一個預測對應一個錨點

   Faster R-CNN 中,咱們使用卷積核來作 5 個參數的預測:4 個參數對應某個錨點的預測邊框,1 個參數對應 objectness 置信度得分。所以 3× 3× D × 5 卷積核將特徵圖從 8 × 8 × D 轉換爲 8 × 8 × 5。

使用 3x3 卷積覈計算預測

  在單次檢測器中,卷積核還預測 C 個類別機率以執行分類(每一個機率對應一個類別)。所以咱們應用一個 3× 3× D × 25 卷積核將特徵圖從 8 × 8 × D 轉換爲 8 × 8 × 25(C=20)。

每一個位置作出 k 個預測,每一個預測有 25 個參數

  單次檢測器一般須要在準確率和實時處理速度之間進行權衡。它們在檢測太近距離或過小的目標時容易出現問題。在下圖中,左下角有 9 個聖誕老人,但某個單次檢測器只檢測出了 5 個。

 

2.2  SSD (Single Shot MultiBox Detector)

  SSD 是使用 VGG19 網絡做爲特徵提取器(和 Faster R-CNN 中使用的 CNN 同樣)的單次檢測器。咱們在該網絡以後添加自定義卷積層(藍色),並使用卷積核(綠色)執行預測。

同時對類別和位置執行單次預測

  然而,卷積層下降了空間維度和分辨率。所以上述模型僅能夠檢測較大的目標爲了解決該問題,咱們從多個特徵圖上執行獨立的目標檢測。採用多尺度特徵圖獨立檢測。

使用多尺度特徵圖用於檢測

  如下是特徵圖圖示。

圖源:https://arxiv.org/pdf/1512.02325.pdf

  SSD 使用卷積網絡中較深的層來檢測目標。若是咱們按接近真實的比例重繪上圖,咱們會發現圖像的空間分辨率已經被顯著下降,且可能已沒法定位在低分辨率中難以檢測的小目標。若是出現了這樣的問題,咱們須要增長輸入圖像的分辨率。

2.3  YOLO

YOLO 是另外一種單次目標檢測器。

 

  YOLO  在卷積層以後使用了 DarkNet 來作特徵檢測。

  然而,它並無使用多尺度特徵圖來作獨立的檢測。相反,它將特徵圖部分平滑化,並將其和另外一個較低分辨率的特徵圖拼接。例如,YOLO 將一個 28 × 28 × 512 的層重塑爲 14 × 14 × 2048,而後將它和 14 × 14 ×1024 的特徵圖拼接。以後,YOLO 在新的 14 × 14 × 3072 層上應用卷積核進行預測。

  YOLO(v2)作出了不少實現上的改進,將 mAP 值從第一次發佈時的 63.4 提升到了 78.6。YOLO9000 能夠檢測 9000 種不一樣類別的目標。

圖源:https://arxiv.org/pdf/1612.08242.pdf

  如下是 YOLO 論文中不一樣檢測器的 mAP 和 FPS 對比。YOLOv2 能夠處理不一樣分辨率的輸入圖像。低分辨率的圖像能夠獲得更高的 FPS,但 mAP 值更低。

圖源:https://arxiv.org/pdf/1612.08242.pdf

  YOLOv3 使用了更加複雜的骨幹網絡來提取特徵。DarkNet-53 主要由 3 × 3 和 1× 1 的卷積核以及相似 ResNet 中的跳過鏈接構成。相比 ResNet-152,DarkNet 有更低的 BFLOP(十億次浮點數運算),但能以 2 倍的速度獲得相同的分類準確率。

圖源:https://pjreddie.com/media/files/papers/YOLOv3.pdf

  YOLOv3 還添加了特徵金字塔,以更好地檢測小目標。如下是不一樣檢測器的準確率和速度的權衡。

圖源:https://pjreddie.com/media/files/papers/YOLOv3.pdf

特徵金字塔網絡(FPN)

  檢測不一樣尺度的目標頗有挑戰性,尤爲是小目標的檢測。特徵金字塔網絡(FPN)是一種旨在提升準確率和速度的特徵提取器。它取代了檢測器(如 Faster R-CNN)中的特徵提取器,並生成更高質量的特徵圖金字塔。

數據流

FPN(圖源:https://arxiv.org/pdf/1612.03144.pdf)

  FPN 由自下而上和自上而下路徑組成。其中自下而上的路徑是用於特徵提取的經常使用卷積網絡。空間分辨率自下而上地降低。當檢測到更高層的結構,每層的語義值增長。

FPN 中的特徵提取(編輯自原論文)

  SSD 經過多個特徵圖完成檢測。可是,最底層不會被選擇執行目標檢測。它們的分辨率高可是語義值不夠,致使速度顯著降低而不能被使用。SSD 只使用較上層執行目標檢測,所以對於小的物體的檢測性能較差。

圖像修改自論文 https://arxiv.org/pdf/1612.03144.pdf

  FPN 提供了一條自上而下的路徑,從語義豐富的層構建高分辨率的層。

自上而下重建空間分辨率(編輯自原論文)

  雖然該重建層的語義較強,但在通過全部的上採樣和下采樣以後,目標的位置不精確。在重建層和相應的特徵圖之間添加橫向鏈接可使位置偵測更加準確。

增長跳過鏈接(引自原論文)

  下圖詳細說明了自下而上和自上而下的路徑。其中 P二、P三、P4 和 P5 是用於目標檢測的特徵圖金字塔。

FPN 結合 RPN

  FPN 不單純是目標檢測器,仍是一個目標檢測器和協同工做的特徵檢測器。分別傳遞到各個特徵圖(P2 到 P5)來完成目標檢測。

FPN 結合 Fast R-CNN 或 Faster R-CNN

  在 FPN 中,咱們生成了一個特徵圖的金字塔。用 RPN(詳見上文)來生成 ROI。基於 ROI 的大小,咱們選擇最合適尺寸的特徵圖層來提取特徵塊。

困難案例

  對於如 SSD 和 YOLO 的大多數檢測算法來講,咱們作了比實際的目標數量要多得多的預測。因此錯誤的預測比正確的預測要更多。這產生了一個對訓練不利的類別不平衡。訓練更多的是在學習背景,而不是檢測目標。可是,咱們須要負採樣來學習什麼是較差的預測。因此,咱們計算置信度損失來把訓練樣本分類。選取最好的那些來確保負樣本和正樣本的比例最多不超過 3:1。這使訓練更加快速和穩定。

推斷過程當中的非極大值抑制

  檢測器對於同一個目標會作出重複的檢測。咱們利用非極大值抑制來移除置信度低的重複檢測。將預測按照置信度從高到低排列。若是任何預測和當前預測的類別相同而且二者 IoU 大於 0.5,咱們就把它從這個序列中剔除。

Focal Loss(RetinaNet)

  類別不平衡會損害性能。SSD 在訓練期間從新採樣目標類和背景類的比率,這樣它就不會被圖像背景淹沒。Focal loss(FL)採用另外一種方法來減小訓練良好的類的損失。所以,只要該模型可以很好地檢測背景,就能夠減小其損失並從新加強對目標類的訓練。咱們從交叉熵損失 CE 開始,並添加一個權重來下降高可信度類的 CE。

  例如,令 γ = 0.5, 經良好分類的樣本的 Focal loss 趨近於 0。

編輯自原論文

  這是基於 FPN、ResNet 以及利用 Focal loss 構建的 RetianNet

RetinaNet

 

原文連接:https://medium.com/@jonathan_hui/what-do-we-learn-from-region-based-object-detectors-faster-r-cnn-r-fcn-fpn-7e354377a7c9https://medium.com/@jonathan_hui/what-do-we-learn-from-single-shot-object-detectors-ssd-yolo-fpn-focal-loss-3888677c5f4d

相關文章
相關標籤/搜索