YOLOv3沒有太多的創新,主要是借鑒一些好的方案融合到YOLO里面。不過效果還是不錯的,在保持速度優勢的前提下,提升了預測精度,尤其是加強了對小物體的識別能力。
YOLO3主要的改進有:
- 調整了網絡結構;
- 利用多尺度特征進行對象檢測;
- 對象分類用Logistic取代了softmax。
一、Backbone: darknet-53
為了達到更好的分類效果,作者自己設計訓練了darknet-53。作者在ImageNet上實驗發現這個darknet-53,的確很強,相對于ResNet-152和ResNet-101,darknet-53不僅在分類精度上差不多,計算速度還比ResNet-152和ResNet-101強多了,網絡層數也比他們少。比較結果如下表所示,
darknet-53的網絡結構如下圖所示,YOLOv3使用了darknet-53的前52層卷積結構,去掉了全連接層,因此YOLOv3是個全卷積網絡。
darknet-53網絡的特點:
- 使用了大量殘差的跳層連接,即表中的Residual塊;
- darknet-53為了降低池化帶來的梯度負面效果,作者直接摒棄了Pooling,作者使用步長為2的卷積來進行下采樣,即上圖中紅色橢圓的5次下采樣操作。
二、利用多尺度特征進行對象檢測
YOLOv3采用了類似FPN的思想,在多個不同尺度上進行對象檢測。
YOLO2曾采用passthrough結構來檢測細粒度特征,在YOLO3更進一步采用了3個不同尺度的特征圖來進行對象檢測。
結合上圖看,卷積網絡在79層后,經過下方幾個黃色的卷積層得到一種尺度的檢測結果。相比輸入圖像,這里用于檢測的特征圖有32倍的下采樣。比如輸入是416 * 416的話,這里的特征圖就是13 * 13了。由于下采樣倍數高,這里特征圖的感受野比較大,因此適合檢測圖像中尺寸比較大的對象。
為了實現細粒度的檢測,第79層的特征圖又開始作上采樣(從79層往右開始上采樣卷積),然后與第61層特征圖融合(Concatenation),這樣得到第91層較細粒度的特征圖,同樣經過幾個卷積層后得到相對輸入圖像16倍下采樣的特征圖。它具有中等尺度的感受野,適合檢測中等尺度的對象。
最后,第91層特征圖再次上采樣,并與第36層特征圖融合(Concatenation),最后得到相對輸入圖像8倍下采樣的特征圖。它的感受野最小,適合檢測小尺寸的對象。
9種尺度的先驗框
隨著輸出的特征圖的數量和尺度的變化,先驗框的尺寸也需要相應的調整。YOLO2已經開始采用K-means聚類得到先驗框的尺寸,YOLO3延續了這種方法,為每種下采樣尺度設定3種先驗框,總共聚類出9種尺寸的先驗框。
在COCO數據集這9個先驗框是:(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326)。
- 最小的13 * 13特征圖上(有最大的感受野)應用較大的先驗框(116x90),(156x198),(373x326),適合檢測較大的對象;
- 中等的26 * 26特征圖上(中等感受野)應用中等的先驗框(30x61),(62x45),(59x119),適合檢測中等大小的對象;
- 較大的52 * 52特征圖上(較小的感受野)應用較小的先驗框(10x13),(16x30),(33x23),適合檢測較小的對象。
感受一下9種先驗框的尺寸,下圖中藍色框為聚類得到的先驗框。黃色框式ground truth,紅框是對象中心點所在的網格。
這里注意bounding box 與anchor box的區別:
Bounding box它輸出的是框的位置(中心坐標與寬高),confidence以及N個類別。
anchor box只是一個尺度即只有寬高。
輸入映射到輸出
不考慮神經網絡結構細節的話,總的來說,對于一個輸入圖像,YOLO3將其映射到3個尺度的輸出張量,代表圖像各個位置存在各種對象的概率。
我們看一下YOLO3共進行了多少個預測。對于一個416 * 416的輸入圖像,在每個尺度的特征圖的每個網格設置3個先驗框,總共有 13 * 13 * 3 + 26 * 26 * 3 + 52 * 52 * 3 = 10647 個預測。每一個預測是一個(4+1+80)=85維向量,這個85維向量包含邊框坐標(4個數值),邊框置信度(1個數值),對象類別的概率(對于COCO數據集,有80種對象)。
對比一下,YOLO2采用13 * 13 * 5 = 845個預測,YOLO3的嘗試預測邊框數量增加了10多倍,而且是在不同分辨率上進行,所以mAP以及對小物體的檢測效果有一定的提升。
三、對象分類softmax改成logistic
預測對象類別時不使用softmax,改成使用logistic的輸出進行預測。這樣能夠支持多標簽對象(比如一個人有Woman 和 Person兩個標簽)。
四、YOLOv3的整體網絡結構
這張圖很好的總結了YOLOV3的結構,讓我們對YOLO有更加直觀的理解。
- 橙色塊DBL:是指代碼中的卷積+BN+Leaky relu;
- 綠色的resn:n代表數字,有res1,res2, … ,res8等等,表示這個res_block里含有多少個res_unit;
-
紅色的res unit:表示YOLOv3中的殘差結構;其中的前一個DBL是1x1卷積,后一個DBL是3x3卷積;
- 黃色梯形concat:張量拼接。將darknet中間層和后面的某一層的上采樣進行拼接。拼接的操作和殘差層add的操作是不一樣的,拼接會擴充張量的維度,而add只是直接相加不會導致張量維度的改變。