YOLO V2
YOLO V2是在YOLO的基礎上,融合了其他一些網絡結構的特性(比如:Faster R-CNN的Anchor,GooLeNet的\(1\times1\)卷積核等),進行的升級。其目的是彌補YOLO的兩個缺陷:
- YOLO中的大量的定位錯誤
- 和基於區域推薦的目標檢測算法相比,YOLO的召回率(Recall)較低。
YOLO V2的目標是:在保持YOLO分類精度的同時,提高目標定位的精度以及召回率。其論文地址:
YOLO 9000:Better,Faster,Stronger。
YOLO論文的名稱總是如此的直抒胸臆,
- Better 指的是和YOLO相比,YOLO V2有更好的精度
- Faster 指的是修改了網絡結構,其檢測更快
- Stronger 指的就是YOLO 9000,使用聯合訓練的方法,同時使用目標檢測和圖像分類的數據集,訓練YOLO V2,訓練出來的模型能夠實時的識別多達9000種目標,所以也稱為YOLO9000。
Better
這部分主要是改進YOLO的兩個缺點:
- 定位不精確
- 召回率較低(和基於候選區域的方法相比)
YOLO V2種並沒有加深或者加寬網絡結構,反而簡化了網絡(faster)。
-
Batch Normalization
這個是CNN網絡通用的方法了,不但能夠改善網絡的收斂性,而且能夠抑制過擬合,有正則化的作用。 -
High Resolution Classifier
相比圖像的分類任務,目標檢測需要更高的圖像分辨率。而為了提取圖像的特征,目標檢測網絡的提取特征部分,通常要在ImageNet數據集上進行預訓練。從AlexNet結構開始,大多數分類的網絡的輸入圖像都小於\(256 \times 256\),在YOLO中,使用\(224 \times 224\)的圖像進行預訓練,但是在目標檢測的網絡中使用\(448 \times 448\)的圖像進行訓練。這樣就意味着,從用於分類的特征提取模型切換到目標檢測網絡,還需要適應這種圖像分辨率的改變。
在YOLO V2中對此進行了改變了,使用ImageNet數據集,首先使用\(224 \times 224\)的分辨率訓練160個epochs,然后調整為\(448 \times 448\)在訓練10個epochs。
Convolutional With Anchor Boxes
在YOLO中在最后網絡的全連接層直接預測目標邊框的坐標,在YOLO V2中借鑒 Fast R-CNN中的Anchor的思想。
- 去掉了YOLO網絡的全連接層和最后的池化層,使提取特征的網絡能夠得到更高分辨率的特征。
- 使用\(416 \times 416\)代替\(448 \times 448\)作為網絡的輸入。這是因為希望得到的特征圖的尺寸為奇數。奇數大小的寬和高會使得每個特征圖在划分cell的時候就只有一個center cell(比如可以划分成77或99個cell,center cell只有一個,如果划分成88或1010的,center cell就有4個)。為什么希望只有一個center cell呢?因為大的object一般會占據圖像的中心,所以希望用一個center cell去預測,而不是4個center cell去預測。網絡最終將416416的輸入變成1313大小的feature map輸出,也就是縮小比例為32。(5個池化層,每個池化層將輸入的尺寸縮小1/2)。
- Anchor Boxes 在YOLO中,每個grid cell只預測兩個bbox,最終只能預測98個bbox(\(7\times 7\times 2=98\)),而在Faster RCNN在輸入大小為\(1000\times 600\)時的boxes數量大概是6000,在SSD300中boxes數量是8732。顯然增加box數量是為了提高object的定位准確率。 過少的bbox顯然影響了YOLO的定位的精度,在YOLO V2中引入了Anchor Boxes的思想,其預測的bbox則會超過千個(以輸出的feature map為\(13 \times 13\)為例,每個grid cell有9個anchor box的話,其預測的bbox數量為\(13 \times 13 \times 9 = 1521\)個)。
Dimension Clusters
YOLO V2中引入了Faster R-CNN思想,但是讓大佬單純的使用別人的想法而不加以改進是不可能的。在Faster R-CNN中每個Anchor box的大小以及形狀是預先設定好的,然后在網絡種通過邊框回歸來調整每個Anchor Box的邊框。但是,如果開始就選擇好的邊框(Faster R-CNN中的邊框是手工設計的,3種大小,3種形狀共9種),那么網絡肯定能更好的預測。
YOLO 作者使用據類的思想,對訓練集能夠生成的所有Anchor box做聚類,以此來找到合適的預設的Anchor box.另外作者發現如果采用標准的k-means(即用歐式距離來衡量差異),在box的尺寸比較大的時候其誤差也更大,而我們希望的是誤差和box的尺寸沒有太大關系。所以通過IOU定義了如下的距離函數,使得誤差和box的大小無關,故使用如下的距離度量
也就是針對同一個grid cell,其將IOU相近的聚到一起,如下圖
左邊表示選擇不同聚類中心的\(K\)和平均IOU的關系,不同曲線表示兩種數據集:2007 VOC 和COCO。 YOLO V2選擇了\(K=2\),在模型的復雜度和召回率之間做個平衡。 右邊5種紫框和黑色的邊框表示兩種數據集下,最終聚類選擇的5中bbox的形狀和大小,從圖看出兩種數據集的形狀類似大小相近。圖中也可以看出,一個的大的bbox差不多是正方形,另外3個是高瘦的形狀,最后一個則是矮胖的形狀,這和Faster R-CNN手動選擇的9種形狀還是有所不同的。
Direct location prediction
解決了每個Grid Cell生成的bounding box的個數問題,直接按照Faster R-CNN的方法,又遇到了第二個問題:模型不穩定,特別是在早期的迭代中,而這種不穩定是由於預測box的位置\((x,y)\)引起的。在區域推薦的方法中,其網絡學習的結果\((tx,ty)\)bbox的中心位置相對於ground truth的中尉\((x,y)\)的平移量,如候選區域的bbox的中心為\((x_p,y_p)\),寬和高為\((w_p,h_p)\),則有如下的等式
這種位置的平移是沒有任何限制的,例如,\(t_x = 1\),則將bbox在\(x\)軸向右移動\(w_p\);\(t_x = -1\)則將其向左移動\(w_p\)。也是說,不管初始的bbox在圖像的什么位置,通過預測偏移量可以將bbox移動到圖像的任何位置。對於YOLO V2這種隨機初始化bbox的位置,需要訓練很久的一段時間才能學習到平移量的合適的值。
基於候選區域的R-CNN 其初始的bbox並不是隨機的,而是通過RPN網絡生成的。
YOLO V2中沒有使用候選區域的直接預測偏移量,而是沿用YOLO的方法,預測位置相對於當前grid cell的偏移量。YOLO V2網絡最后輸出的特征層為\(13 \times 13\),然后每個cell生成5個bbox,針對每個bbox得到5個值\((t_x,t_y,t_w,t_h,t_o)\),\((t_x,t_y)\)表示bbox中心相對於grid cell左上角的偏移,並且將其平移量限制在一個grid cell內,使用\(sigmoid\)函數處理處理偏移值,將其限制在\((0,1)\)范圍內(每個grid cell的尺度看做1)。所以得到下面的公式
其中,\((C_x,C_y)\)為當前grid cell相對於圖像的左上角的距離,以grid cell的個數為單位。\(p_w,p_h\)為為先驗框的寬和高。
如下圖,
\((C_x,C_y)\)為當前grid cell相對於圖像的左上角的距離,以grid cell為單位,則當前cell的左上角坐標為\((1,1)\);\(p_w,p_h\)為為先驗框的寬和高,其值也是相對於特征圖的大小,在特征都中每個cell的大小為1。這里記特征圖的大小為\((W,H)\)(YOLO V2為\((13,13)\)),這樣就可以將邊框相對於圖像的大小和位置計算出來
在將上面得到的\(b_x,b_y,b_w,b_H\)乘以圖像的寬和高(像素為單位)就可以求得邊框在圖像的位置。
例如,假如預測輸出的值\((t_x,t_y,t_w,t_h) = (0.2,0.1,0.2,0.32)\);當前cell的相對於特征圖左上角的坐標為\((1,1)\),Anchor box預設的寬和高為\(p_w = 3.19275,p_h = 4.00944\),則有
上面的計算的距離都是相對於\(13 \times 13\)的特征圖而言的,其單位為grid cell的邊長。 YOLO V2輸入的圖像尺寸為\(416 \times 416\),則每個grid cell的邊長為\(416 / 13 = 32\),將上述位置換算到以像素為單位
這樣就得到了一個在原圖上以\((38.4,35.2)\)為中心,寬高為\((124.78,176.68)\)的邊框。
Fine-Grained Features
YOLO V2是在\(13 \times 13\)的特征圖上做檢測,這對於一些大的目標是足夠了,但是對於小目標則需要更寫細粒度的特征。 Faser R-CNN和SSD都在不同層次的特征圖上產生區域建議(SSD直接就可看得出來這一點),獲得了多尺度的適應性,YOLO V2則使用了一種不同的方法,添加要給轉移層(passthrough layer),該層將淺層的特征圖(\(26 \times 26\))連接到最終使用的深層特征度(#13 \times 13$)。
這個轉移層有點類似ResNet的dentity mappings結構,將淺層和深層兩種不同尺寸的特征連接起來,將\(26 \times 26 \times 512\)的特征圖和\(13 \times 13 \times 1024\)的特征圖連接起來。passthrough layer,具體來說就是特征重排(不涉及到參數學習),\(26 \times 26 \times 512\)的特征使用按行和按列隔行采樣的方法,就可以得到4個新的特征圖,維度都是\(13 \times 13 \times 512\)的特征,然后做concat操作,得到\(13 \times 13 \times 2048\)的特征圖,將其拼接到后面\(13 \times 13 \times1024\)得到\(13 \times 13 \times 3072\)的特征圖,相當於做了一次特征融合,有利於檢測小目標。下圖是passthrough layer的一個實例
Multi-Scale Training
YOLO中使用\(448\times448\)作為輸入,而且由於使用了全連接層,無法改變輸入的圖像的大小;在 YOLO V2中將全連接層替換為了卷積層,也就是說只有卷積層和池化層,這樣就可以處理任意尺寸的圖像。為了應對不同尺寸的圖像,YOLO V2中在訓練的時候使用不同的尺寸圖像。
YOLO V2在訓練的時候每經過幾輪(每經過10epochs)迭代后就會微調網絡,隨機選擇新的圖片尺寸。YOLO網絡使用的降采樣參數為32,那么就使用32的倍數進行尺度\(\{320,352,\cdots,608\}\)。最終最小的尺寸為\(320 \times 320\),最大的尺寸為\(608 \times 608\)。
Summary
YOLO V2針對YOLO定位不准確以及召回率低的問題,進行一些改變。 主要是借鑒Faster R-CNN的思想,引入了Anchor box。並且使用k-means的方法,通過聚類得到每個Anchor應該生成的Anchor box的的大小和形狀。為了是提取到的特征有更細的粒度,其網絡中借鑒ResNet的思想,將淺層的高分辨率特征和深層的特征進行了融合,這樣能夠更好的檢測小的目標。 最后,由於YOLO V2的網絡是全卷積網絡,能夠處理任意尺寸的圖像,在訓練的時候使用不同尺度的圖像,以應對圖像尺寸的變換。
Faster
大多數檢測網絡有賴於VGG-16作為特征提取部分,VGG-16的確是一個強大而准確的分類網絡,相應的其計算量也是巨大的。 YOLO V2中使用基於GoogLeNet的網絡結構Darknet-19,在損失一些精度的情況下,大大的提高運算速度。
Darknet-19作為YOLO V2的特征提取網絡,參考了一些其他的網絡結構的經驗
- VGG,使用了較多的\(3\times3\)卷積核,在每一次池化操作后把通道數翻倍。
- GoogLeNet的network in network的思想,網絡使用了全局平均池化(global average pooling),把\(1\times1\)的卷積核置於\(3\times3\)的卷積核之間,用來壓縮特征。
- 使用batch normalization穩定模型訓練,抑制過擬合
最終得出的基礎模型就是Darknet-19,如下圖,其包含19個卷積層、5個最大值池化層(maxpooling layers ),下圖展示網絡具體結構。Darknet-19在ImageNet圖片分類top-1准確率72.9%,top-5准確率91.2%
上述的網絡結構是用於ImageNet的預訓練網絡,其輸入的是\(224\times224\)(最后幾輪調整為\(448 \times 448\))。在ImageNet預訓練完成后,需要調整上面的網絡結構:去掉最后的卷積層,添加三個\(3 \times 3 \times 1024\)的卷積層,且在這三個卷積層的每個后面添加\(1 \times 1\)的卷積層。 在檢測的時,輸入的是\(416 \times 416\),通過了5個池化層的降維,在最后的卷積層 輸出的特征為\(13 \times 13 \times 1024\)。 前面提到,為了得到更細粒度的特征,添加了passthrough layer,將淺層的\(26 \times 26 \times 512\)(是輸入到最后一個池化層前的特征)融合到最終輸出的\(13 \times 13 \times 1024\),作為最終用於檢測的特征\(13 \times 13 \3072\)。
用於的檢測的cell有$13 \times 13 \(,每個cell要生成的5個bbox,每個bbox需要預測其位置和置信度\)(t_x,t_y,t_w,t_h,t_0)$以及其每個類別的概率20個,所以最終輸出為\(13 \times 13 \times 5 \times (5 + 20) = 13 \times 13 \times 125\).
Stroner YOLO9000
YOLO9000是在YOLOv2的基礎上提出的一種可以檢測超過9000個類別的模型,其主要貢獻點在於提出了一種分類和檢測的聯合訓練策略。眾多周知,檢測數據集的標注要比分類數據集打標簽繁瑣的多,所以ImageNet分類數據集比VOC等檢測數據集高出幾個數量級。在YOLO中,邊界框的預測其實並不依賴於物體的標簽,所以YOLO可以實現在分類和檢測數據集上的聯合訓練。對於檢測數據集,可以用來學習預測物體的邊界框、置信度以及為物體分類,而對於分類數據集可以僅用來學習分類,但是其可以大大擴充模型所能檢測的物體種類。
summary
YOLO V2在YOLO主要的改動就是,引入了Anchor box以及修改了其用於特征提取的網絡,在檢測時去掉了全連接層,整個網絡全部使用卷積層。
YOLO V3
YOLO作者對 YOLO V2做了一些小的改動。主要以下兩個方面:
- 使用殘差模型,構建更深的特征提取網絡
- 使用FPN架構(Feature Pyramid Networks for Object Detection)來實現多尺度檢測
Darkent-53
YOLO V3特征提取網絡使用了殘差模型,相比YOLO V2使用的Darknet-19,其包含53個卷積層所以稱為Darknet-53.其網絡結構如下圖
Darknet-53在ImageNet數據集上的性能
和ResNet相比,其速度快了很多,精度卻相差不大。
多尺度預測
采用FPN架構(Feature Pyramid Networks for Object Detection)來實現多尺度檢測,如下圖
YOLOv3采用了3個尺度的特征圖(當輸入為\(416 \times 416\)時):\((13\times 13),(26\times 26),(52\times 52)\),YOLOv3每個位置使用3個先驗框,所以使用k-means得到9個先驗框,並將其划分到3個尺度特征圖上,尺度更大的特征圖使用更小的先驗框。
summary
大體學習了下YOLO系列的目標檢測,但是其中的一些細節還不是很明了,需要結合代碼實現了。