目標(biāo)檢測算法YOLO-V3結(jié)構(gòu)詳解
?上期我們一起學(xué)了
?YOLO-V2的算法結(jié)構(gòu)以及跟YOLO-V1比起來有哪些優(yōu)缺點(diǎn),如下:
目標(biāo)檢測算法YOLO-V2詳解
今天我們看下在YOLO-V2版本上改進(jìn)的YOLO-V3算法,到底做了哪些優(yōu)化?
今天我們主要從以下幾個(gè)方面來學(xué)習(xí)YOLO-V3對YOLO-V2做了哪些改進(jìn)。
Darknet-53結(jié)構(gòu)YOLO-V3結(jié)構(gòu)先驗(yàn)框設(shè)置 損失函數(shù) 模型性能
YOLO-V3模型框架
YOLO-V3模型框架,我們主要從它的基礎(chǔ)網(wǎng)絡(luò)Darknet-53以及YOLO-V3的結(jié)構(gòu)方面學(xué)習(xí),首先看下Darknet-53結(jié)構(gòu)。
Darknet-53結(jié)構(gòu)
Darknet-53是專門為YOLO-V3設(shè)計(jì)的一個(gè)深度學(xué)習(xí)框架,有著非常好的圖像識別的效果,如下圖:

整個(gè)網(wǎng)絡(luò)主要包括5組殘差塊,如下:
以 256x256輸入為例,首先經(jīng)過一個(gè)3x3x32的卷積層輸出為256x256x32;接著經(jīng)過一個(gè) 3x3x64 stride=2的卷積層輸出為128x128x64;接著經(jīng)過一個(gè)殘差塊(前面學(xué)習(xí)殘差網(wǎng)絡(luò)的時(shí)候?qū)W過),輸出為 128x128x64;再經(jīng)過一個(gè) 3x3x128 stride=2的卷積層輸出為64x64x128;經(jīng)過 2個(gè)殘差塊后輸出為64x64x128;接著經(jīng)過一個(gè) 3x3x256 stride=2的卷積層輸出為32x32x256;接著經(jīng)過 8個(gè)殘差塊,輸出為32x32x256;再經(jīng)過一個(gè) 3x3x512 stride=2的卷積層輸出為16x16x512;接著經(jīng)過 8個(gè)殘差塊后輸出為16x16x512;接著經(jīng)過一個(gè) 3x3x1024 stride=2的卷積層輸出為8x8x1024;接著經(jīng)過 4個(gè)殘差塊后輸出為8x8x1024;最后經(jīng)過池化全連接層以及 softmax輸出.
這就是Darknet-53網(wǎng)絡(luò)的具體框架,接下來我們看下YOLO-V3算法是怎么嫁接上去的。
YOLO-V3結(jié)構(gòu)
YOLO-V3借鑒了前面學(xué)的SSD算法的思想,采用從不同尺度特征圖上下手的檢測方式,如下:

