1. Introduction
- yolo從v1-v2-v3做了一步步迭代饱亮,從速度兆旬、精度、強(qiáng)度都有了顯著的提高隧出。yolo的核心思想在v1中提出踏志,在v2中結(jié)合其他研究者的工作做了各方面的改進(jìn),在v3中使用了許多技巧進(jìn)一步優(yōu)化胀瞪。
- yolo將以往目標(biāo)檢測(cè)的two stage方法縮減成one stage针余,它將以往region proposal的過(guò)程融合到后續(xù)的分類(lèi)任務(wù)中,將目標(biāo)的定位和分類(lèi)用一個(gè)end to end的神經(jīng)網(wǎng)絡(luò)作為回歸問(wèn)題求解凄诞。
- 效果與其他網(wǎng)絡(luò)對(duì)比起來(lái)圆雁,很快,背景誤判率低帆谍,通用性強(qiáng)伪朽,但定位精準(zhǔn)性稍差。
2. yolov1
總體流程
yolo先將圖像切分成個(gè)grid(單元格)汛蝙,讓每一個(gè)grid負(fù)責(zé)檢測(cè)中心點(diǎn)落入該格的目標(biāo)烈涮,預(yù)測(cè)出B個(gè)bounding box定位目標(biāo)并給出目標(biāo)類(lèi)別朴肺。
- bounding box中有一個(gè)5維坐標(biāo),分別代表框的位置坚洽、寬高戈稿、置信度。
- x讶舰,y是bounding box中心位置相對(duì)于當(dāng)前格子位置的偏移值鞍盗,并且被歸一化到0-1;
- w和h是用原圖的寬高進(jìn)行歸一化到0-1绘雁;
- 置信度反映當(dāng)前框是否包含物體以及位置的準(zhǔn)確性橡疼,計(jì)算為援所,IOU也歸一化到0-1庐舟。
- 整個(gè)模型輸入是image,輸出是的張量住拭。
結(jié)構(gòu)
yolo網(wǎng)絡(luò)由24個(gè)卷積層和2個(gè)全連接層組成挪略。卷積層用于提取特征,全連接層用于定位和分類(lèi)滔岳。
它借鑒了googleNet的結(jié)構(gòu)杠娱,但是未使用inception模塊,僅用11和33卷積核簡(jiǎn)單替代谱煤,減小了模型的復(fù)雜度摊求。
Loss
它的loss很簡(jiǎn)單又很巧妙,使用誤差平方和(sum-square error)
刘离。
由于定位誤差和分類(lèi)誤差對(duì)網(wǎng)絡(luò)的loss的貢獻(xiàn)值是不同的室叉,因此加上了坐標(biāo)誤差權(quán)值,給無(wú)物體的IOU誤差權(quán)值硫惕;
又因?yàn)閷捀咤e(cuò)誤對(duì)大物體的影響應(yīng)該小于小物體的影響茧痕,所以給寬高加上了根號(hào),但并不能完全解決這個(gè)問(wèn)題恼除。最后得到一個(gè)形式稍復(fù)雜一點(diǎn)的loss公式踪旷。
訓(xùn)練過(guò)程
- 預(yù)訓(xùn)練,使用前20個(gè)conv和1個(gè)ave pool和1個(gè)全連接做預(yù)訓(xùn)練豁辉。
- 用預(yù)訓(xùn)練得到的20層conv初始化yolo的前20層令野,為了提高精度,將輸入圖像從224*224 resize到448*448
- 使用了leaky ReLU徽级,dropout气破,data augmentation
- 調(diào)整學(xué)習(xí)率。第一個(gè)epoch從0.001到0.01灰追,然后0.01持續(xù)75epoch堵幽,0.001持續(xù)30epochs狗超,0.0001持續(xù)30epochs
缺陷:
- 由于輸出為全連接,所以輸入圖像分辨率大小都要一致
- 有很強(qiáng)的空間約束朴下,每個(gè)格子只能預(yù)測(cè)一個(gè)目標(biāo)努咐。每個(gè)格子雖然有B個(gè)bounding box,但是只選擇IOU最高的bounding box做預(yù)測(cè)殴胧,所以有B*5個(gè)坐標(biāo)值渗稍,只有C個(gè)類(lèi)別概率,輸出為(B*5+C)团滥,而不是B*(5+C)竿屹。
- 對(duì)小物體的預(yù)測(cè)不好
- 對(duì)于長(zhǎng)寬比例的適應(yīng)性不是太強(qiáng)
3. yolov2
yolov2提高了精度、速度灸姊、廣泛度拱燃。
精度的提高主要表現(xiàn)在對(duì)recall的提高。做了以下的修改力惯。
加上BN碗誉,并去除了其他正則化方法如dropout,保證不過(guò)擬合父晶。
使用高分辨率的圖像分類(lèi)器哮缺,將預(yù)訓(xùn)練的圖像從224*224直接轉(zhuǎn)為448*448。
[圖片上傳中...(image.png-1ced27-1555252428685-0)]-
加上了anchor機(jī)制
移除了最后的全連接(使用conv和GAP替代)和一個(gè)池化層(為了使分辨率不減小一半)甲喝,使recall從81%加到了88%尝苇。將圖像從448改成416,因?yàn)樵摼W(wǎng)絡(luò)最后是將圖像縮小了32倍埠胖,416除32會(huì)得到一個(gè)奇數(shù)13糠溜,這樣可以使每個(gè)grid有一個(gè)唯一的中心點(diǎn)而不是像偶數(shù)有4個(gè)。
-
由于傳統(tǒng)anchor的大小比例是手動(dòng)設(shè)置為(8,16,32)*(1:2,1:1,2:1)共9個(gè)押袍,而如果能直接使用更好的anchor肯定會(huì)對(duì)網(wǎng)絡(luò)效果有利诵冒。這里使用了一種改進(jìn)的k-means算法來(lái)自動(dòng)產(chǎn)生prior anchor(先驗(yàn)框)。在選擇kmeans的距離時(shí)發(fā)現(xiàn)谊惭,L2距離在這個(gè)任務(wù)中不太適用汽馋。因?yàn)閎ox尺寸大時(shí)其誤差也會(huì)變大,而我們希望和尺寸關(guān)系較小圈盔,而和是否吻合ground truth較大豹芯,所以將距離函數(shù)設(shè)置為 d=1-IOU。在k定為5時(shí)驱敲,就取得了傳統(tǒng)的9個(gè)anchor的效果铁蹈;k=9時(shí)則遠(yuǎn)超傳統(tǒng)anchor。
-
引入了anchor后众眨,訓(xùn)練變得不穩(wěn)定握牧。改進(jìn)了anchor的坐標(biāo)公式容诬,之前r-cnn中是全局的偏移,這里改成預(yù)測(cè)相對(duì)于grid的偏移沿腰。使用坐標(biāo)公式:xy=該grid左上角相對(duì)于圖片的偏移cxcy+預(yù)測(cè)的xy览徒。wh=先驗(yàn)框的寬高*e^twth
為了得到細(xì)粒度特征,類(lèi)似resnet的shortcut引入了passthrough層颂龙,直接將高像素特征和低像素特征concatenate习蓬,使多級(jí)別的特征在最后的預(yù)測(cè)中都起到效果,提高了小物體的正確率措嵌。
采用多尺度圖片訓(xùn)練躲叼。把原先固定輸入圖片大小改成了動(dòng)態(tài)調(diào)整輸入圖像大小,每10個(gè)batch就在range(320,608,32)中隨機(jī)選出一個(gè)大小訓(xùn)練企巢。這個(gè)操作強(qiáng)制讓網(wǎng)絡(luò)學(xué)習(xí)多個(gè)分辨率的圖像枫慷,提高了適應(yīng)性。
速度上包斑,
提出了darknet19模型流礁,19*卷積層+5max pooling+1GAP(global average pooling)涕俗,取得了很快的速度罗丰。
廣泛度
主要體現(xiàn)在yolo9000可以對(duì)超過(guò)9000個(gè)類(lèi)別的目標(biāo)進(jìn)行檢測(cè)。引入了分層預(yù)測(cè)的機(jī)制再姑,把類(lèi)別標(biāo)簽從imagenet的橫向改成了wordnet的圖式構(gòu)造萌抵。在預(yù)測(cè)一個(gè)物體時(shí),逐層預(yù)測(cè)元镀,使用條件概率绍填,增加準(zhǔn)確性。
4. yolov3
yolov3是增量式改動(dòng)栖疑,也借鑒了他人的諸多工作讨永,提出了darknet53模型。幾個(gè)重點(diǎn)是:
1遇革、多分類(lèi)卿闹;2、多尺度萝快;3锻霎、引入resnet。
定位上使用logistic regression
對(duì)anchor包圍的部分進(jìn)行評(píng)分揪漩,判定該位置是目標(biāo)的可能性有多大旋恼。這一步是在predict之前進(jìn)行的,可以去掉不必要anchor奄容,可以減少計(jì)算量冰更。
logistic回歸就是用曲線對(duì)prior相對(duì)于 objectness score映射關(guān)系的線性建模产徊。如果先驗(yàn)邊界框與真實(shí)框的重疊度比之前的任何其他邊界框都要好,則該值應(yīng)該為1蜀细。 如果先驗(yàn)邊界框不是最好的囚痴,但確實(shí)與真實(shí)對(duì)象的重疊超過(guò)某個(gè)閾值(這里是0.5),那么就忽略這次預(yù)測(cè)审葬。YOLOv3只為每個(gè)真實(shí)對(duì)象分配一個(gè)邊界框深滚,如果先驗(yàn)邊界框與真實(shí)對(duì)象不吻合,則不會(huì)產(chǎn)生坐標(biāo)或類(lèi)別預(yù)測(cè)損失涣觉,只會(huì)產(chǎn)生物體預(yù)測(cè)損失痴荐。
分類(lèi)上不使用softmax,而采用logistic
支持多標(biāo)簽的預(yù)測(cè)官册,而非單標(biāo)簽生兆。當(dāng)一張圖像經(jīng)過(guò)特征提取后的某一類(lèi)輸出經(jīng)過(guò)sigmoid函數(shù)約束后如果大于0.5,就表示屬于該類(lèi)膝宁。在loss函數(shù)中使用了二分類(lèi)交叉熵鸦难。
多尺度預(yù)測(cè)(FPN)
將高維的特征和低維的特征連接,得到3層特征员淫,對(duì)這三層特征分別做預(yù)測(cè)合蔽。每一個(gè)scale都輸出替代了之前的,將v2中提到的k-means的k改成了9介返。
基于yolov2的結(jié)構(gòu)拴事,提出了darknet53
使用了residual block。用了更少的浮點(diǎn)運(yùn)算圣蝎,并且每秒浮點(diǎn)運(yùn)算更高刃宵。
整個(gè)v3中,取消了池化層徘公,圖像縮小是通過(guò)改變卷積核步長(zhǎng)實(shí)現(xiàn)的牲证,想縮小一半邊長(zhǎng),就設(shè)stride=2关面。在最后的輸出層坦袍,借鑒了FPN(feature pyramid networks)采用多尺度對(duì)不同size的目標(biāo)進(jìn)行檢測(cè)。