YOLOv2是YOLO的第二個版本,其目標是在提高速度的同時顯著提高精度
1. Batch Normalization
- 假設一個情況
X1 = 1 , X2 = 20
X1_1 = 0.1 , X2_2 = 2 (經過 W = 0.1權重後的結果)
X1_1A ≅ 0.1 , X2_2A ≅ 0.96 (再經過一個Tanh激勵函數後的結果)
此時hidden layer 2節點的感受力已經不會對特徵較大的X2感到敏感
X1 = 0.1 , X2 = 0.96
一般來說這種情況,在輸入層時可以用Normalize將Feature範圍做限制,但僅限於輸入層
後面幾層Hidden Layer 仍會因梯度的加深尚失輸入之間的資訊差異敏感度
- 此圖模擬一群資料中一個batch 的 data
我們可以清楚的發現到
未使用Batch Normalize 的值不僅分布直不均勻,而且有太多的值,會在經過Activation function 後落在飽和區間
- 於是我們在神經網路中的隱藏層和Activation 函數之間加上 Normalization layer
加入後情況如下
- 在最基礎的normalize程序當中
μ (mean) 取決於 bath data
σ (標準差) 取決於 bath data 和 mean
Bathch size要夠大, Batch normalize才有意義,目的是盡可能從整個data裡估算μ 和σ
ϵ 是一個任意小的常數,加在分母當中作為bias激活normalize
透過μ 和σ 計算出(xi )delta的normalize值 (特性: μ =0 , σ = 1 )
- 但是在模型中我們不希望每次normalize的分布都調適成這種情況,因為不具彈性
- 因此加了最後一道自動調整程序
γ(scale)和β(shift) 相對於用batch data算出來的μ 和σ 是讓模型學習調整的參數 (不會受到batch data影響,而是根據Network自己做調整)
模型會知道我什麼時候該做normalize 什麼時候該維持原樣
反向傳播時會根據其中一條路徑傳遞損失
2. High Resolution Classifier
- 在這邊我們比較v1和v2之間訓練的差異,v1在Stage1訓練的時候是採用224*224的resolution下去做訓練分類網路,然後在Stage2的時候以448*448的resolution訓練檢測網路,這會造成一件問題--YOLOv1的捲積層要重新適應新的分辨率同時YOLOv1的網絡還要學習檢測網絡
- 因此yolo v2提出了一個方法,在Stage1訓練的時候先用低解析度訓練160個epoch然後再用10個epoch訓練網路適應448*448的高解析度,最後再讓Stage2以相同解析度訓練檢測
3. Convolutional With Anchor Boxes
在這裡我們比對過往檢測方法,最後傳遞的網路層以及輸出預測方式
Yolo v1參考GoogleNet網路模型,最後加上2層 Flattern Layer,將結果平滑化再餵到神經網路作預測,最後輸出一個 S ×S ×(B ∗5 + C)維度的Tensor。
- Softmax層對anchors進行分類找到需要被檢測的foreground anchors
- Regression層對anchors的邊框進行回歸找到精確度較高的Propsoal邊框
- 接著Propsoal Layer再綜合兩者產生出多個Propsoal Feature Map
ROI Pooling可接受任意尺寸的輸入,warp操作不再需要,這有效避免了物體的形變扭曲,保證了特徵信息的真實性
最後作者決定參考Faster-RCNN中的Anchor挑選候選框的作法,改善V1的準確度
- Input 改為416*416
- Multi-Scale with factor 32
- Dimension Clusters
- 提出Darknet-19架構
預測每個anchor的bbox以及類別(而不是YOLO中,對於feature map中一點,僅預測一次類別)
跟YOLO相同一個Anchor預測5個bbox和他們類別跟信心值
4. Dimension Clusters
Q : 傳統使用hand picked的方式讓機器選擇Anchor box的Dimension ,是否有更簡單更快的方式去學習?
- 用Clustering的方式,先去對dataset裡所有的bbox做分群,找出最有可能的預選框大小
- Centroid: K-Means選出的bbox
5. Direct Location Prediction
Q : Using anchor boxes with YOLO we encounter an issue: model instability, especially during early iterations.
- V2提出了預測的新公式, 直接對anchor box點的偏移位置進行預測
- 而sigma函數用來約束其可能的偏移範圍(相對於Grid Cell的坐標位置)
- 通過預測tx和ty來得到bound box中心座標(bx, by)值
- cx和cy是當前網格左上角到圖像左上角的距離
- σ函數將約束在(0,1)範圍內,所以根據上面的計算公式,
- 預測邊框的藍色中心點被約束在藍色背景的網格內。約束邊框位置使得模型更容易學習,且預測更為穩定
- 因為自然對數e表示「增長的極限」,所以在這邊以e為底以scale放大率為次方,計算出數值的自然放大倍率
6. Fine-Grained Features
- 卷積層逐漸減小空間維度。隨著相應的分辨率降低,檢測小物體變得更加困難。
為了抓取細粒度特徵,YOLO v2加入了一層PassThrough layer,將原本26×26的resolution的feature map進行特徵重排
然後再與原始的13×13×1024輸出層連接。現在我們在新的13×13×3072層上使用convolution filters來進行預測
Detection Network
7. Multi-Scale Training
We want YOLOv2 to be robust to running on images of different sizes so we train this into the model.
- 爲了讓模型更穩定,所以YOLOv2做了多尺度的訓練,而Multi-Scale Training 讓 YOLO v2在速度和準確性做出平衡的選擇
- 在訓練過程,每隔10個epochs隨機選擇一種輸入圖片大小,然後只需要修改對最後檢測層的處理就可以重新訓練。
- 由於YOLOv2的轉換層將輸入維度下採樣32倍,因此新採樣的大小為32的倍數
- Training => Input Size : {320 , 352, … , 608} — Multi-Scale Training .
- Detect => Input Size : 416X416
8. Darknet-19
- 在3×3卷積之間使用1×1卷積來壓縮特徵圖channles以降低模型計算量和參數
- 使用Darknet-19之後,YOLOv2的mAP值沒有顯著提升,但是計算量卻可以減少約33%
- global average pooling是對每個feature map內部取平均,每個feature map變成一個值,10個feature map就變成一個10維的向量,然後直接輸入到softmax中。
YOLO v2 使用技術整理
- Accuracy improvements after applying the techniques discussed
- Accuracy comparison for different detectors:
YOLO v2 訓練
同一個網路分作兩階段任務訓練
1. For Classification
- 用來防止神經網絡在訓練的後期由於學習率過小而導致的網絡一直在某個局部最小值附近震盪,這樣可以通過在後期增大學習率跳出局部極小值
2. For Detection
- 去掉Darknet-19最後的卷積層
- 加入PassThrough Layer
- Fine tune這個預訓練模型160個epoch
- Modify Learning Rate
- Weight Decay為0.0005
- Momentum 為0.9
去掉最後的卷積層(因為它是我們當初為了得到1K類的分類置信度加上去的)
初始學習率訓練了160次,在第60次和第90次的時候學習率減為原來的十分之一
YOLO9000
作者提出了一種在分類數據集和檢測數據集上聯合訓練的機制。使用檢測數據集的圖片去學習檢測相關的信息,
例如bounding box 坐標預測, 是否包含物體以及屬於各個物體的概率。使用僅有類別標籤的分類數據集圖片去擴展可以檢測的種類。
Microsoft COCO — detection dataset
- 10W images, 80 classes, detection labels
- classes are more general like “dog” or “boat”
ImageNet — classification dataset
- ImageNet資料集是按照wordnet架構組織的大規模帶標籤數據集
- 1300W images, 1000 classes, classification labels
- classes are more specific like “Norfolk terrier”, “Yorkshire terrier”, or “Bedlington terrier”
訓練過程中把監測數據和分類數據混合在一起。當網絡遇到一張屬於檢測數據集的圖片就基於YOLOv2的全部損失函數(包含分類部分和檢測部分)做反向傳播。
當網絡遇到一張屬於分類數據集的圖片就僅基於分類部分的損失函數做反向傳播。
這種方法有一些難點需要解決。檢測數據集只有常見物體和抽象標籤(不具體),
例如“狗”,“船”。分類數據集擁有廣而深的標籤範圍(例如ImageNet就有一百多類狗的品種,包括“Norfolk terrier”, “Yorkshire terrier”, and “Bedlington terrier”等. )。
必須按照某種一致的方式來整合兩類標籤。 => Hierarchical classification(層次式分類)
1. Hierarchical Tree
- 由於大部分的標籤是有上下同義詞的關係
- 因此不能以一維的方式直接合併
最終結果是一顆WordTree (視覺名詞組成的層次結構模型)。
合併後的標籤並不相互排斥。
2. Hierarchical classification
以前,YOLO只單純預測雙翼飛機的班級成績。
但是有了WordTree,它現在可以預測出在airplane的情況下biplane的得分。
用WordTree執行分類時,預測每個節點的條件概率。
例如: 在“terrier”節點會預測:
如果想求得特定節點的絕對概率,只需要沿著路徑做連續乘積。
- 按照這種方式執行分類有一些好處,當遇到新的或未知物體類別,預測精確度降低的比較緩慢(沒有突然巨幅下降)。
- 例如,如果網絡看到狗的圖片但不確定它是什麼類型的狗,它仍然會以高Confidence預測“狗”,但在下位詞hyponym中分散的Confidence較低。
- 這個方法也適用於detection,在detection時當然就不能假裝每一幅圖都有一個物體了,
- detector必須得明確算出物體的概率值,我們走訪整個WordTree,沿著根節點向下每次都走Confidence最高的分支,
- 直到達到某個閾值(0.6)時,最終預測物體的類別為最後的節點類別。
- 作者在WordTree上訓練了Darknet-19模型。為了創建WordTree作者添加了很多中間節點,把標籤由1000擴展到1369。訓練過程中ground truth標籤要順著向根節點的路徑傳播
- 不同之處在於,YOLO為每個父節點的child node執行多個softmax操作,而不是單一softmax操作。
- Pr(physical object)等於框置信度分數,該分數用於衡量框是否具有對象。
- YOLO搜索整顆樹, 在每次分割時採用最高置信度路徑,直到達到某個閾值,YOLO預測該類別的object。
3. Joint Classification And Detection
- 因爲ImageNet比COCO大的多,所以訓練的時候對COCO多采樣一些,保持比例在4:1
- 例如遇到狗的標籤,就只反向傳播狗的參數,不需要反向傳播給哈士奇和金毛,因爲也沒得可傳的信息了
- 採用這種聯合訓練,YOLO9000從COCO檢測數據集中學習如何在圖片中尋找物體,從ImageNet數據集中學習更廣泛的物體分類。
- YOLO9000是在不同數據集上進行半監督訓練。而且YOLO9000可以同時即時檢測9000多種其它物體類別。
- 同時YOLO9000是縮小檢測和分類之間數據集大小差距的重要一個進程。