Faster RCNN從問世到現在, 期間誕生了眾多優秀的物體檢測算法, 但憑借其優越的性能, 目前依然是物體檢測領域主流的框架之一。尤其是在高精度、 多尺度和小物體等物體檢測領域的難點問題上, 新型算法基本都是在Faster RCNN的基礎上優化完善的。
本節將首先分析Faster RCNN的特點及可以優化的方向, 然后從特征提取網絡、 RoI Pooling等多個角度, 陸續講解幾個在Faster RCNN基礎上優化改進的經典算法, 如HyperNet、 Mask RCNN、 R-FCN及Cascade RCNN算法, 如圖4.13所示
1. 審視Faster RCNN
Faster RCNN之所以生命力如此強大, 應用如此廣泛, 離不開以下幾個特點:
·性能優越: Faster RCNN通過兩階網絡與RPN, 實現了精度較高的物體檢測性能。
·兩階網絡: 相比起其他一階網絡, 兩階更為精准, 尤其是針對高精度、 多尺度以及小物體問題上, 兩階網絡優勢更為明顯。
·通用性與魯棒性: Faster RCNN在多個數據集及物體任務上效果都很好, 對於個人的數據集, 往往Fine-tune后就能達到較好的效果。
·可優化點很多: Faster RCNN的整個算法框架中可以進行優化的點很多, 提供了廣闊的算法優化空間。
·代碼全面: 各大深度學習框架都有較好的Faster RCNN源碼實現,使用方便。
當然, 原始的Faster RCNN也存在一些缺點, 而這些缺點也恰好成為了后續學者優化改進的方向, 總體來看, 可以從以下6個方面考慮:
·卷積提取網絡: 無論是VGGNet還是ResNet, 其特征圖僅僅是單層的, 分辨率通常也較小, 這些都不利於小物體及多尺度的物體檢測, 因此多層融合的特征圖、 增大特征圖的分辨率等都是可以優化的方向。
·NMS: 在RPN產生Proposal時為了避免重疊的框, 使用了NMS, 並以分類得分為篩選標准。 但NMS本身的過濾對於遮擋物體不是特別友好, 本身屬於兩個物體的Proposal有可能因為NMS而過濾為1個, 造成漏檢, 因此改進優化NMS是可以帶來檢測性能提升的。
·RoI Pooling: Faster RCNN的原始RoI Pooling兩次取整帶來了精度的損失, 因此后續Mask RCNN針對此Pooling進行了改進, 提升了定位的精度。
·全連接: 原始Faster RCNN最后使用全連接網絡, 這部分全連接網絡占據了網絡的大部分參數, 並且RoI Pooling后每一個RoI都要經過一遍全連接網絡, 沒有共享計算, 而如今全卷積網絡是一個發展趨勢, 如何取代這部分全連接網絡, 實現更輕量的網絡是需要研究的方向。
·正負樣本: 在RPN及RCNN部分, 都是通過超參數來限制正、 負樣本的數量, 以保證正、 負樣本的均衡。 而對於不同任務與數據, 這種正、 負樣本均衡方法是否都是最有效的, 也是一個研究的方向。
·兩階網絡: Faster RCNN的RPN與RCNN兩個階段分工明確, 帶來了精度的提升, 但速度相對較慢, 實際實現上還沒有達到實時。 因此,網絡階數也是一個值得探討的問題, 如單階是否可以使網絡的速度更快, 更多階的網絡是否可以進一步提升網絡的精度等。
2. 特征融合: HyperNet
卷積神經網絡的特點是, 深層的特征體現了強語義特征, 有利於進行分類與識別, 而淺層的特征分辨率高, 有利於進行目標的定位。 原始的Faster RCNN方法僅僅利用了單層的feature map(例如VGGNet的conv5-3) , 對於小尺度目標的檢測較差, 同時高IoU閾值時, 邊框定位的精度也不高。
在2016 CVPR上發表的HyperNet方法認為單獨一個feature map層的特征不足以覆蓋RoI的全部特性, 因此提出了一個精心設計的網絡結構, 融合了淺、 中、 深3個層次的特征, 取長補短, 在處理好區域生成的同時, 實現了較好的物體檢測效果。
HyperNet提出的特征提取網絡結構如圖4.14所示, 以VGGNet作為基礎網絡, 分別從第1、 3、 5個卷積組后提取出特征, 這3個特征分別對應着淺層、 中層與深層的信息。 然后, 對淺層的特征進行最大值池化對深層的特征進行反卷積, 使得二者的分辨率都為原圖大小的1/4, 與中層的分辨率相同, 方便進行融合。 得到3個特征圖后, 再接一個5×5的卷積以減少特征通道數, 得到通道數為42的特征。
在三層的特征融合前, 需要先經過一個LRN(Local ResponseNormalization) 處理, LRN層借鑒了神經生物學中的側抑制概念, 即激活的神經元抑制周圍的神經元, 在此的作用是增加泛化能力, 做平滑處理。
最后將特征沿着通道數維度拼接到一起。 3個通道數為42的特征拼接一起后形成通道數為126的特征, 作為最終輸出。
HyperNet融合了多層特征的網絡有如下3點好處:
·深層、 中層、 淺層的特征融合到一起, 優勢互補, 利於提升檢測精度。
·特征圖分辨率為1/4, 特征細節更豐富, 利於檢測小物體。
·在區域生成與后續預測前計算好了特征, 沒有任何的冗余計算。
HyperNet實現了一個輕量化網絡來實現候選區域生成。 具體方法是, 首先在特征圖上生成3萬個不同大小與寬高的候選框, 經過RoI Pooling獲得候選框的特征, 再接卷積及相應的分類回歸網絡, 進而可以得到預測值, 結合標簽就可以篩選出合適的Proposal。 可以看出, 這里的實現方法與Faster RCNN的RPN方法很相似, 只不過先進行了RoIPooling, 再選擇候選區域。
HyperNet后續的網絡與Faster RCNN也基本相同, 接入全連接網絡完成最后的分類與回歸。 不同的地方是, HyperNet先使用了一個卷積降低通道數, 並且Dropout的比例從0.5調整到了0.25。
由於提前使用了RoI Pooling, 導致眾多候選框特征都要經過一遍此Pooling層, 計算量較大, 為了加速, 可以在Pooling前使用一個3×3卷積降低通道數為4, 這種方法在大幅度降低計算量的前提下, 基本沒有精度的損失。
總體來看, HyperNet最大的特點還是提出了多層融合的特征, 因此, 其檢測小物體的能力更加出色, 並且由於特征圖分辨率較大, 物體的定位也更精准。 此外, 由於其出色的特征提取, HyperNet的Proposal的質量很高, 前100個Proposal就可以實現97%的召回率。
值得注意, HyperNet使用到了反卷積來實現上采樣, 以擴大尺寸。通常來講, 上采樣可以有3種實現方法: 雙線性插值、 反池化(Unpooling) 與反卷積。 反卷積也叫轉置卷積, 但並非正常卷積的完全可逆過程。 具體實現過程是, 先按照一定的比例在特征圖上補充0,然后旋轉卷積核, 再進行正向的卷積。 反卷積方法經常被用在圖像分割中, 以擴大特征圖尺寸。
3. 實例分割: Mask RCNN
基於Faster RCNN, 何凱明進一步提出了新的實例分割網絡Mask RCNN, 該方法在高效地完成物體檢測的同時也實現了高質量的實例分割, 獲得了ICCV 2017的最佳論文。
Mask RCNN的網絡結構如圖4.15所示, 可以看到其結構與Faster RCNN非常類似, 但有3點主要區別:
·在基礎網絡中采用了較為優秀的ResNet-FPN結構, 多層特征圖有利於多尺度物體及小物體的檢測。
·提出了RoI Align方法來替代RoI Pooling, 原因是RoI Pooling的取整做法損失了一些精度, 而這對於分割任務來說較為致命。
·得到感興趣區域的特征后, 在原來分類與回歸的基礎上, 增加了一個Mask分支來預測每一個像素的類別。
下面將詳細介紹這3部分。
3.1 特征提取網絡
當前多尺度的物體檢測越來越重要, 對於基礎的特征提取網絡來說, 不同層的特征圖恰好擁有着不同的感受野與尺度, 因此可以利用多層特征圖來做多尺度的檢測, 例如上一節的HyperNet方法。
基於ResNet的FPN基礎網絡也是一個多層特征結合的結構, 包含了自下而上、 自上而下及橫向連接3個部分, 這種結構可以將淺層、 中層、 深層的特征融合起來, 使得特征同時具備強語義性與強空間性, 具體結構參見第3章, 在此不再重復。
原始的FPN會輸出P2、 P3、 P4與P5 4個階段的特征圖, 但在MaskRCNN中又增加了一個P6。 將P5進行最大值池化即可得到P6, 目的是獲得更大感受野的特征, 該階段僅僅用在RPN網絡中。原始的Faster RCNN使用單層的特征圖時, 篩選出的RoI可以直接作用到特征圖上進行RoI Pooling, 但如果使用FPN作為基礎網絡時, 由於其包含了P2、 P3、 P4、 P5這4個階段的特征圖, 篩選出的RoI應該對應到哪一個特征圖呢?
對於此問題, Mask RCNN的做法與FPN論文中的方法一致, 從合適尺度的特征圖中切出RoI, 大的RoI對應到高語義的特征圖中, 如P5, 小的RoI對應到高分辨率的特征圖中, 如P3。 式(4-7) 中給出了精確的計算公式:
公式中的224代表着ImageNet預訓練圖片的大小, k0默認值為4, 表示大小為224×224的RoI應該對應的層級為4, 計算后做取整處理。
這樣的分配方法保證了大的RoI從高語義的特征圖上產生, 有利於檢測大尺度物體, 小的RoI從高分辨率的特征圖上產生, 有利於小物體 的檢測。
3.2 RoI Align部分
Faster RCNN原始使用的RoI Pooling存在兩次取整的操作, 導致RoI選取出的特征與最開始回歸出的位置有一定的偏差, 稱之為不匹配問題(Missalignment) , 嚴重影響了檢測或者分割的准確度。
Maks RCNN提出的RoI Align取消了取整操作, 而是保留所有的浮點, 然后通過雙線性插值的方法獲得多個采樣點的值, 再將多個采樣點進行最大值的池化, 即可得到該點最終的值。
由於使用了采樣點與保留浮點的操作, RoI Align獲得了更好的性能。 這部分在前面已經詳細介紹過, 在此不再重復。
3.3 損失任務設計
在得到感興趣區域的特征后, Mask RCNN增加了Mask分支來進行圖像分割, 確定每一個像素具體屬於哪一個類別。 具體實現時, 采用了FCN(Fully Convolutional Network) 的網絡結構, 利用卷積與反卷積構建端到端的網絡, 最后對每一個像素分類, 實現了較好的分割效果。 由於屬於分割領域、 在此不對FCN細節做介紹, 感興趣的讀者可以查看相關資料。
假設物體檢測任務的類別是21類, 則Mask分支對於每一個RoI, 輸出的維度為21×m×m, 其中m×m表示mask的大小, 每一個元素都是二值的, 相當於得到了21個二值的mask。 在訓練時, 如果當前RoI的標簽別是5, 則只有第5個類別的mask參與計算, 其他的類別並不參與計算這種方法可以有效地避免類間競爭, 將分類的任務交給更為專業的分類分支去處理。
增加了Mask分支后, 損失函數變為了3部分, 如式(4-8) 所示。 公式中前兩部分Lcls、 Lbox與Faster RCNN中相同, 最后一部分Lmask代表了分割的損失。 對mask上的每一個像素應用Sigmoid函數, 送到交叉熵損失中, 最后取所有像素損失的平均值作為Lnask。
Mask RCNN算法簡潔明了, 在物體檢測與實例分割領域都能得到較高的精度, 在實際應用中, 尤其是涉及多任務時, 可以采用MaskRCNN算法。
公式中前兩部分Lcls、 Lbox與Faster RCNN中相同, 最后一部分Lmask代表了分割的損失。 對mask上的每一個像素應用Sigmoid函數, 送到交叉熵損失中, 最后取所有像素損失的平均值作為Lnask。
Mask RCNN算法簡潔明了, 在物體檢測與實例分割領域都能得到較高的精度, 在實際應用中, 尤其是涉及多任務時, 可以采用MaskRCNN算法。
4 全卷積網絡: R-FCN
Faster RCNN在RoI Pooling后采用了全連接網絡來得到分類與回歸的預測, 這部分全連接網絡占據了整個網絡結構的大部分參數, 而目前越來越多的全卷積網絡證明了不使用全連接網絡效果會更好, 以適應各種輸入尺度的圖片。
一個很自然的想法就是去掉RoI Pooling后的全連接, 直接連接到分類與回歸的網絡中, 但通過實驗發現這種方法檢測的效果很差, 其中一個原因就是基礎的卷積網絡是針對分類設計的, 具有平移不變性, 對位置不敏感, 而物體檢測則對位置敏感。
針對上述“痛點”, 微軟亞洲研究院的代季峰團隊提出了RFCN(Region-based Fully Convolutional Networks) 算法, 利用一個精心設計的位置敏感得分圖(position-sensitive score maps) 實現了對位置的敏感, 並且采用了全卷積網絡, 大大減少了網絡的參數量。圖4.16所示為R-FCN的網絡結構圖, 首先R-FCN采用了ResNet-101網絡作為Backbone, 並在原始的100個卷積層后增加了一個1×1卷積, 將通道數降低為1024。
此外, 為了增大后續特征圖的尺寸, R-FCN將ResNet-101的下采樣率從32降到了16。 具體做法是, 在第5個卷積組里將卷積的步長從2變為1, 同時在這個階段的卷積使用空洞數為2的空洞卷積以擴大感受野。 降低步長增加空洞卷積是一種常用的方法, 可以在保持特征圖尺寸的同時, 增大感受野。
在特征圖上進行1×1卷積, 可以得到位置敏感得分圖, 其通道數為k2(c+1)。 這里的c代表物體類別, 一般需要再加上背景這一類別。 k的含義是將RoI划分為k2個區域, 如圖4.17分別展示了k為1、 3、 5的情況。 例如當k=3時, 可以將RoI分為左上、 中上、 右上等9個區域, 每個區域對特征區域的信息敏感。 因此, 位置敏感得分圖的通道包含了所有9個區域內所有類別的信息。
對於一個位置敏感得分圖上的點, 假設其坐標為m×n, 通道在右上區域, 類別為人, 則該點表示當前位置屬於人並且在人這個“物體”的右上區域的特征, 因此這樣就包含了位置信息。
在RPN提供了一個感興趣區域后, 對應到位置敏感得分圖上, 首先將RoI划分為k×k個網格, 如圖4.18所示, 左側為將9個不同區域展開后的RoI特征, 9個區域分別對應着不同的位置, 在Pooling時首先選取其所 在區域的對應位置的特征, 例如左上區域只選取其左上角的特征, 右下區域只選取右下角的特征, 選取后對區域內求均值, 最終可形成右側的一個c+1維的k×k特征圖。
接下來再對這個c+1維的k×k特征進行逐通道求和, 即可得到c+1維的向量, 最后進行Softmax即可完成這個RoI的分類預測。
至於RoI的位置回歸, 則與分類很相似, 只不過位置敏感得分圖的通道數為k2(c+1), 而回歸的敏感回歸圖的通道數為k2×4, 按照相同的方法進行Pooling, 可形成通道數為4的k×k特征, 求和可得到1×4的向量,即為回歸的預測。
由於R-FCN去掉了全連接層, 並且整個網絡都是共享計算的, 因此速度很快。 此外, 由於位置敏感得分圖的存在, 引入了位置信息, 因此R-FCN的檢測效果也更好。
5. 級聯網絡: Cascade RCNN
在前面的講解中可以得知, 在得到一個RoI后, Faster RCNN通過RoI與標簽的IoU值來判斷該RoI是正樣本還是負樣本, 默認的IoU閾值為0.5, 這個閾值是一個超參數, 對於檢測的精度有較大影響。
如何選擇合適的閾值是一個矛盾的問題。 一方面, 閾值越高, 選出的RoI會更接近真實物體, 檢測器的定位會更加准確, 但此時符合條件的RoI會變少, 正、 負樣本會更加不均衡, 容易導致訓練過擬合; 另一方面, 閾值越低, 正樣本會更多, 有利於模型訓練, 但這時誤檢也會增多, 從而增大了分類的誤差。
對於閾值的問題, 通過實驗可以發現兩個現象:
·一個檢測器如果采用某個閾值界定正負樣本時, 那么當輸入Proposal的IoU在這個閾值附近時, 檢測效果要比基於其他閾值時好, 也就是很難讓一個在指定閾值界定正、 負樣本的檢測模型對所有IoU的輸入Proposal檢測效果都最佳。
·經過回歸之后的候選框與標簽之間的IoU會有所提升。
基於以上結果, 2018年CVPR上的Cascade RCNN算法通過級聯多個檢測器來不斷優化結果, 每個檢測器都基於不同的IoU閾值來界定正負樣本, 前一個檢測器的輸出作為后一個檢測器的輸入, 並且檢測器越靠后, IoU的閾值越高。級聯檢測器可以有多種形式, 如圖4.19所示為迭代式的邊框回歸模型示意圖, 圖中的Pooling代表了RoI Pooling過程, H1表示RCNN部分絡, C與B分別表示分類與回歸部分網絡。 從圖中可以看出, 這種方法 將前一個回歸網絡輸出的邊框作為下一個檢測器的輸入繼續進行回歸,
連續迭代3次才得到結果。
從前面的實驗可以得知, 經過一個固定IoU閾值的檢測器后, 邊框的IoU會提升, 分布也發生了變化, 即越來越靠近真實物體。 如果下一個檢測器仍然還是這個IoU閾值的話, 顯然不是一個最優的選擇, 這也是上述這種級聯器的問題所在。
圖4.20是另一種多個檢測器的組合方式, 稱為Integral Loss。 圖中H1、 H2與H3分別代表不同的IoU閾值界定正負樣本的檢測器, 當閾值較高時, 預測的邊框會更為精准, 但會損失一些正樣本。 這種方法中多個檢測器相互獨立, 沒有反饋優化的思想, 僅僅是利用了多個IoU閾值的檢測器。
圖4.21的結構則是Cascade RCNN采用的方法, 可以看到每一個檢測器的邊框輸出作為下一個檢測器的輸入, 並且檢測器的IoU閾值是逐漸提升的, 因此這種方法可以逐步過濾掉一些誤檢框, 並且提升邊框的定位精度。
總體來看, Cascade RCNN算法深入探討了IoU閾值對檢測器性能的影響, 並且在不增加任何tricks的前提下, 在多個數據集上都有了明顯
的精度提升, 是一個性能優越的高精度物體檢測器。