一文看懂近年火到不行的CNN圖像識別:從R-CNN到Mask R-CNN
卷積神經網路(Convolutional Neural Networks, CNNs)在Athelas中除了用於解決分類問題,還在很多地方有著廣泛應用。本文主要介紹如何CNNs在圖像實例分割中起到的巨大作用。
自從2012年Alex Krizhevsky,Geoff Hinton和Ilya Sutskever在ImageNet挑戰賽獲勝以來,CNNs已經成為圖像分類的黃金標準。此後CNN不斷優化,現在在ImageNet挑戰賽中的表現甚至超過了人類的水平。
在ImageNet挑戰賽中,CNN的表現已經比人類的更勝一籌,上圖中Y軸表示錯誤率。雖然這些成果令人震驚,但圖像分類相對於人類視覺理解的複雜性和多樣性來說還算是不足的。
分類挑戰中使用的圖像示例。這個圖像里只有一個物體,需要關注的是怎樣把它完整地框起來。在分類中,通常一個圖像只關注一個目標,任務是分辨出那個圖像是什麼(如上面)。但當我們觀察周圍的世界時,我們需要處理更複雜的情況。
現實生活中的景象通常是由許多不同的、重疊的物體、背景和動作組成的。
我們看到複雜的景象,有許多重疊的物體和不同的背景,我們不僅能分辨這些不同的物體,而且還識別它們的邊界、差異和它們相互之間的關係!
在圖像分割中,我們的目標是對圖像中的不同對象進行分類,並識別它們的邊界。來源:Mask R-CNN paper。
CNNs能否幫助我們完成如此複雜的任務?也就是說,給出一張複雜的圖像,能否利用CNNs識別圖像中的不同目標以及他們的邊界呢?Ross Girshick和他的同事近幾年的研究表明,答案是肯定的!
本文目標
本文主要介紹目標檢測和分割中所用到的主要技術背後的知識以及這些技術的演進過程,特別是R-CNN(Regional CNN,CNN最早應用於檢測和分割問題的方法)及其衍生出來的Fast R-CNN和Faster R-CNN,最後我們會介紹Mask R-CNN,它是Facebook Research發表的一篇論文中提出的,把目標檢測問題擴展到像素級分割。本文中引用的論文如下:
1. R-CNN: https://arxiv.org/abs/1311.2524
2. Fast R-CNN: https://arxiv.org/abs/1504.08083
3. Faster R-CNN: https://arxiv.org/abs/1506.01497
4. Mask R-CNN: https://arxiv.org/abs/1703.06870
2014: R-CNN(CNNs在目標檢測中的早期應用)
目標檢測演算法(如R-CNN)識別圖像中主要物體的位置和類別,來源:https://arxiv.org/abs/1311.2524。
受多倫多大學Hinton實驗室研究成果的啟發,加州大學伯克利分校Jitendra Malik教授帶領的小團隊提出了一個不可避免的問題:如何將Krizhevsky等人的成果擴展到目標檢測?
目標檢測從圖像中找到不同的物體並對其進行分類(如上圖所示)。Ross Girshick(後續會再次出現的人名)、Jeff Donahue和Trevor Darrel的團隊發現了可以藉助Krizhevsky的研究成果解決並在PASCAL VOC挑戰賽(一個類似於ImageNet的目標檢測挑戰賽)中進行測試的方法。他們的論文中提到:與基於更簡單的HOG-like特性的系統相比,本文首次證明了在PASCAL VOC挑戰賽中,CNN可以顯著提高目標檢測性能。
接下來我們一起了解一下Regions CNN(R-CNN)工作的架構。
了解R-CNN
R-CNN的目標是藉助邊界框(Bounding Box)獲取圖像,並正確地識別圖像中的主要對象:
- 輸入:圖像
- 輸出:圖像中每個物體的邊界框+ 標籤
如何找出邊界框的位置呢?R-CNN採用我們直覺上會做的方式:給出一堆圖像可能的框,然後判斷這些框是否和物體對應。
選擇性搜索(Selective Search)方法通過不同尺寸的窗口的滑動尋找相近紋理、顏色或亮度的相鄰像素。來源:https://www.koen.me/research/pub/uijlings-ijcv2013-draft.pdf。
R-CNN採用選擇性搜索的方法給出邊界框或者區域建議(region proposal)。換個角度看,選擇性搜索通過不同尺寸的窗口在圖像中進行滑動(如上圖所示),對於每個尺寸方法都試圖通過紋理、顏色或亮度將鄰近的像素聚合在一起,實現對物體的識別。
生成一組區域建議之後,R-CNN採用改進後的AlexNet判斷這些區域建議是否是有效的區域。來源:https://arxiv.org/abs/1311.2524。
生成一組區域建議之後,R-CNN將這些區域變換為標準的方形尺寸並採用改進後的AlexNet判斷這些區域建議是否是有效的區域,如上圖所示。
在CNN的最終層,R-CNN增加了支持向量機(Support Vector Machine, SVM),用於簡單判斷區域中是否包含目標以及它是什麼(就像上圖中的第4步)。
調整邊界框
現在已經找到框中的物體,接下來能否調整邊界框,使其更貼近物體的真實範圍呢?當然,這也是R-CNN的最後一步,R-CNN對區域建議進行簡單的線性回歸,從而生成調整後的邊界框並作為最終結果。回歸模型的輸入和輸出如下:
- 輸入:物體在圖像中的子區域(sub-region)
- 輸出:子區域中物體的新邊界框坐標
小結一下,R-CNN的步驟如下:
- 為邊界框生成一組區域建議;
-通過受過訓練的AlexNet和後面的SVM判斷邊界框中對應的圖像是什麼;
-對已分類的邊界框進行線性回歸,輸出這些框對應的更加貼近的坐標。
2015: Fast R-CNN(針對R-CNN進行提速和簡化)
Ross Girshick提出了R-CNN和Fast R-CNN。他在Facebook Research繼續推動計算機視覺(Computer Vision)的發展。
R-CNN效果非常好,但是效率太低了,主要的原因:
- 需要對每個圖像的每個區域建議進行CNN (AlexNet)前向傳播(forward pass),每個圖像大約2000次前向傳播。
-必須分別訓練三個不同的模型——CNN來生成圖像特徵,分類器來預測類別,回歸模型來收緊邊框。這使得所有模型極其難以很好地訓練。
2015年,R-CNN的作者Ross Girshick解決了上述兩個問題,並提出了Fast R-CNN的方法,接下來介紹一下Fast R-CNN。
Fast R-CNN改進點一:感興趣區域池(Region of Interest Pooling/RoIPool)
Ross Girshick發現,對於CNN的前向傳播,每張圖像的很多區域建議總是重疊的,從而導致重複的CNN前向傳播(可能達到2000次)。他的想法非常簡單——為什麼不讓每張圖像只計算一次CNN,然後在2000個區域建議中找到一種方法來分享計算結果呢?
在RoIPool方法中,進行一次完整的前向傳播並從前向傳播結果中提取每個感興趣區域的conv特徵。來源:Stanford』s CS231N slides by Fei Fei Li, Andrei Karpathy, and Justin Johnson。
RoIPool(Region of Interest Pooling)就是Fast R-CNN解決重複計算問題的方法。這個方法的核心是RoIPool把圖片CNN前向傳播結果分享給子區域。如上圖所示,需要注意的是如何從CNN特徵圖(CNN Feature Map)中選擇一個對應的區域來獲取每個區域的CNN特徵。接下來對每個區域的特徵進行池化(pooled)操作(一般採用最大池化,max pooling)。這樣的話我們只需要一次原始圖像的CNN前向傳播,而不是2000次!
Fast R-CNN改進點二:將所有模型整合到一個網路中
Fast R-CNN將CNN、分類器和邊界框線性回歸融合到一個單獨的網路中。來源:https://www.slideshare.net/simplyinsimple/detection-52781995。
Fast R-CNN第二個改進點是將CNN、分類和邊界框線性回歸的訓練融合到單一模型中。之前我們有不同的模型來提取圖像特徵(CNN)、分類(SVM)和收緊邊界框(回歸),而Fast R-CNN則使用單一的網路計算這三個。
您可以在上圖中看到融合是如何實現的:Fast R-CNN採用CNN上層的softmax 層取代了SVM分類器來輸出類別。它還增加了一個平行於softmax層的線性回歸層,以輸出邊界框坐標。這樣,所有需要的輸出都來自一個網路!以下是這個整體模型的輸入和輸出:
- 輸入:帶區域建議的圖像
- 輸出:每個區域的目標分類以及更緊密的邊界框
2016: Faster R-CNN(針對區域建議提速)
經過上述的改進,Fast R-CNN仍然存在一個瓶頸——區域建議。正如我們所看到的,檢測目標位置的第一步是生成一堆要測試的潛在邊界框或感興趣區域。在Fast R-CNN中,這些建議是通過選擇性搜索產生的,但這是一個相當緩慢的過程,是限制Fast R-CNN效率的主要瓶頸。
Jian Sun是微軟研究院的首席研究員,他帶領的研究團隊提出了Faster R-CNN。來源: https://blogs.microsoft.com/next/2015/12/10/microsoft-researchers-win-imagenet-computer-vision-challenge/#sm.00017fqnl1bz6fqf11amuo0d9ttdp
2015年年中,由Shaoqing Ren, Kaiming He, Ross Girshick和Jian Sun組成的微軟研究團隊提出了新方法,使得區域建議變得非常高效,他們將這種方法命名為「Faster R-CNN」。
Faster R-CNN的想法來源於區域建議的特徵計算依賴於圖像的特徵,這些特徵已經通過CNN的前向傳播(分類的第一步),那麼為何不重用這些相同的CNN特徵進行區域建議,從而取代單獨的選擇性搜索呢?
Faster R-CNN方法中採用一個單獨的CNN進行區域建議和分類。來源:Towards Real-Time Object Detection with Region Proposal Networks。
實際上,這就是Faster R-CNN方法的最大的改進。上圖展示了一個單獨CNN完成區域建議和分類的過程。只需要這樣訓練一個CNN,區域建議的計算成本基本可以忽略。提出團隊這麼描述Faster R-CNN:我們的觀察是基於區域的探測器(如Fast R- CNN)所使用的卷積特徵圖也可以用於生成區域建議(從而實現幾乎無成本的區域建議)。
模型的輸入和輸出如下:
- 輸入:圖像(不需要區域建議)
- 輸出:圖像中物體的類別及其對應的邊界框坐標
區域是如何產生的
接下來看一下Faster R-CNN如何從CNN特徵中生成這些區域建議。Faster R-CNN在CNN的功能上增加了一個全卷積網路,即區域建議網路(Region Proposal Network)。
區域建議網路滑動CNN特徵上的窗口,對於每個窗口的位置,網路在每個錨點輸出一個分數和一個邊界框(因此有4k個框坐標,k是錨點的個數)。來源:https://arxiv.org/abs/1506.01497
區域建議網路在CNN特徵圖上和每個窗口上通過一個滑動窗口來工作,輸出k個潛在的邊界框和分數並根據這些框的預期好壞。那麼這k個框代表什麼?
我們知道,人的邊界框往往是矩形和垂直的。我們可以利用這種直覺通過創建這樣維度錨來指引我們的區域建議網路。
圖片來源:http://vlm1.uta.edu/~athitsos/courses/cse6367_spring2011/assignments/assignment1/bbox0062.jpg
直覺上,我們會認為圖像中的物體應該符合一定的長寬比和尺寸,比如人的形狀一般是是矩形框。類似地,我們一般也不會關注那些非常窄的框。據此,我們構建了k個這樣的常見的長寬比,並稱作錨點框(anchor boxes)。每個錨點框輸出邊界框和圖像中每個位置的得分。
考慮這些錨點框,區域建議網路的輸入和輸出如下:
- 輸入:CNN特徵圖
- 輸出:每個錨點對應一個邊界框。分數表示邊界框中對應圖像部分是物體的可能性。
然後我們將每個這樣很可能是一個目標的邊界框傳遞到Fast R-CNN來生成類別並收緊邊界框。
2017: Mask R-CNN(把Faster R-CNN擴展到像素級分割)
圖像實例分割的目標是識別場景中像素級的目標。來源:https://arxiv.org/abs/1703.06870。
至此,我們已經看到了如何以許多有趣的方式使用CNN特性來有效地用邊界框定點陣圖像中的不同物體。
我們是否可以擴展這些技術,使其實現定位每個物體的精確像素,而不僅僅是邊界框?這個問題被稱為圖像分割(image segmentation),這一個包括Kaiming He、Girshick等人的研究團隊在Facebook AI上使用一種名為Mask R-CNN的架構進行的探索。
Kaiming He是一個Facebook AI的研究人員,主導了Mask R-CNN,同時他也是Faster R-CNN的合作者之一。
類似於Fast R-CNN和Faster R-CNN,Mask R-CNN的靈感來源也是很直接的,鑒於Faster R-CNN在目標檢測中的效果,我們是否可以將其擴展到像素級的圖像分割中呢?
Mask R-CNN在Faster R-CNN的CNN特徵的上層增加一個全卷積網路(Fully Convolutional Network,FCN)用於生成mask(分割輸出結果)。這與Faster R-CNN中的分類和邊界框回歸網路的並行的。來源:https://arxiv.org/abs/1703.06870
Maks R-CNN在Faster R-CNN的基礎上增加一個分支實現的,這個分支用於輸出一個Binary Mask,表示給定像素是否屬於目標的一部分。上述分支(上圖中白色部分)就是一個置於CNN特徵圖上層的全卷積網路。它的輸入和輸出如下:
- 輸入:CNN特徵圖
- 輸出:在當前像素屬於目標的所有位置上為1s 的矩陣,其他位置為0s(這被稱為binary mask)
但是Mask R-CNN的作者做了少量調整使得流程按預期工作。
RoiAlign - 調整RoIPool使它更加準確
用RoIAlign取代RoIPool對圖像進行傳遞,從而使得RoIPool選擇區域的特徵圖與原始圖像對應更加精確,這是必需的,因為是像素級的分割比邊界框需要更細粒度的對齊。來源:https://arxiv.org/abs/1703.06870
在沒有對原始的Faster R-CNN架構進行修改前,Mask R-CNN的作者意識到,由RoIPool選擇的特徵圖的區域與原始圖像的區域稍有偏差。與邊界框不同,圖像分割需要像素級的特徵,少量的偏差自然會導致不準確。作者通過巧妙地採用RoIAlign的方法調整RoIPool,使之更精確地對齊,從而解決了這個問題。
如何將原始圖像的感興趣區域和特徵圖精確對齊?
假設有一個128x128的圖像和一個25x25的特徵圖。如果我們想要在原始圖像中左上角的15x15像素區域映射到特徵圖中。我們如何從特徵圖中選擇這些像素呢?
我們知道原始圖像中的每個像素對應於特徵圖中的~ 25/128個像素。要從原始圖像中選擇15個像素,我們只需選擇15x25/128 ~= 2.93個像素。
在RoIPool中,我們將對其進行四捨五入,並選擇3個像素(譯者註:原文為2個像素,應當是原作者筆誤),從而導致輕微的不對齊。然而,在RoIAlign中,我們避免了這樣的四捨五入。相反,我們使用雙線性插值(bilinear interpolation)來一個精確的值,即2.93。這是能夠避免RoIPool造成的不對齊的原因。
這些mask生成後,Mask R-CNN將它們與Faster R-CNN的分類和邊界框結合在一起,得到精確的分割:
Mask R-CNN能夠對圖像中的目標進行分割和分類。來源:https://arxiv.org/abs/1703.06870
源碼
如果你有興趣自己試驗一下這些演算法,這裡是相關的源碼庫:
Faster R-CNN
- Caffe: rbgirshick/py-faster-rcnn
- PyTorch: longcw/faster_rcnn_pytorch
- MatLab: ShaoqingRen/faster_rcnn
Mask R-CNN
- PyTorch: felixgwu/mask_rcnn_pytorch
- TensorFlow: CharlesShang/FastMaskRCNN
展望
在短短3年時間裡,我們已經看到研究社區如何從Krizhevsky的早期成果到R-CNN,一直到Mask R-CNN這樣強大的結果。像Mask R-CNN這樣的成果看起來是巨大的飛躍,難以企及。然而,通過這篇文章,我希望大家已經看到這些進步如何通過多年的努力和合作實現,每一次的進步實際上是有跡可循和循序漸進的。R-CNN、Fast R-CNN、Faster R-CNN以及Mask R-CNN的提出,每個想法都不是跳躍的,但共同努力的產物已經產生了非常顯著的成果,使我們更接近人類水平的視覺。
讓我特別興奮的是,從R-CNN演進到Mask R-CNN的時間只有三年!通過持續的資金、關注和支持,未來三年計算機視覺能夠取得多大的提升?
親自上手實戰CNN
對CNN感興趣?不如跟著擁有十餘年數據科學領域經驗的Stephen老師一起線上解析代碼,親自上手搭建一個屬於你的CNN應用!本活動完全免費!
項目主題:老闆接近就自動切屏的深度學習應用如何實現?
核心技術點:深度學習,CNN,OpenCV
主講嘉賓:Stephen,Fortinet高級數據科學家,前IBM資深軟體研發工程師,擁有十五年在深度學習與數據科學領域的工業界經驗。
美西時間 8月13日 周一 07:00 PM
北京時間 8月14日 周二 10:00 AM
※深入淺出,詳解Airbnb數據架構
※Airbnb Head of Data Science:一文帶你看懂數據科學
TAG:BitTiger |