YOLO v1到YOLO v4(上)
YOLO v1到Y(jié)OLO v4(上)
一. YOLO v1
這是繼RCNN,fast-RCNN和faster-RCNN之后,rbg(RossGirshick)針對DL目標(biāo)檢測速度問題提出的另外一種框架。YOLO V1其增強版本GPU中能跑45fps,簡化版本155fps。
論文下載:http://arxiv.org/abs/1506.02640
代碼下載:https://github.com/pjreddie/darknet
YOLO的核心思想
提出了一種新的目標(biāo)檢測方法YOLO。先前的目標(biāo)檢測工作重新調(diào)整了分類器的用途以執(zhí)行檢測。取而代之的是,將目標(biāo)檢測作為一個回歸問題,以空間分隔的邊界框和關(guān)聯(lián)的類概率來處理。一個單一的神經(jīng)網(wǎng)絡(luò)在一次評估中直接從完整圖像預(yù)測邊界框和類概率。由于整個檢測通道是一個單一的網(wǎng)絡(luò),因此可以直接對檢測性能進(jìn)行端到端的優(yōu)化。統(tǒng)一架構(gòu)非常快。基本YOLO模型以每秒45幀的速度實時處理圖像。另一個更小版本的網(wǎng)絡(luò)Fast YOLO每秒處理155幀,同時仍然可以實現(xiàn)其他實時檢測器的兩倍。與最先進(jìn)的檢測系統(tǒng)相比,YOLO定位誤差更大,但在背景下預(yù)測誤報的可能性較小。最后,YOLO學(xué)習(xí)對象的一般表示。當(dāng)從自然圖像推廣到其他領(lǐng)域(如藝術(shù)作品)時,它優(yōu)于其他檢測方法,包括DPM和R-CNN。
·
YOLO的核心思想就是利用整張圖作為網(wǎng)絡(luò)的輸入,直接在輸出層回歸bounding box的位置和bounding box所屬的類別。
·
faster RCNN中也直接用整張圖作為輸入,但是faster-RCNN整體還是采用了RCNN那種 proposal+classifier的思想,只不過是將提取proposal的步驟放在CNN中實現(xiàn)了,而YOLO則采用直接回歸的思路。
二. YOLO的實現(xiàn)方法
·
將一幅圖像分成SxS個網(wǎng)格(grid cell),如果某個object的中心 落在這個網(wǎng)格中,則這個網(wǎng)格就負(fù)責(zé)預(yù)測這個object。
·
每個網(wǎng)格要預(yù)測B個bounding box,每個bounding
box除了要回歸自身的位置之外,還要附帶預(yù)測一個confidence值。
這個confidence代表了所預(yù)測的box中含有object的置信度和這個box預(yù)測的有多準(zhǔn)兩重信息,其值是這樣計算的:
其中如果有object落在一個grid cell里,第一項取1,否則取0。第二項是預(yù)測的bounding box和實際的groundtruth之間的IoU值。
·
每個bounding box要預(yù)測(x, y, w, h)和confidence共5個值,每個網(wǎng)格還要預(yù)測一個類別信息,記為C類。則SxS個網(wǎng)格,每個網(wǎng)格要預(yù)測B個bounding box還要預(yù)測C個categories。輸出就是S x S x (5*B+C)的一個tensor。
注意:class信息是針對每個網(wǎng)格的,confidence信息是針對每個bounding box的。
·
舉例說明: 在PASCAL VOC中,圖像輸入為448x448,取S=7,B=2,一共有20個類別(C=20)。則輸出就是7x7x30的一個tensor。
整個網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示:
·
在test的時候,每個網(wǎng)格預(yù)測的class信息和bounding box預(yù)測的confidence信息相乘,就得到每個bounding box的class-specific confidence score:
等式左邊第一項就是每個網(wǎng)格預(yù)測的類別信息,第二三項就是每個bounding box預(yù)測的confidence。這個乘積即encode了預(yù)測的box屬于某一類的概率,也有該box準(zhǔn)確度的信息。
· 得到每個box的class-specific confidence score以后,設(shè)置閾值,濾掉得分低的boxes,對保留的boxes進(jìn)行NMS處理,就得到最終的檢測結(jié)果。
·
注:
*由于輸出層為全連接層,因此在檢測時,YOLO訓(xùn)練模型只支持與訓(xùn)練圖像相同的輸入分辨率。
*雖然每個格子可以預(yù)測B個bounding box,但是最終只選擇只選擇IOU最高的bounding box作為物體檢測輸出,即每個格子最多只預(yù)測出一個物體。當(dāng)物體占畫面比例較小,如圖像中包含畜群或鳥群時,每個格子包含多個物體,但卻只能檢測出其中一個。這是YOLO方法的一個缺陷。
三. YOLO的實現(xiàn)細(xì)節(jié)
·
每個grid有30維,這30維中,8維是回歸box的坐標(biāo),2維是box的confidence,還有20維是類別。
其中坐標(biāo)的x,y用對應(yīng)網(wǎng)格的offset歸一化到0-1之間,w,h用圖像的width和height歸一化到0-1之間。
·
在實現(xiàn)中,最主要的就是怎么設(shè)計損失函數(shù),讓這個三個方面得到很好的平衡。作者簡單粗暴的全部采用了sum-squared error loss來做這件事。
這種做法存在以下幾個問題:
第一,8維的localization error和20維的classification error同等重要顯然是不合理的;
第二,如果一個網(wǎng)格中沒有object(一幅圖中這種網(wǎng)格很多),那么就會將這些網(wǎng)格中的box的confidence push到0,相比于較少的有object的網(wǎng)格,這種做法是overpowering的,這會導(dǎo)致網(wǎng)絡(luò)不穩(wěn)定甚至發(fā)散。
解決辦法:
·
更重視8維的坐標(biāo)預(yù)測,給這些損失前面賦予更大的loss weight, 記為
在pascal VOC訓(xùn)練中取5。
·
對沒有object的box的confidence loss,賦予小的loss weight,記為
在pascal VOC訓(xùn)練中取0.5。
·
有object的box的confidence loss和類別的loss的loss weight正常取1。
·
對不同大小的box預(yù)測中,相比于大box預(yù)測偏一點,小box預(yù)測偏一點肯定更不能被忍受的。而sum-square error loss中對同樣的偏移loss是一樣。
為了緩和這個問題,作者用了一個比較取巧的辦法,就是將box的width和height取平方根代替原本的height和width。這個參考下面的圖很容易理解,小box的橫軸值較小,發(fā)生偏移時,反應(yīng)到y(tǒng)軸上相比大box要大。(也是個近似逼近方式)
·
一個網(wǎng)格預(yù)測多個box,希望的是每個box predictor專門負(fù)責(zé)預(yù)測某個object。具體做法就是看當(dāng)前預(yù)測的box與ground truth box中哪個IoU大,就負(fù)責(zé)哪個。這種做法稱作box predictor的specialization。
·
最后整個的損失函數(shù)如下所示:
這個損失函數(shù)中:
§ 只有當(dāng)某個網(wǎng)格中有object的時候才對classification error進(jìn)行懲罰。
§ 只有當(dāng)某個box predictor對某個ground truth box負(fù)責(zé)的時候,才會對box的coordinate error進(jìn)行懲罰,而對哪個ground truth box負(fù)責(zé)就看其預(yù)測值和ground truth box的IoU是不是在那個cell的所有box中最大。
·
其他細(xì)節(jié),例如使用激活函數(shù)使用leak RELU,模型用ImageNet預(yù)訓(xùn)練等等,在這里就不一一贅述了。
·
注:
*YOLO方法模型訓(xùn)練依賴于物體識別標(biāo)注數(shù)據(jù),因此,對于非常規(guī)的物體形狀或比例,YOLO的檢測效果并不理想。
*YOLO采用了多個下采樣層,網(wǎng)絡(luò)學(xué)到的物體特征并不精細(xì),因此也會影響檢測效果。
- YOLO loss函數(shù)中,大物體IOU誤差和小物體IOU誤差對網(wǎng)絡(luò)訓(xùn)練中l(wèi)oss貢獻(xiàn)值接近(雖然采用求平方根方式,但沒有根本解決問題)。因此,對于小物體,小的IOU誤差也會對網(wǎng)絡(luò)優(yōu)化過程造成很大的影響,從而降低了物體檢測的定位準(zhǔn)確性。
四. YOLO的缺點
·
YOLO對相互靠的很近的物體,還有很小的群體 檢測效果不好,這是因為一個網(wǎng)格中只預(yù)測了兩個框,并且只屬于一類。
·
同一類物體出現(xiàn)的新的不常見的長寬比和其他情況時,泛化能力偏弱。
·
由于損失函數(shù)的問題,定位誤差是影響檢測效果的主要原因。尤其是大小物體的處理上,還有待加強。
YOLO9000 YOLOv2
原文下載:https://arxiv.org/pdf/1612.08242v1.pdf
工程代碼:http://pjreddie.com/darknet/yolo/
摘要
-
提出YOLOv2:代表著目前業(yè)界最先進(jìn)物體檢測的水平,它的速度要快過其他檢測系統(tǒng)(FasterR-CNN,ResNet,SSD),使用者可以在它的速度與精確度之間進(jìn)行權(quán)衡。
-
提出YOLO9000:這一網(wǎng)絡(luò)結(jié)構(gòu)可以實時地檢測超過9000種物體分類,這歸功于它使用了WordTree,通過WordTree來混合檢測數(shù)據(jù)集與識別數(shù)據(jù)集之中的數(shù)據(jù)。
-
提出了一種新的聯(lián)合訓(xùn)練算法( Joint Training Algorithm ),使用這種聯(lián)合訓(xùn)練技術(shù)同時在ImageNet和COCO數(shù)據(jù)集上進(jìn)行訓(xùn)練。YOLO9000進(jìn)一步縮小了監(jiān)測數(shù)據(jù)集與識別數(shù)據(jù)集之間的代溝。
簡介
目前的檢測數(shù)據(jù)集(DetectionDatasets)有很多限制,分類標(biāo)簽的信息太少,圖片的數(shù)量小于分類數(shù)據(jù)集(Classi?cation Datasets),而且檢測數(shù)據(jù)集的成本太高,使其無法當(dāng)作分類數(shù)據(jù)集進(jìn)行使用。而現(xiàn)在的分類數(shù)據(jù)集卻有著大量的圖片和十分豐富分類信息。
文章提出了一種新的訓(xùn)練方法–聯(lián)合訓(xùn)練算法,這種算法可以把這兩種的數(shù)據(jù)集混合到一起。使用一種分層的觀點對物體進(jìn)行分類,用巨量的分類數(shù)據(jù)集數(shù)據(jù)來擴充檢測數(shù)據(jù)集,從而把兩種不同的數(shù)據(jù)集混合起來。
聯(lián)合訓(xùn)練算法的基本思路就是:同時在檢測數(shù)據(jù)集和分類數(shù)據(jù)集上訓(xùn)練物體檢測器(Object Detectors ),用監(jiān)測數(shù)據(jù)集的數(shù)據(jù)學(xué)習(xí)物體的準(zhǔn)確位置,用分類數(shù)據(jù)集的數(shù)據(jù)來增加分類的類別量、提升健壯性。
YOLO9000就是使用聯(lián)合訓(xùn)練算法訓(xùn)練出來的,他擁有9000類的分類信息,這些分類信息學(xué)習(xí)自ImageNet分類數(shù)據(jù)集,而物體位置檢測則學(xué)習(xí)自COCO檢測數(shù)據(jù)集。
All of our code and pre-trained models are available online at http://pjreddie.com/yolo9000/
BETTER
YOLO一代有很多缺點,作者希望改進(jìn)的方向是:改善recall,提升定位的準(zhǔn)確度,同時保持分類的準(zhǔn)確度。
目前計算機視覺的趨勢是更大更深的網(wǎng)絡(luò),更好的性能表現(xiàn)通常依賴于訓(xùn)練更大的網(wǎng)絡(luò)或者把多種model綜合到一起。但是YOLO v2則著力于簡化網(wǎng)絡(luò)。具體的改進(jìn)見下表:
·
Batch Normalization
使用Batch Normalization對網(wǎng)絡(luò)進(jìn)行優(yōu)化,讓網(wǎng)絡(luò)提高了收斂性,同時還消除了對其他形式的正則化(regularization)的依賴。通過對YOLO的每一個卷積層增加Batch Normalization,最終使得mAP提高了2%,同時還使model正則化。使用Batch
Normalization可以從model中去掉Dropout,而不會產(chǎn)生過擬合。
·
High resolution classifier
目前業(yè)界標(biāo)準(zhǔn)的檢測方法,都要先把分類器(classi?er)放在ImageNet上進(jìn)行預(yù)訓(xùn)練。從Alexnet開始,大多數(shù)的分類器都運行在小于256256的圖片上。而現(xiàn)在YOLO從224224增加到了448*448,這就意味著網(wǎng)絡(luò)需要適應(yīng)新的輸入分辨率。
為了適應(yīng)新的分辨率,YOLO v2的分類網(wǎng)絡(luò)以448*448的分辨率先在ImageNet上進(jìn)行Fine Tune,Fine Tune10個epochs,讓網(wǎng)絡(luò)有時間調(diào)整他的濾波器(filters),好讓其能更好的運行在新分辨率上,還需要調(diào)優(yōu)用于檢測的Resulting
Network。最終通過使用高分辨率,mAP提升了4%。
·
Convolution with anchor boxes
YOLO一代包含有全連接層,從而能直接預(yù)測Bounding
Boxes的坐標(biāo)值。Faster R-CNN的方法只用卷積層與Region
Proposal Network來預(yù)測Anchor Box的偏移值與置信度,而不是直接預(yù)測坐標(biāo)值。作者發(fā)現(xiàn)通過預(yù)測偏移量而不是坐標(biāo)值能夠簡化問題,讓神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)起來更容易。
所以最終YOLO去掉了全連接層,使用Anchor Boxes來預(yù)測 Bounding Boxes。作者去掉了網(wǎng)絡(luò)中一個Pooling層,這讓卷積層的輸出能有更高的分辨率。收縮網(wǎng)絡(luò)讓其運行在416416而不是448448。由于圖片中的物體都傾向于出現(xiàn)在圖片的中心位置,特別是那種比較大的物體,所以有一個單獨位于物體中心的位置用于預(yù)測這些物體。YOLO的卷積層采用32這個值來下采樣圖片,所以通過選擇416416用作輸入尺寸最終能輸出一個1313的Feature Map。使用Anchor Box會讓精確度稍微下降,但用了它能讓YOLO能預(yù)測出大于一千個框,同時recall達(dá)到88%,mAP達(dá)到69.2%。
·
Dimension clusters
之前Anchor Box的尺寸是手動選擇的,所以尺寸還有優(yōu)化的余地。為了優(yōu)化,在訓(xùn)練集(training set)Bounding Boxes上跑了一下k-means聚類,來找到一個比較好的值。
如果用標(biāo)準(zhǔn)的歐式距離的k-means,尺寸大的框比小框產(chǎn)生更多的錯誤。因為的目的是提高IOU分?jǐn)?shù),這依賴于Box的大小,所以距離度量的使用:
通過分析實驗結(jié)果,左圖:在model復(fù)雜性與high recall之間權(quán)衡之后,選擇聚類分類數(shù)K=5。右圖:是聚類的中心,大多數(shù)是高瘦的Box。
Table1是說明用K-means選擇Anchor Boxes時,當(dāng)Cluster IOU選擇值為5時,AVG IOU的值是61,這個值要比不用聚類的方法的60.9要高。選擇值為9的時候,AVG
IOU更有顯著提高。總之就是說明用聚類的方法是有效果的。
·
Direct location prediction
用Anchor Box的方法,會讓model變得不穩(wěn)定,尤其是在最開始的幾次迭代的時候。大多數(shù)不穩(wěn)定因素產(chǎn)生自預(yù)測Box的(x,y)位置的時候。按照之前YOLO的方法,網(wǎng)絡(luò)不會預(yù)測偏移量,而是根據(jù)YOLO中的網(wǎng)格單元的位置來預(yù)測坐標(biāo),這就讓Ground Truth的值介于0到1之間。而為了讓網(wǎng)絡(luò)的結(jié)果能落在這一范圍內(nèi),網(wǎng)絡(luò)使用一個 Logistic Activation來對于網(wǎng)絡(luò)預(yù)測結(jié)果進(jìn)行限制,讓結(jié)果介于0到1之間。網(wǎng)絡(luò)在每一個網(wǎng)格單元中預(yù)測出5個Bounding
Boxes,每個Bounding Boxes有五個坐標(biāo)值tx,ty,tw,th,t0,他們的關(guān)系見下圖(Figure3)。假設(shè)一個網(wǎng)格單元對于圖片左上角的偏移量是cx,cy,Bounding Boxes
Prior的寬度和高度是pw,ph,那么預(yù)測的結(jié)果見下圖右面的公式:
因為使用了限制讓數(shù)值變得參數(shù)化,也讓網(wǎng)絡(luò)更容易學(xué)習(xí)、更穩(wěn)定。
Dimension clusters和Direct location prediction,improves YOLO by almost 5% over the version with anchor boxes.
·
Fine-Grained Features
YOLO修改后的Feature Map大小為1313,這個尺寸對檢測圖片中尺寸大物體來說足夠了,同時使用這種細(xì)粒度的特征對定位小物體的位置可能也有好處。Faster R-CNN、SSD都使用不同尺寸的Feature Map來取得不同范圍的分辨率,而YOLO采取了不同的方法,YOLO加上了一個Passthrough Layer來取得之前的某個2626分辨率的層的特征。這個Passthrough layer能夠把高分辨率特征與低分辨率特征聯(lián)系在一起,聯(lián)系起來的方法是把相鄰的特征堆積在不同的Channel之中,這一方法類似與Resnet的Identity Mapping,從而把2626512變成13132048。YOLO中的檢測器位于擴展后(expanded )的Feature Map的上方,所以他能取得細(xì)粒度的特征信息,這提升了YOLO 1%的性能。
·
Multi-ScaleTraining
作者希望YOLO v2能健壯的運行于不同尺寸的圖片之上,所以把這一想法用于訓(xùn)練model中。
區(qū)別于之前的補全圖片的尺寸的方法,YOLO v2每迭代幾次都會改變網(wǎng)絡(luò)參數(shù)。每10個Batch,網(wǎng)絡(luò)會隨機地選擇一個新的圖片尺寸,由于使用了下采樣參數(shù)是32,所以不同的尺寸大小也選擇為32的倍數(shù){320,352……608},最小320320,最大608608,網(wǎng)絡(luò)會自動改變尺寸,并繼續(xù)訓(xùn)練的過程。
這一政策讓網(wǎng)絡(luò)在不同的輸入尺寸上都能達(dá)到一個很好的預(yù)測效果,同一網(wǎng)絡(luò)能在不同分辨率上進(jìn)行檢測。當(dāng)輸入圖片尺寸比較小的時候跑的比較快,輸入圖片尺寸比較大的時候精度高,所以你可以在YOLO v2的速度和精度上進(jìn)行權(quán)衡。
Figure4,Table 3:在voc2007上的速度與精度
·
Further Experiments
總結(jié)
以上是生活随笔為你收集整理的YOLO v1到YOLO v4(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统常用词典(三)
- 下一篇: YOLO v1到YOLO v4(下)