手把手實現YOLOv3(一)

前言

本文翻譯總結於scratch

目標檢測是一個很古老的視覺問題,和其他視覺問題一樣,它也從深度學習的發展中受益匪淺。
近年來,人們開發了許多用於對象檢測的算法,其中包括YOLO,SSD,Mask RCNN和RetinaNet。

目錄

正文

在過去的幾個月中,我一直在實驗室中改進對象檢測算法。
這次體驗最大的收穫之一就是認識到學習目標檢測的最佳方法是自己從頭開始實現它。這就是本教程的目標。

我們將使用PyTorch來實現基於YOLOv3的對象檢測器,YOLOv3是一種較快的對象檢測算法。

本教程的代碼可在Python 3.7和PyTorch 1.1.0上運行。
可以在此Github存儲庫
中找到全部內容。
本教程分爲5部分:

 第一部分(這一部分):瞭解YOLO的工作方式

 第二部分:創建各層神經網路

 第三部分:實現網絡的前向傳遞

 第四部分:目標閾值化和非最大抑制

 第五部分:設計輸入和輸出管道

先決條件

您應該瞭解卷積神經網絡如何工作。
這包括殘差塊,躍接層和上採樣的知識。
什麼是物體檢測,邊界框迴歸,IoU和非最大抑制。
PyTorch的基本用法。您應該能夠輕鬆創建簡單的神經網絡。
如果您在任何方面有疑惑,我會在文章末尾提供鏈接。

什麼是YOLO?

YOLO代表you only look once。
它是一種目標檢測器,它使用深度卷積神經網絡學習到的特徵來檢測對象。
在弄清代碼之前,我們必須瞭解YOLO的工作方式。

全卷積神經網絡

YOLO僅含卷積層,因此被稱爲全卷積神經網絡(FCN).
它具有75個卷積層,以及躍連層和上採樣層。
不含任何形式的池化層,而是使用跨度爲2的卷積層對特徵圖進行下采樣。
這有助於防止通常歸因於池化層稀釋的丟失。
作爲FCN,YOLO不受輸入圖像的大小影響。但是,在實踐中,由於各種問題,我們可能希望堅持一個固定的輸入層,而這些問題只有在實現算法時你才能體會到。
這些問題中最大的一個問題是,如果我們要分批處理圖像(批處理圖像可以由GPU並行處理,從而提高了速度),我們需要擁有固定尺寸的所有圖像。
這需要將多個圖像串聯成一個大組(將多個PyTorch張量串聯成一個)
網絡通過稱爲網絡步幅的因素對圖像進行下采樣。
例如,如果網絡的間隔爲32,則大小爲416 x 416的輸入圖像將產生大小爲13 x 13的輸出。
通常,網絡中任何層的步幅等於網絡輸入圖像除以輸出的大小。

解釋輸出

通常,(與所有目標檢測器一樣)將由卷積層學習的特徵傳遞到分類器/迴歸器上,該分類器/迴歸器進行目標預測(邊界框的座標,類標籤等)
在YOLO中,預測是通過使用1 x 1卷積的卷積層完成的。

現在,首先要注意的是我們的輸出是一個特徵圖。
由於我們使用了1 x 1卷積,因此預測圖的大小恰好是其之前的特徵圖的大小。在YOLO v3(及其後續版本)中,解釋此輸出圖的方式是每個單元格都可以預測固定數量的邊界框。
儘管在技術上正確地稱謂特徵圖中一個單元的術語是一個神經元,但爲了讓它在我們的上下文中更加直觀,這裏我們把它稱爲單元。

在數值上,特徵圖中有(B x(5 + C))個元素。
B表示每個單元格可以預測的邊界框的數量。
根據本文,這些邊界框中的每一個都可以專門用於檢測某種對象。
每個邊界框都有5 + C屬性,這些屬性描述每個邊界框的中心座標,尺寸,目標得分和C類置信度。
YOLO v3會爲每個單元格預測3個邊界框。
如果目標的中心落在該單元的接受域中,則您希望特徵圖的每個單元都可以通過其邊界框之一來預測該對象。
(感受野是輸入圖像對細胞可見的區域。有關進一步的說明,請參見卷積神經網絡上的鏈接)。

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

爲此,我們將輸入圖像劃分爲尺寸等於最終特徵圖尺寸的網格。

讓我們考慮下面的示例,其中輸入圖像爲416 x 416,網絡的步幅爲32。
如前所述,特徵圖的尺寸將爲13 x13。然後將輸入圖像劃分爲13 x 13個像元。

圖像點圖,紅點對偵測到狗很有用。
在這裏插入圖片描述預測特徵圖
在這裏插入圖片描述每個box的元素構成

在這裏插入圖片描述

然後,將包含對象地面真值框中心的單元格(在輸入圖像上)選擇爲負責預測對象的單元格。在圖像中,標記爲紅色的單元格包含地面真值框(標記爲黃色)的中心。
現在,紅色單元格是網格第7行中的第7個單元格。現在,我們將特徵圖上第7行中的第7個單元格(特徵圖上的對應單元格)分配爲負責檢測狗的單元格。

現在,該單元格可以預測三個邊界框。哪一個將被分配給狗的真實值標籤?爲了理解這一點,我們必須將錨的概念描述一遍。
請注意,我們在此討論的單元格是預測功能圖上的單元格。
我們將輸入圖像劃分爲一個網格只是爲了確定預測特徵圖的哪個單元負責預測該網格。

錨框

