YOLO v3實現 Prat1

目標檢測是近年來深度學習發展的一個重要領域。近年來,人們開發了許多目標檢測算法,其中包括YOLO、SSD、Mask RCNN和RetinaNet。

在過去的幾個月裏,我一直在一個研究實驗室致力於改進對象檢測。從這段經歷中,我最大的收穫是認識到,學習對象檢測的最好方法是自己實現算法,從零開始。這正是我們在本教程中要做的。

我們將使用PyTorch實現一個基於YOLO v3的對象檢測器,這是一種速度更快的對象檢測算法。

The code for this tutorial is designed to run on Python 3.5, and PyTorch 0.4. It can be found in it’s entirety at this Github repo.

This tutorial is broken into 5 parts:

  1. Part 1 (This one): Understanding How YOLO works
  2. Part 2 : Creating the layers of the network architecture
  3. Part 3 : Implementing the the forward pass of the network
  4. Part 4 : Objectness score thresholding and Non-maximum suppression
  5. Part 5 : Designing the input and the output pipelines

Prerequisites

  • 你應該瞭解卷積神經網絡是如何工作的,這還包括剩餘塊、跳過連接和向上採樣的知識。
  • 什麼是對象檢測、邊框迴歸、IoU和非最大抑制。
  • 基本的PyTorch使用方法,您應該能夠輕鬆地創建簡單的神經網絡。

我在文章末尾提供了鏈接,以防您在任何方面都有不足。

What is YOLO?

YOLO stands for You Only Look Once. It’s an object detector that uses features learned by a deep convolutional neural network to detect an object. Before we get out hands dirty with code, we must understand how YOLO works.

A Fully Convolutional Neural Network

YOLO只使用卷積層,是一個完全卷積的網絡(FCN)。它有75個卷積層,具有跳過連接和向上採樣層。不使用池化的形式,使用帶stride 2的卷積層對feature map進行下采樣。這有助於防止通常歸因於池的低級特性的丟失。

作爲FCN, YOLO對輸入圖像的大小是不變的。然而,在實踐中,由於各種問題只有在我們實現算法時纔會出現,我們可能希望保持輸入大小不變。

其中一個很大的問題是,如果我們想批量處理圖像(批量圖像可以由GPU並行處理,從而提高速度),我們需要具有固定高度和寬度的所有圖像。需要將多個圖像連接成一個大批(將多個PyTorch張量連接成一個)

網絡通過一個叫做網絡步幅的因素對圖像進行下采樣。例如,如果網絡的步幅是32,那麼大小爲416 x 416的輸入圖像將產生大小爲13 x 13的輸出。一般來說,網絡中任意一層的步幅等於該層的輸出小於網絡輸入圖像的係數。

Interpreting the output

通常,(對於所有的對象檢測器都是如此)卷積層學習到的特徵被傳遞到一個分類器/迴歸器上,這個分類器/迴歸器進行檢測預測(邊界框的座標,類標籤)。等等)。

在YOLO中,預測是通過使用使用1x1卷積的卷積層來完成的。

現在,首先要注意的是我們的輸出是一個feature map。由於我們使用了1x1卷積,所以預測映射的大小正好是之前feature映射的大小。在YOLO v3(及其後代)中,解釋這個預測映射的方法是,每個單元格可以預測固定數量的邊界框。

Though the technically correct term to describe a unit in the feature map would be a neuron, calling it a cell makes it more intuitive in our context.

在深度方面,我們在feature map中有(B x (5 + C))項。B表示每個單元格可以預測的包圍框的數量。根據本文的研究,每一個B包圍框都可以專門用於檢測某一類對象。每個包圍框都有5 + C屬性,這些屬性描述了每個包圍框的中心座標、尺寸、object - score和C類置信度。YOLO v3預測每個單元格有3個包圍框。

如果對象的中心落在該單元格的接受域中,則期望feature map的每個單元格通過其中一個包圍框來預測對象。(接受域是輸入圖像對細胞可見的區域。請參閱卷積神經網絡的鏈接以獲得進一步的澄清)。

這與YOLO的訓練方式有關,其中只有一個包圍框負責檢測任何給定的對象。首先,我們必須確定這個包圍框屬於哪個單元格。

爲了做到這一點,我們將輸入圖像分割成與最終feature map相同的維度網格。

讓我們考慮下面的一個例子,其中輸入圖像是416 x 416,網絡的步幅是32。如前所述,feature map的維數將是13 x 13。然後我們將輸入圖像分成13 x 13個單元格。

在這裏插入圖片描述

然後,選擇包含對象的ground truth box中心的cell(在輸入圖像上)作爲負責預測對象的cell。在圖像中,標記爲紅色的單元格包含ground truth box(標記爲黃色)的中心。

現在,紅色的細胞是網格第7行的第7個細胞。我們現在將feature map (feature map上對應的cell)的第7行第7個cell指定爲負責檢測dog的cell。

現在,這個單元格可以預測三個包圍框。哪個將被分配到狗的真實標籤?爲了理解這一點,我們必須圍繞錨的概念展開討論。

Note that the cell we’re talking about here is a cell on the prediction feature map. We divide the input image into a grid just to determine which cell of the prediction feature map is responsible for prediction

Anchor Boxes

預測邊界框的寬度和高度可能是有意義的,但是在實踐中,這會導致在訓練過程中出現不穩定的梯度。另外,大多數現代對象檢測器預測日誌空間轉換,或者簡單地偏移到預先定義的稱爲錨的默認邊界框。

然後,將這些變換應用於錨箱,得到預測結果。YOLO v3有三個錨點,每個單元可以預測三個包圍框。

回到我們之前的問題,負責檢測狗的邊界框將是錨點與真值框有最高IoU的那個。

