FAIR最新視覺論文集錦:FPN,RetinaNet,Mask 和 Mask-X RCNN(含代碼實現)
本文為雷鋒字幕組編譯的技術博客,原標題Recent FAIR CV Papers - FPN, RetinaNet, Mask and Mask-X RCNN,作者為Krish。
FPN, RetinaNet,,Mask 和 Mask-X RCNN
翻譯 | 李石羽 林立宏 整理 | 凡江
這篇文章會從 FAIR 在基本模塊上的創新開始談到CNN,再到one-shot 物體檢測。之後會講實例分割的創新。最後聊聊依靠弱半監督模型來擴展實例分割。
FPN
特徵金字塔網路 (FPN) [1] 發表在 2017 年的 CVPR 上。如果你關注最近兩年計算機視覺的發展,就知道冥冥之中存在著那樣一些優秀的演算法,而你要做的,就是等著大神們把它寫出來、訓練好、再公開源碼。認真地說,FPN這篇論文寫的非常不錯,很合我胃口。能構建出一個簡單易行的基本模型,在各種不同的任務都好使,並不是一件容易的事。深究細節之前先強調一點,FPN 是基於一個特徵提取網路的,它可以是常見的 ResNet 或者 DenseNet 之類的網路。在你最常用的深度學習框架下取一個預訓練模型,就可以用來實現 FPN 了。
圖像里的目標尺寸大小各種各樣,數據集里的物體不可能涵蓋所有的尺度,所以人們利用圖像金字塔(不同解析度的下採樣)來幫助 CNN 學習。但是這樣的速度太慢了,所以人們只使用單一尺度來預測,也有人會取中間結果來預測。後者和前者很像,只不過是在特徵圖上的。比較容易想到的方法是,在幾層殘差模塊後面加一層轉置卷積,提高解析度,得到分割的結果,或者通過 1x1 的卷積或 GlobalPool 得到分類的結果。這種架構在有輔助信息和輔助損失函數時被大量使用。
FPN 的作者用一種很巧妙的辦法提高了上述的方法。除了側向的連接,還加入了自上而下的連接。這樣做效果非常好。作者把從上到下的結果和側向得到的結果通過相加的辦法融合到一起。這裡的重點在於,低層次的特徵圖語義不夠豐富,不能直接用於分類,而深層的特徵更值得信賴。將側向連接與自上而下的連接組合起來,就可以得到不同解析度的的特徵圖,而它們都包含了原來最深層特徵圖的語義信息。
模型細節
金字塔 - 同樣尺寸的特徵圖屬於同一級。每級最後一層輸出是金字塔的特徵圖,比如 ResNet 第2,3,4,5個模塊的最後一層。你可以根據需要進行調整。
側向連接:通過 1x1 卷積並與經過上採樣的從上到下連接的結果相加求和。自上而下的部分生成粗粒度特徵,自下而上的部分通過側向連接加入細粒度特徵。原文的圖示表達的非常明了。
原文中只是用一個簡單的例子展示了 FPN 的設計之簡單以及效果之可觀,這不代表它不能用於更複雜的研究中。
如我剛才所說,這是個萬金油網路,可以用在目標檢測、實例分割、姿態識別、面部識別等各種各樣的應用里。文章僅僅公開幾個月就有了近 100 次引用。文章題目是《用於目標識別的金字塔特徵網路》,所以作者把 FPN 帶入到 Faster-RCNN 中作為區域推薦網路 (RPN)。很多關鍵的細節在原文中都有詳細的解釋,為了節約時間我這裡列幾條重點。
實驗要點
用 FPN 作為 RPN - 用 FPN 的多解析度特徵取代單一解析度的特徵圖,每一級上用同樣的尺寸的 anchor(因為特徵圖尺度不同從而達到了多尺度 anchor 的效果)。金字塔的每一級都共享相似的語義水平。
FasterRCNN - 用類似於處理圖像金字塔的方法來處理 FPN。ROI通過下面這個公式來分派給特定的一級。
w 和 h 分別代表寬度和高度。k 是ROI被分配到的層級,
表示輸入原圖大小(224x224)的那一層。
簡單粗暴地在 COCO 數據集上獲得了最優效果。
對每一個模塊都進行了單變數實驗,從而證明了開頭的說法。
基於 DeepMask and SharpMask 架構演示了 FPN 可以用於圖像分割建議生成。
對實現細節感興趣的同學一定要去讀一讀原文。
附註:FPN 是基於一個主幹模型的,比如 ResNet。常見的命名方法是:主幹網路-層數-FPN,例如:ResNet-101-FPN
代碼實現
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
同樣的團隊,同樣的一作,這篇文章發表在了 2017 年的 ICCV 上[2]。這篇文章有兩個重點,一般性的損失函數 Focal Loss (FL) 以及單階段的目標檢測模型 RetinaNet。這兩者的結合在 COCO 目標檢測任務中大顯身手,超過了剛才提到的 FPN。
Focal Loss
這是一個極其精巧簡潔的設計。如果你熟悉加權損失函數的話,這基本上是同樣的原理,只不過更集中在難以分類的樣本上。它的公式如下,很好理解
是一個可以調整的超參數。
表示樣本分類的概率。 讓
大於 0 會降低分類正確樣板的權重。
含義與在常規的加權損失函數中相同。論文中被稱為
損失函數。注意這只是用於分類的損失函數,在 RetinaNet 的目標檢測任務中要與 smooth L1 損失一起使用。
RetinaNet
一款單階段檢測器竟是出於 FAIR 之手,實在驚人。YOLOv2 和 SSD 在單階段檢測領域稱霸至今。但如作者所說,它們都沒有達到目前(包括兩階段檢測器)最佳的效果。 同為單階段檢測器的 RetinaNet 卻做到了,兼顧速度與效果。作者表示能帶到如此效果是因為新的損失函數而不是網路的改進(網路用的是 FPN)。 單階段檢測器會面臨大量的樣本不平衡狀況,背景樣本太多,物體樣本太少。加權損失只能做到平衡,而 FL 主要針對難例,這兩者也可以相結合。
需要注意的地方
兩階段檢測器不需要擔心不平衡的問題,因為第一階段移除了幾乎所有的不平衡。
網路包含兩部分 - 主幹網路(用於特徵提取,比如 FPN)和兩個子網路分別用於分類與邊框回歸。
選擇不同組件時性能差異不大。
Anchor 或 AnchorBoxes 與 RPN [5] 中的 Anchor 相同,都以滑窗為中心並有一個長寬比。尺度與長寬比和 [1] 一樣,尺度從
到
,長寬比分別為 1:2, 1:1, 2:1。
FPN 的每一級,都通過子網路給出相應的有 anchor 的輸出。
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] 也是來自同一個團隊。在2017年的ICCV上發表的,用於圖像實例分割。對於外行人來說,它是基本的對象檢測,而不是畫邊界框, 任務是給出對象的精確分割圖! 回想起來,人們會說這一個如此簡單的想法,但是它是可行的,並且成為了SOTA,為預訓練的模型提供了一種快速實現,這是一項了不起的工作!
長話短說,如果你知道 Faster-RCNN,那你就會知道它非常簡單,給分割添加另外一個頭部(分支)。通常是3個分支,分別用於分類,邊框回歸和分割。
又一次,這種方法關注於使用簡單和基本的神經網路設計來提高效率。沒有任何花里胡哨的東西就讓他們獲得了SOTA。(有一些免費技術(比如OHEM,多維度訓練/測試等)能夠適用於所有的方法用於提高準確性,花里胡哨的實現並不使用他們。因為他們是免費的,準確率肯定會提高。但是這不在本文的討論範圍之內)
我非常喜歡這篇論文,它非常的簡單。但有一些論文在一些很簡單的事情上給了過多的解釋,並給出了明確的方式進行實現。比如說,使用多項mask和獨立的mask(softmax 和 sigmoid)。此外,它不需要假定大量先驗知識和解釋所有的事情(有時候可能也是一個騙局)。有人認真了論文的話就會很明顯地發現,他們的新想法在現有成熟的環境上不能工作。下面的解釋假定了你對 Fast RCNN有基本的了解:
它和FasterRCNN是相似的,有兩個階段,第一階段是RPN。
加入了平行分支用於預測分割mask——一個FCN。
損失是
的總和
用ROIAlign 層替代了ROIPool。這實際上是將 (x/spatial_scale) 分數四捨五入為一個整數像ROIPool中那樣。 相反,它通過雙線性插值來找出那些浮點值處的像素。
例如:假設ROI的高度和寬度分別為54,167。 空間尺度基本上是圖像尺寸/ 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用python實現的ROIPooling,並嘗試自己實現ROIAlign
ROIAlign代碼可以在不同的庫中使用,請查看下面提供的代碼倉庫。
核心是 ResNet-FPN
PS - 我針對Mask-RCNN上也寫了一篇單獨的文章,很快就會在這裡發布。
代碼實現
Official 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
Mask-X RCNN
正如標題所說的,這是關於分割的。更準確的說,是實例分割。計算機視覺中的分割標準數據集,對現實世界有用的非常少。 COCO數據集[7]即使在2018年也是最流行和豐富的數據集,只有80個對象類。這甚至不是很有用。 相比之下,對象識別和檢測數據集(如OpenImages [8])具有近6000個分類和545個檢測 。話雖如此,斯坦福大學還有另一個名為Visual Genome數據集的數據集,其中包含3000類對象!那麼,為什麼不使用這個呢? 每個分類下的對象數量太少,所以DNN沒有辦法在這樣的數據集上很好的工作,所以人們不使用這個數據集儘管它很豐富,對現實世界也很有用。請注意,數據集沒有任何分割的注釋,只有3000個類別的對象檢測(邊框)標籤可用。
談到第四篇論文啦,這也是一篇非常酷的論文。正如人們能想到,在邊框和分割註解領域上並沒有太大的區別,只是後者比前者精確得多。所以,因為我們在Visual Genome [9]數據集中有3000個類,為什麼不利用它來給出分割輸出。這就是他們所做的,這可以稱為弱監督(或弱半監督)學習,你沒有完全監督你試圖完成的任務。它還可以與半監督相關聯,因為它們使用COCO + Visual Genome數據集。分割標籤以及邊框標籤。這篇論文是迄今為止最酷的。
建立在Mask-RCNN之上
輸入有mask和輸入沒有mask兩種方式進行訓練
在mask和bbox mask之間添加一個權重轉換函數
在訓練過程中,一個能夠在整個數據集上 反向傳播bbox的損失,但是另外一個只能在輸入的真實數據(數據集 A)中帶有mask的損失上反向傳播
在推斷過程中,當通過一個輸入的時候,函數 τ 預測mask特徵需要相乘的權重。模型的一種拓展使用了融合MLP+FCN模型的方式來改善準確度。這裡只是使用了簡單的MLP來代替。
如下圖所示,兩個數據集:A是COCO數據集和B是VG數據集, 注意不同輸入(bbox和mask)在任意輸入計算得到不同的損失。
反向傳播是計算這兩種損失會導致
的權重出現差異,因為COCO和VG之間的共同類別有兩個損失(bbox和mask),而其餘類別只有一個(bbox)。這有一個解決辦法:
當反向傳播mask時,計算預測mask權重
與權重傳遞函數參數θ的梯度,但不包括邊框權重
。
其中 τ 函數預測mask的權重
由於沒有注釋可用,因此他們無法在VG數據集上顯示精確度。 所以他們把這個想法應用到可以證明結果的數據集上。PASCAL-VOC有20個等級,在COCO中都很常見 。因此,他們使用VOC分類標籤進行培訓,並且只使用來自COCO的bbox標籤對這20個類進行訓練。 針對在COCO數據集的20個類的實例分割的任務的結果如下. 反之亦然,因為這兩個數據集中都有真實值(Ground truth),這個結果列在下面的表格中。
PS - 如果它變得有用的話,我打算查閱論文來寫一篇關於使用權重預測方法,去做有意思的事。
代碼實現
PyTorch
參考文獻
[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.
更多文章,關注雷鋒網 雷鋒網 雷鋒網
添加雷鋒字幕組微信號(leiphonefansub)為好友
備註「我要加入」,To be an AI Volunteer !
※撞人還是撞自己?我們該如何面對這種道德困境?
※Overstock ICO受SEC審查,股價下跌4%
TAG:雷鋒網 |