從FPN到Mask R-CNN,一文告訴你Facebook的計算機視覺有多強

AI科技大本營發表於2018-03-20



翻譯 | 人工智慧頭條(ID:AI_Thinker)

參與 | 林椿眄


本文概述了 Facebook AI Research(FAIR)近期在計算機視覺領域的研究進展,內容主要包括基礎結構模組的創新、卷積神經網路、one shot 檢測模組等,以及一些在例項分割方面的創新方法,並介紹了弱半監督學習方式下例項分割的研究進展。下面將逐一介紹,文中的一些引用可在文末的參考文獻中找到。


Feature Pyramid Networks( 特徵金字塔網路)


首先,我們要介紹的是著名的特徵金字塔網路[1](這是發表在 CVPR 2017 上的一篇論文,以下簡稱FPN)。


如果你在過去兩年有一直跟進計算機視覺領域的最新進展的話,那你一定聽說過這個網路的大名,並和其他人一樣等待著作者開源這個專案。FPN 這篇論文提出的一種非常棒的思路。我們都知道,構建一個多工、多子主題、多應用領域的基線模型是很困難的。


FPN 可以視為是一種擴充套件的通用特徵提取網路(如 ResNet、DenseNet),你可以從深度學習模型庫中選擇你想要的預訓練的 FPN 模型並直接使用它!


通常,影像目標有多個不同尺度和尺寸大小。一般的資料集無法捕捉所有的影像屬性,因此人們使用影像金字塔的方式,對影像按多種解析度進行降級,提取影像特徵,以方便 CNN 處理。但是,這種方法最大弊端是網路處理的速度很慢,因此我們更喜歡使用單個影像尺度進行預測,也就導致大量影像特徵的流失,如一部分研究者可能從特徵空間的中間層獲取預測結果。


換句話說,以 ResNet 為例,對於分類任務而言,在幾個 ResNet 模組後放置一個反摺積層,在有輔助資訊和輔助損失的情況下獲取分割輸出(可能是 1x1 卷積和 GlobalPool),這就是大部分現有模型架構的工作流程。


回到我們的主題,FPN 作者提出一種新穎的思想,能夠有效改善現有的處理方式。他們不單單使用側向連線,還使用自上而下的路徑,並通過一個簡單的 MergeLayer(mode=『addition』)將二者結合起來,這種方式對於特徵的處理是非常有效!由於初始卷積層提取到的底層特徵圖(初始卷積層)的語義資訊不夠強,無法直接用於分類任務,而深層特徵圖的語義資訊更強,FPN 正是利用了這一關鍵點從深層特徵圖中捕獲到更強的語義資訊。


此外,FPN 通過自上而下的連線路徑獲得影像的 Fmaps(特徵圖),從而能夠到達網路的最深層。可以說,FPN 巧妙地將二者結合了起來,這種網路結構能夠提取影像更深層的特徵語義資訊,從而避免了現有處理過程資訊的流失。



其他一些實現細節


  • 影像金字塔:認為同樣大小的所有特徵圖屬於同一個階段。最後一層的輸出是金字塔的 reference FMaps。如 ResNet 中的第 2、3、4、5 個模組的輸出。你可以根據記憶體和特定使用情況來改變金字塔。

  • 側向連線:1x1 卷積和自上而下的路徑都經過 2× 的上取樣過程。上層的特徵以自上而下的方式生成粗粒度的影像特徵,而側向連線則通過自下而上的路徑來新增更多細粒度的特徵資訊。在此我引用了論文中的一些圖片來幫助你進一步理解這一過程。

  • 在 FPN 的論文中,作者還介紹了一個簡單的 demo 來視覺化這個想法的設計思路。



如前所述,FPN 是一個能夠在多工情景中使用的基線模型,適用於如目標檢測、分割、姿態估計、人臉檢測及其他計算機視覺應用領域。這篇論文的題目是 FPNs for Object Detection,自 2017 年發表以來引用量已超過 100 次!


此外,論文作者在隨後的 RPN(區域建議網路)和 Faster-RCNN 網路研究中,仍使用 FPN 作為網路的基線模型,可見 FPN的強大之處。以下我將列出一些關鍵的實驗細節,這些在論文中也都可以找到。



