天天看點

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

轉自:

https://www.cnblogs.com/guoyaohua/p/8994246.html

目标檢測是很多計算機視覺任務的基礎,不論我們需要實作圖像與文字的互動還是需要識别精細類别,它都提供了可靠的資訊。本文對目标檢測進行了整體回顧,第一部分從RCNN開始介紹基于候選區域的目标檢測器,包括Fast R-CNN、Faster R-CNN 和 FPN等。第二部分則重點讨論了包括YOLO、SSD和RetinaNet等在内的單次檢測器,它們都是目前最為優秀的方法。

一、基于候選區域的目标檢測器

1.1  滑動視窗檢測器

  自從 AlexNet 獲得 ILSVRC 2012 挑戰賽冠軍後,用 CNN 進行分類成為主流。一種用于目标檢測的暴力方法是從左到右、從上到下滑動視窗,利用分類識别目标。為了在不同觀察距離處檢測不同的目标類型,我們使用不同大小和寬高比的視窗。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

  我們根據滑動視窗從圖像中剪切圖像塊。由于很多分類器隻取固定大小的圖像,是以這些圖像塊是經過變形轉換的。但是,這不影響分類準确率,因為分類器可以處理變形後的圖像。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

将圖像變形轉換成固定大小的圖像

  變形圖像塊被輸入 CNN 分類器中,提取出 4096 個特征。之後,我們使用 SVM 分類器識别類别和該邊界框的另一個線性回歸器。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

滑動視窗檢測器的系統工作流程圖

  下面是僞代碼。我們建立很多視窗來檢測不同位置的不同目标。要提升性能,一個顯而易見的辦法就是減少視窗數量。

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

1.2  選擇性搜尋

  我們不使用暴力方法,而是用候選區域方法(region proposal method)建立目标檢測的感興趣區域(ROI)。在選擇性搜尋(selective search,SS)中,我們首先将每個像素作為一組。然後,計算每一組的紋理,并将兩個最接近的組結合起來。但是為了避免單個區域吞噬其他區域,我們首先對較小的組進行分組。我們繼續合并區域,直到所有區域都結合在一起。下圖第一行展示了如何使區域增長,第二行中的藍色矩形代表合并過程中所有可能的 ROI。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

1.3  R-CNN

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

  通過使用更少且更高品質的 ROI,R-CNN 要比滑動視窗方法更快速、更準确。

ROIs = region_proposal(image)
for ROI in ROIs:
    patch = get_patch(image, ROI) 
    results = detector(pach)      
  • 邊界框回歸器

  候選區域方法有非常高的計算複雜度。為了加速這個過程,我們通常會使用計算量較少的候選區域選擇方法建構 ROI,并在後面使用線性回歸器(使用全連接配接層)進一步提煉邊界框。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

使用回歸方法将藍色的原始邊界框提煉為紅色的

1.4  Fast R-CNN

  R-CNN 需要非常多的候選區域以提升準确度,但其實有很多區域是彼此重疊的,是以 R-CNN 的訓練和推斷速度非常慢。如果我們有 2000 個候選區域,且每一個都需要獨立地饋送到 CNN 中,那麼對于不同的 ROI,我們需要重複提取 2000 次特征。(R-CNN很多卷積運算是重複的)

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器
目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

直接利用特征圖計算 ROI

  Fast R-CNN 使用特征提取器(CNN)先提取整個圖像的特征,而不是從頭開始對每個圖像塊提取多次。然後,我們可以将建立候選區域的方法直接應用到提取到的特征圖上。例如,Fast R-CNN 選擇了 VGG16 中的卷積層 conv5 輸出的 Feture Map 來生成 ROI,這些關注區域随後會結合對應的特征圖以裁剪為特征圖塊,并用于目标檢測任務中。我們使用 ROI 池化将特征圖塊轉換為固定的大小,并饋送到全連接配接層進行分類和定位。因為 Fast-RCNN 不會重複提取特征,是以它能顯著地減少處理時間。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

