關於影像辨識,所有你應該知道的深度學習模型

Computer vision object detection models: R-CNN, Fast R-CNN, Faster R-CNN, Mask R-CNN, YOLO

Computer vision object detection models: R-CNN, Fast R-CNN, Faster R-CNN, Mask R-CNN, YOLO

這篇是簡介一些用來辨識影像中物體的 AI 模型。

在前面有提到,透過 CNN 模型,你可以輸入一張圖片,得到該圖片屬於哪種類別的結果,這過程我們把他稱作分類 (Classification)。

但在真實世界的應用情境通常要從一張圖片中辨識所有出現的物體, 並且標示出位置來 (標出位置稱之為 Object Localization)。你一定在網路上看過類似底下的影片,這段影片可以看出中國閉路攝影機(CCTV)發展的概況,不只是可以框出影像中每個物件,辨別物件種類,偵測出移動物體的動量,甚至是人臉辨識,實現楚門世界的惡夢。要做到這就需要靠深度學習中的 Object Detection 演算法,這也是最近幾年來深度學習最蓬勃發展的一塊領域。

基本的想法是,既然 CNN 對於物體的分類又快又好,那我們可不可以拿 CNN 來掃描並辨識圖片中的任何物體? 答案當然是 — 可以。

最簡單的作法就是用 Sliding Windows 的概念,也就是用一個固定大小的框框,逐一的掃過整張圖片,每次框出來的圖像丟到 CNN 中去判斷類別。由於物體的大小是不可預知的,所以還要用不同大小的框框去偵測。但是 Sliding Window 是非常暴力的作法,對單一影像我們需要掃描非常多次,每掃一次都需要算一次 CNN,這將會耗費大量的運算資源,而且速度慢,根本無法拿來應用!

Andrew Ng — object detection with sliding windows

所以後來就有人提出了 R-CNN (Regions with CNN)

R-CNN

與其用 Sliding Window 的方式掃過一輪,R-CNN 的作法是預先篩選出約 2000 個可能的區域,再將這 2000 區域個別去作分類,所以他的演算法流程如下:

  1. 產生一群約 2000 個可能的區域 (Region Proposals)
  2. 經由一個預先訓練好的 CNN 模型如 AlexNet 擷取特徵,將結果儲存起來。
  3. 然後再以 SVM (Support Vector Machine) 分類器來區分是否為物體或者背景。
  4. 最後經由一個線性回歸模型來校正 bounding box 位置。

Selective Search

R-CNN 用來篩選 Region Proposals 的方法稱之為 Selective Search ,而 Selective Search 又是基於 Felzenszwal 於 2004 年發表的論文 Graph Base Image Segmentation

圖像經由 Graph Base Image Segmentation 可以切出數個 Segment 來,如下圖:

Graph base image segmentation

而 Selective Search 的作法是將 Segment 的結果先各自畫出 bounding box,然後以一個迴圈,每次合併相似度最高的兩個 box,直到整張圖合併成單一個 box 為止,在這過程中的所有 box 便是 selective search 出來的 region proposals。Selective Search 的演算法如下:

取自 Selective Search 論文。先以 Graph base image segmentation 取得一些區域,計算每個區域間的相似度,每次合併相似度最高的兩個區域,直到整張圖片成為單一區域為止

但是 R-CNN 存在一些問題,速度仍然不夠快:

  1. R-CNN 一開始必須先產生約 2000 個區域,每個區域都要丟進 CNN 中去擷取特徵,所以需要跑過至少 2000 次的 CNN
  2. R-CNN 的 model 是分開成三部份,分別是用來取出特徵的 CNN,分類的 SVM,以及優化 bounding box 的線性回歸。所以 R-CNN 不容易作訓練。

所以 R-CNN 的其中一個作者 Ross Girshick (RBG 大神) 在 2015 年又提出了一個改良版本,並稱之為 Fast R-CNN

Fast R-CNN

Fast R-CNN 的想法很簡單,在 R-CNN 中,2000 多個區域都要個別去運算 CNN,這些區域很多都是重疊的,也就是說這些重疊區域的 CNN 很多都是重複算的。所以 Fast R-CNN 的原則就是全部只算一次 CNN 就好,CNN 擷取出來的特徵可以讓這 2000 多個區域共用!

Fast R-CNN 採用的作法就是 RoIPooling (Region of Interest Pooling)。

RoIPooling

Fast RCNN architecture

Fast RCNN 一樣要預選 Region proposals,但是只做一次 CNN。在跑完 Convolution layers 的最後一層時,會得到一個 HxW 的 feature map,同時也要將 region proposals 對應到 HxW 上,然後在 feature map 上取各自 region 的 MaxPooling,每個 region 會得到一個相同大小的矩陣 (例如 2x2)。

from https://blog.deepsense.ai/region-of-interest-pooling-explained/

