作者:louwill 個人公眾號:機器學習實驗室,致力於資料科學、機器學習和深度學習的應用與研究。有著多年的R語言和Python程式設計經驗

配套影片教程:Python機器學習全流程專案實戰精

https://

edu。hellobi。com/course/

284

涵蓋

需求分析

->資料採集->資料清洗與預處理->資料分析與視覺化->

特徵工程

->機器學習建模->模型調優->報告輸出。以Python為工具實現機器學習全流程。

在前面幾講的論文研讀筆記中,筆者和大家一起研讀了以 R-CNN 為代表的兩步走目標檢測算法系列,其中包括 R-CNN、SPP-Net、Fast R-CNN 和 Faster R-CNN。往後還有

何愷明

2017 年新提出的 Mask R-CNN,因其涉及到影象分割任務,故而筆者將其留到後面的影象分割系列進行介紹。總而言之,兩階段的目標檢測演算法就是先生成候選框再執行卷積網路識別出目標物體,無論是 R-CNN、SPP-Net 和 Fast R-CNN 的選擇性搜尋方法還是 Faster R-CNN 的 RPN 網路生成候選框,基本都是兩階段的套路。

那可否考慮直接用

卷積網路

識別出物體,不使用候選框呢?以

yolo 系列

為代表的一步到位的目標檢測演算法給出了肯定的答案。Joseph Redmon、Santosh Divvala、Ross Girshick(對、又是 RBG 大佬,哪裡都有他)以及 Ali Farhadi 四位研究人員於 2016 年提出完全不同於 R-CNN 系列的目標檢測演算法,也就是筆者此前所說的一步走演算法。本節筆者就和大家一起研讀 yolo 演算法的第一代版本 yolo v1 演算法。

深度學習第29講:目標檢測演算法經典論文研讀之 yolo v1

yolo v1 演算法

是一個複雜的系統,要透過認真研讀論文才能搞清楚演算法的每個細節。但簡單而言,yolo v1 演算法是將目標檢測任務當作的一個迴歸問題來對待,當然這是一個相當複雜的迴歸系統。yolo v1 透過訓練一個神經網路根據整張輸入的圖片預測出目標物體的邊界框位置和目標物體名稱和置信度。相較於兩階段的目標檢測演算法,yolo v1 演算法省掉了生成候選框的步驟,直接用一個檢測網路進行端到端的檢測,因而檢測速度非常快。

深度學習第29講:目標檢測演算法經典論文研讀之 yolo v1

從上圖可以看到 yolo v1 的檢測步驟:

將輸入圖片縮放到 448 x 448 的尺寸

對輸入影象執行一個

卷積神經網路

根據預測邊界框的置信度篩選出最優結果(NMS)

統一檢測方法

下面我們來詳細看一下 yolo v1 演算法的細節問題。

yolo v1 將輸入圖片進行 resize 之後將其劃分為 SxS 大小的網格(grid),每個網格負責檢測中心落在該網格中的物體,如下圖所示:

深度學習第29講:目標檢測演算法經典論文研讀之 yolo v1

簡單的檢測場景下,一個網格通常只負責檢測一個目標物體,但現實的檢測任務往往存在一個網格會有多個目標物體的情形。所以一般來說一個網格可以預測出 B 個邊界框(Bounding Boxes)和邊界框的置信度。這個置信度的含義在於該網格是否含有目標物體以及對於目標物體的定位有多大的可信度。邊界框的置信度計算公式為:

深度學習第29講:目標檢測演算法經典論文研讀之 yolo v1

其中第一項為當前網格中是否含有目標物體,含有的話就是 1,不含有的話則是 0,所以噹噹前網格中不含有目標物體時,該網格所對應的邊界框的置信度也就為零了。當前網格包含目標物體時,對應的邊界框的置信度則為預測的邊界框和實際的邊界框(groud truth bounding box)之間的交併比(IOU)。

到這裡我們簡單梳理一下以上過程基本邏輯:

yolo v1 將每張輸入圖片劃分為 SxS 個網格,每個網格可以預測 B 個邊界框和對應邊界框的置信度和具體定位。邊界框的置信度由網格中是否含有目標物體和預測邊界框與真實邊界框之間的 IOU 相乘得到。

再來看邊界框的位置預測問題。除了預測邊界框的置信度(confidence),還有邊界框的定位,而定位由四個

座標值

體現,分別是 x、y、w 和 h。其中:

x 和 y 代表了預測的邊界框中心與網格邊界的

相對值

w 和 h 則表示邊界框的寬和高相對於整幅影象的比例值

所以,綜合置信度和定位兩個因素,我們知道了每個邊界框都包含以上五個變數:

(x,y,w,h,confidence)

好了,邊界框的

屬性變數

