1. 程式人生 > >YOLO v2 學習與研究

YOLO v2 學習與研究

論文:YOLO9000:Better, Faster, Stronger

論文連結:https://arxiv.org/abs/1612.08242

工程連結:https://pjreddie.com/

參考連結:

1、https://blog.csdn.net/guleileo/article/details/80581858

2、https://zhuanlan.zhihu.com/p/37668951

3、https://blog.csdn.net/u014380165/article/details/77961414


0、與yolo v1對比

與Yolo v1的對比:

首先,yolo存在兩個問題:定位不準確;recall較低;針對這兩個問題,yolo v2提出了一系列解決方法,這個在better部分有體現。

faster是通過對網路結構進行調整,提出darknet。

stronger:目前檢測資料集標註成本較大,所以數量和類別上都少於分類資料集。本文提出一種聯合訓練方式,將檢測和分類資料集混合一起,同時在這兩種資料集上訓練物體檢測器,用檢測資料集的資料學習物體的準確位置,用分類資料集的資料來增加分類的數量,提高魯棒性。最後得到一個yolo9000的模型,這個模型可以檢測識別出9000多種類別。

本文一共提出了兩個模型,yolo v2和yolo 9000,前者主要是在yolo的基礎上進行了一系列改進,後者是將檢測資料集和識別數集進行合併,從而擴充檢測目標的種類數。所以基本也是按照better、faster、stronger這三部分介紹。

YOLO v2: At 67 FPS, YOLOv2 gets 76.8 mAP on VOC 2007. At 40 FPS, YOLOv2 gets 78.6 mAP, outperforming state-of-the-art methods like Faster RCNN with ResNet and SSD while still running significantly faster.

YOLO9000: YOLO9000 gets 19.7 mAP on the ImageNet detection validation set despite only having detection data for 44 of the 200 classes. On the 156 classes not in COCO, YOLO9000 gets 16.0 mAP. But YOLO can detect more than just 200 classes; it predicts detections for more than 9000 different object categories. And it still runs in real-time.

1、better

針對YOLO v1,提高 recall,提升定位的準確度,並保持分類的準確度。

目前計算機視覺的趨勢是更大更深的網路,更好的效能表現通常依賴於訓練更大的網路或者把多種模型綜合到一起。但是 YOLO v2 則著力於簡化網路。

以下是論文給出的改進方法:

在這裡插入圖片描述

下面具體闡述每一種策略:

Batch Normalization

沒啥好說的,添加了BN層,使 mAP 提高了 2%。

High Resolution Classifier

調整輸入資料的解析度。原先yolo在預訓練時的輸入是224224的,然後在檢測時採用448448的輸入,這樣導致從分類模型切換到檢測模型時,模型要適應影象解析度的改變。yolo v2這裡使用448*448的輸入對分類網路進行finetune,訓練10個epoch,給網路調整的時間以在高解析度上有好的結果。然後再finetune這個結果進行檢測。最後可以提高近4%的mAP。

Convolutional With Anchor Boxes

yolo v1直接使用全連線層進行預測bounding box的座標,yolo v2借鑑faster rcnn的思想,引入anchor。先說結論:雖然加入anchor使得mAP值下降了一點(69.5降到69.2),但是提高了recall(81%提高到88%)。

  • 將全連線層和最後一pooling層去掉,使得最後得到的feature map有更高的解析度;
  • 縮減網路,使用416416輸入代替448448。(這裡引用部落格的解釋:原因:希望最後得到的feature map的高和寬是奇數,這種將feature map劃分cell時,必然只有一箇中心cell。只有一個center cell的好處是,大的object一般會佔據影象的中心,所以希望用一個center cell去預測,而不是4個center cell去預測。網路最終將416416的輸入變成1313大小的feature map輸出,也就是縮小比例為32)

