單級式目標檢測方法概述:YOLO與SSD

機器之心發表於2018-08-06

目標檢測是計算機視覺領域的基本研究問題之一,當前最常用的技術是卷積神經網路機器學習工程師 Jeremy Jordan 近日發表了一篇博文,介紹了用於目標檢測的單級式方法(包括 YOLO 和 SSD)。

在這篇文章中,我將概述用於基於卷積神經網路(CNN)的目標檢測的深度學習技術。目標檢測是很有價值的,可用於理解影像內容、描述影像中的事物以及確定目標在影像中的位置。

總體而言,目標檢測包含兩大類方法——要麼是在網格上進行固定數量的預測(單級式);要麼是先使用一個提議網路尋找目標,然後再使用另一個網路來微調這些提議並輸出最終預測結果(兩級式)。

我將在本文中介紹用於目標檢測的單級式方法;後面我還會發布一篇介紹兩級式方法的文章。每種方法都有自己的優勢和短板,我也將在各自的文章中談到。

目標檢測任務

目標檢測的目標是識別一個預定義的目標類別集(比如 {人, 汽車, 自行車, 動物})的例項並使用一個邊界框描述影像中每個被檢測出的目標。下圖給出了兩個示例: 

單級式目標檢測方法概述:YOLO與SSD

目標檢測示例,來自 PASCAL VOC 資料集:http://host.robots.ox.ac.uk/pascal/VOC/

我們一般使用矩形描述每個目標的位置,由於目標形狀千差萬別,所以定位結果可能並不完美。另一種可用方法是影像分割,這能提供畫素級的定位。

直接目標預測

本文將主要關注單級式地直接預測影像中的目標邊界框的模型架構。換句話說,其中沒有必須執行的中間任務(我們後面會介紹的區域提議方案就有中間任務),就能得到輸出結果。這種模型架構更簡單、速度更快,但有時候並不能足夠靈活地適應任意任務(比如掩碼預測)。

基於網格的預測

為了理解影像中存在什麼事物,我們將會將輸入饋送通過一個標準的卷積神經網路以構建出原始影像的豐富特徵表示。我們將這部分架構稱為「骨幹(backbone)」網路,這通常以影像分類器的形式進行了預訓練,可以更便宜地學習從影像中提取特徵的方式。這麼做的原因是用於影像分類的資料更易於標準(因此成本更低),因為其僅需單個標籤,而不需要為每張影像都定義邊界框標註。因此,我們可以在一個非常大的有標註資料集(比如 ImageNet)上進行訓練,以獲得優良的特徵表示。

單級式目標檢測方法概述:YOLO與SSD

在以影像分類器的形式預訓練了骨幹架構之後,我們將移除網路的最後幾層,以便我們的骨幹網路能輸出堆疊的特徵圖集合,它們以更低的空間解析度描述了原影像,儘管它們有更高的特徵(通道)解析度。在下面的示例中,我們對我們的觀察有一個 7x7x512 的表示。這 512 個特徵圖中的每一個都描述了原影像的不同特性。

單級式目標檢測方法概述:YOLO與SSD

我們將這個 7x7 網格關聯回原輸入,以瞭解每個網格單元相對於原影像所代表的內容。

單級式目標檢測方法概述:YOLO與SSD

通過觀察哪個網格單元包含我們的邊界框標註的中心,我們還可以在粗略的(7x7)特徵圖中大致確定目標的位置。我們將把該網格單元指定為「負責」檢測該特定目標的單元。

單級式目標檢測方法概述:YOLO與SSD

為了檢測該目標,我們將新增另外一個卷積層並學習結合了所有 512 個特徵圖背景的核引數,以得到一個對應於包含目標的網格單元的啟用。

單級式目標檢測方法概述:YOLO與SSD

如果輸入影像包含多個目標,那麼在我們的網格上應該有多個啟用,表示每個啟用區域中都有一個目標。

單級式目標檢測方法概述:YOLO與SSD

但是,我們不能使用單個啟用就充分地描述每個目標。為了完整描述被檢測出的目標,我們需要定義:

  • 一個網格單元包含一個目標的可能(pobj)

  • 該目標屬於哪個類別(c1, c2, ..., cC)

  • 四個邊界框描述量,描述了標註框的 x 座標、y 座標、寬度和高度(tx, ty, tw, th)

