1. 程式人生 > >從YOLOv1談到YOLOv2(2)訓練與損失函式

從YOLOv1談到YOLOv2(2)訓練與損失函式

之前簡單介紹了YOLO的主要思想,這裡再簡單介紹一下訓練的過程。都知道訓練的過程中需要修改神經網路的權重的,怎麼修改要基於一個損失函式來判斷。從最簡單的圖片分類來說,分錯了,損失函式為1,對了為0,然後反向傳播。損失函式的設計對於訓練神經網路是很重要的,那麼YOLO是怎麼設計的呢。

以下內容轉自知乎“圖解YOLO”

這裡寫圖片描述

損失函式的設計目標就是讓座標(x,y,w,h),confidence,classification 這個三個方面達到很好的平衡。簡單的全部採用了sum-squared error loss來做這件事會有以下不足: a) 8維的localization error和20維的classification error同等重要顯然是不合理的; b) 如果一個網格中沒有object(一幅圖中這種網格很多),那麼就會將這些網格中的box的confidence push到0,相比於較少的有object的網格,這種做法是overpowering的,這會導致網路不穩定甚至發散。 解決方案如下:

· 更重視8維的座標預測,給這些損失前面賦予更大的loss weight, 記為 \lambda_{coord} ,在pascal VOC訓練中取5。(上圖藍色框)
· 對沒有object的bbox的confidence loss,賦予小的loss weight,記為 \lambda_{noobj} ,在pascal VOC訓練中取0.5。(上圖橙色框)
· 有object的bbox的confidence loss (上圖紅色框) 和類別的loss (上圖紫色框)的loss weight正常取1。

對不同大小的bbox預測中,相比於大bbox預測偏一點,小box預測偏一點更不能忍受。而sum-square error loss中對同樣的偏移loss是一樣。 為了緩和這個問題,作者用了一個比較取巧的辦法,就是將box的width和height取平方根代替原本的height和width。 如下圖:small bbox的橫軸值較小,發生偏移時,反應到y軸上的loss(下圖綠色)比big box(下圖紅色)要大。
這裡寫圖片描述

一個網格預測多個bounding box,在訓練時我們希望每個object(ground true box)只有一個bounding box專門負責(一個object 一個bbox)。具體做法是與ground true box(object)的IOU最大的bounding box 負責該ground true box(object)的預測。這種做法稱作bounding box predictor的specialization(專職化)。每個預測器會對特定(sizes,aspect ratio or classed of object)的ground true box預測的越來越好。(個人理解:IOU最大者偏移會更少一些,可以更快速的學習到正確位置)

訓練:

預訓練分類網路: 在 ImageNet 1000-class competition dataset上預訓練一個分類網路,這個網路是Figure3中的前20個卷機網路+average-pooling layer+ fully connected layer (此時網路輸入是224*224)。

訓練檢測網路:轉換模型去執行檢測任務,《Object detection networks on convolutional feature maps》提到說在預訓練網路中增加捲積和全連結層可以改善效能。在他們例子基礎上新增4個卷積層和2個全連結層,隨機初始化權重。檢測要求細粒度的視覺資訊,所以把網路輸入也又224*224變成448*448。