CS231n Lecture 11:圖像分割與檢測(各種R-CNN, YOLO, SSD)

CS231n Lecture 11:圖像分割與檢測

圖像的分割和檢測的相關任務有不同的粒度,我們首先明確一下有關概念:

  • 語義分割(Semantic Segmentation):將每個像素標註爲某一類別,是一個分類問題。該任務不區分實例,即同一類別的不同實例都標爲同一顏色(如下圖中的兩頭牛);
  • 單目標檢測:只識別圖像中的一個目標,並標出bounding box,此任務可以理解爲分類+定位;
  • 目標檢測(Object Detection):識別圖像中的所有目標,並分別標出bounding box;
  • 實例分割(Instance Segmentation):識別圖中所有目標,並標出它們的精確邊界。

一、語義分割

滑動窗口?

現在嘗試實現語義分割。爲了預測某個像素所屬的類別,我們可以以這個像素爲中心在原圖中裁切出一個子圖(Patch),並對這個子圖進行圖像分類(Classification)。我們使用滑動窗口依次對每個像素對應的patch進行分類,最終得到結果。
這樣做理論上是可以的,但顯然計算量太大,有許多冗餘計算——patch間的重合部分的feature map是相同的。

直接上CNN?

我們可以直接串聯若干卷積層,輸出C個[H x W]的feature map作爲結果(C爲類別數),第i個feature map代表各像素屬於類別i的概率。但這需要需要人工標註大量的訓練數據(給圖片上的像素表類別),成本很高。除此之外,由於所有層產生的feature map與原圖大小相同,當網絡較深、輸入圖像分辨率較高是計算量和內存佔用量都很大。

下采樣+上採樣

如前文所屬保持feature map大小問題很大,所以我們可以先將feature map逐步縮小,然後再逐步變大。這樣網絡較深時中間部分的計算量也比較小。

有興趣可以參考下面兩篇paper:

  • Fully Convolutional Networks for Semantic Segmentation, CVPR 2015
  • Learning Deconvolution Network for Semantic Segmentation, ICCV 2015

卷積操作很容易做到下采樣,我們現在來討論如何做上採樣。

  1. 反池化(UnPooling):可以用池化的逆操作,通過複製值或 填充常數0等操作增加feature map大小(其中UnMaxPooling在MaxPooling的對應位置保留數字,其他位置填充零),見下圖

  2. 使用轉置卷積(Transpose Convolution):分別將輸入的feature map上的值與kernel的每個元素相乘,得到的矩陣作爲輸出,換言之,是分別將輸入的feature map上的每個值作爲kernel的權重。

    若得到的結果有重疊(如上圖的紅色和藍色有1x3的相交區域),則把相交部分的數值相加。
    注意,這個操作也常被稱爲反捲積(DeConvolution),但實際上它並不是卷積的逆操作。

一維的轉置卷積更好理解,如下圖,輸入[a b],kernel爲[x y z],經過轉置卷積的結果爲[ax ay az+bx by bz]

二、單目標檢測

我們可以將目標檢測作爲一個迴歸(Regression)任務。例如,將圖片輸入AlexNet,最後並行加上兩個全連接層,分別進行分類和定位。其中,分類的輸出是對每一類打分,這部分使用SoftMax Loss;而定位的輸出爲四個數字,分別代表bounding box的左上角橫縱座標和寬高,這部分使用L2 Loss。

這種看做迴歸問題的方法也可以用於其他的一些問題(只要所需信息的個數固定,如bounding box需要四個數字)。比如下圖中的識別人體姿態,我們只需預測14個關鍵點的位置:

三、目標檢測

目標檢測需要找出所有目標的bounding box並標出類別,由於圖中目標數量未知,因此不能簡單地處理爲分類+定位問題。

我們可以考慮前面提到的先提取patch的方法。對於每個patch,我們對它進行分類,測試其是否屬於某類目標,或者是否是背景(歸爲“背景類”代表此處沒有目標)。這種方法首先要解決問題是怎樣找合適的patch。

我們不可能窮舉所有可能的patch。實際上,我們使用的**區域推薦(Region Proposal)**的方法:先找出可能包含目標的候選框,然後識別每個候選框中是否包含目標。

