YOLO 算法
假設你要訓練一個算法去檢測三種對象,行人、汽車和摩托車,你還需要顯式指定完整的背景類別。這里有 3 個類別標簽,如果你要用兩個 anchor box,那么輸出 y 就是 3×3×2×8,其中 3×3 表示 3×3 個網格,2 是 anchor box 的數量,8 是向量維度,你可以將它看成是 3×3×2×8,或者 3×3×16。要構造訓練集,你需要遍歷 9 個格子,然后構成對應的目標向量y。
先看看第一個格子(編號 1),里面沒什么有價值的東西,行人、車子和摩托車,三個類別都沒有出現在左上格子中,所以對應那個格子目標 y 就是這樣的:
第一個 anchor box 的 pc 是 0,因為沒什么和第一個 anchor box 有關的,第二個 anchor box 的 pc也是 0。假設你的訓練集中,對於車子有這樣一個邊界框(編號 3),水平方向更長一點。所以如果這是你的 anchor box,這是 anchor box 1(編號 4),這是 anchor box 2(編號 5),然后紅框和 anchor box 2 的交並比更高,那么車子就和向量的下半部分相關,這里和 anchor box 1 有關的 pc是 0,剩下這些分量都是不關心,,然后你的第二個pc = 1,然后你要用這些(bx,by,bh,bw)來指定紅邊界框的位置,然后指定它的正確類別是 2(c1 = 0, c2 = 1, c3 = 0),對吧,這是一輛汽車,這就是神經網絡做出預測的過程。
所以你這樣遍歷 9 個格子,遍歷 3×3 網格的所有位置,你會得到這樣一個向量,得到一個 16 維向量,所以最終輸出尺寸就是 3×3×16,然后你訓練一個卷積網絡,輸入是圖片,可能是 100×100×3,然后你的卷積網絡最后輸出尺寸是,在我們例子中是 3×3×16 或者3×3×2×8。最后你要運行一下這個非極大值抑制,如果你使用兩個 anchor box,那么對於 9 個格子中任何一個都會有兩個預測的邊界框,其中一個的概率pc很低。但 9 個格子中,每個都有兩個預測的邊界框,比如說我們得到的邊界框是是這樣的,注意有一些邊界框可以超出所在格子的高度和寬度,然后拋棄概率很低的預測。這就是 YOLO 對象檢測算法,這實際上是最有效的對象檢測算法之一。