YOLO v2推理過程介紹

這大概是在2017年底的時候寫的,當時還研究了一下faster rcnn和ssd的推理過程。後來YOLO v3出來了,這個就放在一邊沒理了。現在發出來湊個篇數。

YOLO (You only look once) 是業界第一個端到端的圖像目標檢測方法,和Faster RCNN相比,不再需要RPN(region proposal network)來生成候選區域ROIs,因此,檢測速度更快,更加可以滿足實時檢測的要求。YOLO第一版本算法 將一張圖片均分爲SxS個網格(grid),每個網格對應B個bounding box,但是,對目標概率的檢測是基於每個網格進行,而不是基於每個bounding box進行,因此,碰到目標不是落在單個網格中的情況,檢測準確性有所下降。YOLO v2 做了很多改進,再次確定了YOLO在圖像目標檢測領域的重要地位,和SSD(single shot multibox detector) 並列爲端到端圖像目標檢測的兩大流派。

YOLO 算法都已由作者基於Darknet 實現並開源 ,本文基於YOLO v2的例子程序,以yolo.cfg 爲網絡模型,yolo-voc.weights 爲模型參數(支持80種分類),dog.jpg 爲待檢測圖像,分析了YOLO v2算法的推理過程。這三個文件的網址是:https://github.com/pjreddie/darknet/blob/master/cfg/yolo.cfghttps://pjreddie.com/media/files/yolo-voc.weightshttps://github.com/pjreddie/darknet/blob/master/data/dog.jpg

  • YOLOv2整體網絡結構

上述例子使用的網絡模型在推理時候的結構如下所示。YOLOv2整體網絡結構

此網絡由32層組成,分別記爲layer0到layer31,如上圖所示。由於網絡模型要求輸入的圖像是固定大小,因此,待檢測的原始圖像首先被縮放到608x608,最終進入網絡模型的數據尺寸是608x608x3,其中3表示紅綠藍三個通道。經過由卷積層和池化層組成的17個layer後(layer0至layer16),數據尺寸變成了38x38x512,這表示有512個feature map,每個feature map的大小是38x38。而layer25將此數據分別傳遞給上下兩條路徑,其中上面路徑再經過由卷積層和池化層組成的8個layer後(layer17至layer24),數據尺寸變成了19x19x1024;而下面路徑先經過layer26卷積層再進行layer27重排,數據尺寸變成了19x19x256。然後,上下兩條路徑經過layer28合併爲19x19x1280的數據,再經過兩個卷積層layer29和layer30,得到數據尺寸爲19x19x425,表示有425個feature map,每個feature map大小是19x19。最後的layer31,則根據確定網絡模型時候的假設,爲輸入的19x19x425數據賦予相應的物理意義,再進行整合得到最終檢測結果。總之,網絡模型非常簡潔而且直截了當,主要通過若干卷積和池化層來提取圖像特徵並生成檢測所需數據,最後通過結果整合層來得到最終的目標檢測結果。

其中,卷積層,除了包括普通意義卷積層的功能外,還可以包括批歸一化(Batch Normalize )和激活函數(activation);池化層都是普通的2x2的max pooling;重排層則是將38x38的feature map中2x2區域的數據,重排成4個19x19的feature map;合併層只做簡單的數據歸併;結果整合層的功能,除了在網絡模型配置文件中指定的region層外,還包括分散在Darknet實現中的代碼,從而組成了一個邏輯完整獨立的結果整合層。卷積層和結果整合層將在後面詳述。

  • 卷積層和批歸一化

在Darknet的網絡模型配置參數中,卷積層由卷積、批歸一化(Batch Normalize)和激活函數(activation)組成,其中,批歸一化又包括歸一化和縮放平移兩個功能,如下圖所示。卷積層

在本網絡模型中,除了最後一個卷積層layer30的激活函數是線性函數外,其他卷積層的激活函數都是leaky ,即:return (x>0) ? x : 0.1x。