下面介紹目標檢測網絡的發展~

R-CNN

R-CNN中的Region Proposal方法叫做Selective Search(一種傳統算法,非CNN),它會約產生2000個候選區域(Regions of Interest, ROI)。之後,每個候選區域的圖像會規格化到統一的大小,並分別送入一個使用ConvNet,最後用SVM進行分類。

R-CNN還會輸出四個數字對候選框進行修正,注意這個修正不僅可能使候選框變小,還可能讓它變大(比如這個框框出了一個沒有頭的人,那麼網絡可能推斷出上方會有個人頭,因此上邊界變大)。

R-CNN存在以下問題:

  • 計算量大(處理2000個候選區域)
  • 訓練慢(84小時),佔用空間多
  • 訓練完成後,運行速度也慢(使用VGG16時,每張圖片要處理47s)

Fast-RCNN

我們不再分別將圖像中的patch輸入ConvNet,而是將整張圖片輸入ConvNet,得到一張整張圖feature map,然後將RoI所對應的位置的feature map裁切出來。

同樣的,如果我們使用全連接層做接下來的分類的話,裁切出來的feature map的patch必須規格化到固定的大小。這個操作使用RoI Pooling層實現的。

Faster R-CNN的的測試用時非常短,其中主要用時花在在Region Proposal上(見下圖)。所以我們要想再加速就必須優化Region Proposal,而下面的Faster R-CNN就解決了這個問題。

Faster R-CNN

Faster R-CNN中的Region Proposal不再用傳統算法做,而是使用稱爲Region Proposal Network (RPN)的網絡來從feature中預測候選框,也就是說,現在的候選框也是學習出來的了。

整個網絡設計如下圖:圖像經過一個CNN輸出feature map,將該feature map輸入RPN產生若干RoI,之後的處理方式和Fast R-CNN就相同了。

網絡同樣使用multi-task loss,共有下面四個loss:

  1. RPN 分類是否是目標的loss
  2. RPN迴歸候選框座標的loss
  3. 對每個類別打分的loss
  4. 最終bounding box座標的loss

注意到其中RPN的結果沒有ground truth,那我們怎樣評價一個候選框應不應該是候選框呢?Faster R-CNN中採取的方法是:如果一個候選框和某一個目標重合較大,它被認爲是合適的候選框,反之不是。

使用RPN,Faster R-CNN的測試用時又大大縮短:

YOLO和SSD

R-CNN、Fast R-CNN和Faster R-CNN中的“R”代表區域(Region),它們都是基於區域候選的方法來做目標檢測的(稱作Region-based methods for object detection)。除了這樣的方法,還有一些直接一個過程做完所有事情的網絡,比較典型的有YOLO和SSD。

YOLO和SSD不再對每個候選框單獨處理,而是將目標檢測視爲迴歸問題,使用某種CNN,將所有的預測框同時給出。

將整張圖片劃分爲幾個粗略的網格(Grid)(比如7x7的網格),在每個網格中存在固定數目(設這個數字爲B)的base bounding box。

我們要預測的東西有:

  • 真實框與base bounding box的差異
  • 給出每個base bounding box的置信度,即包含目標的可能性
  • 這個bounding box屬於各類別的分數
    綜上,所以最終網絡會輸出7x7x(5B+C)個數字。其中C爲類別數,每個7x7的網格中有B個base bounding box,每個base bounding box需要回歸5個數字(4個表示修正座標的數字和1個表示置信度的數字)。

四、實例分割

實例分割做的最好的網絡是Mask R-CNN,它是上面方法的綜合,對於每個RoI,它都再預測一個Binary Mask來像素級地刻畫實例邊界,網絡設計如下:

這個方法的結果非常好:

五、網絡對比

以上網絡都是用Microsoft COCO數據集進行訓練的,其中大約有200,000張圖片,80個類別,每張圖平均有五六個實例。

這些網絡需要調整的參數十分複雜,如使用什麼網絡(VGG16,、ResNet等)、使用什麼檢測框架(Faster R-CNN、R-FCN等),不同設置的精度和速度都有差異,CVPR 2017的中paper“Speed/accuracy trade-offs for modern convolutional object detectors”對這些不同的選擇進行了詳盡的比較。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章