論文閱讀筆記(九)YOLOv3: An Incremental Improvement
Abstract
該技術報告主要介紹了作者對 YOLOv1 的一系列改進措施(注意:不是對YOLOv2,但是借鑑了YOLOv2中的部分改進措施)。雖然改進後的網路較YOLOv1大一些,但是檢測結果更精確,執行速度依然很快。在輸入影象解析度為320*320時,YOLOv3執行耗時22ms,mAP達到28.2,這和SSD一樣精確,但是速度比SSD快三倍。當我們使用舊的檢測指標0.5 IOU mAP(IOU閾值取為0.5,然後比較mAP)時,YOLOv3依舊錶現得相當好。在一個 Titan X上,YOLOv3耗時為51ms,AP50為57.9,而RetinaNet耗時198ms,AP50
2. The Deal
報告中對YOLOv1的改進大多數來自於別人的good ideas,同時也有作者自己的貢獻,比如訓練了一個新的比其它分類器效能要好的classifier network。下面就詳細描述各個改進措施:
2.1 Bounding Box Prediction
和YOLOv2一樣,YOLOv3使用dimension clusters(k-means聚類的結果)作為anchor boxes(錨箱)來預測bounding boxes。網路為每個bounding box預測4個座標,即tx
式中,tx,ty是相對於所在cell的offsets,logistic迴歸函式將tx,ty約束在0-1範圍內,這樣保證了每個cell預測到的bounding boxes位於當前cell內。
訓練時使用誤差平方和損失(Sum of squared error loss)。因此,如果ground-truth box(真實的box)對應的預測座標是 t
式中,b*是bounding box對應的ground-truth box的實際座標;t*是根據實際座標推算出來的該bounding box對應的理想輸出
YOLOv3使用logistic regression為每個bounding box預測一個objectness score(用來表示該bounding box包含一個object的可能性)。在訓練時,如果該bounding box對應的prior(即anchor box)與一個ground truth box的IOU高於其它任何bounding box prior,那麼該bounding box的objectness score就被置為1;如果該bounding box對應的prior不是最好的但是又確實與一個ground truth box的IOU高於設定的閾值,那麼該bounding box會被忽略。論文中作者使用的閾值是0.5。另外,YOLOv3在訓練時為每個ground truth object只分配一個bounding box prior(相當於一個bounding box,因為每個cell有k個bounding box prior,每個bounding box prior對應一個bounding box)。如果一個bounding box沒有分配到ground truth object,那麼在計算定位損失和分類損失時它不會被考慮在內,也就是說只有包含ground truth object的bounding box才會參與訓練損失的計算。
2.2 Class Prediction
YOLOv3使用多標籤分類為每個bounding box均預測屬於各個類別的概率,但是作者沒有使用softmax,而是簡單地使用了獨立的 logistic classifier。體現在網路結構上就是將softmax層替換為一個1*1 卷積層 + logistic啟用函式的結構。作者在訓練時也使用binary cross-entropy 來計算分類損失。
作者之所以使用 logistic classifier而不是softmax,主要是因為在某些複雜的訓練資料集或應用場景中,類別標籤labels是有重疊的(比如Woman and Person),而Softmax的使用前提是每個box只屬於一類,這與實際情況往往不符。logistic classifier正好能夠幫助網路適應這種分類,更好地對資料進行建模。
2.3 Predictions Across Scales
通常一幅影象包含各種不同的objects,且有大有小。因此,網路必須具備能夠檢測出不同大小物體的能力。在網路中,網路越深,特徵圖就會越小,所以越往後小的物體越難檢測出來。SSD的做法是:在不同深度的feature map中直接檢測目標。這樣小的物體會在相對較淺的faeture map中被檢測出來,而大的物體會在相對較深的feature map中被檢測出來,從而達到檢測不同scale目標的目的。然而這樣的做法忽視了一個問題,那就是不同深度的feature maps所包含的資訊不是絕對相同的。比如,淺層的feature map主要包含低階的特徵(如物體邊緣、顏色、初級位置資訊等),而隨著網路層加深,feature maps中的高等資訊(如物體的語義資訊:汽車、貓、狗等)逐漸增多。所以在不同深度的feature map中檢測不同尺寸的objects的做法雖然聽起來比較合理,但是實際上可能效果並不好
目前實現多重scale的主流方法主要有以下幾種:
- (a) :先為一幅影象建立影象金字塔,然後將不同級別的金字塔影象輸入到網路當中,用於不同scale物體的檢測。顯而易見,這樣做會導致訓練和測試的速度比較慢
- (b) :檢測只在最後一個feature map上進行,所以該方法無法檢測不同大小的物體
- (c) :在不同深度的feature map上均進行檢測。SSD採用的就是這種方法。另外可以看到,每個feature map獲得的特徵僅來自於之前的層,之後的層的特徵無法獲取並利用
- (d) :FPN(特徵金字塔網路)。與(c)相似,不同的是,當前層的feature map會與更深層的feature maps經過上取樣後連線,這樣當前層的feature map就可以利用深層的特徵,以提高檢測精度
YOLOv3在 3 種不同的尺度上預測 B 個boxes(每個尺度對應 B/3 個boxes)。YOLOv3使用類似於 feature pyramid network(特徵金字塔網路)的方法提取 3 中不同尺度的特徵。從網路中的 base feature extractor(Darknet-53)開始,作者添加了若干層卷積層。其中最後一層卷積層(第一個 scale)輸出一個3-d tensor,這個張量包含了 bounding box coordinates,objectness score 和 class predictions。比如在COCO資料集上,每種scale預測3個boxes,那麼輸出的張量為 N*N*[3*(4+1+80)],包含4個 bounding box offsets,1 個objectness prediction 和 80 個 class predictions
接著對倒數第二層卷積層輸出的 feature map 進行 2x 上取樣(upsample),再將前面卷積層的 feature map 與上取樣後的結果進行拼接(Concatenation)。這樣做能夠從經過上取樣的feature map中獲得更加有意義的語義資訊(semantic information),也能從前面的feature map中獲得更細粒度的資訊(finer-grained information)。之後再新增一些卷積層來處理拼接後的feature map,最終輸出一個類似的 3-d tensor(第二個scale。與之前相比,size擴大兩倍)
再次使用相同的方式可以獲得第三個scale(size 再擴大兩倍)。因此,基於第三個scale的預測得益於網路中所有prior computation和來自於低層的細粒度特徵(fine-grained features)。
在YOLOv3中,作者採用和YOLOv2相同的方法 k-means clustering 來確定bounding box priors(即anchor boxes),之後將確定的 9 個clusters 平均分配給 3 種scales。比如在COCO資料集上得到的 9 個clusters為:(10*13),(16*30),(33*23),(30*61),(62*45),(59*119),(116*90),(156*198),(373*326)。需要注意的是,9個clusters在分配時深層的feature map應該得到最大的3個clusters,淺層的feature map應該得到最小的3個clusters。這是因為深層的feature map是用來檢測大目標的,而淺層的feature map是用來檢測小目標的。
2.4 Feature Extractor
YOLOv3使用一種新的網路作為 base feature extractor 來提取特徵,該網路是基於 YOLOv2使用的 Darknet-19 和流行的殘差網路設計的。作者在網路中除了使用了連續的 3*3 卷積層和 1*1 卷積層,還使用了一些shortcut connections,而且該網路結構顯著變大。因為該網路有53層卷積層,所以被稱為 Darknet-53,其具體結構如Table 1所示:
可以發現,Darknet-53主要由上圖中不同顏色的Residual Blocks構成。同時應該能夠發現,所有Residual Blocks中的kernel size相同,且第一層卷積層的filters數量是第二層的2倍,隨後又是第三層的1倍,依此迴圈若干次。殘差的操作流程如下:
Darknet-53比Darknet-19強大很多,而且仍舊比ResNet-101 或 ResNet-152 高效。Table 2是各分類模型在資料集ImageNet的對比:
從表中可知,Darknet-53的效能可以與最先進的分類器媲美,但是需要更少的浮點運算,速度也更快。此外,Darknet-53每秒的浮點運算次數也是最高的,這說明該網路的結構能夠與GPU更好地統一,使得網路的evaluate更快,更高效。
至此,YOLOv3網路的大致結構已經知曉,如下:
再詳細點的結構圖如下所示:
更詳細的網路結構圖如下:
2.5 Training
YOLOv3 的訓練沒有像R-CNN那樣使用hard negative mining,類似的也沒有,而是依舊直接在整幅image上訓練。此外,訓練過程中還使用了multi-scale training,lots of data augmentation,batch normalization 以及其它所有的標準措施。當然,YOLOv3在訓練和測試時都使用了Darknet neural network framework(Darknet-53)
3. How We Do
在這部分作者將YOLOv3與眾多模型在COCO資料集上的檢測結果進行了比較,如 Table 3 所示,表中AP50即預測時IOU閾值取為0.5,同樣AP75為IOU閾值等於0.75;AP(S,M,L)分別是檢測小、中、大目標時的mean AP:
從表中第三列可知,當從舊的 mAP檢測指標(AP50,即IOU=0.5時的mAP)比較各模型的效能時,YOLOv3表現得很強,它幾乎可以與RetinaNet相媲美,並且超過SSD的variants很多。這說明YOLOv3是一個很強大的detector,擅長為objects生成合適的boxes。但是,當IOU閾值增加時(比如增加到0.75,即AP75),YOLOv3的效能下滑明顯,這說明YOLOv3很難將 boxes 與 object 完美對齊。也就是說,YOLOv3能夠很快地為objects確定大概的boxes,但是精度不是非常高。
從表中第四列可知,通過multi-scale prediction,YOLOv3在檢測小目標時有相當高的 mAPS(尤其與YOLOv2相比),但是在檢測中等目標和大目標時效能相對變差。這與YOLOv1很難檢測小目標但是中大目標檢測效果較好的特性完全相反。作者在報告中提到,出現在這個問題的具體原因還需要進一步的研究。
作者還繪製了各模型在AP50時檢測精度與速度的曲線,如Fig.3所示。從圖中可知,在預測時IOU閾值選擇為0.5的話,YOLOv3擁有比其它檢測系統顯著的優勢,也就是說,此時YOLOv3比其它模型又快又準。
4. Things We Tried That Didn’t Work
這部分記錄了一些作者在改進YOLOv1時嘗試了但是沒有起作用的措施:
- Anchor box x, y offset predictions
作者嘗試使用Faster RCNN中提到的 normal anchor box prediction mechanism來對bounding boxes中心相對影象的offsets進行預測,但是發現正如YOLO9000中說的那樣,這樣做會降低模型的穩定性,效果並不好。 - Linear x, y predictions instead of logistic
作者嘗試使用線性啟用函式代替logistic activation來直接預測x,y偏置,即將下列公式中的sigmiod函式更換為線性函式,但是作者發現這樣做會導致mAP下降幾個百分點。 - Focal loss
作者也嘗試了使用 focal loss,但是結果造成mAP下降大約兩個百分點。對於原因作者也不確定。 - Dual IOU thresholds and truth assignment
Faster RCNN在訓練時使用了兩個IOU 閾值。如果一個預測得的box與ground truth的IOU高於0.7,那麼就會被視為 a positive example;如果在0.3-0.7之間就會被忽略;如果與任何ground truth的IOU均低於0.3就會被視為 a negative example。作者嘗試了一個類似的方案,但是沒有得到較好的結果
儘管上述策略沒有起作用,但是不排除還有一些技術能夠繼續改進YOLOv3只是作者沒有發現,也不排除作者沒有正確使用以上策略的可能。
5. What This All Means
作者在這部分以及報告後面的部分著重於對COCO metric側重強調邊框定位準確性的批評,因為他認為定位精度足夠即可,沒有太大必要追求過高的定位精度
YOLOv3是一個 good detector,不僅快,還很準確。可是YOLOv3在COCO資料集上測試時,IOU metric取為0.5-0.95的話,mAP並不太好。相反,當使用 old detection metric(IOU=0.5)時,YOLOv3的表現非常好。既然如此,那有必要更換 metrics 嗎?
事實上,人類很難區分0.3-0.5之間的IoU值,也就是說最終預測到的邊框位置與ground truth box的IoU在0.3-0.5時,人類在感覺上沒有明顯的區別。所以在測試時,雖然沒有ground truth box進行比較,但是隻要有一定的精度保證,即使定位邊框的精度不太高也沒有多少影響
6. YOLOv3-tiny
具體結構如下:
參考資料
- 近距離觀察YOLOv3
- Focal Loss論文閱讀筆記
- yolov3
- 實現程式碼 github
- 探索 YOLO v3 實現細節(共六篇)
- TensorFlow + Keras 實戰 YOLO v3 目標檢測圖文並茂教程
- YOLOv3: 訓練自己的資料
- yolov3-tiny調參記錄之learning rate相關引數