YOLO 系列算法是目標檢測 one-stage 類的表明算法,本文將從 問題背景,創新點等方面比較,瞭解它們的的發展歷程。
1、任務描述
目標檢測是爲了解決圖像裏的物體是什麼,在哪裏的問題。輸入一幅圖像,輸出的是圖像裏每一個物體的類別和位置,其中位置用一個包含物體的框表示。
算法
須要注意,咱們的目標,同時也是論文中常說的感興趣的物體,指咱們關心的類別(行人檢測只檢測人,交通檢測只關心交通工具等),或者數據集包含的類別,並非圖像裏全部的物體都是目標,好比建築,草坪也是物體,但他們經常是背景。網絡
從計算機視覺的角度看,目標檢測是分類+定位,從機器學習的角度看,目標檢測是分類+迴歸。架構
2、設計思想
目標檢測架構分爲兩種,一種是two-stage,一種是one-stage,區別就在於 two-stage 有region proposal 過程,相似於一種海選過程,網絡會根據候選區域生成位置和類別,而 one-stage 直接從圖片生成位置和類別。框架
今天提到的 YOLO 就是一種 one-stage 方法。機器學習
YOLO 是 You Only Look Once 的縮寫,意思是神經網絡只須要看一次圖片,就能輸出結果。ide
YOLO 一共發佈了四個版本,其中 YOLOv1 奠基了整個系列的基礎,後面的系列就是在初版基礎上的改進,只爲提高性能。函數
YOLO的檢測方法以下:工具
- 將輸入圖像劃分爲 S×S 網格(grid),好比這裏劃分紅 7×7=49 個 grid,若是目標的中心落入網格單元,則該網格單元負責檢測該目標。注意不是整個物體落入單元格,只須要物體中心在便可。
- 每一個網格單元預測 B(文中 B=2) 個邊界框和這些框的置信度得分。這個分數反映這個框包含物體的機率 Pr(Object) 以及預測框的位置準確性 IOU,因此置信分數也由這兩部分定義:
- 每一個 bounding box 都要包含 5 個預測值,x, y, w, h, confidence。(x,y)框中心是相對於網格單元的座標,w 和 h 是框至關於整幅圖的寬和高,confidence 表明該框與 ground truth 之間的 IOU(框裏沒有物體分數直接爲 0 )
- 由於位置和類別須要同時預測,因此每一個單元格除了輸出 bounding box 也輸出物體的條件機率(該物體屬於某一類的機率,固然這些機率以包含對象的網格單元爲條件)。每一個網格單元輸出一個機率集合,不考慮這個 grid 預測幾個 bounding box。
- 測試階段,在測試時,咱們將條件分類機率與各個框的置信度預測相乘,做爲每一個框特定於每一個類的置信分數(這個分數編碼了類別和位置兩部分信息)。
與 R-CNN 系列方法相比:性能
- R-CNN 及其變體採用 region proposals 而不是滑動窗口法找物體,是一種多階段方法。調網絡的時候須要分開調,運行慢。
- YOLO 與 R-CNN 類似的地方是在網格單元找可能的邊界框,用 CNN 提取特徵。不一樣的是,加在網格單元的空間限制有助於防止同一個目標的重複檢測,預測的邊界框也少(98 個),還有把多個階段結合成一個階段。
3、發展歷程
1. YOLOv1
問題背景學習
以前 two-stage 方法如 R-CNN 把檢測問題分紅兩部分,先生成候選區域(region proposal),再用分類器對區域分類,多階段訓練致使不易優化。
創新點
把檢測看成迴歸問題,用一個網絡輸出位置和類別,實現了一個 unified system,從檢測的角度是 one-stage的
訓練流程
和 R-CNN 差很少
- 首先 ImageNet 1000類 競賽數據集上對卷積層進行預訓練
- 而後再把網絡根據檢測任務微調
檢測流程
- 輸入一幅多目標圖像
- 將圖像劃分紅多個網格
- 經過網絡獲得每一個網格的分類機率,以及各網格預測的框+置信度
- 針對每一個框,把機率與置信分數相乘,做爲每一個框特定於每一個類的置信分數
- 輸出位置和類別信息
優勢
- 快。由於迴歸問題沒有複雜的流程(pipeline)。
- 能夠基於整幅圖像預測(看全貌而不是隻看部分)。與基於滑動窗口和區域提議的技術不一樣,YOLO在訓練和測試期間會看到整個圖像,所以它隱式地編碼有關類及其外觀的上下文信息。由於能看到圖像全貌,與 Fast R-CNN 相比,YOLO 預測背景出錯的次數少了一半。
- 學習到物體的通用表示(generalizable representations),泛化能力好。所以,當訓練集和測試集類型不一樣時,YOLO 的表現比 DPM 和 R-CNN 好得多,應用於新領域也不多出現崩潰的狀況。
缺點
- 空間限制:一個單元格只能預測兩個框和一個類別,這種空間約束必然會限制預測的數量;
- 難擴展:模型根據數據預測邊界框,很難將其推廣到具備新的或不一樣尋常的寬高比或配置的對象。因爲輸出層爲全鏈接層,所以在檢測時,YOLO 訓練模型只支持與訓練圖像相同的輸入分辨率。
- 網絡損失不具體:不管邊界框的大小都用損失函數近似爲檢測性能,物體 IOU 偏差和小物體 IOU 偏差對網絡訓練中 loss 貢獻值接近,但對於大邊界框來講,小損失影響不大,對於小邊界框,小錯誤對 IOU 影響較大,從而下降了物體檢測的定位準確性。
2. YOLOv2
問題背景
- YOLOv1 檢測性能低
- 當前的檢測任務受數據集標籤的限制(數據集必須有標籤或經過分類賦予標籤)。可是,標記檢測圖像比標記分類圖像昂貴得多,因此檢測數據和分類數據不是一個規模。
創新點
- 針對第一個問題,使用一些方法提高 YOLOv1 的性能,獲得 YOLOv2。
- 針對第二個問題,提出了 ImageNet 和 COCO 數據集的結合方法,以及聯合訓練方法,訓練 YOLOv2 後獲得的模型叫 YOLO9000。
提高性能的方法
- Accuracy: Batch Normalization, High Resolution Classifier, Convolutional With Anchor Boxes, , Direct location prediction, Fine-Grained Features, Multi-Scale Training
- Speed: 提出一個新網絡 Darknet-19
訓練流程
論文提出了一種聯合訓練算法,該算法能夠在檢測和分類數據上訓練目標檢測器。 利用標記的檢測圖像來學習精準定位,同時使用分類圖像來增長其「詞彙量」和健壯性。
- 分類檢測數據集結合方法:
檢測數據集的標籤少且普通,分類數據集的標籤多且具體,若是咱們想在兩個數據集上訓練,就得把它們的標籤合併起來。不少分類方法都用一個 softmax layer ,但它的前提是假設全部類互斥,但咱們的數據集類別是不都是互斥的(有多是包含關係,例如狗和金毛犬),因此咱們使用了一個多標籤模型來組合數據集(無互斥的要求),及使用多個 softmax 。
大多數分類方法都假定標籤採用扁平結構,可是對於組合數據集咱們須要層次化的結構。
ImageNet 標籤採用有向圖結構。在這裏,做者把數據集的結構簡化爲結構樹(hierarchical tree)。
經過改造圖,最後獲得一個 WordTree,這樣每一個節點/標籤都有本身的機率,解決了類別之間不互斥的問題,就能在檢測集和分類集上聯合訓練。
- 聯合訓練方法:
把檢測和分類數據混合,訓練過程當中遇到帶標籤的檢測圖像,就基於 YOLOv2 整個損失函數進行反向傳播,遇到分類圖像,只反向傳播網絡的分類損失。
3. YOLOv3
問題背景
- YOLOv3 的提出不是爲了解決什麼問題,整篇論文實際上是技術報告。
- YOLOv3 在 YOLOv2 基礎上作了一些小改進,文章篇幅不長,核心思想和 YOLOv二、YOLO9000差很少。
模型改進
- 邊界框預測:定位任務採用 anchor box 預測邊界框的方法,YOLOv3 使用邏輯迴歸爲每一個邊界框都預測了一個分數 objectness score,打分依據是預測框與物體的重疊度。若是某個框的重疊度比其餘框都高,它的分數就是 1,忽略那些不是最好的框且重疊度大於某一閾值(0.5)的框
- 類別預測:和 YOLOv2 同樣,YOLOv3 仍然採起多標籤分類
- 多尺度預測
- 使用新網絡 Darknet-53 提取特徵
4. YOLOv4
問題背景
- YOLO 原做者以前宣佈退出CV界,YOLOv4 的做者其實不是前三篇 YOLO 的一做
- YOLOv4 是對 YOLOv3 的一個改進。它的改進方法就是總結了幾乎全部的檢測技巧,又提出一點兒技巧,而後通過篩選,排列組合,挨個實驗(ablation study)哪些方法有效。
- 值得注意的是文章第二部分相關工做,簡直就是目標檢測的一個簡單綜述,閱讀該部分,你就能瞭解模型及方法,若是它提到的每一個方法你都瞭解,說明你在這個方向的研究較全面深刻(我沒達到)。
框架方法
下面這幅論文中的圖介紹了 YOLOv4 檢測器的構成及使用的訓練方法,這些是通過大量實驗選出的性能最好的組合
4、總結
回顧 YOLO 系列的發展,咱們能夠看出 YOLO 後期沒有提出新穎的想法,更重視應用落地。