實驗要點


  • RPN:這篇論文中,作者用 FPN 來代替單個尺度 Fmap,並在每一級使用單尺度 anchor (由於使用了 FPN,因此沒必要使用多尺度的 anchor)。此外,作者還展示了所有層級的特徵金字塔共享類似的語義資訊。

  • Faster RCNN:這篇論文中,作者使用類似影像金字塔的輸出方式處理這個特徵金字塔,並使用以下公式將感興趣域(RoI)分配到特定的層級中。

  • ,其中 w、h 分別表示寬度和高度,k 表示 RoI 所分配到的層級,k0 代表的是 w=224,h=224 時所對映到的層級。

  • Faster RCNN 在 COCO 資料集上取得當前最先進的實驗結果,沒有任何冗餘的結構。

  • 論文的作者對每個模組的功能進行了消融(ablation)研究,並論證了本文提出的想法。

  • 此外,還基於 DeepMask 和 SharpMask 論文,作者進一步展示瞭如何使用 FPN 生成分割的建議區域(segmentation proposal generation)。


對於其他的實現細節、實驗設定等內容,感興趣的同學可以認真閱讀下這篇論文。


實現程式碼


  • 官方的Caffe2版本:

    https://github.com/facebookresearch/Detectron/tree/master/configs/12_2017_baselines

  • Caffe版本:https://github.com/unsky/FPN

  • PyTorch版本:https://github.com/kuangliu/pytorch-fpn (just the network)

  • MXNet版本:https://github.com/unsky/FPN-mxnet

  • Tensorflow版本:https://github.com/yangxue0827/FPN_Tensorflow


RetinaNet:Focal Loss 損失函式用於密集目標檢測任務


這個架構是由同一個團隊所開發,這篇論文[2]發表在 ICCV 2017 上,論文的一作也是 FPN 論文的一作。該論文中提出有兩個關鍵想法:通用損失函式Focal Loss(FL)和單階段的目標檢測器RetinaNet。兩者組合成的RetinaNet在COCO的目標檢測任務中表現得非常好,並超過了先前FPN所保持的結果。


Focal Loss


Focal Loss損失函式的提出來源於一個聰明又簡單的想法。如果你熟悉加權函式的話,那麼你應該對Focal Loss並不陌生。該損失函式其實就是巧妙地使用了加權的損失函式,讓模型訓練過程更聚焦於分類難度高的樣本。其數學公式如下所示:




其中,γ 是一個可改變的超引數,pt 表示分類器輸出的樣本概率。將 γ 設定為大於 0,將會減小分類結果較好的樣本權重。α_t 表示標準加權損失函式中的類別權重,在論文中將其稱為 α-balanced 損失。值得注意的是,這個是分類損失,RetinaNet 將其與 smooth L1 損失結合,用於目標檢測任務。


RetinaNet


YOLO2 和 SSD 是當前處理目標場景最優的單階段(one-stage)演算法。相繼的,FAIR 也開發了自己的單階段檢測器。作者指出,YOLO2 和 SSD 模型都無法接近當前最佳的結果,而RetinaNet 可以輕鬆地實現單階段的最佳的檢測結果,而且速度較快,他們將這歸功於新型損失函式(Focal Loss)的應用,而不是簡單的網路結構(其結構仍以 FPN 為基礎網路)。


作者認為,單階段檢測器將面臨很多背景和正負類別樣本數量不平衡的問題(而不僅僅的簡單的正類別樣本的不均衡問題),一般的加權損失函式僅僅是為了解決樣本數量不均衡問題,而Focal Loss 函式主要是針對分類難度大/小的樣本,而這正好能與 RetinaNet 很好地契合。


注意點:


  • 兩階段(two-stage)目標檢測器無需擔心正、負樣本的不均衡問題,因為在第一階段就將絕大部分不均衡的樣本都移除了。

  • RetinaNet 由兩部分組成:主幹網路(即卷積特徵提取器,如 FPN)和兩個特定任務的子網路(分類器和邊界框迴歸器)。

  • 採用不同的設計引數時,網路的效能不會發生太大的變化。

  • Anchor 或 AnchorBoxes 是與 RPN 中相同的 Anchor[5]。Anchor 的座標是滑動視窗的中心位置,其大小、橫縱比(aspect ratio)與滑動視窗的長寬比有關,大小從 322 到 512 ,橫縱比取值為{1:2, 1:1, 2:1}。

  • 用 FPN 來提取影像特徵,在每一階段都有 cls+bbox 子網路,用於給出 Anchor 中所有位置的對應輸出。


實現程式碼


  • 官方的Caffe2版本:

    https://github.com/facebookresearch/Detectron/tree/master/configs/12_2017_baselines

  • PyTorch版本:https://github.com/kuangliu/pytorch-retinanet

  • Keras版本:https://github.com/fizyr/keras-retinanet

  • MXNet版本:https://github.com/unsky/RetinaNet


Mask R-CNN