我們知道原來的YOLO演算法將輸入影象分成7x7的網格,每個網格預測兩個bounding box,因此一共只有98個box,但是在YOLOv2通過引入anchor boxes,預測的box數量超過了1千(以輸出feature map大小為13x13為例,每個grid cell有9個anchor box的話,一共就是13x13x9=1521個,當然由後面第4點可知,最終每個grid cell選擇5個anchor box)。順便提一下在Faster RCNN在輸入大小為1000x600時的boxes數量大概是6000,在SSD300中boxes數量是8732。顯然增加box數量是為了提高object的定位準確率。

Dimension Clusters

在Faster R-CNN中anchor box的大小和比例是根據人工經驗設定的。但如果選擇合適尺寸的anchor box,可以幫助網路更好地預測detection。因此採用k-means的方式對訓練集的bounding boxes做聚類,試圖找到合適的anchor box。

如果用標準的歐式距離的 k-means,尺寸大的框比小框產生更多的錯誤。因為我們的目的是提高 IOU 分數,希望誤差與box的尺寸大小沒有關係,因此重新定義以下距離函式:

在這裡插入圖片描述

下圖中,左圖是不同聚類簇個數下的平均iou,分別是coco和voc資料集,在分析模型複雜度和recall後,選擇K=5。右圖是兩個資料集聚類中心,大多是高瘦型的anchor

在這裡插入圖片描述

下表中,說明用 K-means 選擇 Anchor Boxes 時,當 Cluster IOU 選擇值為 5 時,AVG IOU 的值是 61,這個值要比不用聚類的方法faster rcnn的 60.9 要高。選擇值為 9 的時候,AVG IOU 達到了67.2。聚類的效果還是很明顯的。

在這裡插入圖片描述

Direct location prediction

當使用anchor box時,模型訓練會很不穩定,這種不穩定大部分是由於預測box的(x,y)位置。在使用proposal region的目標檢測方法時,是通過預測下圖公式中的tx\ty來計算x\y,其中tx\ty為偏置,xa\ya為anchor的座標,wa\ha為anchor的寬高。

在這裡插入圖片描述

作者舉例,當tx=1時,使得box沿著寬向右偏移,tx=-1,使得box向左偏移。

yolo v2並沒有採用預測偏置的方式,而是延續yolo v1中直接採用預測相對於grid cell的座標位置。這使得ground Truth 的值介於 0 到 1 之間。為了讓網路的結果能落在這一範圍內,使用 Logistic Activation 來對於網路預測結果進行限制。

網路對每個cell預測5個bounding box,對每個bounding box預測5個座標,tx\ty\th\tw\to。如果這個cell偏離了影象中心的左上(cx,cy),並且先驗的bounding box的寬高為pw\ph,則預測為:

在這裡插入圖片描述

因此,作者得到結論,位置預測相對更容易一點,且網路訓練更穩定。使用維度聚類直接預測bounding box中心的定位,相對於其他版本的anchor,yolo提高了5%的mAP。

在這裡插入圖片描述

Fine-Grained Features

添加了一個passthrough layer。之前得到的yolo最後的feature map的大小為13,x13,這個尺寸對於檢測圖片中的大尺寸物體夠了,但是對小尺寸物體不太好。因此,yolo v2沒有采用什麼特徵金字塔的方式,而是加了一個passthrough layer,將之前的26x26 feature map相結合,即高低解析度特徵都有了。類似resnet中的Identity Mapping,將26x26x512 變成 13x13x2048,從而yolo v2提升了1%的mAP。

Multi-Scale Training

作者希望yolo v2能對不同尺寸的輸入有強魯棒性,因此提出multi-scale training,在訓練時不斷調整輸入資料的尺寸。每10個batch後,隨機選擇一個新的影象尺寸,由於下采樣的引數是32,這裡不同的尺寸大小選擇為32的倍數,即{320,352,…,608}。這樣網路對不同解析度的輸入有適應性,雖然大尺寸的輸入會增加執行時間,但小尺度的輸入執行時間比較少,所以總體來說,速度還可以,如下圖,不同size下準確率和速度的影響。