因此,我們需要為上述屬性中的每一個學習一個卷積過濾器,這樣我們有 5+C 個輸出通道來描述每個網格單元位置處的單個邊界框。這意味著我們將學習一組權重來檢查所有 512 個特徵圖,並且確定哪些網格單元很有可能包含目標、每個網格單元很可能出現哪種類別、以及如何描述每個網格單元中可能存在的目標的邊界框。

單級式目標檢測方法概述:YOLO與SSD

為了清楚說明,下面展示了應用 5+C 個卷積過濾器的完整輸出,為每個網格單元都得到一個邊界框描述量。

單級式目標檢測方法概述:YOLO與SSD

但是,某些影像可能有多個目標都「屬於」同一網格單元。我們可以修改我們的層以得到 B(5+C) 個過濾器,這樣我們就能為每個網格單元位置預測 B 個邊界框了。

單級式目標檢測方法概述:YOLO與SSD

視覺化我們的 B(5+C) 過濾器的完整卷積輸出,我們可以看到我們的模型總是能為給定影像得到固定數量的 N×N×B 預測。然後我們可以過濾我們的預測,僅考慮 pobj 超過某個定義的閾值的邊界框。

單級式目標檢測方法概述:YOLO與SSD

由於我們的檢測過程的卷積本質,多個目標可以並行的方式被檢測到。但是,我們最終還會預測到沒有找到任何目標的大量網格單元。儘管我們可以通過這些邊界框的 pobj 分數濾除它們,但這會在預測得到的包含目標和不包含目標的邊界框之間引入相當大的不平衡。

單級式目標檢測方法概述:YOLO與SSD

我下面將討論的兩種模型都使用了「基於網格進行預測」的概念來檢測影像內固定數量的可能目標。在各自的章節,我都將描述每種方法的細微差別,並還會給出一些我曾經看到的細節,以便你能真正實現每種模型。

非極大抑制(Non-Maximum Suppression)

「基於網格進行預測」方法會為每張影像得到固定數量的邊界框預測。但是,我們希望對這些預測進行過濾,以便僅輸出影像中真正可能實際存在的目標的邊界框。此外,對於每個被檢測到的目標,我們都只想要一個邊界框預測。

通過僅考慮 pobj 超過某個定義置信度閾值的預測,我們可以濾除大多數邊界框預測。但是,我們可能仍有多個描述同一目標的高置信度預測。因此,我們需要一個方法來移除冗餘的目標預測,以便每個目標都只用一個邊界框描述。

要做到這一點,可使用一種被稱為非極大抑制的技術。從高層面看,這個技術會檢查高度重疊的邊界框並抑制(即丟棄)除最高置信度預測外的所有預測。

單級式目標檢測方法概述:YOLO與SSD

我們會為每一類都單獨執行非極大抑制。同樣,這裡的目標是移除冗餘的預測,所以如果有兩個重疊度很高的邊界框分別描述的是不同類別的目標(比如一個框描述人,一個框描述車),那麼我們就不必擔心。但是,如果兩個重疊度很高的邊界框都在描述人,那麼很有可能這兩個預測描述的是同一個人。

YOLO:You Only Look Once

YOLO 模型最早是由 Joseph Redmon 等人在 2015 年釋出的,並在隨後的兩篇論文中進行了修訂。在下面的每一小節中,我都會討論具體的實現細節和用於提升效能表現的改進措施。

骨幹網路

最早的 YOLO 網路使用了一個經過修改的 GoogLeNet 作為骨幹網路。之後,Redmond 又建立了一個名為 DarkNet-19 的新模型,其遵循了 3×3 過濾器的一般設計,而將每個池化步驟的通道數量翻了一倍;整個網路中也使用了 1×1 過濾器來週期性壓縮特徵表示。他最新的論文又引入了一個更大的新模型 DarkNet-53,具有更優的效能表現。

所有這些模型都首先是作為影像分類器而進行預訓練,之後再針對檢測任務進行調整。在 YOLO 模型的第二個迭代版本中,Redmond 發現在分類預訓練結束時使用更高解析度的影像能夠提升檢測表現,因此也就採用這一操作方法。

將分類網路調整為檢測網路只需要移除網路的最後幾層,然後新增一個帶有 B(5+C) 個過濾器的卷積層,以得出 N×N×B 的邊界框預測。

邊界框(以及錨框概念)