正如上面所述,Mask R-CNN [3]也幾乎是同一個團隊開發的,並發表在 ICCV 2017 上,用於影像的例項分割任務。簡單來說,影像的例項分割不過就是不使用邊界框的目標檢測任務,目的是給出檢測目標準確的分割掩碼。這項任務想法簡單,實現起來也並不困難,但是要使模型正常執行並達到當前最佳的水準,或者使用預訓練好的模型來加快分割任務的實現等,想要做到這些可並不容易。


TL;DR:如果你瞭解 Faster R-CNN 的工作原理,那麼 Mask R-CNN 模型對你來說是很簡單的,只需要在 Faster R-CNN 的基礎上新增一個用於分割的網路分支,其網路主體有 3 個分支,分別對應於 3 個不同的任務:分類、邊界框迴歸和例項分割。


值得注意的是,Mask R-CNN 的最大貢獻在於,僅僅使用簡單、基礎的網路設計,不需要多麼複雜的訓練優化過程及引數設定,就能夠實現當前最佳的例項分割效果,並有很高的執行效率。


我很喜歡這篇論文,因為它的思想很簡單。但是,那些看似簡單的東西卻伴有大量的解釋。例如,多項式掩碼與獨立掩碼的使用(softmax vs sigmoid)。


此外,Mask R-CNN 並未假設大量先驗知識,因此在論文中也沒有需要論證的內容。如果你有興趣,可以仔細檢視這篇論文,你可能會發現一些有趣的細節。基於你對 Faster RCNN已有了基礎瞭解,我總結了以下一些細節幫助你進一步理解 Mask R-CNN:


  • 首先,Mask R-CNN 與 Faster RCNN 類似,都是兩階段網路。第一階段都是 RPN 網路。

  • Mask R-CNN 新增一個並行分割分支,用於預測分割的掩碼,稱之為 FCN。

  • Mask R-CNN 的損失函式由 L_cls、L_box、L_maskLcls、L_box、L_mask 四部分構成。

  • Mask R-CNN 中用 ROIAlign 層代替 ROIPool。這不像 ROIPool 中那樣能將你的計算結果的分數部分(x/spatial_scale)四捨五入成整數,而是通過雙線性內插值法來找出特定浮點值對應的畫素。

  • 例如:假定 ROI 高度和寬度分別是 54、167。空間尺度,也稱為 stride 是影像大小 size/Fmap 的值(H/h),其值通常為 224/14=16 (H=224,h=14)。此外,還要注意的是:

    • ROIPool: 54/16, 167/16 = 3,10

    • ROIAlign: 54/16, 167/16 = 3.375, 10.4375

    • 現在,我們使用雙線性內插值法對其進行上取樣。

    • 根據 ROIAlign 輸出的形狀(如7x7),我們可以用類似的操作將對應的區域分割成合適大小的子區域。

    • 使用 Chainer folks 檢查 ROIPooling 的 Python 實現,並嘗試自己實現 ROIAlign。

    • ROIAlign 的實現程式碼可在不同的庫中獲得,具體可檢視下面給出的程式碼連結。

  • Mask R-CNN 的主幹網路是 ResNet-FPN。


此外,我還曾專門寫過一篇文章介紹過Mask-RCNN的原理,部落格地址是:https://coming.soon/。


實現程式碼


  • 官方的Caffe2版本:

    https://github.com/facebookresearch/Detectron/tree/master/configs/12_2017_baselines

  • Keras版本:https://github.com/matterport/Mask_RCNN/

  • PyTorch版本:https://github.com/soeaver/Pytorch_Mask_RCNN/

  • MXNet版本:https://github.com/TuSimple/mx-maskrcnn


 Learning to Segment Everything


正如題目 Learning to Segment Everything 那樣,這篇論文是關於目標分割任務,具體來說是解決例項分割問題。計算機視覺領域中標準的分割資料集對於現實的應用而言,資料集的數量都太有限了,即使是當前最流行、最豐富的 COCO 資料集[7],也僅有 80 種目標類別,這還遠遠無法達到實用的需求。


相比之下,目標識別及檢測的資料集,如 OpenImages[8]就有將近 6000 個分類類別和 545 個檢測類別。此外,史丹佛大學的另一個資料集 Visual Genome 也擁有近 3000 個目標類別。但由於這個資料集中每個類別所包含的目標數量太少了,即使它的類別在實際應用中更加豐富、有用,深度神經網路也無法在這樣的資料集上取得足夠好的效能,因此研究者通常不喜歡選用這些資料集進行目標分類、檢測問題的研究。值得注意的是,這個資料集僅有 3000 個目標檢測(邊界框)的標籤類別,而沒有包含任何目標分割的標註,即無法直接用於目標分割的研究。


下面來介紹我們要講的這篇論文[4]。