在這裡插入圖片描述

Further Experiments

一下就是在voc2012和coco資料集的比較結果。

在這裡插入圖片描述

在這裡插入圖片描述

2、faster

作者不僅想要得到高準確率,也要速度很快,希望能最大化yolo v2的效能。

大部分檢測框架都是使用vgg16作為基礎特徵提取器,vgg16確實很強大,但是其引數量過多。過去的yolo採用Googlenet架構,這個比vgg16要快,但是其準確率要稍微弱一點,對於224x224,其top5的準確率,yolo 過去的模型在ImageNet上只有88.0%,而vgg16是90.0%。

Darknet-19. 作者提出一個新的分類模型來作為yolo的基礎模型。這個模型建立在先前網路設計的基礎上。類似VGG,使用3x3卷積核,在每一次pooling後都兩倍通道數量。遵循network in network的工作,使用全域性平均池化,並且使用BN來正則模型,加快收斂。

Darknet-19只需要5.58 billion operation,包含19個卷積層和5個max pooling層,在ImageNet上取得了top-5的91.2%的準確率。

在這裡插入圖片描述

後面的兩部分就是訓練分類和訓練檢測的一些tricks。直接引用部落格

Training for classification.

  • 首選從頭開始訓練Darknet-19,資料集是ImageNet,訓練160個epoch,輸入影象的大小是224*224,初始學習率為0.1。另外在訓練的時候採用了標準的資料增加方式比如隨機裁剪,旋轉以及色度,亮度的調整等。
  • 再fine-tuning 網路,這時候採用448*448的輸入,引數的除了epoch和learning rate改變外,其他都沒變,這裡learning rate改為0.001,並訓練10個epoch。

結果表明fine-tuning後的top-1準確率為76.5%,top-5準確率為93.3%。

而如果按照原來的訓練方式,Darknet-19的top-1準確率是72.9%,top-5準確率為91.2%。

Training for detection. 在進行完訓練分類步驟後,就開始把網路移植到detection,並開始基於檢測的資料再進行fine-tuning。

  • 首先把最後一個卷積層去掉,然後新增3個33的卷積層,每個卷積層有1024個filter,而且每個後面都連線一個11的卷積層,11卷積的filter個數根據需要檢測的類來定。比如對於VOC資料,由於每個grid cell我們需要預測5個box,每個box有5個座標值和20個類別值,所以每個grid cell有125個filter(**與YOLOv1不同,在YOLOv1中每個grid cell有30個filter,還記得那個77*30的矩陣嗎,而且在YOLOv1中,類別概率是由grid cell來預測的,也就是說一個grid cell對應的兩個box的類別概率是一樣的,但是在YOLOv2中,類別概率是屬於box的,每個box對應一個類別概率,而不是由grid cell決定,因此這邊每個box對應25個預測值(5個座標加20個類別值),而在YOLOv1中一個grid cell的兩個box的20個類別值是一樣的**)。
  • 另外作者還提到將最後一個33512的卷積層和倒數第二個卷積層相連。最後作者在檢測資料集上fine tune這個預訓練模型160個epoch,學習率採用0.001,並且在第60和90epoch的時候將學習率除以10,weight decay採用0.0005。

3、stronger

好了,到了一個本人比較關心的地方了,yolo9000是如何檢測出9000多種目標的呢,這部分給出解釋。

目前檢測資料集的目標種類比較少,但是分類資料集種類比較大,因為yolo9000通過結果檢測和分類資料集來訓練一個可以檢測9000類目標的模型。

主要通過兩個方式實現:構造融合資料集,通過Wordtree實現;模型訓練問題,通過joint classification and detection實現。

以下正文:作者提出一個機制,在分類和檢測資料集上聯合訓練,使用檢測資料學習bounding box的座標預測和有無目標,使用分類資料來擴充套件檢測的種類數。