YOLO 模型的第一個迭代版本是直接預測描述一個邊界框的所有 4 個值。每個邊界框的 x 和 y 座標都是相對每個網格單元的左上角定義的,並且根據單元尺寸進行了歸一化,以便這些座標值的範圍在 0 到 1 之間。我們定義框寬度和高度的方式讓我們的模型預測的是平方根寬度和高度;通過平方根值的形式定義框的寬度和高度,大數值之間的差會沒有小數值之間的差那樣顯著(看看 的圖就能確定這一點)。Redmond 選擇這個形式是因為「小偏差在大框中的重要性比在小框中小」,因此,當我們計算我們的損失函式時,我們希望將重點放在更準確地得到小框上面。邊界框的寬度和高度根據影像的寬和高進行歸一化,因此取值也在 0 到 1 之間。訓練過程中使用 L2 損失。

這種形式後來進行了修改,引入了邊界框先驗(bounding box prior)的概念。我們不再期望模型為每張新影像直接生成唯一的邊界框描述量,而是定義一個邊界框集合,其中的邊界框有不同的寬高比,這些寬高比嵌入了某些關於我們預計會檢測到的目標的形狀的先驗資訊。Redmond 提供了一種用於發現最佳寬高比的方法,即在你的訓練資料集中的所有邊界框上執行 k-均值聚類(使用一個自定義的距離度量)。

在下圖中,你可以看到針對中心黃色的網格單元的一個包含 5 個邊界框先驗(也被稱為「錨框(anchor boxes)」)的集合。通過這種形式,B 個邊界框中的每一個都能明確地專門檢測特定尺寸和寬高比的目標。

單級式目標檢測方法概述:YOLO與SSD

注:儘管圖中沒有給出,但我們的預測網格中的每個單元都有這些錨框。

我們不再直接預測邊界框的尺寸,而是重新形式化了我們的任務,從而只需簡單預測與我們的邊界框先驗尺寸的偏移量,這樣我們就可以優化我們的預測邊界框尺寸了。這種處理方式能讓這一預測任務更容易學習。

單級式目標檢測方法概述:YOLO與SSD

由於與原來的預測平方根寬度和高度相似的原因,我們將定義我們的任務來預測與我們的邊界框先驗的對數偏移量。

目標度(以及將被標註的目標分配給一個邊界框)

在該模型的第一個版本中,「目標度(objectness)」分數 pobj 的訓練目標是近似求取被預測框和基本真值標籤之間的交併比(IoU)。當我們在訓練過程中計算損失時,我們會將目標與有最高 IoU 分數的邊界框預測(在同一個網格單元上)進行匹配。對於未匹配的框,我們會包含進我們的損失函式的唯一描述量是 pobj。

YOLOv2 加入了邊界框先驗之後,我們只需簡單地將被標註出的目標分配給與該被標註目標有最高 IoU 分數的錨框(在同一個網格單元上)即可。

在第三個版本中,Redmond 重新定義了「目標度」目標分數 pobj,每個給定目標有最高 IoU 分數的邊界框取值 1,其它所有框都為 0。但是,在計算損失時,我們將不會包含有較高 IoU 分數(超過某個閾值),但不是最高分數的邊界框。簡單來說,只是因為一個優良預測不是最佳預測就懲罰它是不合理的。

類別標籤

最初的類別預測是在網格單元層面上執行的。這意味著單個網格單元不能預測不同類別的多個邊界框。之後的修訂版可以使用在類別和交叉熵損失上的 softmax 啟用來預測每個邊界框的類別。

Redmond 之後修改了類別預測,以使用 sigmoid 啟用來進行多標籤分類,因為他發現 softmax 不一定能得到優良表現。這個選擇取決於你的資料集以及你的標籤是否重疊(比如「金毛獵犬」和「狗」就有所重疊)。

輸出層

第一個 YOLO 模型只是使用我們的骨幹網路的輸出預測 N×N×B 邊界框。

在 YOLOv2 中,Redmond 新增了一個古怪的 skip 連線,將更高解析度的特徵圖分到了多個通道上,如下圖所示。

單級式目標檢測方法概述:YOLO與SSD

我不喜歡這個奇怪的「從更高解析度特徵圖的 skip 連線」思想。

