YOLO V2
basic idea:
yolo最大的問題有兩個:一個是recall較低,另外一個是localization不準確。與一般的增加網絡複雜度和深度的思路不同,yolo v2 希望能保持yolo網絡處理速度快的優勢。因此,v2在不擴大網絡的基礎上,使用了一些技巧來使模型更容易學到有用的features。
接下來從模型的最終效果,處理速度和訓練方法三方面來總結一下yolo v2使用到的算法和技巧。
Performance(better):
Batch Normalization
BN 可以使每層layer的輸入在訓練過程中保持分佈一致,避免了隨着batch不同,輸入分佈隨之改變,而加大神經元的學習難度。在yolo v2上,這體現於加了BN之後,模型收斂更快。並且BN 也可以看作是在神經元之間引入了額外的依賴性或者說限制,迫使模型更簡單,也可能部分代替正則化和drop out的工作。
High resolution detection
和很多其他的CV模型一樣,yolo也使用了開源數據集做transfer learning。和之前不同的是,v2使用了和後續detection數據集相同的高分辨率的圖片做預訓練,使模型不用調整參數以適應新的分辨率,略微減輕了task的難度。
Anchor box with prior: k-means for box dims
yolo之前是不限制預測的bounding box的比例和大小的,唯一的先驗信息是bounding box的中心落在對應的grid cell中。這使得預測的自由度太高,而所獲的信息又太少。對於訓練集中較少出現的大小和比例的bounding box,預測起來便更加困難。
因此v2借鑑了Region CNN的思想,引入了先驗知識,爲每個grid cell規定了k個(文獻中k=5)比例和尺寸固定的anchor box。預測時並不直接預測box的起始位置和寬高,而是預測起始位置相對於grid cell位置的偏移和寬高的縮放係數。這一操作引入了先驗知識,減小了task的難度。在使用了這個方法之後,模型的recall有明顯的提升。
當然,要正真發揮Anchor box的作用,每個Anchor box的尺寸和比例需要仔細設計。文中使用了k-means聚類算法來產生5個cluster,把每個cluster的平均比例尺寸作爲一個Anchor box。值得一提的是,爲了和之後的detection配合,聚類使用的距離metric是。
Predict offset to each grid cell(5 d)
具體來說,模型在每個grid cell上會預測5個bounding box,並且與之前不同,每個bounding box都有自己的objectness和conditional class probability,這樣一來同一cell的bounding box之間便不會相互影響。
每個bounding box會對應5個輸出:。
最後需要的bounding box的中心位置,寬高,以及它包含每類物體的概率可以由如下公式算得:
:此cell相對於feature map左上角的offset。
:此anchor box的先驗寬高。
注意:
- grid cell的尺寸做過歸一化,每個cell的大小爲1*1。因此每個屬於此grid cell的bounding box的中心位置與grid cell起始位置之間的偏差一定小於1。
- 代表了此bounding box包含物體的概率,對應於yolo中的。公式中的是指中心落在此grid cell中的任意ground truth。只關心是否包含物體,因此ground truth的類別不限。
- :在bounding box包含物體的情況下,此物體屬於某一類的概率。
Passthrough layers for fine features
爲了能得到分辨率更高的信息,v2設置了Passthrough layers把模型前部分layer的高分辨率輸出()連接到後部分,與之後的低分辨率輸出()融合/重疊起來。融合方法是把高分辨率feature map上臨近的4個feature重疊起來,成爲一個擁有4倍channels數目的新feature,從而減小map的二維尺寸使其可以疊加。
例如:高分辨率的feature map從 後,即可與低分辨率的feature map重疊。
Train on image with different size
Speed(faster):
- vgg16:
- googlenet: Inception module with dimension reductions
- darknet:Global average pooling, 1x1 conv for channel reduction, batch normalization
training methods (stronger):
- joint training:
- classification data:
只反向傳播loss中條件類概率的部分 - detection data:
反向傳播整個loss的error
- classification data:
- multi-label dataset: structual label / multi-label / word tree
-很有趣實用的話題,怎麼使用多個數據集來訓練同一個模型。主要要解決數據集之間的標籤不一致的問題。 比如同樣是‘狗’這一類別,在一個數據集裏可能是‘柴犬’,另外一個數據集裏可能是‘動物’,他們之間有層級關係。使用最小的effort來統一這些標籤,使數據集間有一致性。 - loss function && classification part: ???
具體的loss公式文中沒有提到,而且關於分類的部分,論文原話是“The network predicts 5 coordinates for each bounding box”。根據我對這句話的理解,每個bounding box應該是隻輸出一個值來表示包含某類物體的概率,而不是我之前以爲的一個維度爲類數目的vector。這一點讓我費解,之後研究清楚了補上。
Results:
Reference:
v2: https://arxiv.org/abs/1612.08242