在訓練時,作者混合了檢測和分類資料。當網路遇到一個來自檢測資料集的輸入時,則把這些資料用完整的 YOLO v2 loss 功能反向傳播。當網路遇到一個來自分類資料集的輸入時,只用整個結構中分類部分的 loss 功能反向傳播。

這種方法帶來了一些挑戰,檢測資料集只有一些常見的目標和通用的標籤,如dog\boat。分類資料集的標籤更寬、更深。ImageNet含有100多個品種的狗,如 “Norfolk terrier”, “Yorkshire terrier”, and “Bedlington terrier”。如果想在這兩個資料集上訓練,需要用一個連貫的方式合併這些標籤。

大多數分類使用softmax層計算最終類別的概率分佈。使用了softmax就假設這些類別是互斥的,但是這給組合資料集帶來個問題,例如,你不希望結合ImageNet和coco資料集來使用模型,因為類別 “Norfolk terrier” and “dog” 不是完全互斥的。

但是我們可以使用multi-label來結合資料集,這不需要假設互斥。這種方法忽略了我們已知的資料結構,例如,所有coco類別都是互斥的。

Hierarchical classification. ImageNet標籤來自於Wordnet,一個語言資料庫,“Yorkshire terrier”是terrier的上義詞,terrier是hunting dog的一種,hunting dog是dog的一種,dog是canine的一種。大多數分類方法都假設標籤是一種扁平結構,但是對於結合資料集來說,結構恰恰是我們所需要的。

Wordnet是一種有向圖的結構,而不是樹結構。因為於洋是複雜的,dog是canine的一種,也是domestic animal的一種,他們都Wordnet中的同義詞。作者沒有使用整個圖結構,而是將問題簡化,通過從ImageNet概念中建立一個Hierarchical tree。

為了構建這個樹,作者檢測了ImageNet中的視覺名詞,並且檢視他們通過Wordnet圖到達根節點的路徑,在本例中是physical object。很多同義詞在圖中只有一條路徑,因此首先將這種路徑新增到tree中。然後檢測剩下的概念,並且儘可能的少新增路徑到tree中如果一個概念有兩條路徑到達根節點,一條路徑需要在tree中新增3條邊,另一個只需要1條,選擇短的那條。

如果要計算特定節點的絕對可能性,只需要遵循達到根節點的路徑,並乘以這些條件概率。例如,如果我們想知道,一幅圖中是否有Norfolk terrier,需要這樣計算,

在這裡插入圖片描述

為了分類,假設
在這裡插入圖片描述

為了驗證這個方法,作者在建立在1000個類別的ImageNet的wordtree上訓練了darknet-19模型。為了建立Wordtree1K,作者添加了所有中間節點,從1000擴充套件為1369。在訓練時,將groundtruth label銅鼓tree傳播,因此,如果一個影象被標記為Norfolk terrier”,也會得到標記dog,mammal等。為了計算條件概率,模型預測一個1369值的向量,然後通過計算所有同義詞的softmax,這些同義詞是同一個概念的下位詞,如下圖所示。

在這裡插入圖片描述

使用與之前相同的訓練引數,hierarchical darknet-19實現71.9%的top1,90.5%的top5準確率。儘管添加了369個額外的概念,網路預測一個樹結構,準確率也只下降一點。以這種方式進行分類,也有一些好處。在一些新的或者未知的目標類別上效能下降比較優雅。例如,如果網路認識到這個圖中的狗,但不確定是那種狗,但它仍然高置信度的預測出了狗,但是下位詞的置信度要低一點。

這種計算同樣也適用於檢測。現在,不是假設每個影象都有一個目標,作者適用yolo v2目標檢測器,給定了Pr(physical object)這樣一個值。這個檢測器預測一個bounding box和樹可能性。然後通過遍歷樹,在每個分叉的節點,採用最高置信度的路徑,直達達到了某個閾值,我們就可以預測這個類別。