的討論到此暫且告一段落,我們再回到之前劃分的網格。每個網格除了預測 B 個邊界框之外,還需要預測 C 個條件類別機率:即在每個網格中包含目標物體的情況下,整個物體屬於某個類的機率。我們把它記為:

深度學習第29講:目標檢測演算法經典論文研讀之 yolo v1

因而 yolo v1 演算法的輸出張量大小可以用公式表示為:

S x S x (B*5 + C)

而到了測試階段,每個網格的條件類別機率乘以每個邊界框的置信度就可以得到每個邊界框具體類別的置信度,所以這裡需要區分一下之前說的邊界框的置信度和邊界框所屬類別的置信度這兩個概念。邊界框的具體類別的置信度計算公式為:

深度學習第29講:目標檢測演算法經典論文研讀之 yolo v1

論文中將 yolo v1 應用於 PASCAL VOC 資料集時將輸入影象劃分為 7x7 個網格,每個網格預測兩個邊界框,即 B = 2,每個邊界框包括 x、y、w、h 和 confidence 五個

預測值

,另外該資料集有 20 個類別,所以根據前述計算公式我們可以得到輸出

張量

大小為:

7 x 7 x (2*5 + 20) = 7 x 7 x 30

以上便是 yolo v1 演算法的檢測預測細節。完整的 yolo v1 的檢測模型示意圖如下所示:

深度學習第29講:目標檢測演算法經典論文研讀之 yolo v1

檢測網路設計、訓練和損失函式

yolo v1 設計的檢測網路包括 24 個卷積層和 2 個全連線層,網路流程於結構如下:

深度學習第29講:目標檢測演算法經典論文研讀之 yolo v1

深度學習第29講:目標檢測演算法經典論文研讀之 yolo v1

作者們在設計 yolo v1 的網路結構時參考了 GoogLeNet 的網路結構,但並未使用 Inception 的通道組合策略,而是大量使用了 1x1 和 3x3 卷積。前 24 層卷積用來提取影象特徵,後面 2 層全連線用來預測目標位置和類別機率。

在訓練時先利用 ImageNet 分類資料集對前 20 層卷積層進行預訓練,將預訓練結果再加上剩下的四層卷積以及 2 層全連線,採用了 Leaky Relu 作為啟用函式,其中為了防止過擬合對全連線層加了失活機率為 0。5 的 dropout 層。

yolo v1 的

損失函式

較為複雜。一般來說系統設計需要平衡邊界框座標損失、

置信度損失

和分類損失。論文中設計的損失函式如下:

深度學習第29講:目標檢測演算法經典論文研讀之 yolo v1

將上述損失函式進行拆解釋義:(該圖來自 hrsstudy 的CSDN部落格,地址見參考資料)

深度學習第29講:目標檢測演算法經典論文研讀之 yolo v1

如何平衡三個損失函式部分之間的平衡是演算法需要重點考慮的問題。由公式可以看出,三者的損失型別均為

均方損失函式

,不同是在三部分損失前均有相應的權重係數來衡量三者各自的重要性。更多細節這裡不想寫了,各位可在讀論文時逐一體會。

結果與評估

yolo v1 在 PASCAL VOC 2007 資料集上與其他演算法的準確率和速度對比:

深度學習第29講:目標檢測演算法經典論文研讀之 yolo v1

與 Fast R-CNN 的準確率比較:

深度學習第29講:目標檢測演算法經典論文研讀之 yolo v1

從以上圖表可以看出,一步到位式的 yolo v1 演算法在準確度和速度的權衡上可能更偏向於速度一些,直接表現就是 yolo v1的檢測速度非常之快。

yolo v1 部分檢測表現:

深度學習第29講:目標檢測演算法經典論文研讀之 yolo v1

來自 yolo 官網的檢測效果影片展示,實時檢測的酷炫性一覽無餘:

關於 yolo v1 論文中還有諸多設計細節筆者也並沒有完全搞清楚,所以接下來一段時間會繼續對原文進行深入推敲,也會實際編碼進行試驗,歡迎各位留言交流!

參考資料:

Redmon J, Divvala S, Girshick R, et al。 You Only Look Once: Unified, Real-Time Object Detection[J]。

https://

blog。csdn。net/hrsstudy/

article/details/70305791

https://

pjreddie。com/darknet/yo

lo/

往期精彩:

深度學習第28講:目標檢測演算法經典論文研讀之Faster R-CNN

深度學習第27講:目標檢測演算法經典論文研讀之Fast R-CNN

深度學習第26講:目標檢測演算法經典論文研讀之空間金字塔池化網路SPP-Net

深度學習第25講:目標檢測演算法經典論文研讀之R-CNN

深度學習第24講:計算機視覺之目標檢測演算法綜述

深度學習第23講:PyTorch入門及快速上手指南