1. 程式人生 > >目標檢測:YOLOV3論文解讀

目標檢測:YOLOV3論文解讀

一、yolov3論文解讀

1. yolov3實現的idea

1.1 邊界框的預測(Bounding Box Prediction)

與之前yolo版本一樣,yolov3的anchor boxes也是通過聚類的方法得到的。yolov3對每個bounding box預測四個座標值(tx, ty, tw, th),對於預測的cell(一幅圖劃分成S×S個網格cell)根據影象左上角的偏移(cx, cy),以及之前得到bounding box的寬和高pw, ph可以對bounding box按如下的方式進行預測:


在訓練這幾個座標值的時候採用了sum of squared error loss(平方和距離誤差損失),因為這種方式的誤差可以很快的計算出來。

yolov3對每個bounding box通過邏輯迴歸預測一個物體的得分,如果預測的這個bounding box與真實的邊框值大部分重合且比其他所有預測的要好,那麼這個值就為1.如果overlap沒有達到一個閾值(yolov3中這裡設定的閾值是0.5),那麼這個預測的bounding box將會被忽略,也就是會顯示成沒有損失值。


說一下我在應用中的事:yolov3它的訓練輪數是50200,我的資料量比較小,因此迭代到900輪的時候,每一輪訓練完顯示的損失值都是nan,其原因可能就是上邊因為閾值他直接忽略掉了這個bounding box導致沒有loss,之前的版本我使用時貌似不是這樣的。

1.2 分類(Class Prediction)

每個框預測分類,bounding box使用多標籤分類(multi-label classification)。論文中說沒有使用softmax分類,只是使用了簡單的邏輯迴歸進行分類,採用的二值交叉熵損失(binary cross-entropy loss)。

1.3 跨尺度的預測(Predictions Across Scales)

yolov3在三個(num=3)不同的尺度預測boxes,yolov3使用的特徵提取模型通過FPN(feature pyramid network)網路上進行改變,最後預測得到一個3-d tensor,包含bounding box資訊,物件資訊以及多少個類的預測資訊。論文給出是這樣子的:(N×N×[3*(4+1+80)])這裡的80即是80類物體。

FPN接面構如下:


yolov3使用這樣的方式使得模型可以獲取到更多的語義資訊,模型得到了更好的表現。

yolov3依然使用k-Means聚類來得到bounding box的先驗,選擇9個簇以及3個尺度,然後將這9個簇均勻的分佈在這幾個尺度上。

1.4 特徵提取(Feature Extractor)

yolov3的特徵提取模型是一個雜交的模型,它使用了yolov2,Darknet-19以及Resnet,這個模型使用了很多有良好表現的3*3和1*1的卷積層,也在後邊增加了一些shortcut connection結構。最終他有53個卷積層,因此作者也把它們叫成Darknet-53。它們的結構是這樣的:


最後論文說明這個模型的優良之後還說了一句,Resnet模型後邊有太多層並且不是很有效。抱歉,我可是KaiMing的迷弟,哈哈,說的委婉一點多好。

1.5 訓練

最後論文說它們訓練的時候使用了很多方法,諸如資料增強,BN等等,具體怎麼訓練的給出了一個引用,在論文的【12】可以找到。

2. yolov3做了些什麼?

就說yolov2有個毛病就是對小物體的檢測不敏感,關鍵在於它那個cell預測時導致的毛病,而如今增加了多尺度預測之後yolov3在對小物體檢測方便有了好轉,但是現在的毛病是對中、大size的物體表現的不是那麼好,這還得需要我們去努力做。然而在論文中yolov3各種表示的還行。

3. yolov3那些嘗試過並沒有提升表現的想法

① 想對Anchor box的x,y偏移使用線性啟用方式做一個對box寬高倍數的預測,結果發現沒有好的表現並且是模型不穩定。

②對anchor box的x, y使用線性的預測,而不是使用邏輯迴歸,實驗結果發現這樣做使他們模型的mAP掉了。

③使用Focal loss,測試結果還是掉mAP。(想法的確挺好的)

4. yolov3測試表現的一些截圖





二、yolov3應用到自己的專案中

訓練自己資料之後檢測的結果:


如何使用yolov3訓練自己的資料,如何做出修改,這裡我給出一個教程文件,這個文件一步步的指示如何去製作一個VOC格式的資料集去跑yolov,需要注意的是yolov3模型結構有所改變,這個文件在資料集的製作上沒問題,但是在說如何訓練yolo?它給出的是訓練yolov2的教程,但是大差不差,可以通過上面論文解讀自己修改yolov3裡邊的引數去訓練自己的資料,就當做是一個練習吧!