我們看下這個(gè)殘差塊,如上圖右上小塊,簡單的說就是一組特征圖與它經(jīng)過兩個(gè)卷積層后的特征圖相加。
YOLO-V3分別從Darknet-53框架的第7步,第9步和第11步的特征圖下手進(jìn)行多尺度檢測。首先,一起從Darknet-53最后輸出的8x8x1024的特征圖看如何檢測的。這里將8x8x1024的特征圖經(jīng)過5個(gè)卷積層進(jìn)行二次提取特征后拿去檢測目標(biāo)。而后再將提取后的特征圖上采樣與第9步的特征圖合并經(jīng)過5個(gè)卷積層進(jìn)行二次提取特征后拿去檢測目標(biāo)。再將第9步的二次提取特征圖上采樣與第7步的特征圖合并進(jìn)行二次特征提取檢測目標(biāo)。
YOLO-V3一般使用416x416大小的圖片作為輸入,根據(jù)上面結(jié)構(gòu)圖,最后得到的特征圖為13x13,Scale2的特征圖為26x26,Scale3的特征圖為52x52.YOLO-V3使用的是COCO數(shù)據(jù)集訓(xùn)練,COCO數(shù)據(jù)集目標(biāo)檢測有80個(gè)類別,而YOLO-V3中每個(gè)cell有3個(gè)box,每個(gè)box還有(x,y,w,h,confidence)五個(gè)基本參數(shù),也就是說一個(gè)cell對應(yīng)的輸出維度為3x(5+80)=255(這里不明白為什么這樣計(jì)算的請參考YOLO-V2算法).
所以YOLO-V3有3個(gè)不同特征尺度的輸出,分別為13x13x255,26x26x255和52x52x255的檢測結(jié)果。對于416x416的輸入圖片,YOLO-V2中的bounding boxes有13x13x5=845個(gè),而YOLO-V3則有(13x13+26x26+52x52)x3=10467個(gè).
模型的訓(xùn)練及性能
明白了YOLO-V3算法的結(jié)構(gòu),我們一起看下訓(xùn)練方面的東西,首先先驗(yàn)框該怎么設(shè)?
先驗(yàn)框設(shè)置
前面學(xué)的YOLO-V2算法已經(jīng)開始采用K-means聚類得到先驗(yàn)框的尺寸,YOLO-V3延續(xù)了這種方法,為每種下采樣尺度設(shè)定3中先驗(yàn)框,總共聚類出9中尺寸的先驗(yàn)框。在COCO數(shù)據(jù)集上,這9個(gè)先驗(yàn)框是(10x13),(16x30),(33x23),(30x61),(62x45),(59x119),(116x90),(156x198),(373x326).
分配上,在最小的13x13特征圖上(有最大的感受野)應(yīng)用較大的先驗(yàn)框(116x90),(156x198),(373x326)適合檢測較大的對象。
中等的26x26特征圖上(中等感受野)應(yīng)用中等大小的先驗(yàn)框(30x61),(62x45),(59x119),適合檢測中等大小的對象。
較大的52x52特征圖上(較小的感受野)應(yīng)用較小的先驗(yàn)框(10x13),(16x30),(33x23),適合檢測較小的對象。如下表:
損失函數(shù)
YOLO-V3對類別預(yù)測的代價(jià)函數(shù)進(jìn)行了修改,并且沒有用softmax。那為什么沒有用softmax呢?在原來的分類網(wǎng)絡(luò)中softmax層都是假設(shè)一張圖片或者一個(gè)object只屬于一個(gè)類別,但是在一些復(fù)雜場景下,一個(gè)object可能屬于多個(gè)類,比如,我們的類別中有woman和person這兩類,那么如果一張圖像中有一個(gè)woman,那么我們檢測的結(jié)果中類別標(biāo)簽就要同時(shí)有woman和person這兩類,這就是多標(biāo)簽分類。也就是一個(gè)object屬于多個(gè)類別。
所以在YOLO-V3中,用了邏輯回歸層來對每個(gè)類別做二分類。邏輯回歸層主要用到sigmoid函數(shù),該函數(shù)可以將輸入約束在0~1的范圍內(nèi),因此當(dāng)一張圖像經(jīng)過特征提取后的某一類輸出經(jīng)過sigmoid函數(shù)約束后如果大于0.5,就表示屬于該類,這樣一個(gè)框就可以預(yù)測多個(gè)類別,代價(jià)函數(shù)用的是sigmoid的交叉熵。
模型性能
YOLO-V3在速度和準(zhǔn)確率上都是很不錯(cuò)的,從下圖中,我們可以看到在跟其他算法進(jìn)行對比的圖中,YOLO-V3在inference time上處于領(lǐng)先地位,其中YOLOV3-320由于輸入圖片為320x320,所以inference time最小為22ms,而YOLOV3-608由于輸入圖片較大,inference time為51ms,也是領(lǐng)先于其他算法的。雖然mAP最高的算法為FPN-FRCN,但是運(yùn)行時(shí)間卻要172ms。而YOLOV3-608的mAP也達(dá)到了57.9。

從下面各算法在COCO數(shù)據(jù)集上的性能圖中,我們也可以清楚的看到YOLO-V3算法的強(qiáng)大性能。

好了,至此,我們今天從Darknet-53結(jié)構(gòu),YOLO-V3結(jié)構(gòu),先驗(yàn)框設(shè)置,損失函數(shù),模型性能的角度對YOLO-V3做了詳細(xì)的介紹,以及跟YOLO-V2對比做了哪些改進(jìn),希望對大家有些幫助。下期,我們將一起學(xué)習(xí)目標(biāo)檢測算法YOLO-V4。
