這是一個閱讀筆記,主要用于記錄在閱讀經典的目標檢測模型論文過程中,得出的總結和思考。并不詳細介紹每個模型,主要總結每個模型的優缺點。其中可能存在錯誤的理解,僅供參考哈。
1. R-CNN(2013-11)
1.1 優點:
成功將CNN分類網絡用于目標檢測任務,這是第一個比較成功的基于深度網絡的two-stage目標檢測器。
1.2 缺點:
整條檢測流水線由以下環節組成:
- 區域建議(selective search)階段;
- 特征提取階段(CNN網絡+全連接層);
- 分類和回歸階段(SVM分類器+包圍框回歸)。
流水線過于復雜。每個環節都需要進行單獨優化,會造成整體次優化效果。
graph TD
A[輸入圖像]-->B[區域建議生成]
B-->C[2000個候選區域]
C-->D[卷積層+全連接層]
D-->F[2000個候選區域特征向量]
F-->G[SVM分類]
F-->H[包圍框回歸]
G-->I[檢測結果]
H-->I[檢測結果]
- 每個區域建議框都要經過一次CNN網絡,2000個建議框要進行2000次卷積特征提取,計算量巨大。
因為全連接層需要固定長度的特征向量。
1.3 參考資料
2. SPP-Net(2014-6)
2.1 優點:
引入了空間金字塔池化層(spatial pyramid pooling layer),加速了區域建議特征的提取速度,整張圖片只需進行一次CNN前向傳播,根據建議框的坐標信息結合原始圖像和特征圖的步長因子,就可以得到每個區域建議的特征圖。
由于每張區域建議的特征圖尺寸大小不一,為了得到固定長度的特征向量喂給全連接層,論文使用了空間金字塔池化層來實現。
2.2 缺點:
SPP-Net主要優化了特征提取階段,整條檢測流水線任然十分復雜。
2.3 參考資料
3. Fast R-CNN(2015-4)
3.1 優點:
優點有兩個:
- 其一是簡化了SPP-Net的空間金字塔池化層為ROI池化層,降低計算量;
- 其二是使用了Softmax分類層取代了SVM分類層,使得特征提取階段,分類和回歸階段融合成了單個檢測網絡。該檢測網絡可以進行端到端訓練。
3.2 缺點:
這樣,Fast R-CNN就由區域建議階段+檢測網絡組成,整個檢測網絡結構相比于之前的R-CNN和SPP-Net來說,已經有很大進步了。此時區域建議算法成了一個瓶頸,因為區域建議算法不僅速度慢(2s/image),而且無法和檢測網絡進行聯合優化。
3.3 參考資料
4. Faster R-CNN
4.1 優點:
提出了RPN網絡,根據輸入圖像的卷積特征圖,采用了anchor機制(特征圖每個像素點位置上,密密麻麻的,不同尺度和橫縱比的默認候選框),以及一個小的二分類及回歸層來生成區域建議。由于RPN的速度飛快,解決了Fast R-CNN的速度瓶頸。此外,RPN網絡和detection network可以進行端到端聯合優化,使得Faster R-CNN的整體檢測性能相比Fast R-CNN更上了個臺階。
4.2 缺點:
Faster R-CNN存在的不足主要有3點:
其一,Faster R-CNN只使用了VGG-16的最后一張卷積特征圖conv5_3來生成區域建議,該特征圖已經比較深/粗糙了,丟失了較多的原始圖像細節(如小目標和精確的位置信息),導致了Faster R-CNN對于小目標的檢測不佳。另外,由于使用了比較粗糙的特征圖,Faster R-CNN的定位精度不太好。這樣,當計算Precision時,在IOU閾值要求較高的檢測數據集如COCO上,Faster R-CNN的Precision不高,進而影響AP值。
其二,Faster R-CNN由兩個階段構成:RPN建議生成階段+Fast R-CNN檢測階段,進行了兩次分類+回歸。雖然可以進行端到端優化,但是整個檢測網絡的復雜度仍然很高。當然,這是所有兩階段檢測網絡的通病,這方面的解決方案參考YOLO系列和SSD系列等單階段檢測器。
-
其三,(這是我自己認為的缺點,網上的博客中好像都沒有提到,目前還沒有通過實驗驗證)Faster R-CNN使用了conv5_3特征圖來生成3個尺度(128x128, 256x256, 512x512)和3個橫縱比(1:1, 1:2, 2:1)一共9種anchor,這9種anchor的大小、形狀都不相同。即RPN需要使用一組固定感受野大小(228 for VGG-16)的特征向量(512d for VGG-16,特征圖中一個位置的特征向量對應于原始圖像中相應位置一塊固定大小的區域)來生成大大小小的區域建議框。那么就會出現三種情況:
(1)區域建議尺度和感受野相差不大
(2)區域建議尺度比感受野小得多
(3)區域建議尺度比感受野大得多
以上三種情況中:
第一種情況是應該算最理想的,根據該感受野來推斷該區域內的區域建議是合理的,因為網絡看得見目標區域(即目標被感受野區域覆蓋);
第二種情況不太理想,雖然網絡看得見整個目標區域,但是目標特別小,前面說了,RPN利用了conv5_3特征圖,該特征圖十分粗糙,已經丟失掉的原始圖像中精細的位置信息,甚至有可能連整塊目標信息都被卷沒了;
第三種情況也不妙,因為網絡只看得見飛機圖中感受野區域內的信息,即網絡需要僅根據飛機機身的一部分來猜測飛機的整體輪廓,針對這一點,Faster R-CNN論文中有這么一段解釋:
大意是說,RPN設置的某些anchor尺寸大于了特征圖的潛在感受野,但是這種情況也不是不可能的。如果只讓一個人看著飛機圖中的感受野區域,應該也能大致猜出飛機的大概輪廓(人是何等智能的動物啊。。。)。作者認為網絡也能通過訓練數據學習到這一點,即根據目標的一部分猜測整體輪廓的能力。
實際上,上面考慮的僅僅是特征圖的理論感受野,網絡的實際感受野更小,兩者是什么關系目前也還是個謎,唯一可參考的論文有這一篇:Understanding the Effective Receptive Field in Deep Convolutional Neural Networks。
當然,某些模型認為建議區域尺寸應該和特征圖感受野大小一一對應,即使用相對較淺的特征圖來處理小目標,使用較深層特征圖來處理大目標,這是SSD的解決方案。但是SSD忽略了一點:淺層特征圖雖然保留了相對精細的內容信息,但其抽象程度不如深層特征圖(可能無法很好地表示目標的語義信息);深層特征圖則存在相反的問題。因此,將不同層級的特征圖進行融合,使得融合后的特征圖既具有深層特征圖高級的語義信息,同時又保留了淺層特征圖的圖像細節信息。這些思想在后面的一系列論文中都有體現,慢慢看吧。
4.3 Faster R-CNN參考資料
5. YOLO(2015-6)
5.1 優點
- 單階段目標檢測器的開山之作,將整個目標檢測看做回歸過程,直接使用兩個fc層直接預測目標類別和坐標信息。
- 基于GoogleNet,提出了一個定制的基礎網絡,性能好,同時計算開銷小。
- YOLO的速度快的嚇人,R-CNN系列經過幾代人的努力(R-CNN-->SPP-Net-->Fast R-CNN-->Faster R-CNN),最新的Faster R-CNN速度終于能達到5FPS了,結果YOLO一下子將速度拉到45FPS以上。
5.2 缺點
- 模型準確率有待提高,和Fast R-CNN、Faster R-CNN相比還有差距。
- 模型采用了直接回歸的方式預測包圍框坐標,導致定位誤差很大
YOLO模型的網絡結構非常簡單,沒什么好講的。具體的模型細節以及訓練方式參考下面提供的論文、演講PPT以及演講視頻。
5.3 參考資料
6. SSD(2015-12)
理解了Faster R-CNN中的RPN以及anchor的理念,那么理解SSD就相當容易了。
6.1 優點
- SSD相當于一個可用于多分類的RPN網絡,但是SSD使用了多個層級的特征圖同時進行預測:
SSD總共使用了6個層級的特征圖進行預測,基本出發點是:淺層特征圖保留了圖像更多的細節信息,更適合用于預測小目標;深層特征圖擁有更大的感受野,適合用于檢測大目標。因此SSD使用了6個不同層級的特征圖進行預測,試圖解決目標的多尺度問題。
- 從模型性能來看,SSD達到了當時最強的Faster R-CNN的水準;但是速度卻完爆Faster R-CNN,貼一張在PASCAL VOC2007測試集上的性能對比圖:
再貼一張速度對比圖:
就準確率和速度的trade-off來看,SSD剛出來時是真的厲害!
6.2 缺點
- SSD雖然使用了淺層的特征圖,試圖改善對小目標的檢測效果,但是SSD實際上對小目標的檢測效果也不太好,原因是淺層特征圖雖然保留了較多的圖像細節,但是其語義信息較弱,導致最后的識別效果不好,這個問題后面會被FPN解決。
- 個人經驗,當識別類別數變多時,SSD的效果沒有Faster R-CNN好,因為SSD的分類網絡太簡單了。
6.3 參考資料
7. HyperNet(2016-4)
7.1 優點:
HyperNet貌似是第一個嘗試將多層級特征進行融合的兩階段目標檢測器,前面說了Faster R-CNN僅使用了十分粗糙的conv5_3層用于生成區域建議,導致對小目標的檢測效果不好,同時定位精度不夠好。HyperNet將不同層級的特征圖進行融合,使得融合后的特征圖既具有深層特征圖高級的語義信息,同時又保留了淺層特征圖的圖像細節信息,這是這篇論文最大的亮點。
HyperNe整體網絡結構如下圖所示:
如果理解了Faster R-CNN的網絡結構,HyperNet的網絡結構應該很容易理解。HyperNet使用了conv3的圖像分辨率進行預測,同時融合了conv1和conv5的特征圖信息,融合之后的特征圖稱為Hyper Feature Maps。
至于區域建議生成部分,HyperNet嘗試了兩種結構:
這一部分中,HyperNet和RPN還是有一點區別的,主要在于ROI池化層的順序(該部分的anchor是怎么生成的,論文中貌似沒有詳細說明),不過個人感覺是換湯不換藥,既然RPN都開了使用深層卷積特征圖和anchor來生成區域建議的先河,后面的修改就方便了。。。
7.2 缺點:
HyperNet的缺點說不上是哪兒,HyperNet的mAP值在PASCAL VOC2007測試集上是76.3%,在Faster R-CNN的基礎上增加了3.1%。
但是,HyperNet的檢測速度很慢,HyperNet-SP和Faster R-CNN的檢測速度都是5fps,但是準確率差不多。
所以,雖然HyperNet融合多個層級的特征用于生成區域建議的思想貌似更高級,但是其效果(mAP)并沒有體現的很明顯。
7.3 參考資料
8. R-FCN(2016-5)
8.1 模型動機
R-FCN提出的初衷是為了提高ResNet論文中最后附帶提出的檢測架構,即Faster R-CNN+ResNet-101的整體檢測速度。下圖是使用了ResNet-101作為Faster R-CNN的基礎網絡后,在PASCAL VOC2007測試集上帶來的mAP提升,最高竟然達到了驚人的85.6%!
當然,85.6%的mAP值還包含了一系列的trick如box refinement,context和multi-scale testing。這些trick這里不管,我也沒詳細看。這里想說明的是:通過使用更好的基礎網絡如ResNet-101取代VGG-16,Faster R-CNN的檢測性能已經相當牛逼了。但付出的代價是檢測速度極劇下降:
上圖是R-FCN和Faster R-CNN(ResNet-101)在PASCAL VOC2007測試集上的檢測準確率和速度的對比圖。
論文摘要中提到,R-FCN在測試集上的檢測速度比Faster R-CNN快了2.5-20倍,達到了170ms/image,大約6fps。剛看到時會感到疑惑:Faster R-CNN論文中不是提到其檢測速度最慢也有5fps嗎?R-FCN才6fps,是怎么比Faster R-CNN快2.5-20倍的?解釋一下,這里R-FCN是和更準的Faster R-CNN(ResNet-101)比速度,而不是原始的Faster R-CNN(VGG-16)。因為原始的Faster R-CNN(VGG-16)的mAP值才73.2%,而R-FCN達到了83.6%,兩者沒什么好比的。
下面從網絡結構上分析Faster R-CNN模型慢的主要原因:
其中,ROI Pooling層是一個分界點。ROI Pooling層之前的特征提取網絡,以及RPN都是在全圖上共享卷積計算的,不管anchor的數量有多少,這部分網絡的計算時間基本固定。但是ROI Pooling層之后的檢測網絡則不一樣了,每一個proposal feature map是一個個單獨送到檢測網絡中進行計算的,如果有300個proposal,那就要進行300次分類回歸計算。原始的Faster R-CNN(VGG-16)最后是兩個FC層,計算量相對較小;準確率更高的Faster R-CNN(ResNet-101)最后貌似使用了10個卷積層進行分類和回歸,因此計算量大增。這也是上面的表格中,Faster R-CNN(ResNet-101)為什么這么慢的原因(還有使用了多尺度預測等)。
好了,Faster R-CNN模型慢的主要原因是因為ROI Pooling層之后的檢測網絡不在全圖上共享計算。那R-FCN的核心動力就是要消除這一部分不共享計算的檢測網絡。使得整個特征提取網絡+RPN+檢測網絡的所有環節都在全圖上共享計算,從而達到提速的目的。下面的表格表明了決心!
其具體做法是提出了位置敏感得分映射position-sensitive score map和position-sensitive ROI Pooling。
8.2 論文中不容易理解的幾個地方
-
圖像分類中的平移不變性和目標檢測中的平移可變性
圖像分類中的平移不變性相對好理解一些,想想ImageNet分類數據集中,一張分類圖像中一般僅包含一個目標,而且該目標又不是鋪滿整張圖像的,如果將該目標在圖像中平移一下、或者左右/上下翻轉一下,分類網絡還是會自信滿滿地將圖像給正確分類出來。這是我理解的分類網絡的平移不變性特征。
但是目標檢測任務就不一樣了,除了要正確找出圖像中有哪些目標,還要準確定位每個目標的包圍框,如果本來一個目標被某個候選框很好地框住,但這個目標在候選框中進行了一定的平移,兩種情況下得到的檢測效果就完全不同了,顯然平移之后,檢測效果就變差了。換句話說,目標檢測網絡對圖像中每個目標的位置(x, y, w, h)信息是很在意/敏感的,一個優秀的目標檢測網絡應該具有對圖像中目標的位置信息敏感的能力。以前面的例子為例,如果目標進行了平移,則目標檢測網絡應該給平移后的候選框打個差評。
-
position-sensitive score map和position-sensitive ROI Pooling
來看R-FCN的網絡結構圖:
前面說了,R-FCN的核心動力就是要消除ROI Pooling層之后的不共享計算的檢測網絡。使得整個特征提取網絡+RPN+檢測網絡的所有環節都在全圖上共享計算,為了達到這個目的,R-FCN將Faster R-CNN(ResNet-101)中用于檢測網絡部分的卷積層全部放到了ROI Pooling層之前。
上圖中,feature maps部分是ResNet-101的conv5之前的卷積層,即3+4+23個瓶頸塊,feature maps輸出的特征圖相對于輸入圖像的下采樣步長是16,這個所有的Faster R-CNN版本都一樣。而RPN部分的分支結構也和Faster R-CNN一致。
區別就在于圖中五顏六色那一塊特征圖是啥?就是position-sensitive score map。feature maps一方面通過RPN生成proposal,另一方面繼續進行ResNet-101的conv5部分的卷積層操作,不過conv5部分所有卷積測步長都是1,中間再接一個1x1卷積將conv5部分的輸出通道數由2048d降到1024d。最后通過一個卷積層得到position-sensitive score map。position-sensitive score map的分辨率和feature maps保持一致。
position-sensitive score map的通道數是KxKx(C+1),其中C表示目標的類別數,PASCAL VOC是20類,COCO是80類,+1表示背景。而KxK則對應了position-sensitive ROI Pooling中的KxK個方塊。
position-sensitive ROI Pooling的池化方式有點特別,如下圖所示:
假設圖中的ROI區域表示一個候選框,position-sensitive ROI Pooling層將該ROI區域劃分成KxK個網格區域,然后對這KxK個區域分別進行平均池化,其中。。。
算了,R-FCN描述起來太麻煩了。。。直接參考下面這兩篇博文吧:
9. PVANet(2016-11)
9.1 概述
在PVANet出來之前,目標檢測領域已經分為了兩階段(two-stage)檢測器和單階段(one-stage)檢測器兩大陣營了:
- 兩階段檢測器以Faster R-CNN、R-FCN等為代表,典型結構是先使用RPN生成候選框,再對候選框進行分類+回歸。特點是準確率高但速度很低,一般低于10FPS。
- 單階段檢測器以YOLO、SSD為代表,YOLO采用回歸的思路,直接使用fc層輸出目標類別和包圍框;SSD相當于一個多分類RPN,但是使用了多層級的特征進行預測。特點是速度很快,都超過了20FPS以上,但是準確率比兩階段檢測器如Faster R-CNN(ResNet-101)和R-FCN稍微差一些。
- 個人感覺在目標類別增多的情況下,單階段檢測器的表現會進一步被兩階段檢測器甩開。因為分類層太簡單了。
PVANet的出現則改善了兩階段檢測器速度慢的毛病。要說明的是,PVANet的總體檢測思路完全是繼承Faster R-CNN的,即特征提取網絡+RPN+檢測網絡。但PVANet對每一部分都進行了優化/提速,結果PVANet在保持兩階段檢測器高準確率的前提下,其檢測速度直接超過了20FPS,達到了實時的檢測速度。直接貼上PVANet在PASCAL VOC2007測試集上的表現:
再貼上到2016-11為止,即PVANet出來時,幾個主流的目標檢測網絡在PASCAL VOC2012測試集上的表現:
對比結果很明顯,PVANet、Faster R-CNN(ResNet-101)和R-FCN在PASCAL VOC2007測試集上的準確率相差不大,但是PVANet的速度完爆Faster R-CNN(ResNet-101)和R-FCN。速度直接和當時最強的單階段檢測器SSD512相媲美,但準確率更勝一籌。
前面說了,兩階段檢測器典型地由三部分組成:特征提取網絡+RPN+檢測網絡,下面分別介紹PVANet在這3部分上的改進。
9.2 特征提取網絡--PVANet
Faster R-CNN最初提出時,特征提取網絡使用了ZF和VGG-16,但后面更強大的ResNet出來之后,使用了ResNet-101作為特征提取網絡(在ResNet論文中有提到)。類似地,后面出現的R-FCN同樣使用ResNet-101。
而這篇論文中提出了一個輕量化的特征提取網絡,即PVANet。對,在論文中PVANet主要指的是目標檢測網絡中的特征提取網絡。PVANet新穎的網絡結構是這篇論文最大的亮點。PVANet主要使用了以下高科技:
- modified C.ReLU層
要了解modified C.ReLU層,得先了解C.ReLU層。可參考這篇博文:CReLU激活函數。
簡單地說,C.ReLU層是一種特別的ReLU層。原論文的作者在做實驗時發現,CNN網絡的前幾層中,網絡傾向于同時捕獲正負相位的信息,但標準的ReLU會抹掉其中的負響應。 這造成負響應相關信息的丟失。為了捕捉完整的信息,C.ReLU層是這樣做的:
即將ReLU層的輸入特征進行取反,然后和原始特征在通道維度進行concate。再進行ReLU操作,也就是說,C.ReLU層輸出的特征通道數量是標準的ReLU層的2倍。但這樣做捕捉了更多的特征信息。使得CNN分類網絡的準確率會有一點提升。但是C.ReLU層只適用于淺層部分,層數加深后,該現象逐漸消失了。
可能說的不太對,想詳細了解還是看C.ReLU層的論文吧。
原始的C.ReLU層之前,兩個相反的輸入特征是共享bias的,而modified C.ReLU層使兩個相反的輸入特征不共享bias。這就是modified C.ReLU層。通過在CIFAR-10上的實驗,使用相同的CNN網絡,本文提出的modified C.ReLU層達到的準確率比C.ReLU層稍微好一點點。
- 殘差網絡中的shortcut connection
如下圖所示:
我們知道,ResNet網絡中提出的shortcut connection,也就是瓶頸塊可以大大改善深度網絡的訓練,所以PVANet中的絕大部分層都使用了shortcut connection,這算是借鑒了ResNet的精華。上圖中,中間部分就是modified C.ReLU層。
- Inception模塊
PVANet網絡的前幾層使用了modified C.ReLU層,后面幾層則使用了Inception模塊。為什么使用Inception模塊而不是單純地繼續使用ResNet的瓶頸塊結構將網絡不斷加深呢?下圖是加了shortcut connection的Inception模塊:
第一,Inception模塊的計算成本是相當小的。這和PVANet致力于降低網絡的計算成本目標一致。
第二,對于目標檢測任務來說,使用Inception模塊作為特征提取層其實是有天然優勢的。很多目標檢測論文不是都提到嗎,圖像中存在大大小小的目標,檢測大目標需要感受野較大的深層特征,檢測小目標則需要感受野較小的淺層特征??匆幌律蠄D中Inception模塊的結構:從左到右,每一個分支擴大的感受野是不同且逐漸增大的。將其進行concate之后,經過很多層的Inception模塊,深層的輸出特征圖中,有一些通道的特征圖保留了相對較小的感受野,這些通道的特征使用用于檢測小目標。而另一些通道的特征圖感受野很大,適合用于檢測大目標,隨著網絡層數的加深,那些用于檢測小目標的,較小的感受野的特征圖也擁有了較強的語義信息。簡直完美!
- BN是必不可少的
BN層的加入進一步加快網絡的訓練。
- 多層級特征融合
自從2016年開始,多層級特征融合這一思想就開始被目標檢測網絡廣泛采用,前面提到的HyperNet就是一個例子。多層級特征融合的思想最早應該是在2014-11,用于語義分割的FCN論文中被提出的吧。所以,雖然使用了Inception模塊能在一定程度上解決目標尺度問題,PVANet還是進一步使用了多層級特征融合的策略。
好了,下面貼上PVANet特征提取網絡的層參數:
整個PVANet特征提取網絡首先使用了一個7x7的大卷積層,2倍步長。然后使用一個3x3,步長為2的池化層。
接下來就是使用有shortcut connection+modified C.ReLU的卷積層了。即conv2_x和conv3_x部分。
再接下來是使用shortcut connection+Inception模塊的卷積層了,即conv4_x和conv5_x部分。
算一算PVANet特征提取網絡有多少個卷積層:7個shortcut connection+modified C.ReLU的卷積層;8個shortcut connection+Inception模塊的卷積層。加上第1層7x7大卷積層。
1+7x3+8x4=54
一共有54層卷積!雖然沒有ResNet-101那么深,但是PVANet同時汲取了ResNet和Inception網絡的核心優點。加上BN層和modified C.ReLU的使用,PVANet在ImageNet分類數據集上的表現并不差:
甚至比GoogleNet和VGG-16還好一些。重點是PVANet的計算成本相當的低(注意到PVANet在網絡深層的特征圖通道一直保持的較?。?!
下面來看一下由PVANet構成的目標檢測網絡的整體結構:
注意和上面PVANet的層參數表格對比,就能很清晰地理解PVANet了。由于PVANet最后一個Inception模塊輸出的特征圖是輸入圖像的1/32。PVANet采用了多層特征融合的思路,將conv5_4的特征圖進行2倍上采樣,將分辨率是輸入圖像1/8的conv3_4特征圖進行2倍采樣,再和分辨率是輸入圖像1/16的conv4_4特征圖進行concate,在進行一次1x1x512的卷積,得到了分辨率是輸入圖像1/16的特征圖。這和原始的Faster R-CNN使用VGG-16的conv5_3輸出的特征圖在大小和通道數上面是一致的。
9.3 RPN
這篇論文中的RPN和原始的Faster R-CNN論文中的RPN有些不同:
- 僅使用了512個通道的特征圖中的前128個通道來送入RPN網絡。
因為作者發現,僅僅使用特征圖中的前128個通道用于生成區域建議,就能得到相當的準確率了。而且RPN的第一個卷積層由3X3X512變成了3X3X384。這樣做進一步降低了RPN部分的計算成本。
- 使用了6個scale和7個aspect ratio
感謝Inception模塊和多層級特征融合,送入RPN的特征圖對小目標的檢測能力應該明顯由于原始的Faster R-CNN,因此作者大膽地使用了多達6個尺度和7個橫縱比的anchor,即特征圖每個點會預測42個anchor:
6個尺度:32, 48, 80, 144, 256, 512
7個橫縱比:0.333, 0.5, 0.667, 1.0, 1.5, 2.0, 3.0
作為對比,原始的Faster R-CNN僅使用了3個尺度:(128, 256, 512),以及3個橫縱比:(0.5, 1.0, 2.0)。
使用更豐富的anchor不僅能提高準確率,同時增加的計算成本相當小。
9.4 檢測網絡
檢測網絡使用了6X6的ROI池化層。而且池化時使用了特征圖全部的512個通道的信息。僅使用200個proposal。應該是使用了更豐富的anchor,使得RPN生成的建議框質量相當好,僅使用200個proposal就能達到98.8%的召回率。作為對比,使用300個proposal能達到99.2%的召回率。僅相差0.4%。
但別忘了,經典Faster R-CNN架構中檢測網絡的計算成本與RPN的proposal數量成正比的。為了提速,作者僅適用了200個proposal。再貼上PVANet在PASCAL VOC2007測試集上的表現:
表中可以看出,僅僅使用50個proposal,PVANet都能達到83.2%的mAP值,此時的速度達到了驚人了37.3FPS!
全連接層的布置和原始Faster R-CNN一致,即4096X4096x(21+21X4)。但是,可以進一步將全連接層進行壓縮(文中展示了truncated SVD,即上表中的PVANet+compressed),在基本不損失準確率的情況下大幅度提高檢測速度。
9.5 總結
PVANet通過使用一系列技巧,使得Faster R-CNN式的兩階段檢測器的檢測速度能夠媲美單階段檢測器,同時保留的兩階段檢測器準確率方面的優勢。
- 特征提取網絡方面。結合了ResNet的shortcut connection、Inception模塊、modified C.ReLU層、BN層、多層級特征融合等一系列高級模塊和技巧,共同構成了一個超級輕量化但性能優良的PVANet特征提取網絡。
- RPN方面。僅使用了特征提取網絡輸出的特征圖的前128個通道用于生成區域建議。進一步降低了RPN的計算成本。使用了更加豐富的anchor,有效提高了網絡的準確率。
- 檢測網絡方面。由于RPN生成的區域建議質量很高,PVANet僅使用了200個proposal用于目標檢測。進一步降低檢測網絡的計算成本。
但是,作者在論文中并沒有給出PVANet在難度更大的COCO數據集上的準確率。要是在COCO上面也能得到很高的mAP的話,那PVANet就真的很牛逼了。不過作者在github上開源了代碼:pva-faster-rcnn。
代碼是在Python/caffe版的Faster R-CNN源代碼上面改的。
9.6 參考資料
10. YOLO_v2(2016-12)
10.1 YOLO_v2在YOLO基礎上的改進
YOLO_v2在YOLO的基礎上進行改進,首先還是先貼上YOLO的網絡結構圖:
下面的表格說明了從YOLO升級到YOLO_v2,作者做了哪些改進:
下面按照從上到下的順序依次總結每一個改進措施:
- 在所有卷積層中加入BN層(batch norm?)
BN層不用多說了,不僅能顯著加快網絡訓練的收斂速度,還是防止過擬合,一般使用BN就不用dropout了。使用BN還能使網絡收斂到一個更好的局部最優。
從表中可看出,僅僅加了BN之后,YOLO的mAP值提高了2.4個百分點。
- 在高分辨率的圖像上進行ImageNet預訓練(hi-res classifier?)
目標檢測網絡中的特征提取網絡通常需要在ImageNet分類數據集上進行預訓練。YOLO特征提取網絡首先在ImageNet上預訓練,此時使用的輸入圖像分辨率是224x224的。但在目標檢測數據集上面fine-tune時,網絡的輸入圖像分辨率增大到了448x448。作者認為,從224到448的調整會導致網絡卷積核需要額外的適應新的圖像分辨率,有可能會增大fine-tune的難度。干嘛不在ImageNet上預訓練時就直接上輸入圖像分辨率設置成448X448呢?
這樣做的效果十分明顯,在BN基礎上,YOLO的mAP值進一步上漲3.7個百分點,mAP值達到了69.5%。
- 使用anchor機制,并將預測層由fc層改為卷積層(convolutional?+new network?+ dimension priors?)
作者參考了Faster R-CNN中RPN使用的anchor機制,由于anchor機制在做位置回歸時是預測一個相對偏移量offset,屬于間接回歸。而YOLO使用了全連接層直接預測目標包圍框的h/w,屬于直接回歸。由于目標尺度變化問題,作者意識到,采用直接回歸的訓練難度應該會比采用anchor的間接回歸大。因此作者嘗試了anchor機制。
既然使用了anchor,那預測層由全連接層改為了卷積層,形式應該和SSD類似。
但是,Faster R-CNN和SSD中的anchor尺度和橫縱比是人工設置的,是一個超參數。YOLO通過對目標檢測訓練集中的anchor進行K-means聚類,根據數據集的目標包圍框的形狀尺度統計信息來設計更加合理的anchor:
如上圖所示,隨著K值增大,anchor與ground truth包圍框的IOU值越來越優。為了權衡模型復雜度,作者選擇K=5這個點的聚類結果,右圖是聚類出來的anchor形狀,可以看到,數據集中的目標包圍框更多的是高瘦型的,矮胖型包圍框相對較少。
而且,K=5時,得到的anchor質量和Faster R-CNN使用9個anchor的效果差不多:
通過采用anchor機制,YOLO的mAP值反而稍微下降了一點點,從69.5%降到69.2。但是,召回率從81%升到了88%。因此作者認為anchor是有效的,且YOLO的mAP肯定有提升的空間。
作者將網絡的輸入分辨率由448改為了416,而且抽掉中間的一個最大池化層。這樣,整個特征提取網絡的總步長變成32,輸出的特征圖大小為13x13(奇數網格數量)。這樣設計的一個目的是,特征圖的中心正好對應原始輸入圖像的中心,因為一些很大的目標的幾何中心一般都落在輸入圖像中心附件,生成13x13的奇數尺寸特征圖的話,特征圖中心網格處的anchor可以更好地捕捉大目標。
- 修改位置回歸公式+使用兩個特征圖進行預測(location prediction?+passthrough?)
作者在使用K-means得到5種anchor之后,在坐標回歸,即預測(x, y, w, h)時采用了RPN的回歸公式,但是發現這種回歸方式在網絡訓練早期很不穩定,因為(x, y)的偏移量的假設范圍太大,可布滿整張圖片。因此,作者使用原始YOLO中(x, y)的回歸方式。而(w, h)的偏移方式采用了RPN中的公式。這樣,網絡訓練過程改善很多。
另外,作者注意到SSD使用了多層級的特征圖進行預測,確實,由于分辨率更高的特征圖保留了更多的圖像細節,在預測小目標上面效果更好些。因此作者同時使用了13x13預測層的上一個層級,即26x26x512大小的特征圖進行預測。而且將26x26x512改成了13x13x2048,這樣就可以和最后一層的13x13x512的特征圖在通道上進行concate,看上去就像是使用一個尺寸的特征圖進行預測一樣。
包圍框坐標預測公式的修改,加上26x26x512的預測層的加入,使得YOLO的mAP值在之前的基礎上提升了5%+1%左右。達到了75.4%。
- 多尺度訓練(multi-scale?+hi-res detector?)
經過以上改進,YOLO去掉了fc層,整個檢測網絡由卷積層+池化層組成,特征提取網絡的最大步長是32。
前面的改進都將輸入圖像的分辨率固定在416x416。但是YOLO的網絡結構原則上是可以處理任意分辨率的輸入圖像的。作者注意到了這一點。于是YOLO在訓練時,總共嘗試了以下這些圖像分辨率:
288x288, 320x320, 352x352, ... , 608x608
考慮到特征提取網絡32的總步長,YOLO在訓練時,每隔32個像素設置一個圖像分辨率,最低288,最高608。
YOLO每訓練10個batch,就從上面的分辨率中隨機選擇一個新的分辨率繼續進行訓練。注意,是在相同的網絡結構中進行不同輸入分辨率圖像的訓練哈!而不是像SSD那樣,300和512的分辨率使用了不同的網絡。
這樣訓練完成后,YOLO檢測網絡擁有了對各種分辨率圖像進行檢測適應能力。測試時如何選擇輸入圖像分辨率就看用戶對速度和準確率的需求了,多種配置,任君選擇!
多尺度訓練后的YOLO在PASCAL VOC2007測試集上的效果如下表:
可以看到,小分辨率圖像速度快,準確率相對差些。大分辨率圖像則相反。當使用544X544的大分辨率時,YOLO能以40FPS的速度達到78.6%的mAP值。
上面這一系列對YOLO的改進方案加在一起,就是本文的YOLO_v2網絡啦。
YOLO_v2在多尺度訓練和多尺度測試這點上的改進很有創意!
另外貼上YOLO_v2在PASCAL VOC2012測試集上的mAP值:
還有YOLO_v2在COCO2015測試集上的準確率:
我們知道,原始的YOLO雖然速度超快,但是準確率比SSD以及Faster R-CNN系列競爭對手還是要差一截的。
但從以上表格可以看出,YOLO進化成YOLO_v2之后,在保持速度優勢的前提下,準確率快要趕上SSD和Faster R-CNN系列了(嚴格來說YOLO_v2的準確率還是要弱一點點。。。而且都沒有拿R-FCN以及PVANET出來作對比)。
10.2 一個新的特征提取網絡:Darknet-19
別的目標檢測模型基本都是直接使用成名的圖像分類網絡如VGG-Net、Inception系列以及ResNer-101等作為特征提取網絡。但是YOLO作者貌似對這些基礎網絡都不太滿意。
在原始的YOLO模型中,作者參考了GoogleNet,提出了一個定制的基礎網絡,這個網絡沒有單獨的代號。
這次的YOLO_v2中,作者參考VGG-16,又提出了一個基礎網絡,這次就有響亮的代號了——Darknet-19。
19表示該網絡有19個卷積層,下面是Darknet-19的網絡層參數:
其實仔細一看,Darknet-19和VGG-16十分相似,不過在每個3x3卷積層中間插入了1x1卷積,這里的1x1卷積不僅能增加網絡深度,同時還能通過減小特征通道的數量,大大地降低計算成本。
對比一下:
- YOLO定制網絡的計算成本是8.52 billion浮點運算,在ImageNet上的top-5準確率是88.0%;
- VGG-16的計算成本是30.69 billion浮點運算,在ImageNet上的top-5準確率是90.0%;
- Darknet-19的計算成本是5.58 billion浮點運算,在ImageNet上的top-5準確率是93.3%;
結論:Darknet-19是一個更加優秀的基礎網絡,同時計算成本是YOLO定制網絡的65%,是VGG-16的18%。
作者用Darknet-19替換掉了原始的YOLO定制網絡,作為新一代YOLO_v2的基礎網絡。
但是作者在論文中沒有給出使用Darknet-19的YOLO_v2在PASCAL VOC和COCO數據集上的表現。
10.3 總結
論文還有一部分關于YOLO-9000的內容,貌似是采用特殊的訓練方式,將YOLO_v2在COCO目標檢測數據集和ImageNet圖像分類數據集中一起訓練,使模型能同時檢測超過9000類目標,這里不關注。
總的來說,這篇論文有以下貢獻:
- 在原始的YOLO模型基礎上,提出了一系列的改進tricks,在保證YOLO速度優勢的同時,使得YOLO進化成了YOLO_v2,準確率基本快趕上SSD和Faster R-CNN系列了。
- YOLO_v2通過新穎的多尺度訓練和多尺度預測方案,使得訓練好的YOLO_v2模型能檢測不同分辨率的輸入圖像,速度和模型準確率之間的trade-off由使用者自己決定。
- 提出了一個性能更好、同時計算成本更小的基礎網絡——Darknet-19。