預測邊界框的寬度和高度的真實值可能很有意義,但是在實踐中,這會導致訓練過程中出現不穩定的漸變。
取而代之的是,大多數現代物體檢測器會使用對數空間轉換進行預測,或者只是到稱爲錨點的預定義默認邊界框的偏移量。
然後,將這些變換應用於錨框以獲得預測。
YOLO v3具有三個錨點,可以預測每個單元格三個邊界框。
回到我們前面的問題,負責檢測狗的邊界框將是具有真實值的錨框中具有最高IoU的邊界框。
在這裏插入圖片描述

做出預測

以下公式描述瞭如何調整網絡輸出以獲得邊界框預測。
bx,by,bw,bh是我們預測的x,y中心點座標的寬度和高度。 tx,ty,tw,th是網絡輸出的數值。 cx和cy是網格的左上角座標。 pw和ph是該框的錨點尺寸。

中心座標

請注意,我們正在通過S型函數實現中心座標預測。

這將強制輸出值在0到1之間。

爲什麼會這樣呢?

通常,YOLO不會預測邊界框中心的絕對座標。它預測的偏移量是:

相對於預測對象的網格單元的左上角。

通過特徵圖中的像元尺寸進行歸一化,即1。

例如,考慮我們的狗圖像的情況。
如果中心預測爲(0.4,0.7),則意味着中心位於13 x 13特徵圖上的(6.4,6.7)。
(因爲紅色單元格的左上角座標爲(6,6))。

但是,等等,如果預測的x,y座標大於1,例如(1.2,0.7),會發生什麼。
這意味着中心位於(7.2,6.7)。
請注意,中心現在位於紅色單元格或第7行的第8個單元格的右邊。
這打破了YOLO背後的理論,因爲如果我們假設紅框負責預測這隻狗,那麼該狗的中心必須位於紅細胞中,而不是在其旁邊。
因此,爲解決此問題,輸出通過S型函數,該函數將輸出壓縮在0到1的範圍內,從而有效地將中心保持在所預測的網格中。
在這裏插入圖片描述

邊框的尺寸

通過對輸出數值使用對數空間轉換,然後與錨點相乘,可以預測邊界框的尺寸。
對檢測器進行輸出如何轉換以給出最終預測。

圖片積分

結果預測bw和bh由圖像的高度和寬度標準化。 (以這種方式選擇訓練標籤)。 因此,如果對包含狗的盒子的預測bx和by爲(0.3,0.8),則13 x 13特徵圖上的實際寬度和高度爲(13 x 0.3,13 x 0.8)。

目標分數

對象分數表示對象包含在邊界框內的概率。
紅色和相鄰的網格應該接近1,而角落的網格應該接近0。
客觀性分數也將通過S形傳遞,因爲它將被解釋爲概率。

類別置信度

類別置信度表示檢測到的對象屬於特定類別(狗,貓,香蕉,汽車等)的概率。
在v3之前,YOLO曾使用softmax來評分。
但是,該設計選擇已在v3中刪除,作者選擇使用Sigmoid。 原因是Softmaxing類分數假定這些類是互斥的。 用簡單的話來說,如果一個對象屬於一個類,那麼可以保證它不能屬於另一個類。 這對於我們將基於檢測器的COCO數據庫是正確的。

但是,當我們開設“女性”和“人”這樣的課程時,這種假設可能不成立。 這就是作者避免使用Softmax激活的原因。

跨不同尺度的預測。

YOLO v3可以進行3種不同尺度的預測。
檢測層用於在三個不同大小的特徵圖中進行檢測,分別具有步幅32、16、8。
這意味着,使用416 x 416的輸入,我們將以13 x 13、26 x 26和52 x 52的比例進行檢測。

網絡對輸入圖像進行下采樣,直到第一檢測層爲止,在此使用步幅爲32的圖層的特徵圖進行檢測。
此外,將各層上採樣2倍,並與具有相同特徵圖大小的先前圖層的特徵圖連接在一起。 現在在步幅爲16的層上進行另一次檢測。
重複相同的上採樣步驟,並在步幅8層進行最終檢測。

在每個尺度上,每個像元使用3個錨點預測3個邊界框,使使用的錨點總數爲9。(不同尺度的錨點不同)

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

輸出處理

對於416 x 416尺寸的圖像,YOLO預測((52 x 52)+(26 x 26)+ 13 x 13))x 3 = 10647邊界框。
但是,就我們的形象而言,只有一個物體,一隻狗。
我們如何將檢測結果從10647減少到1?

通過對象置信度進行閾值化

首先,我們根據盒子的客觀性得分對其進行過濾。
通常,分數低於閾值的框將被忽略。

非最大抑制

NMS旨在解決同一圖像的多次檢測問題。 例如,紅色網格單元的所有3個邊界框可以檢測到一個框,或者相鄰單元可以檢測到同一對象。

在這裏插入圖片描述

多個單元格可能會檢測同一個對象NMS被用來去除多個探測值。
如果你不知道NMS,我已經提供了一個鏈接來解釋它。

我們的實現

YOLO 只能偵測到訓練數據集裏出現過的類別。
我們將使用官方權重文件來虛擬我們的偵測器。
這些權重來自於cooc數據集的網絡訓練,因此我們可以探測到80個類別。
第一部分到此結束了。
本文將會詳細解釋yolo 以便於你能夠自己實現它。然而,如果你想深入理解yolo
是如何工作的,它是如何訓練的,以及它與其它檢測算法的比較,你可以閱讀原始的論文,鏈接在下面。
本節結束,歡迎閱讀下一節,我們將實現需求的不同層來實現這個檢測器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章