yolo v1演算法理解
寫的比較明確,不是籠統的介紹,yolo 目標檢測演算法個人總結(yolov1) - 朱勇的文章 - 知乎
https://zhuanlan.zhihu.com/p/27515705
yolo v1在檢測目標時,不同於之前RCNN系列的方法,是將檢測物件的類別和位置同時進行預測,是一種迴歸問題。
主要步驟為:卷積層進行影象特徵提取;全連線層用於後續類別和目標位置的迴歸預測。
具體預測方法:目標可能位於影象的不同區域性區域,因此,作者首先將影象分割成S*S個柵格單元,
並同時期望每一個柵格單元能完成識別和檢測落入到該單元的目標。
基於此,作者提出對每一個柵格單元,主要預測以下幾個值:1 預測的B個Box的置信度;
2 每個Box的位置(Box中心座標x,y以及Box的寬和高);
3 在當前柵格單元有物件的條件下,輸入每個類別的概率;作者同時還指出,一個柵格單元只負責檢測一個目標,
並且B個Box只有一個用於預測目標的位置,這句話為我們對Train的Image的類別標記和計算loss值提供了依據。
具體loss計算文章中有非常詳細的介紹,截圖如下:
關於loss中的引數,原文有非常詳細的介紹,在這裡就不一一展開。只列舉出,我在實現的過程中為難的地方:
1 文章中每一個柵格單元會預測2個Box,那麼類別標記的時候這兩個Box怎麼處理的?
我在實現過程中,並沒有找到作者關於這2個Box的說明,更別說其他的細節了。
後來,我想,其實這裡預測幾個Box其實並不重要,作者的目標是一個柵格單元只檢測出一個目標,
理論上一個Box就能達到要求,作者在這裡選擇兩個Box我想主要是由於不同的物體形狀上可能差異比較大,
兩個Box可以分別負責預測兩種形狀的物體(w>h or w<h)。因此,我在處理時,對於根據目標的長、
寬比確定選擇哪一個Box作為作者所說的"responsible"。並沒有計算Box與ground truth的IOU,
並找到最大的那個。(這裡有處理錯誤,還請指出來)
2 作者說每一個柵格單元是否包含object的判斷方法是:檢測目標Box的中心點是否落入到該單元。
由於我的最終目標是要檢測人,人一般會比較大,Box的中心點位置標記為object往往不能覆蓋到人的有用資訊
(如下圖中黃色矩形示意),這會較低召回率。為此,類別標記時,我們將一個object差分為4個object,
具體如圖所示(原來的框+3個新框)。這樣明顯增加了類別的召回率。測試時確實效果好了不少。