YOLOv2相對v1版本,在繼續保持處理速度的基礎上,從預測更準確(Better),速度更快(Faster),識別對象更多(Stronger)這三個方面進行了改進。其中識別更多對象也就是擴展到可以檢測9000種不一樣對象,稱之爲YOLO9000。算法
關於YOLO v1的內容,請參考 YOLO v1深刻理解。下面具體看下YOLO2都作了哪些改進。網絡
論文[1]中給出了下面的改進項目列表,列出各項改進對mAP的提高效果。函數
1)batch normalization(批歸一化)性能
批歸一化使mAP有2.4的提高。學習
批歸一化有助於解決反向傳播過程當中的梯度消失和梯度爆炸問題,下降對一些超參數(好比學習率、網絡參數的大小範圍、激活函數的選擇)的敏感性,而且每一個batch分別進行歸一化的時候,起到了必定的正則化效果(YOLO2再也不使用dropout),從而可以得到更好的收斂速度和收斂效果。測試
一般,一次訓練會輸入一批樣本(batch)進入神經網絡。批規一化在神經網絡的每一層,在網絡(線性變換)輸出後和激活函數(非線性變換)以前增長一個批歸一化層(BN),BN層進行以下變換:①對該批樣本的各特徵量(對於中間層來講,就是每個神經元)分別進行歸一化處理,分別使每一個特徵的數據分佈變換爲均值0,方差1。從而使得每一批訓練樣本在每一層都有相似的分佈。這一變換不須要引入額外的參數。②對上一步的輸出再作一次線性變換,假設上一步的輸出爲Z,則Z1=γZ + β。這裏γ、β是能夠訓練的參數。增長這一變換是由於上一步驟中強制改變了特徵數據的分佈,可能影響了原有數據的信息表達能力。增長的線性變換使其有機會恢復其本來的信息。this
關於批規一化的更多信息能夠參考 Batch Normalization原理與實戰。spa
2)使用高分辨率圖像微調分類模型.net
mAP提高了3.7。orm
圖像分類的訓練樣本不少,而標註了邊框的用於訓練對象檢測的樣本相比而言就比較少了,由於標註邊框的人工成本比較高。因此對象檢測模型一般都先用圖像分類樣本訓練卷積層,提取圖像特徵。但這引出的另外一個問題是,圖像分類樣本的分辨率不是很高。因此YOLO v1使用ImageNet的圖像分類樣本採用 224*224 做爲輸入,來訓練CNN卷積層。而後在訓練對象檢測時,檢測用的圖像樣本採用更高分辨率的 448*448 的圖像做爲輸入。但這樣切換對模型性能有必定影響。
因此YOLO2在採用 224*224 圖像進行分類模型預訓練後,再採用 448*448 的高分辨率樣本對分類模型進行微調(10個epoch),使網絡特徵逐漸適應 448*448 的分辨率。而後再使用 448*448 的檢測樣本進行訓練,緩解了分辨率忽然切換形成的影響。
3)採用先驗框(Anchor Boxes)
召回率大幅提高到88%,同時mAP輕微降低了0.2。
借鑑Faster RCNN的作法,YOLO2也嘗試採用先驗框(anchor)。在每一個grid預先設定一組不一樣大小和寬高比的邊框,來覆蓋整個圖像的不一樣位置和多種尺度,這些先驗框做爲預約義的候選區在神經網絡中將檢測其中是否存在對象,以及微調邊框的位置。
同時YOLO2移除了全鏈接層。另外去掉了一個池化層,使網絡卷積層輸出具備更高的分辨率。
以前YOLO1並無採用先驗框,而且每一個grid只預測兩個bounding box,整個圖像98個。YOLO2若是每一個grid採用9個先驗框,總共有13*13*9=1521個先驗框。因此,相對YOLO1的81%的召回率,YOLO2的召回率大幅提高到88%。同時mAP有0.2%的輕微降低。
不過YOLO2接着進一步對先驗框進行了改良。
4)聚類提取先驗框尺度
聚類提取先驗框尺度,結合下面的約束預測邊框的位置,使得mAP有4.8的提高。
以前先驗框都是手工設定的,YOLO2嘗試統計出更符合樣本中對象尺寸的先驗框,這樣就能夠減小網絡微調先驗框到實際位置的難度。YOLO2的作法是對訓練集中標註的邊框進行聚類分析,以尋找儘量匹配樣本的邊框尺寸。
聚類算法最重要的是選擇如何計算兩個邊框之間的「距離」,對於經常使用的歐式距離,大邊框會產生更大的偏差,但咱們關心的是邊框的IOU。因此,YOLO2在聚類時採用如下公式來計算兩個邊框之間的「距離」。
$$ d(box, centroid) = 1 - IOU(box, centroid) $$
centroid是聚類時被選做中心的邊框,box就是其它邊框,d就是二者間的「距離」。IOU越大,「距離」越近。YOLO2給出的聚類分析結果以下圖所示:
上圖左邊是選擇不一樣的聚類k值狀況下,獲得的k個centroid邊框,計算樣本中標註的邊框與各centroid的Avg IOU。顯然,邊框數k越多,Avg IOU越大。YOLO2選擇k=5做爲邊框數量與IOU的折中。對比手工選擇的先驗框,使用5個聚類框便可達到61 Avg IOU,至關於9個手工設置的先驗框60.9 Avg IOU。
上圖右邊顯示了5種聚類獲得的先驗框,VOC和COCO數據集略有差別,不過都有較多的瘦高形邊框。
5)約束預測邊框的位置
借鑑於Faster RCNN的先驗框方法,在訓練的早期階段,其位置預測容易不穩定。其位置預測公式爲:
$$ x=(t_x∗w_a)+x_a \\ y=(t_y∗h_a)+y_a $$
其中,
$x,y$是預測邊框的中心,
$x_a,y_a$是先驗框(anchor)的中心點座標,
$w_a,h_a$是先驗框(anchor)的寬和高,
$t_x,t_y$是要學習的參數。
注意,YOLO論文中寫的是$x=(t_x∗w_a)-x_a$,根據Faster RCNN,應該是"+"。
因爲$t_x,t_y$的取值沒有任何約束,所以預測邊框的中心可能出如今任何位置,訓練早期階段不容易穩定。YOLO調整了預測公式,將預測邊框的中心約束在特定gird網格內。
$$ b_x=σ(t_x)+c_x \\ b_y=σ(t_y)+c_y \\ b_w=p_we^{t_w} \\ b_h=p_he^{t_h} \\ Pr(object)∗IOU(b,object)=σ(t_o) $$
其中,
$b_x,b_y,b_w,b_h$是預測邊框的中心和寬高。
$Pr(object)∗IOU(b,object)$是預測邊框的置信度,YOLO1是直接預測置信度的值,這裏對預測參數$t_o$進行σ變換後做爲置信度的值。
$c_x,c_y$是當前網格左上角到圖像左上角的距離,要先將網格大小歸一化,即令一個網格的寬=1,高=1。
$p_w,p_h$是先驗框的寬和高。
σ是sigmoid函數。
$t_x,t_y,t_w,t_h,t_o$是要學習的參數,分別用於預測邊框的中心和寬高,以及置信度。
參考上圖,因爲σ函數將$t_x,t_y$約束在(0,1)範圍內,因此根據上面的計算公式,預測邊框的藍色中心點被約束在藍色背景的網格內。約束邊框位置使得模型更容易學習,且預測更爲穩定。
6)passthrough層檢測細粒度特徵
passthrough層檢測細粒度特徵使mAP提高1。
對象檢測面臨的一個問題是圖像中對象會有大有小,輸入圖像通過多層網絡提取特徵,最後輸出的特徵圖中(好比YOLO2中輸入416*416通過卷積網絡下采樣最後輸出是13*13),較小的對象可能特徵已經不明顯甚至被忽略掉了。爲了更好的檢測出一些比較小的對象,最後輸出的特徵圖須要保留一些更細節的信息。
YOLO2引入一種稱爲passthrough層的方法在特徵圖中保留一些細節信息。具體來講,就是在最後一個pooling以前,特徵圖的大小是26*26*512,將其1拆4,直接傳遞(passthrough)到pooling後(而且又通過一組卷積)的特徵圖,二者疊加到一塊兒做爲輸出的特徵圖。
具體怎樣1拆4,下面借用參考文章[3]中的一副圖看的很清楚。圖中示例的是1個4*4拆成4個2*2。由於深度不變,因此沒有畫出來。
另外,根據YOLO2的代碼,特徵圖先用1*1卷積從 26*26*512 降維到 26*26*64,再作1拆4並passthrough。下面圖6有更詳細的網絡輸入輸出結構。
7)多尺度圖像訓練
多尺度圖像訓練對mAP有1.4的提高。
由於去掉了全鏈接層,YOLO2能夠輸入任何尺寸的圖像。由於整個網絡下采樣倍數是32,做者採用了{320,352,...,608}等10種輸入圖像的尺寸,這些尺寸的輸入圖像對應輸出的特徵圖寬和高是{10,11,...19}。訓練時每10個batch就隨機更換一種尺寸,使網絡可以適應各類大小的對象檢測。
8)高分辨率圖像的對象檢測
圖1表格中最後一行有個hi-res detector,使mAP提升了1.8。由於YOLO2調整網絡結構後可以支持多種尺寸的輸入圖像。一般是使用416*416的輸入圖像,若是用較高分辨率的輸入圖像,好比544*544,則mAP能夠達到78.6,有1.8的提高。
爲了進一步提高速度,YOLO2提出了Darknet-19(有19個卷積層和5個MaxPooling層)網絡結構。DarkNet-19比VGG-16小一些,精度不弱於VGG-16,但浮點運算量減小到約1/5,以保證更快的運算速度。
YOLO2的訓練主要包括三個階段。第一階段就是先在ImageNet分類數據集上預訓練Darknet-19,此時模型輸入爲 224*224 ,共訓練160個epochs。而後第二階段將網絡的輸入調整爲 448*448 ,繼續在ImageNet數據集上finetune分類模型,訓練10個epochs,此時分類模型的top-1準確度爲76.5%,而top-5準確度爲93.3%。第三個階段就是修改Darknet-19分類模型爲檢測模型,移除最後一個卷積層、global avgpooling層以及softmax層,而且新增了三個 3*3*1024卷積層,同時增長了一個passthrough層,最後使用 1*1 卷積層輸出預測結果,輸出的channels數爲:num_anchors*(5+num_classes) ,和訓練採用的數據集有關係。因爲anchors數爲5,對於VOC數據集(20種分類對象)輸出的channels數就是125,最終的預測矩陣T的shape爲 (batch_size, 13, 13, 125),能夠先將其reshape爲 (batch_size, 13, 13, 5, 25) ,其中 T[:, :, :, :, 0:4] 爲邊界框的位置和大小 $(t_x, t_y, t_w, t_h)$,T[:, :, :, :, 4] 爲邊界框的置信度,而 T[:, :, :, :, 5:] 爲類別預測值。
對象檢測模型各層的結構以下(參考文章[4]):
看一下passthrough層。圖中第25層route 16,意思是來自16層的output,即26*26*512,這是passthrough層的來源(細粒度特徵)。第26層1*1卷積下降通道數,從512下降到64(這一點論文在討論passthrough的時候沒有提到),輸出26*26*64。第27層進行拆分(passthrough層)操做,1拆4分紅13*13*256。第28層疊加27層和24層的輸出,獲得13*13*1280。後面再通過3*3卷積和1*1卷積,最後輸出13*13*125。
綜上所述,雖然YOLO2作出了一些改進,但總的來講網絡結構依然很簡單。就是一些卷積+pooling,從416*416*3 變換到 13*13*5*25。稍微大一點的變化是增長了batch normalization,增長了一個passthrough層,去掉了全鏈接層,以及採用了5個先驗框。
對比YOLO1的輸出張量,YOLO2的主要變化就是會輸出5個先驗框,且每一個先驗框都會嘗試預測一個對象。輸出的 13*13*5*25 張量中,25維向量包含 20個對象的分類機率+4個邊框座標+1個邊框置信度。
偏差依然包括邊框位置偏差、置信度偏差、對象分類偏差。
公式中:
$1_{Max IOU<Thresh}$意思是預測邊框中,與真實對象邊框IOU最大的那個,其IOU<閾值Thresh,此係數爲1,即計入偏差,不然爲0,不計入偏差。YOLO2使用Thresh=0.6。
$1_{t<128000}$意思是前128000次迭代計入偏差。注意這裏是與先驗框的偏差,而不是與真實對象邊框的偏差。多是爲了在訓練早期使模型更快學會先預測先驗框的位置。
$1_{k}^{truth}$意思是該邊框負責預測一個真實對象(邊框內有對象)。
各類$\lambda$是不一樣類型偏差的調節係數。
VOC數據集能夠檢測20種對象,但實際上對象的種類很是多,只是缺乏相應的用於對象檢測的訓練樣本。YOLO2嘗試利用ImageNet很是大量的分類樣本,聯合COCO的對象檢測數據集一塊兒訓練,使得YOLO2即便沒有學過不少對象的檢測樣本,也能檢測出這些對象。
基本的思路是,若是是檢測樣本,訓練時其Loss包括分類偏差和定位偏差,若是是分類樣本,則Loss只包括分類偏差。
1)構建WordTree
要檢測更多對象,好比從原來的VOC的20種對象,擴展到ImageNet的9000種對象。簡單來想的話,好像把原來輸出20維的softmax改爲9000維的softmax就能夠了,可是,ImageNet的對象類別與COCO的對象類別不是互斥的。好比COCO對象類別有「狗」,而ImageNet細分紅100多個品種的狗,狗與100多個狗的品種是包含關係,而不是互斥關係。一個Norfolk terrier同時也是dog,這樣就不適合用單個softmax來作對象分類,而是要採用一種多標籤分類模型。
YOLO2因而根據WordNet[5],將ImageNet和COCO中的名詞對象一塊兒構建了一個WordTree,以physical object爲根節點,各名詞依據相互間的關係構建樹枝、樹葉,節點間的鏈接表達了對象概念之間的蘊含關係(上位/下位關係)。
整個WordTree中的對象之間不是互斥的關係,但對於單個節點,屬於它的全部子節點之間是互斥關係。好比terrier節點之下的Norfolk terrier、Yorkshire terrier、Bedlington terrier等,各品種的terrier之間是互斥的,因此計算上能夠進行softmax操做。上面圖10只畫出了3個softmax做爲示意,實際中每一個節點下的全部子節點都會進行softmax。
2)WordTree的構建方法。
構建好的WordTree有9418個節點(對象類型),包括ImageNet的Top 9000個對象,COCO對象,以及ImageNet對象檢測挑戰數據集中的對象,以及爲了添加這些對象,從WordNet路徑中提取出的中間對象。
構建WordTree的步驟是:①檢查每個將用於訓練和測試的ImageNet和COCO對象,在WordNet中找到對應的節點,若是該節點到WordTree根節點(physical object)的路徑只有一條(大部分對象都只有一條路徑),就將該路徑添加到WrodTree。②通過上面操做後,剩下的是存在多條路徑的對象。對每一個對象,檢查其額外路徑長度(將其添加到已有的WordTree中所需的路徑長度),選擇最短的路徑添加到WordTree。這樣就構造好了整個WordTree。
3)WordTree如何表達對象的類別
以前對象互斥的狀況下,用一個n維向量(n是預測對象的類別數)就能夠表達一個對象(預測對象的那一維數值接近1,其它維數值接近0)。如今變成WordTree,如何表達一個對象呢?若是也是n維向量(這裏WordTree有9418個節點(對象),即9418維向量),使預測的對象那一位爲1,其它維都爲0,這樣的形式依然是互斥關係,這樣是不合理的。合理的向量應該可以體現對象之間的蘊含關係。
好比一個樣本圖像,其標籤是是"dog",那麼顯然dog節點的機率應該是1,而後,dog屬於mammal,天然mammal的機率也是1,......一直沿路徑向上到根節點physical object,全部通過的節點其機率都是1。參考上面圖10,紅色框內的節點機率都是1,其它節點機率爲0。另外一個樣本假如標籤是"Norfolk terrier",則從"Norfolk terrier"直到根節點的全部節點機率爲1(圖10中黃色框內的節點),其它節點機率爲0。
因此,一個WordTree對應且僅對應一個對象,不過該對象節點到根節點的全部節點機率都是1,體現出對象之間的蘊含關係,而其它節點機率是0。
4)預測時如何肯定一個WordTree所對應的對象
上面講到訓練時,有標籤的樣本對應的WordTree中,該對象節點到根節點的全部節點機率都是1,其它節點機率是0。那麼用於預測時,如何根據WordTree各節點的機率值來肯定其對應的對象呢?
根據訓練標籤的設置,其實模型學習的是各節點的條件機率。好比咱們看WordTree(圖10)中的一小段。假設一個樣本標籤是dog,那麼dog=1,父節點mammal=1,同級節點cat=0,即P(dog|mammal)=1,P(cat|mammal)=0。
既然各節點預測的是條件機率,那麼一個節點的絕對機率就是它到根節點路徑上全部條件機率的乘積。好比
P(Norfolk terrier) = P(Norfolk terrier|terrier) * P(terrier|hunting dog) * P(hunting dog|dog) *......* P(animal|physical object) * P(physical object)
對於分類的計算,P(physical object) = 1。
不過,爲了計算簡便,實際中並不計算出全部節點的絕對機率。而是採用一種比較貪婪的算法。從根節點開始向下遍歷,對每個節點,在它的全部子節點中,選擇機率最大的那個(一個節點下面的全部子節點是互斥的),一直向下遍歷直到某個節點的子節點機率低於設定的閾值(意味着很難肯定它的下一層對象究竟是哪一個),或達到葉子節點,那麼該節點就是該WordTree對應的對象。
5)分類和檢測聯合訓練
因爲ImageNet樣本比COCO多得多,因此對COCO樣本會多作一些採樣(oversampling),適當平衡一下樣本數量,使二者樣本數量比爲4:1。
YOLO9000依然採用YOLO2的網絡結構,不過5個先驗框減小到3個先驗框,以減小計算量。YOLO2的輸出是13*13*5*(4+1+20),如今YOLO9000的輸出是13*13*3*(4+1+9418)。假設輸入是416*416*3。
因爲對象分類改爲WordTree的形式,相應的偏差計算也須要一些調整。對一個檢測樣本,其分類偏差只包含該標籤節點以及到根節點的全部節點的偏差。好比一個樣本的標籤是dog,那麼dog往上標籤都是1,但dog往下就很差設置了。由於這個dog其實必然也是某種具體的dog,假設它是一個Norfolk terrier,那麼最符合實際的設置是從Norfolk terrier到根節點的標籤都是1。可是由於樣本沒有告訴咱們這是一個Norfolk terrier,只是說一個dog,那麼從dog如下的標籤就無法肯定了。
對於分類樣本,則只計算分類偏差。YOLO9000總共會輸出13*13*3=507個預測框(預測對象),計算它們對樣本標籤的預測機率,選擇機率最大的那個框負責預測該樣本的對象,即計算其WrodTree的偏差。
另外論文中還有一句話,"We also assume that the predicted box overlaps what would be the ground truth label by at least .3 IOU and we backpropagate objectness loss based on this assumption."。感受意思是其它那些邊框,選擇其中預測置信度>0.3的邊框,做爲分類的負樣本(objectness)。即這些邊框不該該有那麼高的置信度來預測該樣本對象。具體的就要看下代碼了。
總的來講,YOLO2經過一些改進明顯提高了預測準確性,同時繼續保持其運行速度快的優點。YOLO9000則開創性的提出聯合使用分類樣本和檢測樣本的訓練方法,使對象檢測可以擴展到缺少檢測樣本的對象。
最後,若是你居然堅持看到這裏,以爲還有所幫助的話,請點個贊:)๑۩۞۩๑
[1]YOLO9000: Better, Faster, Stronger
[2]Batch Normalization原理與實戰
[3]目標檢測|YOLOv2原理與實現(附YOLOv3)
[4]YOLO9000: Better, Faster, Stronger
[5]WordNet
[6]YOLO v1深刻理解