# Computer vision object detection models: R-CNN, Fast R-CNN, Faster R-CNN, Mask R-CNN, YOLO ###### tags: `學習紀錄` [toc] --- ## Before Meeting :::success - 但在真實世界的應用情境通常要從一張圖片中辨識所有出現的物體, 並且標示出位置來 (標出位置稱之為 Object Localization)。你一定在網路上看過類似底下的影片,這段影片可以看出中國閉路攝影機(CCTV)發展的概況,不只是可以框出影像中每個物件,辨別物件種類,偵測出移動物體的動量,甚至是人臉辨識,實現楚門世界的惡夢。要做到這就需要靠深度學習中的 Object Detection 演算法,這也是最近幾年來深度學習最蓬勃發展的一塊領域。 - 最簡單的作法就是用 Sliding Windows 的概念,也就是用一個固定大小的框框,逐一的掃過整張圖片,每次框出來的圖像丟到 CNN 中去判斷類別。由於物體的大小是不可預知的,所以還要用不同大小的框框去偵測。但是 Sliding Window 是非常暴力的作法,對單一影像我們需要掃描非常多次,每掃一次都需要算一次 CNN,這將會耗費大量的運算資源,而且速度慢,根本無法拿來應用! - ![](https://i.imgur.com/zMvwqsU.png) - 所以後來就有人提出了 R-CNN (Regions with CNN) ::: [refer](https://medium.com/@syshen/%E7%89%A9%E9%AB%94%E5%81%B5%E6%B8%AC-object-detection-740096ec4540) [refer](https://medium.com/@syshen/%E5%85%A5%E9%96%80%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92-2-d694cad7d1e5) [refer]() --- ## Recent Paper --- ### R-CNN :::success #### Abstracion - 與其用 Sliding Window 的方式掃過一輪,R-CNN 的作法是預先篩選出約 2000 個可能的區域,再將這 2000 區域個別去作分類,所以他的演算法流程如下: - 產生一群約 2000 個可能的區域 (Region Proposals) - 經由一個預先訓練好的 CNN 模型如 AlexNet 擷取特徵,將結果儲存起來。 - 然後再以 SVM (Support Vector Machine) 分類器來區分是否為物體或者背景。 - 最後經由一個線性回歸模型來校正 bounding box 位置。 - ![](https://i.imgur.com/WsxMof4.png) ::: :::info #### Detail - Selective Search - R-CNN 用來篩選 Region Proposals 的方法稱之為 Selective Search ,而 Selective Search 又是基於 Felzenszwal 於 2004 年發表的論文 Graph Base Image Segmentation。 - 圖像經由 Graph Base Image Segmentation 可以切出數個 Segment 來,如下圖: - ![](https://i.imgur.com/OUCsTEt.png) - 而 Selective Search 的作法是將 Segment 的結果先各自畫出 bounding box,然後以一個迴圈,每次合併相似度最高的兩個 box,直到整張圖合併成單一個 box 為止,在這過程中的所有 box 便是 selective search 出來的 region proposals。Selective Search 的演算法如下: - ![](https://i.imgur.com/eDT8Wpa.png) ::: :::warning #### Conclusion - 是 R-CNN 存在一些問題,速度仍然不夠快: - R-CNN 一開始必須先產生約 2000 個區域,每個區域都要丟進 CNN 中去擷取特徵,所以需要跑過至少 2000 次的 CNN - R-CNN 的 model 是分開成三部份,分別是用來取出特徵的 CNN,分類的 SVM,以及優化 bounding box 的線性回歸。所以 R-CNN 不容易作訓練。 - 所以 R-CNN 的其中一個作者 Ross Girshick (RBG 大神) 在 2015 年又提出了一個改良版本,並稱之為 Fast R-CNN ::: [refer](https://arxiv.org/pdf/1311.2524.pdf) [refer](http://people.cs.uchicago.edu/~pff/papers/seg-ijcv.pdf?source=post_page---------------------------) [refer](https://www.koen.me/research/pub/uijlings-ijcv2013-draft.pdf?source=post_page---------------------------) [refer]() [refer]() [refer]() --- ### Fast R-CNN :::success #### Abstracion - Fast R-CNN 的想法很簡單,在 R-CNN 中,2000 多個區域都要個別去運算 CNN,這些區域很多都是重疊的,也就是說這些重疊區域的 CNN 很多都是重複算的。所以 Fast R-CNN 的原則就是全部只算一次 CNN 就好,CNN 擷取出來的特徵可以讓這 2000 多個區域共用! - Fast R-CNN 採用的作法就是 RoIPooling (Region of Interest Pooling)。 ::: :::info #### Detail - RoIPooling - ![](https://i.imgur.com/q7nacxG.png) - Fast RCNN 一樣要預選 Region proposals,但是只做一次 CNN。在跑完 Convolution layers 的最後一層時,會得到一個 HxW 的 feature map,同時也要將 region proposals 對應到 HxW 上,然後在 feature map 上取各自 region 的 MaxPooling,每個 region 會得到一個相同大小的矩陣 (例如 2x2)。 - 然後各自連接上 FC 網路,以及 softmax 去作分類。在分類的同時也作 bounding box 的線性回歸運算。 ::: :::warning #### Conclusion - Fast RCNN 的優點是: - 只需要作一次 CNN,有效解省運算時間 - 使用單一網絡,簡化訓練過程 ::: [refer](http://www.rossgirshick.info/?source=post_page---------------------------) [refer](https://arxiv.org/abs/1504.08083?source=post_page---------------------------) [refer]() [refer]() [refer]() --- ### Faster R-CNN :::success #### Abstracion - 不管是 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。 - ![](https://i.imgur.com/vrpANQu.png) ::: :::info #### Detail - Region Proposal Network - ![](https://i.imgur.com/BkxzoGO.png) - 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 座標。 ::: :::warning #### Conclusion ::: [refer](https://arxiv.org/abs/1506.01497?source=post_page---------------------------) [refer]() [refer]() [refer]() [refer]() [refer]() --- ### Mask R-CNN :::success #### Abstracion - 前述幾個方法都是在找到物體外圍的 bounding box,bounding box 基本上都是方形,另外一篇有趣的論文是 Facebook AI researcher Kaiming He 所提出的 Mask R-CNN ,透過 Mask R-CNN 不只是找到 bounding box,可以做到接近 pixel level 的遮罩 (圖像分割 Image segmentation)。 - ![](https://i.imgur.com/62tuAen.png) - 要了解 Mask R-CNN 如何取遮罩,要先看一下 FCN (Fully Convolutional Network) ::: :::info #### Detail - FCN (Fully Convolutional Network) for Image Segmentation - 有別於 CNN 網絡最後是連上一個全連接(Fully Connected)的網絡,FCN (Fully Convolutional Network)最後接上的是一個卷積層。一般的 CNN 只能接受固定大小的 Input,但是 FCN 則能接受任何大小的 Input,例如 W x H 。 - ![](https://i.imgur.com/OyK2dlc.png) - 在 CNN 的過程中會一直作 downsampling,所以 FCN 最後的輸出可能為 H/32 x W/32,實際上得到的會是一個像 heapmap 的結果。但是由於這過程是 downsampling,所以 Segment 的結果是比較粗糙,為了讓 Segment 的效果更好,要再做 upsampling,來補足像素。upsamping 的作法是取前面幾層的結果來作差補運算。 - ![](https://i.imgur.com/YQTjc8M.png) - 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 會讓遮罩位置更準確。 - ![](https://i.imgur.com/1WE8Pix.png) - ![](https://i.imgur.com/IhoeInj.png) - ![](https://i.imgur.com/ZX0MVze.png) ::: :::warning #### Conclusion ::: [refer](https://arxiv.org/abs/1703.06870?source=post_page---------------------------) [refer]() [refer]() [refer]() [refer]() [refer]() --- ### YOLO: You Only Look Once :::success #### Abstracion - 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 的,容易訓練,而且速度快。 ::: :::info #### Detail - YOLO 速度快,在 Titan X GPU 上可以達到每秒 45 禎的速度,簡化版的 YOLO 甚至可以達到 150 fps 的速度。這意味著 YOLO 已經可以對影像作即時運算了。準確度 (mAP) 也狠甩其他深度學習模型好幾條街。看看底下 YOLO2 的 demo 視頻,這偵測速度會嚇到吃手手了 - 有別於 R-CNN 都是先提 region 再做判斷,看的範圍比較小,容易將背景的 background patch 看成物體。YOLO 在訓練跟偵測時都是一次看整張圖片,背景錯誤偵測率 (background error, 抑或 false positive) 都只有 Fast R-CNN 的一半。 - YOLO 的泛用性也比 R-CNN 或者 DPM 方式來得好很多,在新的 domain 使用 YOLO 依舊可以很穩定。 - YOLO 的概念是將一張圖片切割成 S x S 個方格,每個方格以自己為中心點各自去判斷 B 個 bounding boxes 中包含物體的 confidence score 跟種類。 - ![](https://i.imgur.com/eJtGn1F.png) - 如果該 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 的寬跟高。 - ![](https://i.imgur.com/3wDMkdn.png) - YOLO 的網路設計包含了 24 個卷積層,跟 2 層的 FC 網絡。 - ![](https://i.imgur.com/URI6wuv.png) ::: :::warning #### Conclusion - YOLO 的缺點 - 由於 YOLO 對於每個方格提兩個 bounding box 去作偵測,所以不容易去區分兩個相鄰且中心點又非常接近的物體 - 只有兩種 bounding box,所以遇到長寬比不常見的物體的檢測率較差 - YOLO 與其他模型的比較 - ![](https://i.imgur.com/xX9Rog4.png) - ![](https://i.imgur.com/Gufpaqf.png) ::: [refer]() [refer]() [refer]() [refer]() [refer]() --- ### Conclusion :::success #### Abstracion ::: :::info #### Detail ::: :::warning #### Conclusion - 物體辨識 (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。 - ![](https://i.imgur.com/Tc6hkVi.png) ::: [refer](https://medium.com/@syshen/yolo-with-coreml-819799789c11) ---### :::success #### Abstracion ::: :::info #### Detail ::: :::warning #### Conclusion ::: [refer]() ---### :::success #### Abstracion ::: :::info #### Detail ::: :::warning #### Conclusion ::: [refer]() ---### :::success #### Abstracion ::: :::info #### Detail ::: :::warning #### Conclusion ::: [refer]() ---### :::success #### Abstracion ::: :::info #### Detail ::: :::warning #### Conclusion ::: [refer]() ---### :::success #### Abstracion ::: :::info #### Detail ::: :::warning #### Conclusion ::: [refer]() ---