當機器學習通過樣本數據進行有監督的學習時,學到的參數,除了和模型本身相關外,還和樣本數據本身的分佈有關。所以,假如樣本數據的分佈不停發生變化,將會使訓練非常困難,這種情況就發生在神經網絡中的每一個隱含層,因爲,每調整一次參數,隱含層的輸入數據的分佈都會因爲前一層網絡參數的變化而變化,這被稱爲Internal Covariate Shift,也是BN(batch normalize)希望解決的問題。個人認爲,BN尚未從理論上進行完美的解釋,主要是將輸入數據歸一化到正態分佈N(0,1),數學公式如下所示,其中,epsilon可以近似當0看待。另一方面,考慮到這樣的歸一化可能是錯誤的,在某些情況下更加不利於參數的學習,BN又加了數據的縮放平移功能,可以將數據還原恢復到歸一化之前的輸入(即下面公式的反函數),當然,通過訓練學習得到的縮放平移參數,也可能會將數據縮放平移到更加合適的另外一種分佈。在訓練時,針對每個batch的所有數據進行歸一化,也就是說,公式中的均值E和方差Var是基於batch數據得到,這也是BN名稱中batch的來源;而在推理時,則是根據所有的訓練數據進行歸一化,也就是說,此時公式中用到的均值和方差,是來自所有樣本數據的無偏估計。BN公式

  • 結果整合層

結果整合層的輸入數據尺寸是19x19x425,即425個feature map,每個feature map大小是19x19。這意味着,本網絡模型將圖片均分爲19x19的網格,feature map中的每個座標的元素對應着一個網格grid,而每個網格又被細化爲5個bounding box,後一段會具體解釋。

將這些feature map按下圖從左到右從上到下的視角來看,每行有85個feature map,是因爲每個bounding box對應着4個調整參數、屬於背景的可能性、以及屬於80種分類的概率可能性,即一共4+1+80=85個數值。而因爲每個網格被細化爲5個bounding box,所以,圖中一共有5行。這就是85x5=425個feature map的物理意義。425個featuremap的物理意義

任取feature map中的一個元素,不妨假設爲圖中的圓圈位置,記其座標爲該feature map的第i列第j行(zero-based),那麼,對應的bounding box計算公式 如下:

    bx = (i + x0) / w;
    by = (j + x1) / h;
    bw = exp(x2) * biases[2*n]   / w;
    bh = exp(x3) * biases[2*n+1] / h;

其中,bx、by、bw和bh分別對應bounding box中心的座標和寬高,x0、x1、x2和x3則對應着第0、1、2、3列的feature map在該座標位置的數值;w、h是feature map的寬高,這裏即19;biases數組是模型參數,其數值隨網絡模型的確定而確定,對應着網絡模型文件中的region層的anchors參數;n取值爲0到4,對應着行數,因此,上圖5行中的每一行都對應着一個不同的bounding box(不同的寬高),所以,bounding box總數達到了19x19x5=1805個,因爲一張圖片被分成了19x19個網格,而每個網格又被細化爲5個bounding box,這也使得檢測準確性得到了更多的提高,當然,不可以無限制提高n的值,那會影響檢測速度,這是個權衡的結果。

由於上述公式還對bounding box做了規格化處理,最後結果處於[0,1]範圍,因此,第0、1列的feature map的數據要先經過LOGISTIC激活函數,將數據映射到[0,1]範圍,然後才代入上述公式。而從第4列開始,表示的是這個bounding box屬於背景、屬於80種不同分類的可能性,那麼,所有可能性累加應該是1,所以,這裏的概率數據還進行了softmax處理。不過,這裏的代碼實現,只對80種不同分類的概率值進行softmax處理,而沒有包括背景概率,背景概率只是進行了LOGISTIC處理。

最後,結合NMS(non-max suppress)算法,根據屬於80個不同分類的可能性概率和bounding box的重疊情況,給出本圖像中的目標位置和目標類別。

以上內容是本人業餘時間興趣之作,限於水平,差錯難免,僅代表個人觀點,和本人任職公司無關。

本文由博客一文多發平臺 OpenWrite 發佈!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章