# 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,這將會耗費大量的運算資源,而且速度慢,根本無法拿來應用! -  - 所以後來就有人提出了 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 位置。 -  ::: :::info #### Detail - Selective Search - R-CNN 用來篩選 Region Proposals 的方法稱之為 Selective Search ,而 Selective Search 又是基於 Felzenszwal 於 2004 年發表的論文 Graph Base Image Segmentation。 - 圖像經由 Graph Base Image Segmentation 可以切出數個 Segment 來,如下圖: -  - 而 Selective Search 的作法是將 Segment 的結果先各自畫出 bounding box,然後以一個迴圈,每次合併相似度最高的兩個 box,直到整張圖合併成單一個 box 為止,在這過程中的所有 box 便是 selective search 出來的 region proposals。Selective Search 的演算法如下: -  ::: :::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 -  - 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。 -  ::: :::info #### Detail - 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 座標。 ::: :::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)。 -  - 要了解 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 。 -  - 在 CNN 的過程中會一直作 downsampling,所以 FCN 最後的輸出可能為 H/32 x W/32,實際上得到的會是一個像 heapmap 的結果。但是由於這過程是 downsampling,所以 Segment 的結果是比較粗糙,為了讓 Segment 的效果更好,要再做 upsampling,來補足像素。upsamping 的作法是取前面幾層的結果來作差補運算。 -  - 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 會讓遮罩位置更準確。 -  -  -  ::: :::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 跟種類。 -  - 如果該 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 的寬跟高。 -  - YOLO 的網路設計包含了 24 個卷積層,跟 2 層的 FC 網絡。 -  ::: :::warning #### Conclusion - YOLO 的缺點 - 由於 YOLO 對於每個方格提兩個 bounding box 去作偵測,所以不容易去區分兩個相鄰且中心點又非常接近的物體 - 只有兩種 bounding box,所以遇到長寬比不常見的物體的檢測率較差 - YOLO 與其他模型的比較 -  -  ::: [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。 -  ::: [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]() ---
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.