非極大值抑制
那麼可以採用NMS演算法來實現這樣的效果:首先從所有的檢測框中找到置信度最大的那個框,然後挨個計算其與剩餘框的IOU,如果其值大於一定閾值(重合度過高),那麼就將該框剔除;然後對剩餘的檢測框重複上述過程,直到處理完所有的檢測框。Yolo預測過程也需要用到NMS演算法。
yolov1
演算法首先把輸入影像劃分成S*S的格子,然後對每個格子都預測B個bounding boxes,每個bounding box都包含5個預測值:x,y,w,h和confidence。
如果一個物體的中心點落入一個格子,那麼這個格子負責預測這個物體。
每個bounding box的confidence和每個類別的score相乘,得到每個bounding box屬於哪一類的confidence score。
將原始圖片分割成互不重合的小方塊,然後透過卷積最後生產這樣大小的特徵圖,可以認為特徵圖的每個元素也是對應原始圖片的一個小方塊,然後用每個元素來可以預測那些中心點在該小方格內的目標。
Yolo演算法採用一個單獨的CNN模型實現end-to-end的目標檢測,首先將輸入圖片resize到448x448,然後送入CNN網路,最後處理網路預測結果得到檢測的目標。
結構:
Yolo演算法將目標檢測看成迴歸問題,所以採用的是均方差損失函式。但是對不同的部分採用了不同的權重值。首先區分定位誤差和分類誤差。對於定位誤差,即邊界框座標預測誤差,採用較大的權重。
對於Yolo演算法先使用NMS,然後再確定各個box的類別。其基本過程如圖12所示。對於98個boxes,首先將小於置信度閾值的值歸0,然後分類別地對置信度值採用NMS,這裡NMS處理結果不是剔除,而是將其置信度值歸為0。最後才是確定各個box的類別,當其置信度值不為0時才做出檢測結果輸出。
** 那麼我們有每個object的標註資訊,也就是知道每個object的中心點座標在輸入影像的哪個位置,那麼不就相當於知道了每個object的中心點座標屬於哪個grid cell了嗎,而只要object的中心點座標落在哪個grid cell中,這個object就由哪個grid cell負責預測,也就是該grid cell包含這個object。另外由於一個grid cell會預測兩個bounding box,實際上只有一個bounding box是用來預測屬於該grid cell的object的,因為這兩個bounding box到底哪個來預測呢?答案是:和該object的ground truth的IOU值最大的bounding box。**
yolov2
YOLOv1最後採用的是全連線層直接對邊界框進行預測,其中邊界框的寬與高是相對整張圖片大小的,因為需要檢測物體大小不同,YOLOv1在訓練過程中學習適應不同物體的形狀是比較困難的。yolov2移除了全連線層而採用了卷積和anchor boxes來預測邊界框
對於YOLOv1,每個cell都預測2個boxes,每個boxes包含5個值:前4個值是邊界框位置與大小,最後一個值是置信度(confidence scores,包含兩部分:含有物體的機率以及預測框與ground truth的IOU)。但是每個cell只預測一套分類機率值(class predictions,其實是置信度下的條件機率值),供2個boxes共享。YOLOv2使用了anchor boxes之後,每個位置的各個anchor box都單獨預測一套分類機率值,這和SSD比較類似(但SSD沒有預測置信度,而是把background作為一個類別來處理)。