天天看點

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

CS231n Lecture 11:圖像分割與檢測

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

  • 語義分割(Semantic Segmentation):将每個像素标注為某一類别,是一個分類問題。該任務不區分執行個體,即同一類别的不同執行個體都标為同一顔色(如下圖中的兩頭牛);
    CS231n Lecture 11:圖像分割與檢測(各種R-CNN, YOLO, SSD)CS231n Lecture 11:圖像分割與檢測
  • 單目标檢測:隻識别圖像中的一個目标,并标出bounding box,此任務可以了解為分類+定位;
    CS231n Lecture 11:圖像分割與檢測(各種R-CNN, YOLO, SSD)CS231n Lecture 11:圖像分割與檢測
  • 目标檢測(Object Detection):識别圖像中的所有目标,并分别标出bounding box;
    CS231n Lecture 11:圖像分割與檢測(各種R-CNN, YOLO, SSD)CS231n Lecture 11:圖像分割與檢測
  • 執行個體分割(Instance Segmentation):識别圖中所有目标,并标出它們的精确邊界。
    CS231n Lecture 11:圖像分割與檢測(各種R-CNN, YOLO, SSD)CS231n Lecture 11:圖像分割與檢測

一、語義分割

滑動視窗?

現在嘗試實作語義分割。為了預測某個像素所屬的類别,我們可以以這個像素為中心在原圖中裁切出一個子圖(Patch),并對這個子圖進行圖像分類(Classification)。我們使用滑動視窗依次對每個像素對應的patch進行分類,最終得到結果。

這樣做理論上是可以的,但顯然計算量太大,有許多備援計算——patch間的重合部分的feature map是相同的。

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

直接上CNN?

我們可以直接串聯若幹卷積層,輸出C個[H x W]的feature map作為結果(C為類别數),第i個feature map代表各像素屬于類别i的機率。但這需要需要人工标注大量的訓練資料(給圖檔上的像素表類别),成本很高。除此之外,由于所有層産生的feature map與原圖大小相同,當網絡較深、輸入圖像分辨率較高是計算量和記憶體占用量都很大。

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

下采樣+上采樣

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

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

  • Fully Convolutional Networks for Semantic Segmentation, CVPR 2015
  • Learning Deconvolution Network for Semantic Segmentation, ICCV 2015
    CS231n Lecture 11:圖像分割與檢測(各種R-CNN, YOLO, SSD)CS231n Lecture 11:圖像分割與檢測

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

  1. 反池化(UnPooling):可以用池化的逆操作,通過複制值或 填充常數0等操作增加feature map大小(其中UnMaxPooling在MaxPooling的對應位置保留數字,其他位置填充零),見下圖
    CS231n Lecture 11:圖像分割與檢測(各種R-CNN, YOLO, SSD)CS231n Lecture 11:圖像分割與檢測
    CS231n Lecture 11:圖像分割與檢測(各種R-CNN, YOLO, SSD)CS231n Lecture 11:圖像分割與檢測
  2. 使用轉置卷積(Transpose Convolution):分别将輸入的feature map上的值與kernel的每個元素相乘,得到的矩陣作為輸出,換言之,是分别将輸入的feature map上的每個值作為kernel的權重。
    CS231n Lecture 11:圖像分割與檢測(各種R-CNN, YOLO, SSD)CS231n Lecture 11:圖像分割與檢測

    若得到的結果有重疊(如上圖的紅色和藍色有1x3的相交區域),則把相交部分的數值相加。

    注意,這個操作也常被稱為反卷積(DeConvolution),但實際上它并不是卷積的逆操作。

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

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

二、單目标檢測

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

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

這種看做回歸問題的方法也可以用于其他的一些問題(隻要所需資訊的個數固定,如bounding box需要四個數字)。比如下圖中的識别人體姿态,我們隻需預測14個關鍵點的位置:

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

三、目标檢測

目标檢測需要找出所有目标的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層實作的。

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

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

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

Faster R-CNN

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

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

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

網絡同樣使用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的測試用時又大大縮短:

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

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來像素級地刻畫執行個體邊界,網絡設計如下:

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

這個方法的結果非常好:

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

五、網絡對比

以上網絡都是用Microsoft COCO資料集進行訓練的,其中大約有200,000張圖檔,80個類别,每張圖平均有五六個執行個體。

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

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

繼續閱讀