Ⅰ YOLOv3詳解
YOLO是「You Only Look Once」的簡稱,它雖然不是最精確的演算法,但在精確度和速度之間選擇的折中,效果也是相當不錯。YOLOv3借鑒了YOLOv1和YOLOv2,雖然沒有太多的創新點,但在保持YOLO家族速度的優勢的同時,提升了檢測精度,尤其對於小物體的檢測能力。YOLOv3演算法使用一個單獨神經網路作用在圖像上,將圖像劃分多個區域並且預測邊界框和每個區域的概率。
YOLOv3僅使用卷積層,使其成為一個全卷積網唯做絡(指旦衡FCN)。文章中,作者提出一個新的特徵提取網路,Darknet-53。正如其名,它包含53個卷積層,每個後面跟隨著batch normalization層和leaky ReLU層。沒有池化層,使用步幅為2的卷積層替代池化層進行特徵圖的降采樣過程,這樣可以有效阻止由於池化層導致的低層級特徵的損失。Darknet-53網路如下圖左邊所示。
輸入是 。輸出是帶有識別類的邊界框列表,每個邊界框由 六個參數表示。如果 表示80個類別,那麼每個邊界框由85個數字表示。
在YOLO中,預測過程使用一個 卷積,所以輸入是一個特徵圖。由於使用 卷積,因此預測圖正好是特徵圖大小( 卷積只是用於改變通道數)。在YOLOv3中,此預測圖是每個cell預測固定數量的邊界框。
如上圖所示,預測圖的深度為75,假設預測圖深度為 , 表示每個cell可以預測的邊界框數量。這些 個邊界框可以指定檢測到一個物體。每個邊界框有 個特徵,分別描述中心點坐標和寬高(四個)和物體分數(一個)以及 個類置信度(上圖中 )。YOLOv3每個cell預測三個邊界框。
如果對象的中心(GT框中心)落在該cell感受野范圍內,我們希望預測圖的每個單元格都能通過其中一個邊界框預測對象。其中只遲雀有一個邊界框負責檢測物體,首先我們需要確定此邊界框屬於哪個cell。
為了實現上面的想法,我們將原始圖像分割為最後預測圖維度大小的網格。如下圖所示,輸入圖像維度為 ,步幅為32(最後的預測圖降采樣32倍),最後預測圖維度為 ,所以我們將原始圖像劃分為 的網格。
直接預測框的寬高會導致訓練時不穩定的梯度問題,因此,現在的很多目標檢測方法使用log空間轉換或者簡單的偏移(offset)到稱為錨框的預定義默認邊界框。然後將這些變換應用到錨框以獲得預測,YOLOv3具有三個錨框,可以預測每個單元格三個邊界框。
錨框是邊界框的先驗,是使用k均值聚類在COCO數據集上計算的。我們將預測框的寬度和高度,以表示距聚類質心的偏移量。
以下公式描述了如何轉換網路輸出以獲得邊界框預測:
這里 分別是我們預測的中心坐標、寬度和高度。 是網路的輸出。 是網格從頂左部的坐標。 是錨框的維度(見下圖)。
通過sigmoid函數進行中心坐標預測,強制將值限制在0和1之間。YOLO不是預測邊界框中心的絕對坐標,它預測的是偏移量:相對於預測對象的網格單元的左上角;通過特徵圖cell歸一化維度。
例如,考慮上面狗的圖像。如果預測中心坐標是 ,意味著中心在 (因為紅色框左上角坐標是 )。但是如果預測的坐標大於1,例如 ,意味著中心在 ,現在中心在紅色框右邊,但是我們只能使用紅色框對對象預測負責,所以我們添加一個sidmoid函數強制限制在0和1之間。
通過對輸出應用對數空間轉換,然後與錨框相乘,可以預測邊界框的尺寸(如上面的計算公式)。
物體分數表示一個邊界框包含一個物體的概率,對於紅色框和其周圍的框幾乎都為1,但邊角的框可能幾乎都為0。物體分數也通過一個sigmoid函數,表示概率值。
類置信度表示檢測到的物體屬於一個具體類的概率值,以前的YOLO版本使用softmax將類分數轉化為類概率。在YOLOv3中作者決定使用sigmoid函數取代,原因是softmax假設類之間都是互斥的,例如屬於「Person」就不能表示屬於「Woman」,然而很多情況是這個物體既是「Person」也是「Woman」。
為了識別更多的物體,尤其小物體,YOLOv3使用三個不同尺度進行預測(不僅僅只使用 )。三個不同尺度步幅分別是32、16和8。這意味著,輸入 圖像,檢測尺度分別為 、 和 (如下圖或者更詳細如圖2所示)。
YOLOv3為每種下采樣尺度設定3個先驗框,總共聚類9個不同尺寸先驗框。在COCO數據集上9個先驗框分別是: 。下表是9個先驗框分配情況:
我們的網路生成10647個錨框,而圖像中只有一個狗,怎麼將10647個框減少為1個呢?首先,我們通過物體分數過濾一些錨框,例如低於閾值(假設0.5)的錨框直接捨去;然後,使用NMS(非極大值抑制)解決多個錨框檢測一個物體的問題(例如紅色框的3個錨框檢測一個框或者連續的cell檢測相同的物體,產生冗餘),NMS用於去除多個檢測框。
具體使用以下步驟:拋棄分數低的框(意味著框對於檢測一個類信心不大);當多個框重合度高且都檢測同一個物體時只選擇一個框(NMS)。
為了更方便理解,我們選用上面的汽車圖像。首先,我們使用閾值進行過濾一部分錨框。模型有 個數,每個盒子由85個數字描述。將 分割為下面的形狀:box_confidence: 表示 個cell,每個cell5個框,每個框有物體的置信度概率;boxes: 表示每個cell5個框,每個框的表示;box_class_probs: 表示每個cell5個框,每個框80個類檢測概率。
即使通過類分數閾值過濾一部分錨框,還剩下很多重合的框。第二個過程叫NMS,裡面有個IoU,如下圖所示。
下圖給出更加詳細的輸入輸出情況:
文章原文: https://medium.com/analytics-vidhya/yolo-v3-theory-explained-33100f6d193
論文原文: https://pjreddie.com/media/files/papers/YOLOv3.pdf
YOLOv3深入理解: https://www.jianshu.com/p/d13ae1055302
keras實現YOLOv3博客: https://blog.csdn.net/weixin_44791964/article/details/103276106
What new in YOLOv3?: https://towardsdatascience.com/yolo-v3-object-detection-53fb7d3bfe6b