就資料集而言,實際上邊界框與分割標註之間並不存在太大的區別,區別僅在於後者比前者的標註資訊更加精確。因此,本文的作者正是利用 Visual Genome[9]資料集中有 3000 個類別的目標邊界框標籤來解決目標分割任務。我們稱這種方法為弱監督學習,即不需要相關任務的完整監督資訊。如果他們使用的是 COCO + Visual Genome 的資料集,即同時使用分割標籤和邊界框標籤,那麼這同樣可稱為是半監督學習。


讓我們回到主題,這篇論文提出了一種非常棒的思想,其網路架構主要如下:


  • 網路結構建立在 Mask-RCNN 基礎上。

  • 同時使用有掩碼和無掩碼的輸入對模型進行訓練。

  • 在分割掩碼和邊界框掩碼之間新增了一個權重遷移函式。

  • 當使用一個無掩碼的輸入時,將  函式預測的權重與掩碼特徵相乘。當傳遞一個有掩碼的輸入時,則使用一個簡單的 MLP 而不使用該函式。

  • 如下圖所示:A 表示 COCO 資料集,B 表示 Visual Genome 資料集,對網路的不同輸入使用不同的訓練路徑。

  • 將兩個損失同時進行反向傳播將導致  不一致的權重值:對 COCO 和 Visual Genome 之間的共有的目標類別,需要同時計算掩碼損失和邊界框損失;而對於二者各自獨有的類別,則僅需要計算邊界框損失。作者使用的改進方法是:

    • Fix:當反向傳播掩碼損失時,要計算預測掩碼的權重 τ 關於權重遷移函式引數 θ 的梯度值,而對邊界框的權重不做該計算。

    • ,其中 τ 表示預測掩碼的權重值。




由於 Visual Genome 資料集沒有分割標註,模型無法給出在該資料集上目標分割的準確率,因此作者在其他的資料集上展示模型的驗證結果。PASCAL-VOC 資料集有 20 個目標類別,這些類別全部包含在 COCO 資料集中。因此,對於這 20 種類別,他們使用 PASCAL-VOC 資料集的分割標註及 COCO 資料集中相應類別的邊界框標籤對模型進行訓練。


論文展示了在 COCO 資料集中這 20 個類別上,模型例項分割的結果。此外由於兩個資料集包含兩種不同的真實標籤,他們還對相反的情況進行了訓練,實驗結果如下圖所示。





參考文獻

[1] Lin, Tsung-Yi, Piotr Dollár, Ross B. Girshick, Kaiming He, Bharath Hariharan and Serge J. Belongie. “Feature Pyramid Networks for Object Detection.” *2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR)* (2017): 936-944.

[2] Lin, Tsung-Yi, Priya Goyal, Ross B. Girshick, Kaiming He and Piotr Dollár. “Focal Loss for Dense Object Detection.” *2017 IEEE International Conference on Computer Vision (ICCV)* (2017): 2999-3007.

[3] He, Kaiming, Georgia Gkioxari, Piotr Dollár and Ross B. Girshick. “Mask R-CNN.” *2017 IEEE International Conference on Computer Vision (ICCV)* (2017): 2980-2988.

[4] Hu, Ronghang, Piotr Dollár, Kaiming He, Trevor Darrell and Ross B. Girshick. “Learning to Segment Every Thing.” *CoRR*abs/1711.10370 (2017): n. pag.

[5] Ren, Shaoqing, Kaiming He, Ross B. Girshick and Jian Sun. “Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks.” *IEEE Transactions on Pattern Analysis and Machine Intelligence* 39 (2015): 1137-1149.

[6] Chollet, François. “Xception: Deep Learning with Depthwise Separable Convolutions.” 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR) (2017): 1800-1807.

[7] Lin, Tsung-Yi, Michael Maire, Serge J. Belongie, James Hays, Pietro Perona, Deva Ramanan, Piotr Dollár and C. Lawrence Zitnick. “Microsoft COCO: Common Objects in Context.” ECCV (2014).

[8] Krasin, Ivan and Duerig, Tom and Alldrin, Neil and Ferrari, Vittorio et al. OpenImages: A public dataset for large-scale multi-label and multi-class image classification. Dataset available from https://github.com/openimages

[9] Krishna, Ranjay, Congcong Li, Oliver Groth, Justin Johnson, Kenji Hata, Joshua Kravitz, Stephanie Chen, Yannis Kalantidis, David A. Shamma, Michael S. Bernstein and Li Fei-Fei. “Visual Genome: Connecting Language and Vision Using Crowdsourced Dense Image Annotations.” International Journal of Computer Vision 123 (2016): 32-73.


作者:krish 

原文連結:https://skrish13.github.io/articles/2018-03/fair-cv-saga





相關文章