然後各自連接上 FC 網路,以及 softmax 去作分類。在分類的同時也作 bounding box 的線性回歸運算。

Fast RCNN 的優點是:

  1. 只需要作一次 CNN,有效解省運算時間
  2. 使用單一網絡,簡化訓練過程

Faster R-CNN

不管是 R-CNN 還是 Fast R-CNN 都還是要先透過 selective search 預選 region proposals,這是一個緩慢的步驟。在 2015 年時,Microsoft 的 Shaoqing Ren, Kaiming He, Ross Girshick, 以及 Jian Sun 提出了 Faster R-CNN ,一個更快的 R-CNN。

Faster R-CNN 的想法也很直覺,與其預先篩選 region proposals,到不如從 CNN 的 feature map 上選出 region proposals。

Region Proposal Network

RPN (Region Proposal Network) 也是一個 Convolution Network,Input 是之前 CNN 輸出的 feature map,輸出是一個 bounding box 以及該 bounding box 包含一個物體的機率。

RPN 在 feature map 上取 sliding window,每個 sliding window 的中心點稱之為 anchor point,然後將事先準備好的 k 個不同尺寸比例的 box 以同一個 anchor point 去計算可能包含物體的機率(score),取機率最高的 box。這 k 個 box 稱之為 anchor box。所以每個 anchor point 會得到 2k 個 score,以及 4k 個座標位置 (box 的左上座標,以及長寬,所以是 4 個數值)。在 Faster R-CNN 論文裡,預設是取 3 種不同大小搭配 3 種不同長寬比的 anchor box,所以 k 為 3x3 = 9 。

經由 RPN 之後,我們便可以得到一些最有可能的 bounding box,雖然這些 bounding box 不見得精確,但是透過類似於 Fast RCNN 的 RoIPooling, 一樣可以很快的對每個 region 分類,並找到最精確的 bounding box 座標。

Mask R-CNN

前述幾個方法都是在找到物體外圍的 bounding box,bounding box 基本上都是方形,另外一篇有趣的論文是 Facebook AI researcher Kaiming He 所提出的 Mask R-CNN ,透過 Mask R-CNN 不只是找到 bounding box,可以做到接近 pixel level 的遮罩 (圖像分割 Image segmentation)。

要了解 Mask R-CNN 如何取遮罩,要先看一下 FCN (Fully Convolutional Network)

FCN (Fully Convolutional Network) for Image Segmentation

有別於 CNN 網絡最後是連上一個全連接(Fully Connected)的網絡,FCN (Fully Convolutional Network)最後接上的是一個卷積層。一般的 CNN 只能接受固定大小的 Input,但是 FCN 則能接受任何大小的 Input,例如 W x H 。

圖上方一般的 CNN 網絡,只能接受大小固定的輸入,得到單一維度的輸出,分別代表每個類別的機率。圖下則是 FCN 網路,最後兩層由卷積取代,輸出為 h x w x 1000,代表每個 pixel 種類的機率,可以視為一個 heapmap

在 CNN 的過程中會一直作 downsampling,所以 FCN 最後的輸出可能為 H/32 x W/32,實際上得到的會是一個像 heapmap 的結果。但是由於這過程是 downsampling,所以 Segment 的結果是比較粗糙,為了讓 Segment 的效果更好,要再做 upsampling,來補足像素。upsamping 的作法是取前面幾層的結果來作差補運算。

FCN 的結果會跟前面幾層的輸出作差補運算

Mask R-CNN 是建構於 Faster R-CNN 之上,如果是透過 RoIPooling 取得 Region proposals 之後,針對每個 region 會再跑 FCN 取得遮罩分割,但是由 於 RoIPooling 在做 Max pooling 時,會使用最近插值法(Nearest Neighbor Interpolation)取得數值,所以出來的遮罩會有偏移現象,再加上 pooling 下來的結果,會讓 region 的尺寸出現非整數的情況,然後取整數的結果就是沒辦法做到 Pixel 層級的遮罩。所以 Mask R-CNN 改採用雙線性插值法(Bilinear Interpolation)來改善 RoIPooling,稱之為 RoIAlign,RoIAlign 會讓遮罩位置更準確。

Mask RCNN 架構,將原有的 RoIPooling 改成 RoIAlign
Fast R-CNN 的 RoIPool。將一個 7x5 的 Anchor box 取 2x2 的 MaxPool,由於使用最近插值法,會有偏差
RoIAlign 的作法是使用雙線性插值法(Bilinear Interpolation),減少mis-alignment的問題

YOLO: You Only Look Once

YOLO 有個很討喜的名字,取自 You Only Live Once,但用在 Object detection 上則為 You only look once,意思是說 YOLO 模型的特性只需要對圖片作一次 CNN 便能夠判斷裡面的物體類別跟位置,大大提升辨識速度。