将候選區域直接應用于特征圖,并使用 ROI 池化将其轉化為固定大小的特征圖塊

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

  在下面的僞代碼中,計算量巨大的特征提取過程從 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 個大小相似或相等的部分。
  • 右下角:找到每個部分的最大值,得到變換後的特征圖。
目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

輸入特征圖(左上),輸出特征圖(右下),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 毫秒的速度運作。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

  • 候選區域網絡(RPN)

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

  此處有 3 種猜想,稍後我們将予以完善。由于隻需要一個正确猜想,是以我們最初的猜想最好涵蓋不同的形狀和大小。是以,Faster R-CNN 不會建立随機邊界框。相反,它會預測一些與左上角名為「錨點」的參考框相關的偏移量(如x、y)。我們限制這些偏移量的值,是以我們的猜想仍然類似于錨點。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

  這些錨點是精心挑選的,是以它們是多樣的,且覆寫具有不同比例和寬高比的現實目标。這使得我們可以以更好的猜想來指導初始訓練,并允許每個預測專門用于特定的形狀。該政策使早期訓練更加穩定和簡便。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

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

  • R-CNN 方法的性能

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

  假設我們隻有一個特征圖用來檢測右眼。那麼我們可以使用它定位人臉嗎?應該可以。因為右眼應該在人臉圖像的左上角,是以我們可以利用這一點定位整個人臉。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

  如果我們還有其他用來檢測左眼、鼻子或嘴巴的特征圖,那麼我們可以将檢測結果結合起來,更好地定位人臉。

  現在我們回顧一下所有問題。在 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] 處于激活狀态。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

在左側建立一個新的特征圖,用于檢測目标的左上角

  我們将方塊分成 9 個部分,由此建立了 9 個特征圖,每個用來檢測對應的目标區域。這些特征圖叫作位置敏感得分圖(position-sensitive score map),因為每個圖檢測目标的子區域(計算其得分)。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

生成 9 個得分圖

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

  将得分圖(Feature Map)和 ROI 映射到 vote 數組的過程叫作位置敏感 ROI 池化(position-sensitive ROI-pool)。該過程與前面讨論過的 ROI 池化非常接近。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

ROI 池化

  假如我們有 C 個類别要檢測。我們将其擴充為 C + 1 個類别,這樣就為背景(非目标)增加了一個新的類别。每個類别有 3 × 3 個得分圖,是以一共有 (C+1) × 3 × 3 個得分圖。使用每個類别的得分圖可以預測出該類别的類别得分。然後我們對這些得分應用 softmax 函數,計算出每個類别的機率。

  以下是資料流圖,在我們的案例中,k=3。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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)      

二、單次目标檢測器

  第二部分,我們将對單次目标檢測器(包括 SSD、YOLO、YOLOv2、YOLOv3)進行綜述。我們将分析 FPN 以了解多尺度特征圖如何提高準确率,特别是小目标的檢測,其在單次檢測器中的檢測效果通常很差。然後我們将分析 Focal loss 和 RetinaNet,看看它們是如何解決訓練過程中的類别不平衡問題的。

2.1  單次檢測器

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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      

  讓我們再看一下滑動視窗檢測器。我們可以通過在特征圖上滑動視窗來檢測目标。對于不同的目标類型,我們使用不同的視窗類型。以前的滑動視窗方法的緻命錯誤在于使用視窗作為最終的邊界框,這就需要非常多的形狀來覆寫大部分目标。更有效的方法是将視窗當做初始猜想,這樣我們就得到了從目前滑動視窗同時預測類别和邊界框的檢測器。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

基于滑動視窗進行預測

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

64 個位置

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

  在 Faster R-CNN 中,我們使用卷積核來做 5 個參數的預測:4 個參數對應某個錨點的預測邊框,1 個參數對應 objectness 置信度得分。是以 3× 3× D × 5 卷積核将特征圖從 8 × 8 × D 轉換為 8 × 8 × 5。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

使用 3x3 卷積核計算預測

  在單次檢測器中,卷積核還預測 C 個類别機率以執行分類(每個機率對應一個類别)。是以我們應用一個 3× 3× D × 25 卷積核将特征圖從 8 × 8 × D 轉換為 8 × 8 × 25(C=20)。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

