從FPN到Mask R-CNN,一文告訴你Facebook的計算機視覺有多強
翻譯 | 人工智慧頭條(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
相關文章
- 一文告訴你Java日期時間API到底有多爛JavaAPI
- 開源一個從標註到訓練、測試的計算機視覺庫計算機視覺
- 一文概覽2017年Facebook AI Research的計算機視覺研究進展AI計算機視覺
- 沒有足夠多的資料怎麼辦?計算機視覺資料增強方法總結計算機視覺
- 人類大腦如何工作?五篇計算神經學論文告訴你
- OpenCV計算機視覺學習(2)——影像算術運算 & 掩膜mask操作(數值計算,影像融合,邊界填充)OpenCV計算機視覺
- 從智慧化“天眼”看計算機視覺未來計算機視覺
- iOS計算機視覺—ARKitiOS計算機視覺
- 計算機視覺論文集計算機視覺
- 資料視覺化告訴你,北京究竟有多熱?視覺化
- 一文告訴你勝任力模型對企業有多重要模型
- 計算機視覺入門系列(一) 綜述計算機視覺
- 從試用到使用:計算機視覺產業新一輪發展的起步年計算機視覺產業
- 計算機視覺—影象特效(3)計算機視覺特效
- 計算機視覺環境配置計算機視覺
- OpenVINO計算機視覺模型加速計算機視覺模型
- 計算機視覺中的深度學習計算機視覺深度學習
- 【計算機視覺】視訊格式介紹計算機視覺
- 計算機視覺3-> yolov5目標檢測1 |從入門到出土計算機視覺YOLO
- 一文告訴你大資料是什麼大資料
- 一文告訴你資料和資訊的區別
- 計算機視覺中的注意力機制計算機視覺
- 計算機視覺頂會引用格式計算機視覺
- 計算機視覺方向乾貨文章計算機視覺
- 人工智慧 (14) 計算機視覺人工智慧計算機視覺
- Python計算機視覺-第2章Python計算機視覺
- Facebook開源Mask R-CNN的PyTorch 1.0基準,比mmdetection更快、更省記憶體CNNPyTorch記憶體
- Hugging Face 中計算機視覺的現狀Hugging Face計算機視覺
- CV:計算機視覺基礎之影像儲存到計算機的原理daiding計算機視覺AI
- 收藏 | 一文告訴你大資料分析對企業有什麼幫助大資料
- “視聯網”或將成為計算機視覺的下一個藍海計算機視覺
- 2020上半年收集到的優質AI文章 – 計算機視覺AI計算機視覺
- iOS計算機視覺—人臉識別iOS計算機視覺
- 計算機視覺基本原理——RANSAC計算機視覺
- Pytorch計算機視覺實戰(更新中)PyTorch計算機視覺
- 計算機視覺方向文章清單20191105計算機視覺
- 計算機視覺技術專利分析計算機視覺
- 計算機視覺與深度學習公司計算機視覺深度學習