本文逐步介紹YOLO v1~v3的設(shè)計(jì)歷程。 YOLOv1基本思想YOLO將輸入圖像分成SxS個(gè)格子,,若某個(gè)物體 Ground truth 的中心位置的坐標(biāo)落入到某個(gè)格子,那么這個(gè)格子就負(fù)責(zé)檢測(cè)出這個(gè)物體,。 每個(gè)格子預(yù)測(cè)B個(gè)bounding box及其置信度(confidence score),以及C個(gè)類別概率,。bbox信息(x,y,w,h)為物體的中心位置相對(duì)格子位置的偏移及寬度和高度,均被歸一化.置信度反映是否包含物體以及包含物體情況下位置的準(zhǔn)確性,定義為Pr(Object)×IOUtruthpred,其中Pr(Object)∈{0,1}. 網(wǎng)絡(luò)結(jié)構(gòu)YOLOv1網(wǎng)絡(luò)借鑒了GoogLeNet分類網(wǎng)絡(luò)結(jié)構(gòu),。不同的是,YOLO未使用inception module,,而是使用1x1卷積層(此處1x1卷積層的存在是為了跨通道信息整合)+3x3卷積層簡(jiǎn)單替代,。 缺餡:
損失函數(shù)YOLO全部使用了均方和誤差作為loss函數(shù).由三部分組成:坐標(biāo)誤差,、IOU誤差和分類誤差,。 簡(jiǎn)單相加時(shí)還要考慮每種loss的貢獻(xiàn)率,YOLO給coordErr設(shè)置權(quán)重λcoord=5.在計(jì)算IOU誤差時(shí),,包含物體的格子與不包含物體的格子,,二者的IOU誤差對(duì)網(wǎng)絡(luò)loss的貢獻(xiàn)值是不同的。若采用相同的權(quán)值,,那么不包含物體的格子的confidence值近似為0,,變相放大了包含物體的格子的confidence誤差在計(jì)算網(wǎng)絡(luò)參數(shù)梯度時(shí)的影響。為解決這個(gè)問(wèn)題,,YOLO 使用λnoobj=0.5修正iouErr,。(此處的‘包含’是指存在一個(gè)物體,它的中心坐標(biāo)落入到格子內(nèi)),。對(duì)于相等的誤差值,,大物體誤差對(duì)檢測(cè)的影響應(yīng)小于小物體誤差對(duì)檢測(cè)的影響。這是因?yàn)?,相同的位置偏差占大物體的比例遠(yuǎn)小于同等偏差占小物體的比例,。YOLO將物體大小的信息項(xiàng)(w和h)進(jìn)行求平方根來(lái)改進(jìn)這個(gè)問(wèn)題,但并不能完全解決這個(gè)問(wèn)題。
綜上,,YOLO在訓(xùn)練過(guò)程中Loss計(jì)算如下式所示: 其中有寶蓋帽子符號(hào)(?x,?y,?w,?h,?C,?p)為預(yù)測(cè)值,無(wú)帽子的為訓(xùn)練標(biāo)記值,。1objij表示物體落入格子i的第j個(gè)bbox內(nèi).如果某個(gè)單元格中沒(méi)有目標(biāo),則不對(duì)分類誤差進(jìn)行反向傳播;B個(gè)bbox中與GT具有最高IoU的一個(gè)進(jìn)行坐標(biāo)誤差的反向傳播,其余不進(jìn)行. 訓(xùn)練過(guò)程1)預(yù)訓(xùn)練。使用 ImageNet 1000 類數(shù)據(jù)訓(xùn)練YOLO網(wǎng)絡(luò)的前20個(gè)卷積層+1個(gè)average池化層+1個(gè)全連接層,。訓(xùn)練圖像分辨率resize到224x224,。 2)用步驟1)得到的前20個(gè)卷積層網(wǎng)絡(luò)參數(shù)來(lái)初始化YOLO模型前20個(gè)卷積層的網(wǎng)絡(luò)參數(shù),然后用 VOC 20 類標(biāo)注數(shù)據(jù)進(jìn)行YOLO模型訓(xùn)練,。檢測(cè)通常需要有細(xì)密紋理的視覺(jué)信息,所以為提高圖像精度,,在訓(xùn)練檢測(cè)模型時(shí),將輸入圖像分辨率從224 × 224 resize到448x448,。 訓(xùn)練時(shí)B個(gè)bbox的ground truth設(shè)置成一樣的. 升級(jí)版 YOLO v2為提高物體定位精準(zhǔn)性和召回率,,YOLO作者提出了 《YOLO9000: Better, Faster, Stronger》 (Joseph Redmon, Ali Farhadi, CVPR 2017, Best Paper Honorable Mention),相比v1提高了訓(xùn)練圖像的分辨率,;引入了faster rcnn中anchor box的思想,,對(duì)網(wǎng)絡(luò)結(jié)構(gòu)的設(shè)計(jì)進(jìn)行了改進(jìn),輸出層使用卷積層替代YOLO的全連接層,,聯(lián)合使用coco物體檢測(cè)標(biāo)注數(shù)據(jù)和imagenet物體分類標(biāo)注數(shù)據(jù)訓(xùn)練物體檢測(cè)模型,。相比YOLO,YOLO9000在識(shí)別種類,、精度、速度,、和定位準(zhǔn)確性等方面都有大大提升,。 YOLOv2 改進(jìn)之處YOLO與Fast R-CNN相比有較大的定位誤差,與基于region proposal的方法相比具有較低的召回率,。因此YOLO v2主要改進(jìn)是提高召回率和定位能力,。下面是改進(jìn)之處: Batch Normalization: v1中也大量用了Batch Normalization,同時(shí)在定位層后邊用了dropout,,v2中取消了dropout,,在卷積層全部使用Batch Normalization。 高分辨率分類器:v1中使用224 × 224訓(xùn)練分類器網(wǎng)絡(luò),,擴(kuò)大到448用于檢測(cè)網(wǎng)絡(luò),。v2將ImageNet以448×448 的分辨率微調(diào)最初的分類網(wǎng)絡(luò),迭代10 epochs,。 Anchor Boxes:v1中直接在卷積層之后使用全連接層預(yù)測(cè)bbox的坐標(biāo),。v2借鑒Faster R-CNN的思想預(yù)測(cè)bbox的偏移.移除了全連接層,并且刪掉了一個(gè)pooling層使特征的分辨率更大一些.另外調(diào)整了網(wǎng)絡(luò)的輸入(448->416)以使得位置坐標(biāo)是奇數(shù)只有一個(gè)中心點(diǎn)(yolo使用pooling來(lái)下采樣,有5個(gè)size=2,stride=2的max pooling,而卷積層沒(méi)有降低大小,因此最后的特征是416/(2^5)=13).v1中每張圖片預(yù)測(cè)7x7x2=98個(gè)box,而v2加上Anchor Boxes能預(yù)測(cè)超過(guò)1000個(gè).檢測(cè)結(jié)果從69.5mAP,81% recall變?yōu)?9.2 mAP,88% recall. YOLO v2對(duì)Faster R-CNN的手選先驗(yàn)框方法做了改進(jìn),采樣k-means在訓(xùn)練集bbox上進(jìn)行聚類產(chǎn)生合適的先驗(yàn)框.由于使用歐氏距離會(huì)使較大的bbox比小的bbox產(chǎn)生更大的誤差,而IOU與bbox尺寸無(wú)關(guān),因此使用IOU參與距離計(jì)算,使得通過(guò)這些anchor boxes獲得好的IOU分值,。距離公式: D(box,centroid)=1?IOU(box,centroid)
使用聚類進(jìn)行選擇的優(yōu)勢(shì)是達(dá)到相同的IOU結(jié)果時(shí)所需的anchor box數(shù)量更少,使得模型的表示能力更強(qiáng),任務(wù)更容易學(xué)習(xí).k-means算法代碼實(shí)現(xiàn)參考:k_means_yolo.py.算法過(guò)程是:將每個(gè)bbox的寬和高相對(duì)整張圖片的比例(wr,hr)進(jìn)行聚類,得到k個(gè)anchor box,由于darknet代碼需要配置文件中region層的anchors參數(shù)是絕對(duì)值大小,因此需要將這個(gè)比例值乘上卷積層的輸出特征的大小.如輸入是416x416,那么最后卷積層的特征是13x13. 細(xì)粒度特征(fine grain features):在Faster R-CNN 和 SSD 均使用了不同的feature map以適應(yīng)不同尺度大小的目標(biāo).YOLOv2使用了一種不同的方法,,簡(jiǎn)單添加一個(gè) pass through layer,把淺層特征圖(26x26)連接到深層特征圖(連接到新加入的三個(gè)卷積核尺寸為3 * 3的卷積層最后一層的輸入)。 通過(guò)疊加淺層特征圖相鄰特征到不同通道(而非空間位置),,類似于Resnet中的identity mapping,。這個(gè)方法把26x26x512的特征圖疊加成13x13x2048的特征圖,與原生的深層特征圖相連接,,使模型有了細(xì)粒度特征,。此方法使得模型的性能獲得了1%的提升。 Multi-Scale Training: 和YOLOv1訓(xùn)練時(shí)網(wǎng)絡(luò)輸入的圖像尺寸固定不變不同,,YOLOv2(在cfg文件中random=1時(shí))每隔幾次迭代后就會(huì)微調(diào)網(wǎng)絡(luò)的輸入尺寸,。訓(xùn)練時(shí)每迭代10次,就會(huì)隨機(jī)選擇新的輸入圖像尺寸,。因?yàn)閅OLOv2的網(wǎng)絡(luò)使用的downsamples倍率為32,,所以使用32的倍數(shù)調(diào)整輸入圖像尺寸{320,352,…,,608},。訓(xùn)練使用的最小的圖像尺寸為320 x 320,最大的圖像尺寸為608 x 608,。 這使得網(wǎng)絡(luò)可以適應(yīng)多種不同尺度的輸入. YOLOv2網(wǎng)絡(luò)結(jié)構(gòu)YOLOv2對(duì)v1的基礎(chǔ)網(wǎng)絡(luò)做了更改. 分類網(wǎng)絡(luò) YOLOv2提出了一種新的分類模型Darknet-19.借鑒了很多其它網(wǎng)絡(luò)的設(shè)計(jì)概念.主要使用3x3卷積并在pooling之后channel數(shù)加倍(VGG);global average pooling替代全連接做預(yù)測(cè)分類,并在3x3卷積之間使用1x1卷積壓縮特征表示(Network in Network);使用 batch normalization 來(lái)提高穩(wěn)定性,加速收斂,對(duì)模型正則化. 包含 19 conv + 5 maxpooling. 訓(xùn)練:使用Darknet框架在ImageNet 1000類上訓(xùn)練160 epochs,學(xué)習(xí)率初始為0.1,以4級(jí)多項(xiàng)式衰減.weight decay=0.0005 , momentum=0.9.使用標(biāo)準(zhǔn)的數(shù)據(jù)增廣方法:random crops, rotations, (hue, saturation), exposure shifts. 之后將輸入從224放大至448,學(xué)習(xí)率調(diào)整為0.001,迭代10 epochs.結(jié)果達(dá)到top-1 accuracy 76.5% , top-5 accuracy 93.3%. 檢測(cè)網(wǎng)絡(luò) 在分類網(wǎng)絡(luò)中移除最后一個(gè)1x1的層,在最后添加3個(gè)3x3x1024的卷積層,再接上輸出是類別個(gè)數(shù)的1x1卷積. 添加跨層跳躍連接(借鑒ResNet等思想),融合粗細(xì)粒度的特征:將前面最后一個(gè)3x3x512卷積的特征圖,對(duì)于416x416的輸入,該層輸出26x26x512,直接連接到最后新加的三個(gè)3x3卷積層的最后一個(gè)的前邊.將26x26x512變形為13x13x1024與后邊的13x13x1024特征按channel堆起來(lái)得到13x13x3072.從yolo-voc.cfg文件可以看到,第25層為route層,,逆向9層拿到第16層26 * 26 * 512的輸出,,并由第26層的reorg層把26 * 26 * 512 變形為13 * 13 * 2048,再有第27層的route層連接24層和26層的輸出,,堆疊為13 * 13 * 3072,,由最后一個(gè)卷積核為3 * 3的卷積層進(jìn)行跨通道的信息融合并把通道降維為1024。 訓(xùn)練:作者在VOC07+12以及COCO2014數(shù)據(jù)集上迭代了160 epochs,初始學(xué)習(xí)率0.001,在60和90 epochs分別減小為0.1倍.
網(wǎng)絡(luò)結(jié)構(gòu)如下(輸入416,5個(gè)類別,5個(gè)anchor box; 此結(jié)構(gòu)信息由Darknet框架啟動(dòng)時(shí)輸出): YOLO9000提出了一種聯(lián)合訓(xùn)練方法,,能夠容許同時(shí)使用目標(biāo)檢測(cè)數(shù)據(jù)集和分類數(shù)據(jù)集,。使用有標(biāo)記的檢測(cè)數(shù)據(jù)集精確定位,使用分類數(shù)據(jù)增加類別和魯棒性,。 YOLOv3YOLOv3在Pascal Titan X上處理608x608圖像速度達(dá)到20FPS,,在 COCO test-dev 上 [email protected] 達(dá)到 57.9%,與RetinaNet(FocalLoss論文所提出的單階段網(wǎng)絡(luò))的結(jié)果相近,,并且速度快4倍. YOLO v3的模型比之前的模型復(fù)雜了不少,,可以通過(guò)改變模型結(jié)構(gòu)的大小來(lái)權(quán)衡速度與精度。 速度對(duì)比如下: 改進(jìn)之處:
分類器-類別預(yù)測(cè):
多尺度預(yù)測(cè)
參見網(wǎng)絡(luò)結(jié)構(gòu)定義文件yolov3.cfg 基礎(chǔ)網(wǎng)絡(luò) Darknet-53 網(wǎng)絡(luò)結(jié)構(gòu)如下: YOLOv3在[email protected]及小目標(biāo)APS上具有不錯(cuò)的結(jié)果,但隨著IOU的增大,性能下降,說(shuō)明YOLOv3不能很好地與ground truth切合. 邊框預(yù)測(cè)
仍采用之前的logistic方式: 其中cx,cy是網(wǎng)格的坐標(biāo)偏移量,pw,ph是預(yù)設(shè)的anchor box的邊長(zhǎng).最終得到的邊框坐標(biāo)值是b?,而網(wǎng)絡(luò)學(xué)習(xí)目標(biāo)是t?.
優(yōu)缺點(diǎn)優(yōu)點(diǎn)
但相比RCNN系列物體檢測(cè)方法,,YOLO具有以下缺點(diǎn):
YOLO v.s. Faster R-CNN
Darknet 框架Darknet 由 C 語(yǔ)言和 CUDA 實(shí)現(xiàn), 對(duì)GPU顯存利用效率較高(CPU速度差一些, 通過(guò)與SSD的Caffe程序?qū)Ρ劝l(fā)現(xiàn)存在CPU較慢,GPU較快的情況). Darknet 對(duì)第三方庫(kù)的依賴較少,且僅使用了少量GNU linux平臺(tái)C接口,因此很容易移植到其它平臺(tái),如Windows或嵌入式設(shè)備. region層:參數(shù)anchors指定kmeans計(jì)算出來(lái)的anchor box的長(zhǎng)寬的絕對(duì)值(與網(wǎng)絡(luò)輸入大小相關(guān)),num參數(shù)為anchor box的數(shù)量, region層的輸入和輸出大小與前一層(1x1 conv)的輸出大小和網(wǎng)絡(luò)的輸入大小相關(guān). Detection層: 坐標(biāo)及類別結(jié)果輸出層. 參考 |
|
來(lái)自: Rainbow_Heaven > 《目標(biāo)檢測(cè)》