Making Predictions

下面的公式描述瞭如何轉換網絡輸出,以獲得預測框。
在這裏插入圖片描述
bx, by, bw, bh are the x,y center co-ordinates, width and height of our prediction. tx, ty, tw, th is what the network outputs. cx and cy are the top-left co-ordinates of the grid. pw and ph are anchors dimensions for the box.

Center Coordinates

注意,我們通過一個sigmoid函數運行我們的中心座標預測。這迫使輸出的值介於0和1之間。爲什麼會這樣呢?

通常情況下,YOLO不能預測包圍框中心的絕對座標。它預測偏移量爲:

  • 相對於預測對象的網格單元左上角。
  • 由特徵圖上單元格的尺寸標準化,即1。

例如,考慮我們的狗的形象。如果中心的預測是(0.4,0.7),那麼這意味着中心位於(6.4,6.7)在13 x 13 feature map上。(因爲紅細胞的左上角座標是(6,6))。

但等一下,如果預測的x,y座標大於1(1.2,0.7)會發生什麼。這意味着中心位於(7.2,6.7)注意到中心現在在格子中就在紅色格子的右邊,或者第7行第8個格子。這打破了YOLO背後的理論,因爲如果我們假設紅盒子是用來預測狗的,那麼狗的中心一定是在紅格子裏,而不是在它旁邊的那個格子裏。

因此,爲了解決這個問題,輸出通過一個sigmoid函數傳遞,該函數將輸出壓扁在0到1之間,有效地保持預測網格的中心。

Dimensions of the Bounding Box

通過對輸出應用對數空間轉換,然後使用錨點進行乘法,可以預測邊界框的大小。
在這裏插入圖片描述

How the detector output is transformed to give the final prediction. Image Credits. http://christopher5106.github.io/

結果的預測,bw和bh,由圖像的高度和寬度標準化。(通過這種方式選擇培訓標籤)。因此,如果bx和by對包含狗的盒子的預測是(0.3,0.8),那麼13 x 13 feature map上的實際寬度和高度是(13 x 0.3, 13 x 0.8)。

Objectness Score

對象得分表示對象被包含在包圍框內的概率。紅色的和相鄰的網格應該接近1,而角上的網格應該接近0。

對象得分也通過一個sigmoid傳遞,因爲它被解釋爲一個概率。

Class Confidences

類置信度表示屬於特定類(狗、貓、香蕉、車等)的被檢測對象的概率。v3之前,YOLO習慣用softmax來處理類分數。

然而,v3中已經放棄了這種設計選擇,作者選擇使用sigmoid。原因是軟最大化類分數假定類是互斥的。簡單地說,如果一個對象屬於一個類,那麼它就保證不屬於另一個類。這對於COCO數據庫是正確的,我們將在其上建立我們的檢測器。

然而,這種假設可能不適用於女性和人這種分類。這就是作者避免使用Softmax激活的原因。

Prediction across different scales.

YOLO v3跨越3個不同的尺度進行預測。檢測層用於對三種不同尺寸的地物圖進行檢測,其步幅分別爲32、16、8。這意味着,在輸入416 x 416的情況下,我們在13 x 13, 26 x 26和52 x 52的刻度上進行檢測。

網絡對輸入圖像進行下采樣,直到第一個檢測層,在第一個檢測層使用stride 32的一個層的feature map進行檢測。此外,層被向上採樣2倍,並與具有相同特徵圖大小的前一層的特徵圖連接。另一個檢測現在是在step 16的圖層上進行的。重複相同的上採樣過程,在stride 8層進行最終檢測。

在每個尺度上,每個單元格使用3個錨點預測3個包圍框,使得使用的錨點總數爲9。(不同尺度的錨是不同的)
在這裏插入圖片描述
作者報告說,這有助於YOLO v3更好地檢測小對象,這是YOLO早期版本經常遇到的問題。向上採樣可以幫助網絡學習細粒度的特徵,這些特徵對於檢測小對象是有幫助的

Output Processing

對於大小爲416 x 416的圖像,YOLO預測((52 x 52) + (26 x 26) + 13 x 13) x 3 = 10647個包圍框。然而,在我們的圖像中,只有一個對象,狗。如何將檢測從10647減少到1?

Thresholding by Object Confidence

首先,我們根據它們的對象得分對它們進行過濾。通常,得分低於閾值的框會被忽略。

Non-maximum Suppression

NMS旨在解決同一圖像多次檢測的問題。例如,紅色網格單元格的所有3個包圍框可能檢測到一個框,或者相鄰單元格可能檢測到相同的對象。
在這裏插入圖片描述
如果你不知道NMS,我提供了一個網站的鏈接來解釋同樣的問題。

Our Implementation

YOLO只能檢測數據集中用於訓練網絡的類的對象。我們將使用我們的檢測器的官方權重文件。這些權值是通過對COCO數據集上的網絡進行訓練得到的,因此我們可以檢測到80個對象類別。

這就是第一部分。本文對YOLO算法進行了充分的解釋,使您能夠實現檢測器。然而,如果你想深入瞭解YOLO是如何工作的,它是如何訓練的,以及與其他檢測器相比,它的表現如何,你可以閱讀原始論文,我在下面提供了鏈接。

這部分就講到這裏。在下一部分中,我們將實現組裝檢測器所需的各個層

擴展閱讀

  1. YOLO V1: You Only Look Once: Unified, Real-Time Object Detection
  2. YOLO V2: YOLO9000: Better, Faster, Stronger
  3. YOLO V3: An Incremental Improvement
  4. Convolutional Neural Networks
  5. Bounding Box Regression (Appendix C)
  6. IoU
  7. Non maximum suppresion
  8. PyTorch Official Tutorial
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章