CNN 遠遠不止於處理分類問題。
這篇文章中,我們會一起來看在圖像實例分割領域,CNN 的發展簡史:它可被如何使用,以得到驚人的結果。
據雷鋒網瞭解,在 2012 年,Alex Krizhevsky, Geoff Hinton, and Ilya Sutskever 贏得 ImageNet 挑戰賽堪稱是 CNN 發展史上的里程碑,自那之後,CNN 就成了圖像分類的黃金標準,並且性能不斷提升。現在,它已經在 ImageNet 挑戰賽上有了超人類的表現。
自 2015 年起,CNN 在 ImageNet 的錯誤率已低於人類
雖然這很令人激動,但相比人類高度複雜、多樣化的視覺理解系統,圖像識別要簡單得多。
在圖像識別任務中,一般圖中央僅有一個需要識別的物體,而任務便是判斷該圖像是什麼。但當我們用眼睛觀察周圍的世界時,我們進行的是遠遠更複雜的任務。
我們眼中的視野高度複雜,有許多個重疊、相互遮擋的物體,有不同的背景;我們的大腦不僅對這些物體進行分類,還會識別它們的邊緣輪廓、差異、以及相互之間的關係。
問題來了:CNN 是否“ hold 住”這樣複雜的任務?換句話說,給定一個十分複雜的圖像,我們是否能用 CNN 來識別其中的不同物體、它們的邊緣輪廓?正如 Ross Girshick 和他的同事最近幾年的研究所展示:這是完全可以實現的。
內容簡介
本文將講述基於 CNN 的物體檢測、分割主流技術背後的直覺性思路,並看看它們是如何從一種執行方式進化到另一種。其中,我們將覆蓋 R-CNN (Regional CNN)、該類問題的最初 CNN 解決方案、 Fast R-CNN 以及 Faster R-CNN 等話題。文末將討論 Facebook 研究團隊最近搞出來的 Mask R-CNN,它把物體檢測技術拓展到提供圖元級別的分割。
這是本文涉及的論文:
R-CNN: https://arxiv.org/abs/1311.2524
Fast R-CNN: https://arxiv.org/abs/1504.08083
Faster R-CNN: https://arxiv.org/abs/1506.01497
Mask R-CNN: https://arxiv.org/abs/1703.06870
2014: R-CNN
R-CNN 是將 CNN 用於物體檢測的早期應用。
受到深度學習之父 Geoffrey Hinton 實驗室研究的啟發,加州伯克利教授 Jitendra Malik 帶領的一隻小團隊提出了一個今天看來無可回避的問題:
在什麼程度上 Krizhevsky et. al 的研究結果可泛化到物體識別?
如同其名稱,物體識別是在圖像中找出不同物體、並對其分類的任務(如上圖)。該團隊包括 Ross Girshick、Jeff Donahue 和 Trevor Darrel,他們發現該問題可通過在 PASCAL VOC 挑戰上進行測試,用 Krizhevsky 的結果來解決。PASCAL VOC 是一個類似於 ImageNet 的流行物體識別挑戰。
他們寫到:
該論文首次展示出,與更簡單的、基於 HOG 特徵的其他系統相比, CNN 在 PASCAL VOC 上有非常優越的物體識別表現。
現在,我們來看一看他們的架構,Regions With CNNs (R-CNN) ,是如何工作的。
理解 R-CNN
R-CNN 的目標是:導入一張圖片,通過方框正確識別主要物體在圖像的哪個地方。
輸入:圖像
輸出:方框+每個物體的標籤
但怎麼知道這些方框應該在哪裡呢?R-CNN 的處理方式,和我們直覺性的方式很像——
在圖像中搞出一大堆方框,看看是否有任何一個與某個物體重疊。
生成這些邊框、或者說是推薦局域,R-CNN 採用的是一項名為 Selective Search 的流程。在高層級,Selective Search(如上圖)通過不同尺寸的視窗來查看圖像。對於每一個尺寸,它通過紋理、色彩或密度把相鄰圖元劃為一組,來進行物體識別。
如上圖,當邊框方案生成之後,R-CNN 把選取區域變形為標準的方形,並將之喂給改良版的 AlexNet(ImageNet 2012 的冠軍方案,它啟發了R-CNN )。
在 CNN 的最後一層,R-CNN 加入了一個支持向量機,它要做的事很簡單:對這是否是一個物體進行分類,如果是,是什麼物體。這便是上圖中的第四步。
對邊框進行改進
現在,既然已經找到了方框中的物體,我們是否能縮小邊框,讓它更符合物體的三維尺寸?答案是肯定的,這是 R-CNN 的最後一步。R-CNN 在推薦區域上運行一個簡單的線性回歸,生成更緊的邊框座標以得到最終結果。
這是該回歸模型的輸入和輸出:
輸入:對應物體的圖像子區域
輸出:針對該物體的新邊框系統
概括下來,R-CNN 只是以下這幾個步驟:
生成對邊框的推薦
在預訓練的 AlexNet 上運行方框裡的物體。用支援向量機來看邊框裡的物體是什麼。
在線性回歸模型上跑該邊框,在物體分類之後輸出更緊的邊框的座標。
2015: Fast R-CNN
它加速、簡化了 R-CNN。
R-CNN 的效果非常好,但出於以下幾個原因,它運行起來特別慢:
對於每一個圖像的每一個推薦區域,它都需要一個 CNN (AlexNet) 的 forward pass。這意味著每個圖像就需要約 2000 個 forward pass。
它必須分來訓練三個不同的模型——生成圖像特徵的 CNN,預測類別的分類器以及收緊邊框的回歸模型。這使得訓練流水線變得特別困難。
在 2015 年,R-CNN 的第一作者 Ross Girshick 解決了上述兩個問題,導致了本簡史中第二個演算法的誕生: Fast R-CNN
Ross Girshick
Fast R-CNN 特性
1. RoI (Region of Interest) Pooling
對於 CNN 的 forward pass,Girshick 意識到對於每個圖像,許多推薦區域會不可避免的重疊,同樣的 CNN 運算會一遍遍重複 (~2000 次)。他的思路很簡單:為什麼不能在每一個圖像上只運行一次 CNN,並找到一種在 ~2000 個推薦裡共用計算的方式?
借助名為 RoIPool 的技術,Fast R-CNN 實現了該思路。在其核心,RoIPool 會對圖像的所有子區域共用 CNN 的forward pass。上圖便是示例,注意每個區域的 CNN 特徵,是怎麼通過選擇 CNN 特徵圖的相應區域來獲取的。然後,每個區域的特徵被池化(“pooled”,通常使用 max pooling)。因此原始圖像只需要計算一遍,而不是 2000 遍。
2. 把不同模型整合為一個網路
第二項特性是在一個模型裡聯合訓練 CNN、分類器和邊框回歸量。而此前,提取圖像特徵要用 CNN,分類要用支援向量機,收緊邊框要用回歸。
Fast R-CNN 用一個單個的網路完成這三項任務。
至於這是如何實現的,請看上圖。Fast R-CNN 在 CNN 之上添加一個 softmax 層輸出分類,來代替支持向量機。添加一個與 softmax 平行的線性回歸層,來輸出邊框座標。這種方式,所有需要輸出都通過單個神經網路得到。這是模型整體的輸入和輸出:
輸入:有區域推薦的圖像
輸出:每個區域的物體識別,收緊的邊框
2016:Faster R-CNN
名字很直白,它加速了選區推薦。
即便有上文所提到的優點,Fast R-CNN 仍然有一個重大瓶頸:選區推薦器。正如我們看到的,檢測物體位置的第一步,是生成一系列候選邊框來進行測試。雷鋒網瞭解到,在 Fast R-CNN 裡,這些推薦通過 Selective Search 生成。後者是一個相當慢的過程,成為系統整體的瓶頸。
在 2015 年,微軟的孫劍、任少卿、何凱明、Ross Girshick 找到了一個讓推薦步驟幾乎不需要成本的辦法,這通過被他們稱之為 Faster R-CNN 的架構來實現。
孫劍
Faster R-CNN 背後的思路是:既然選區推薦取決於 CNN forward pass 已經計算出來的圖像特徵,那麼,為什麼不對區域推薦重複利用這些 CNN 結果,來代替運行一個單獨的 selective search 演算法?
這便是 Faster R-CNN 更快的原因。
上圖中,你可以看到單個 CNN 是如何同時進行選區推薦和分類。利用這種方式,只有一個 CNN 需要被訓練,我們也幾乎免費得到了選區推薦。作者們寫到:
“我們的觀察是:基於區域的檢測器所使用的卷積特徵圖,比如 Faster R-CNN,也能被用來生成選區推薦。”
這是模型的輸入和輸出:
輸入:圖像(選區推薦並不需要)
輸出:分類、圖中物體的邊框座標。
選區是如何生成的
我們一起多花幾分鐘,看看 Faster R-CNN 是如何從 CNN 特徵裡生成選區推薦的。Faster R-CNN 在 CNN 特徵之上添加了完全卷積網路(Fully Convolutional Network ),以生成 Region Proposal Network。
Region Proposal Network 通過在 CNN 特徵圖上傳遞滑窗(sliding window)來運作,在每個窗口輸出 K 潛在邊框和對每個邊框的評估分值。這些 K 邊框代表了什麼呢?
直覺上,我們知道圖像中的物體應該符合特定的常用長寬比例和尺寸,比如類似於人體形狀的矩形選框。類似的,我們知道很窄的選框並不會太多。於是我們創造出 anchor boxes ——K 常用長寬比例,對於每一個 anchor boxe,我們輸出選框以及圖像中的每個位置的分值。
有了這些 anchor boxes,我們看看 Region Proposal Network 的輸入、輸出。
輸入: CNN 特徵圖
輸出:每個 anchor 對應一個選框。一個分值,用來表示選框內圖像是否為物體。
之後把每個可能是物體的選框導入 Fast R-CNN,生成分類和收緊的選框。
2017: Mask R-CNN
把 Faster R-CNN 拓展到圖元級的圖像分割。
到現在,我們已經看到了多種利用 CNN 特徵、利用選框來鎖定圖像中不同物體的有趣方式。我們是否能夠將這些技術進一步,去定位物體的每一個圖元呢?
該問題便是圖像分割(image segmentation)。對此,Facebook AI 的何凱明、Girshick 等研究人員開發出了一個名為 Mask R-CNN 的架構。
與 Fast R-CNN、Faster R-CNN 一樣,Mask R-CNN 的底層邏輯也很直接:Faster R-CNN 對物體識別效果這麼好,我們能夠將之擴展到圖元級別的分割?
Mask R-CNN 通過向 Faster R-CNN 加入一個分支來實現這一點,該分支輸出一個二元的 mask,指示某圖元是否是物體的一部分。這分支(圖中白色部分)說白了就是一個 CNN 特徵圖上的全卷積網路。這是它的輸入、輸出:
輸入:CNN 特徵圖
輸出:矩陣,屬於物體的圖元在矩陣內用 1 表示,否則用 0 表示(這就是二元 Mask)。
為使 Mask R-CNN 如預期的運行,作者們做了一個小改變:RoiAlign,或者說 Realigning RoIPool。
RoiAlign
當不加修改地運行於原始版本的 Faster R-CNN,RoIPool 選擇的特徵圖區域,會與原圖中的區域有輕微排列出入。而圖像分割需要圖元級別的精確度。於是,作者們巧妙地對 RoIPool 進行調整,使之更精確得排列對齊,這便是 RoIAlign。
假設我們有一個 128x128 的圖像,25x25 的特徵圖,想要找出與原始圖像左上角 15x15 位置對應的特徵區域,怎麼在特徵圖上選取圖元?
我們知道原始圖像的每一個圖元與特徵圖上的 25/128 個圖元對應。為了在原始圖像選取 15 個圖元,在特徵圖上我們需要選擇 15 * 25/128 ~= 2.93 個圖元。
對於這種情形,RoIPool 會舍去零頭選擇兩個圖元,導致排列問題。但在 RoIAlign,這種去掉小數點之後數位的方式被避免,而是使用雙線性插值(bilinear interpolation)準確獲得 2.93 圖元位置的資訊。在高層級,這避免了排列錯誤。
在 mask 生成之後,Mask R-CNN 把它們與 Faster R-CNN 的分類、選框結合起來,生成相當精確的分割:
後話
短短三年的時間,我們就看到了機器學習社區從 Krizhevsky et. al 的原始結果進步到 R-CNN,並最終開發出 Mask R-CNN 這樣的強大方案。若單獨來看,Mask R-CNN 像是一步巨大的技術飛躍,令人難以望其項背。但在這篇簡史中,我希望大家看到,這樣的進步是一系列直覺性、漸進式進步的總和,是多年苦心合作研究的成果。
但從 R-CNN 到 Mask R-CNN 畢竟只用了三年。在接下來的三年,電腦視覺又會進步多少呢?
via
athelas
,雷鋒網編譯