2.2  SSD (Single Shot MultiBox Detector)

  SSD 是使用 VGG19 網絡作為特征提取器(和 Faster R-CNN 中使用的 CNN 一樣)的單次檢測器。我們在該網絡之後添加自定義卷積層(藍色),并使用卷積核(綠色)執行預測。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

  然而,卷積層降低了空間次元和分辨率。是以上述模型僅可以檢測較大的目标。為了解決該問題,我們從多個特征圖上執行獨立的目标檢測。采用多尺度特征圖獨立檢測。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

使用多尺度特征圖用于檢測

  以下是特征圖圖示。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

2.3  YOLO

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

  YOLO  在卷積層之後使用了 DarkNet 來做特征檢測。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

  然而,它并沒有使用多尺度特征圖來做獨立的檢測。相反,它将特征圖部分平滑化,并将其和另一個較低分辨率的特征圖拼接。例如,YOLO 将一個 28 × 28 × 512 的層重塑為 14 × 14 × 2048,然後将它和 14 × 14 ×1024 的特征圖拼接。之後,YOLO 在新的 14 × 14 × 3072 層上應用卷積核進行預測。

  YOLO(v2)做出了很多實作上的改進,将 mAP 值從第一次釋出時的 63.4 提高到了 78.6。YOLO9000 可以檢測 9000 種不同類别的目标。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

  以下是 YOLO 論文中不同檢測器的 mAP 和 FPS 對比。YOLOv2 可以處理不同分辨率的輸入圖像。低分辨率的圖像可以得到更高的 FPS,但 mAP 值更低。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

  YOLOv3 還添加了特征金字塔,以更好地檢測小目标。以下是不同檢測器的準确率和速度的權衡。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

特征金字塔網絡(FPN)

  檢測不同尺度的目标很有挑戰性,尤其是小目标的檢測。特征金字塔網絡(FPN)是一種旨在提高準确率和速度的特征提取器。它取代了檢測器(如 Faster R-CNN)中的特征提取器,并生成更高品質的特征圖金字塔。

資料流

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

  SSD 通過多個特征圖完成檢測。但是,最底層不會被選擇執行目标檢測。它們的分辨率高但是語義值不夠,導緻速度顯著下降而不能被使用。SSD 隻使用較上層執行目标檢測,是以對于小的物體的檢測性能較差。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

  雖然該重建層的語義較強,但在經過所有的上采樣和下采樣之後,目标的位置不精确。在重建層和相應的特征圖之間添加橫向連接配接可以使位置偵測更加準确。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

增加跳過連接配接(引自原論文)

  下圖詳細說明了自下而上和自上而下的路徑。其中 P2、P3、P4 和 P5 是用于目标檢測的特征圖金字塔。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

FPN 結合 RPN

  FPN 不單純是目标檢測器,還是一個目标檢測器和協同工作的特征檢測器。分别傳遞到各個特征圖(P2 到 P5)來完成目标檢測。

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

困難案例

  對于如 SSD 和 YOLO 的大多數檢測算法來說,我們做了比實際的目标數量要多得多的預測。是以錯誤的預測比正确的預測要更多。這産生了一個對訓練不利的類别不平衡。訓練更多的是在學習背景,而不是檢測目标。但是,我們需要負采樣來學習什麼是較差的預測。是以,我們計算置信度損失來把訓練樣本分類。選取最好的那些來確定負樣本和正樣本的比例最多不超過 3:1。這使訓練更加快速和穩定。

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

  檢測器對于同一個目标會做出重複的檢測。我們利用非極大值抑制來移除置信度低的重複檢測。将預測按照置信度從高到低排列。如果任何預測和目前預測的類别相同并且兩者 IoU 大于 0.5,我們就把它從這個序列中剔除。

Focal Loss(RetinaNet)

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

編輯自原論文

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

目标檢測算法總結(R-CNN、Fast R-CNN、Faster R-CNN、FPN、YOLO、SSD、RetinaNet)一、基于候選區域的目标檢測器二、單次目标檢測器

RetinaNet

繼續閱讀