R-CNN 的概念是先提出幾個可能包含物體的 Region proposal,再針對每個 region 使用 CNN 作分類,最後再以 regression 修正 bounding box 位置,速度慢且不好訓練。YOLO 的好處是單一網路設計,判斷的結果會包含 bounding box 位置,以及每個 bounding box 所屬類別及概率。整個網路設計是 end-to-end 的,容易訓練,而且速度快。

  1. YOLO 速度快,在 Titan X GPU 上可以達到每秒 45 禎的速度,簡化版的 YOLO 甚至可以達到 150 fps 的速度。這意味著 YOLO 已經可以對影像作即時運算了。準確度 (mAP) 也狠甩其他深度學習模型好幾條街。看看底下 YOLO2 的 demo 視頻,這偵測速度會嚇到吃手手了

2. 有別於 R-CNN 都是先提 region 再做判斷,看的範圍比較小,容易將背景的 background patch 看成物體。YOLO 在訓練跟偵測時都是一次看整張圖片,背景錯誤偵測率 (background error, 抑或 false positive) 都只有 Fast R-CNN 的一半。

3. YOLO 的泛用性也比 R-CNN 或者 DPM 方式來得好很多,在新的 domain 使用 YOLO 依舊可以很穩定。

YOLO 的概念是將一張圖片切割成 S x S 個方格,每個方格以自己為中心點各自去判斷 B 個 bounding boxes 中包含物體的 confidence score 跟種類。

confidence score = Pr(Object) * IOU (ground truth)

如果該 bounding box 不包含任何物體 (Pr(Object) = 0),confidence score 便為零,而 IOU 則為 bounding box 與 ground truth 的交集面積,交集面積越大,分數越高。

每個方格預測的結果包含 5 個數值,x 、y 、w 、 h 跟 confidence,x 與 y 是 bounding box 的中間點,w 與 h 是 bounding box 的寬跟高。

S = 7,B = 2,PASCAL VOC label 20 種種類,所以 tensor 為 S x S x (5 * B + C) = 7 x 7 x 30

YOLO 的網路設計包含了 24 個卷積層,跟 2 層的 FC 網絡。

包含 24 個卷積層,2 層的 FC 網路,

另外一個版本的 YOLO Fast 則只有 9 個卷積層,不過最後的輸出都是 7x7x30 的 tensor。

YOLO 的缺點

  1. 由於 YOLO 對於每個方格提兩個 bounding box 去作偵測,所以不容易去區分兩個相鄰且中心點又非常接近的物體
  2. 只有兩種 bounding box,所以遇到長寬比不常見的物體的檢測率較差

YOLO 與其他模型的比較

YOLO 在速度跟準確率上都有相當好的表現
YOLO 有比較少的 background error (false positive),但是 bounding box 的 location error 比較高

YOLO2

YOLO2 建構於 YOLO 之上,但是有更好的準確度,更快速的判斷速度,能夠判斷更多的物件種類(多達 9000 種),所以是更好(Better)、更快(Faster)、更強大(Stronger)

YOLO2 在準確度上比 YOLO 好,且追上甚至超越其他模型像是 Faster R-CNN 或者 SSD 等,速度還是別人的 2–10 倍以上。

YOLO2 採用了許多改善方式,例如 batch normalization、anchor box 等,使用了這些改良方式讓 YOLO2 不管在辨識速度還是準確率上都有了提升,此外對於不同圖檔大小也有很好的相容性,提供了在速度與準確性上很好的平衡,所以也很適合運用在一些便宜的 GPU 或者 CPU 上,依舊提供水準以上的速度與準確率。

不同版本的 YOLO2 與其他模型的 mAP 跟 FPS 比較

結語

物體辨識 (Object detection) 的進展飛快,為了整理這篇大概也看了七八篇論文,還有很多都還沒涵蓋到的,例如 SSD (Single Shot Mulitbox Detector)。如果想更了解 AI 在 Computer Vision 最近幾年的發展,也可以參考這篇搜文 A Year in Computer vision,內容涵蓋了 Classification、Object detection、Object tracking、Segmentation、Style transfer、Action recognition、3D object、Human post recognition 等等,看完會大致知道在 Computer Vision 中有哪些 AI 所做的努力,以及各自的進展。

Google 的 Tensorflow 也有提供 Object detection API ,透過使用 API ,不用理解這些模型的實作也能快速實作出速度不錯涵蓋率又廣的 object detection。

tensorflow object detection 支援的模型列表

會寫這篇純粹是我自己也想多了解這些不同模型的差異,下一篇文章說明怎麼在 iOS 上用 CoreML 實踐 YOLO2 演算法。

覺得我寫的還可以
請幫我拍手三下 👏👏👏
如果想要給我更多鼓勵
可以給我更多的拍手 👏👏👏👏👏👏👏👏

感恩 🙏🙏