上期給大家介紹了YOLO模型的檢測系統和具體實現,YOLO是如何進行目標定位和目標分類的,這期主要給大家介紹YOLO是如何進行網絡訓練的,話不多說,馬上開始!
前言:
輸入圖片首先被分成S*S個網格cell,每個網格會預測B個邊界框bbox,這B個邊界框來定位目標,每個邊界框又包含5個預測:x,y,w,h和置信度confidence.那這取值有什么約束嘛?如下圖所示:

黃色的圓圈代表了中間這個網格的中心點,紅色的圓圈代表了這個紅色方框的中心點,則x,y的取值是兩個中心的偏移量和 cell 本身寬高的比值:
x = (bbox.x-cell.x)/cell.width
y = (bbox.y - cell.y)/cell.height
bbox 的寬高w,h是和整張圖片的寬高的比值:
w = bbox.width / image.width
h = bbox.height / image.height
現在回到我們YOLO的訓練上。
YOLO訓練
YOLO先使用ImageNet數據集對前20層卷積神經網絡進行預訓練,然后使用完整的網絡,在Pascal voc2007和2012數據集上進行對象識別和定位的訓練和預測。網絡結構圖如下所示:

YOLO的最后一層采用線性激活函數,其它層都是Leaky Relu,訓練過程中為了防止數據過擬合,數據過擬合的話對於外來檢測的數據的檢測效果會不好,采用了(drop out)正則化和數據增強(data augmentation)技術防止過擬合。
YOLO損失函數
損失就是網格實際輸出值和樣本標簽之間的偏差:

總的來說就是,就是用網格輸出與樣本標簽的各項內容的誤差平方和作為一個樣本的整體誤差,損失函數中的五項分別對應於每一個網格的輸出的30維相對應,邊框中心xy,寬高wh,可以稱為定位誤差,以及邊框是否有對象,和有對象時的分類誤差,可以稱為分類誤差。


YOLO預測:
在上期中我已經講解來了YOLO是如何進行目標定位和分類了,輸入一張圖片到我們已經訓練好了的YOLO網絡,將輸出一個7*7*30的張量來表示圖片中所有網格包含的對象(概率)以及該網格中對象可能的兩個位置(bounding box)以及可信程度(置信度),就是說一張圖片上最后會有98個邊界框,那么如何找到最有可能的對象和位置呢? 如下圖所示:

這就用到 交並比(Intersection over union 和非極大值抑制(Non-max suppression )算法。
交並比:
如下圖,把A和B分別當做一個邊界框,由於我們從預測結果中可以得到邊界框的寬高和中心坐標,我們就可以計算邊界框A和邊界框B的面積,從而計算他們之間的交並比,又假如A是實際邊界框,而B是預測框,那么當A和B之間的交並比大於0.5時,判斷預測這個框預測正確,否則舍棄這個框。

那剩下還有許多邊界框怎么辦呢?

最后附上TensorFlow版的YOLOv1的代碼地址:下載好代碼裝好環境即可使用預訓練好了的權重就可測試https://github.com/gliese581gg/YOLO_tensorflow,下載下來進行自己的訓練吧!

參考:
https://zhuanlan.zhihu.com/p/32525231
https://link.zhihu.com/?target=https%3A//segmentfault.com/a/1190000016692873%3Futm_source%3Dtag-newest
往期推薦:
小白也能弄懂的目標檢測之YOLO系列 - 第一期

小白也能弄懂的目標檢測YOLO系列之YOLOV1 - 第二期

更多有關python、深度學習和計算機編程和電腦知識的精彩內容,可以關注微信公眾號:碼農的后花園