Dataset combination with WordTree. 我們可以使用Wordtree,以一種合理的方式結合多個數據集。只需要將資料集的類別對映到tree中的同義詞上。圖6展示了使用Wordtree的一個例子,將ImageNet和coco的label結合。Wordtree是極其多樣性的,因此這種方法可以就用在很多資料集上。

在這裡插入圖片描述

Joint classification and detection. 現在已經使用了Wordtree將資料集結合起來了,可以訓練分類和檢測的聯合模型了。我們先訓練一個極其大範圍的檢測器,因此我們使用coco檢測資料集和從整個ImageNet開放的前9000個類別。我們也需要驗證我們的方法,因此我們也添加了尚未儲存在ImageNet檢測比賽中的任何類。這使得最後的Wordtree有9418個類別。ImageNet是一個相當大的資料集,因此為了平衡資料集,需要對coco進行過取樣,這樣,ImageNet只會大4:1。

使用這個資料集,作者訓練了yolo9000。我們使用yolo v2的基礎架構,但是為了限制輸出的size,只使用3個priors而不是5。當網路看到一個檢測影象時,正常進行反向傳播損失。對於分類損失,我們只傳播與之想對應標籤的損失。例如,如果標籤是dog,我們會在tree中進一步預測error,如果是“German Shepherd” versus “Golden Retriever”,則不會,因為我們沒有這些資訊。

當網路看到一個分類影象時,我們只反向傳播分類損失。為了做到這點,我們只需要找到預測該類最高可能性的bounding box,然後計算預測tree的損失。我們假設,預測box與groundtruth label至少重疊0.3iou,基於這個假設反向傳播物件損失。

使用這個聯合訓練,yolo9000使用coco的檢測資料學習找到影象中的目標,使用ImageNet的資料學習分類更多樣性的目標。

我們在ImageNet 檢測任務上驗證了yolo9000。這個ImageNet的檢測任務與coco資料集共享了44個目標類別,因此這意味著yolo9000只見過測試影象中大多數的分類資料,而不是檢測資料。yolo9000最終得到19.7mAP,在156個未見過帶標籤的測試資料上,達到16.0mAP。這個mAP比DPM要高一點,但是Yolo9000是在不同資料集上訓練的,且只有部分監督。它也能實時檢測其他9000類目標類別。

我們在ImageNet上分析了yolo9000的效能,發現它可以很好的學習到新的動物種類,但是對學習衣服和裝飾等類別不太好。新的動物更容易被學習是因為目標預測從coco中的動物泛化的比較好。相反,coco中沒有任何衣服類別的bounding box label,僅限於人因為,yolo9000對訓練類別太陽鏡、泳褲等類別仍有難度。

下圖是yolo9000最好和最差的幾個類別。

在這裡插入圖片描述

4、conclusion

作者結束掃了yolo v2和yolo9000兩個實時檢測系統。yolo v2是目前在多種檢測資料集上均比其他檢測系統要快的state-of-the-art。進一步,它可以執行在不同size影象上,在速度和準確率上有一個平滑的過度。

yolo9000是一個通過聯合檢測和分類,可以實時檢測出超過9000類目標的框架。使用Wordtree融合不同源的資料,在ImageNet和coco上聯合優化技術訓練。yolo9000是很重要的一步,將檢測和分類之間的差距拉近。

我們的很多技術都可以泛化在目標檢測之外。我們對ImageNet的Wordtree的表示方法,對影象分類提供一種更豐富、更多細節的輸出空間。使用分級分類的資料集結合,在分類和分割領域都是有用的。像multi-scale訓練的這些訓練技術都可以對不同的任務提供好處。

未來工作,我們希望使用類似的方法可以用在弱監督的影象分割上,我們也計劃使用更強大的匹配策略,在訓練時為分類資料提高弱標籤,來提高檢測結果。計算機視覺是基於大量標註資料的。我們將繼續尋找方法,將不同源、不同結構的資料結合到一起,來得到視覺世界更強大的模型。