幸運的是,在第三個迭代版本中,這被改成了更標準的特徵金字塔網路輸出結構。使用這一方法,我們將在輸出一個預測結果和上取樣特徵圖(使用 skip 連線)之間交替。這允許預測能夠利用網路更早期的更細粒度資訊,這有助於檢測影像中的小目標。

單級式目標檢測方法概述:YOLO與SSD

SSD:Single Shot Detection

SSD 模型也發表於 2015 年(Wei Liu et al.),就在 YOLO 模型發表後不久,並且也在後續論文中得到了改進。下面我會具體介紹該模型的實現細節。

骨幹網路

其骨幹網路是一個在 ImageNet 上針對影像分類預訓練後的 VGG-16 模型。研究者對其進行了一些微調,使其能用於檢測任務,其中包括:使用卷積實現替換全連線層、移除 dropout 層、使用一個擴張卷積替換最後的最大池化層。

邊界框(以及錨框概念)

SSD 模型沒有使用 k-均值聚類來發現寬高比,而是人工定義了一個寬高比集合(比如 {1, 2, 3, 1/2, 1/3}),以用於每個網格單元位置的 B 個邊界框。

對於每個邊界框,我們都會預測其在邊界框座標(x 和 y)以及尺寸(寬度和高度)上離錨框的偏移量。我們將使用通過一個 Smooth L1 損失訓練的 ReLU 啟用。

目標度(以及將被標註的目標分配給一個邊界框)

YOLO 和 SSD 的一大主要區別是 SSD 不會試圖為 pobj 預測一個值。YOLO 模型是在存在一個目標時預測目標的概率,然後再預測每個類別的概率,而 SSD 模型則試圖直接預測一個類別存在於一個給定目標框中的概率。

在計算損失時,我們會將有最高 IoU 的每個基本真值框與錨框進行匹配——並將該框定義為「負責」做出預測的框。但是,我們也會將基本真值框與 IoU 超過某個定義閾值(0.5)的任何其它錨框進行匹配,從而不因為這些錨框並不是最佳的而懲罰這些優良預測。

類別標籤

正如我之前提到的,SSD 邊界框的最佳預測並不基於存在目標的事實。因此,我們是使用一個 softmax 啟用和交叉熵損失來直接預測每個類別的概率。因為我們並不明確預測 pobj,所以有一個「背景」類別是很重要的,這樣我們就能預測不存在目標的情況了。

由於事實上大多數框都將屬於「背景」類別,所以我們將使用一種被稱為「hard negative mining」的技術來取樣負例(沒有目標)預測,使得在計算我們的損失時最多隻使用 3:1 比例的正例和負例預測。

輸出層

為了能進行多個尺度的預測,SSD 輸出模組會逐步對卷積特徵圖進行下采樣,間歇性地得到邊界框預測(如下圖中從卷積層指向預測框的箭頭所示)。

單級式目標檢測方法概述:YOLO與SSD

使用焦點損失(Focal Loss)解決目標不平衡問題

正如我之前提到的,我們常常最終會得到大量邊界框,而由於我們的「基於網格進行預測」方法的本質,這些框往往不包含目標。儘管我們可以在得到一組固定的邊界框預測後輕鬆濾除這些框,但仍然存在(前景—背景)類別不平衡的情況,這可能會給訓練過程造成困難。對於不將目標度預測和類別概率預測分成兩個獨立任務,而是簡單地為沒有目標的區域設定一個「背景」類別的模型,困難尤其顯著。

Facebook 的研究者提出向標準的交叉熵損失新增一個比例因子,以使其在訓練過程中更加關注「困難的」樣本,防止簡單的負例預測主導訓練過程。

單級式目標檢測方法概述:YOLO與SSD

正如這些研究者指出的那樣,能被輕鬆分類的樣本會為標準的交叉熵損失帶來非平凡損失(γ=0),這是在一個大樣本集合上求和得到的,並能輕易主導引數更新。項是一個可調節的比例因子,以防止這種情況發生。

正如該論文指出的那樣:「γ=2 時,pt=0.9 的分類樣本的損失與 CE(交叉熵)相比低 100 倍,pt=0.968 時會低 1000 倍。」

常見資料集和競賽

下面我列出了一些研究者在評估新的目標檢測模型時常用的資料集:

擴充套件閱讀

論文

講座

標註資料的工具

原文連結:https://www.jeremyjordan.me/object-detection-one-stage/

相關文章