▌Feature Pyramid Networks( 特征金字塔網絡)
首先,我們要介紹的是著名的特征金字塔網絡(這是發表在 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 基礎上。
-
同時使用有掩碼和無掩碼的輸入對模型進行訓練。
-
在分割掩碼和邊界框掩碼之間添加了一個權重遷移函數。
-
當使用一個無掩碼的輸入時,將
-
如下圖所示:A 表示 COCO 數據集,B 表示 Visual Genome 數據集,對網絡的不同輸入使用不同的訓練路徑。
-
將兩個損失同時進行反向傳播將導致
-
Fix:當反向傳播掩碼損失時,要計算預測掩碼的權重 τ 關于權重遷移函數參數 θ 的梯度值,而對邊界框的權重
-
,其中 τ 表示預測掩碼的權重值。?
-
由于 Visual Genome 數據集沒有分割標注,模型無法給出在該數據集上目標分割的準確率,因此作者在其他的數據集上展示模型的驗證結果。PASCAL-VOC 數據集有 20 個目標類別,這些類別全部包含在 COCO 數據集中。因此,對于這 20 種類別,他們使用 PASCAL-VOC 數據集的分割標注及 COCO 數據集中相應類別的邊界框標簽對模型進行訓練。
論文展示了在 COCO 數據集中這 20 個類別上,模型實例分割的結果。此外由于兩個數據集包含兩種不同的真實標簽,他們還對相反的情況進行了訓練,實驗結果如下圖所示。
?
-
Facebook
+關注
關注
3文章
1429瀏覽量
55000 -
計算機視覺
+關注
關注
8文章
1700瀏覽量
46130
原文標題:從FPN到Mask R-CNN,一文告訴你Facebook的計算機視覺有多強
文章出處:【微信號:AI_Thinker,微信公眾號:人工智能頭條】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
機器視覺與計算機視覺的關系簡述
計算機視覺領域的關鍵技術/典型算法模型/通信工程領域的應用方案
什么是Mask R-CNN?Mask R-CNN的工作原理
引入Mask R-CNN思想通過語義分割進行任意形狀文本檢測與識別
手把手教你操作Faster R-CNN和Mask R-CNN
Facebook AI使用單一神經網絡架構來同時完成實例分割和語義分割
![<b class='flag-5'>Facebook</b> AI使用單一神經網絡架構來同時完成實例分割和語義分割](https://file.elecfans.com/web1/M00/8F/71/pIYBAFy9OS2AXtmuAAAiWsGVBaE545.png)
基于Mask R-CNN的遙感圖像處理技術綜述
用于實例分割的Mask R-CNN框架
PyTorch教程14.8之基于區域的CNN(R-CNN)
![PyTorch教程14.8之基于區域的<b class='flag-5'>CNN</b>(<b class='flag-5'>R-CNN</b>)](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評論