目標檢測技術演化:從R-CNN到Faster R-CNN
作者:【方向】 來源:雲棲社群
原文連結: https://yq.aliyun.com/articles/619803?spm=a2c4e.11153940.bloghomeflow.332.162d291aRoS8gf
目標檢測旨在準確地找到給定圖片中物體的位置,並將其正確分類。準確地來講,目標檢測需要確定目標是什麼以及對其定位。
然而,想要解決這個問題並不容易。因為,目標的大小,其在空間中的方向,其姿態,以及其在圖片中的位置都是變化的。
這裡有一張圖片,我們需要識別圖片中的物體,並且用方框將該物體圈出來。
影像識別(分類)
-
輸入:影像
-
輸出:目標型別
-
評價指標:精確度
定位:
-
輸入:影像
-
輸出:方框在圖片中的位置(x,y,w,h)
-
評價指標:檢測評價函式(IOU)
如今大火的卷積神經網路幫助我們很好地進行影像識別。但是,我們仍需要一些額外的功能來進行精確定位,深度學習在這裡發揮了很好的作用。
在本文中,我們將從目標定位的角度入手探討目標檢測技術的發展。我們將按著如下的演化順序講述:R-CNN->SPP Net->Fast R-CNN-> Faster R-CNN
在開始前,我們將對基於區域的卷積神經網路(R-CNN)進行簡單的介紹。
將定位看作迴歸問題
如果我們將其看作是一個迴歸問題,則需要對(x,y,w,h)四個引數進行預測,從而得到方框所在位置。
步驟1
-
先解決最簡單的問題:使用神經網路識別圖片
-
在AlexNet VGG GoogleLenet上微調(fine-tuning)
步驟2
-
在上述神經網路的尾部展開(CNN前面保持不變,我們對CNN的結尾處做出改進:加了兩個頭:“分類頭”和“迴歸頭”)
-
將其轉化為分類 + 迴歸模型
步驟3
-
在迴歸部分使用歐氏距離損失
-
使用隨機梯度下降進行訓練
步驟4
-
在預測部分結合迴歸和分類
-
實現不同的功能
接著,我們將進行兩次微調操作。第一次在AlexNet上進行,第二次將頭部改為迴歸頭。
迴歸部分加在哪裡呢?
兩種解決辦法:
-
加在最後一個卷積層後面(如VGG)
-
加在最後一個全連線層後面(如R-CNN)
但是實現迴歸操作太困難了,我們需要找到一種方法將其變為分類問題。迴歸的訓練引數收斂的時間要長得多,所以上面的網路採取了用分類的網路來計算網路共同部分的連線權值。
取影像視窗
-
依舊使用前面所提及的分類+迴歸的思路
-
首先選取不同的大小的方框
-
讓方框出現在不同的位置,計算出這個方框在不同位置的得分
-
取得分最高的那方框
左上角的黑框:得分0.5
右上角的黑框:得分0.75
左下角的黑框:得分0.6
右下角的黑框:得分0.8
根據這些得分,我們選擇右下角的黑框作為所要預測的目標位置。
注: 有的時候也會選擇得分最高的兩個方框,然後取兩個方框的交集作為最終需要預測的位置。
問題: 方框的大小如何確定呢?
當取了不同的方框後,依次從左上角掃描到右下角。
總結:
對第一張圖片,我們使用不同大小的方框(遍歷整張圖片)將圖片擷取出來,輸入到CNN,然後CNN會輸出這個框的分類以及這個框圖片對應的(x,y,w,h)。
但是,這個方法太耗費時間了,需要做一些優化。最初的網路模型如下圖所示:
所做優化:將全連線層改為為卷積層以提高速度。
目標檢測
當圖中有多個物體存在的時候我們應該如何做呢?現在我們所要解決的問題就變成了:多個目標識別+定位。
現在我們還能將其看作分類問題麼?
可是,將其看作分類問題的話會有如下矛盾產生:
-
你需要找到許多的位置,並提供不同大小的方框
-
你還需要對方框中的影像進行分類
-
當然,如果你的GPU很強大,將其看作分類問題也沒什麼不妥
如果將其看作分類問題,我們能做哪些優化呢?我們並不想使用太多的方框在不同的位置間來回嘗試。下面,給出了一種解決方案:
首先,我們需要找出包含所有目標的方框。其中有的方框會產生重疊或者互相包含,這樣我們就不用列舉出所有的方框了。
對於候選框的獲取,前人發現了很多種方法:比如EdgeBoxes和Selective Search。以下是候選方框獲取方法的效能對比:
對於“選擇性搜尋”是如何選出所有候選方框這個問題,本文不作介紹,有興趣的可以對其相關論文進行研究。
R-CNN
上述提及的思路推動了R-CNN的面世。讓我們以同樣的圖片為例,對R-CNN進行講解。
步驟1
下載一個分類模型(如AlexNet)
步驟2
對模型進行微調
-
將分類數目從1000降至20
-
去掉最後一個全連線層
步驟3
特徵提取:
-
提取出影像中所有的候選方框(選擇性搜尋)
-
對每一個區域:調整區域的大小,使其與CNN的輸入一致,做一次向前運算,將第五個池化層的輸出存入硬碟中
步驟4
-
訓練一個支援向量機(SVM)分類器(二分類),用以判斷這個候選框裡物體的類別
-
判斷SVM是否屬於對應的類別。如果是,就是positive,如果否,就是negative。下面是一個給狗分類的SVM示例。
步驟5
使用迴歸器對候選方框的位置進行仔細校正。對於每一個分類,都需要訓練一個線性迴歸模型,用以判斷這個方框是否足夠匹配。
SPP Net
空間金字塔池化(SPP:Spatial Pyramid Pooling)概念的提出對R-CNN的發展有著非凡的意義。在此我們會對SPP進行簡明的介紹。
SPP有兩個特徵:
1. 結合空間金字塔法,實現CNN的多尺度輸入
一般來說,在CNN後面會接有一個全連線層或者一個分類器。它們都需要調整至合適大小方可作為輸入,因此需要對輸入資料進行分割和變形。然而,這些預處理可能會造成資料的丟失或幾何的失真。SPP Net的第一個貢獻就是將金字塔思想與CNN相結合,實現資料的多尺度輸入。
如下圖所示,在卷積層和全連線層之間加入一個SPP層。此時,網路的輸入尺度可以是任意的,在SPP層中,池化所需的過濾器會根據輸入自動調節大小,但SPP的輸出尺度確實保持不變的。
2. 只對原始影像提取一次卷積特徵
在R-CNN中,每個候選框會將其尺寸調至統一,然後分別作為CNN的輸入,但這樣的做法降低了效率。SPP Net針對這個缺點做了相應的優化:只對原始影像進行一次卷積操作,得到特徵圖,然後找到每個候選方框在特徵圖上的對映,然後將該對映作為卷積特徵輸入SPP層。這種優化方法節約了大量的計算時間,相比 R-CNN快上百倍。
Fast R-CNN
SPP Net非常實用,有學者就在R-CNN的基礎上結合SPP Net,提出Fast R-CNN,進一步提升了效能。
R-CNN與Fast R-CNN有什麼區別呢?
首先,讓我們來看看R-CNN的不足之處。儘管它在提取潛在邊框作為輸入時,使用了選擇性搜尋以及其它處理方法,但是R-CNN在運算速度上仍然遇到了瓶頸。這是由於計算機在對所有區域進行特徵提取時會進行大量的重複計算。
為了解決這個問題,研究學者提出了Fast R-CNN。
在Fast R-CNN中,有一個被稱為ROI Pooling的單層SPP網路層。該網路層能夠將不同尺寸的輸入對映為一系列固定尺度的特徵向量,正如我們所知,conv,pooling,relu以及一些其它操作並不需要固定尺度的輸入。因此,當我們在原始圖片上執行這些操作後,由於輸入圖片的尺寸不同,得到的特徵圖尺寸也不一樣,不能將它們直接連線到一個全連線層上進行分類,但是我們可以在其中加入ROI Pooling層,以一個固定尺度的特徵來表示每個區域,再通過softmax進行分類。
此外,前面所講的R-CNN需要先有一個proposal,再輸入到CNN中進行特徵提取,之後採用SVM進行分類,最後進行邊框迴歸。但是在Fast R-CNN模型中,作者將邊框迴歸引入神經網路,並將其與區域分類合併,形成一個多工模型。
實驗證明,這兩個任務能夠共享卷積特徵。Fast R-CNN的一個額外貢獻是使Region Proposal+CNN這一框架得以運用,同時讓人們看到進行多類檢測的同時仍保證精度是能夠實現的。
R-CNN總結:
-
R-CNN有一些缺點
-
主要缺點:因為每一個候選方框都需要獨立地輸入到CNN中,此操作十分耗費時間
-
次要缺點:在共享層,不是每個候選方框都作為輸入進入到CNN中。相反,輸入的是一張完整的圖片,在第五個卷積層提取出每個候選方框的特徵
-
原始方法:大量候選方框(例如2000個)→CNN→得到每個候選方框的特徵→分類+迴歸
-
現在的方法:完整的圖片→CNN→得到每個候選方框的特徵→分類+迴歸
很明顯,Fast R-CNN比R-CNN在速度上有了大幅提升;與R-CNN對每個候選方框輸入到CNN中提取特徵不同的是,Fast R-CNN只對輸入的整張圖片提取一次特徵,然後在第五個卷積層上提取每個候選方框的特徵,此操作只需要計算一次特徵,剩下的操作在第五個卷積層上完成即可。
效能的提升也十分明顯:
Faster R-CNN
毫無疑問,Fast R-CNN與傳統的CNN相比,在效能上有了大幅提升。但Fast R-CNN的一個主要問題在於它使用選擇性搜尋去找所有的候選方框,這是非常耗時的。
是否有更加高效的方法去找出所有的候選方框呢?
解決辦法:增加一個可以對邊緣進行提取的神經網路。換句話說,利用神經網路去尋找所有的候選方框。能夠實現這種操作的神經網路叫做區域生成網路(RPN:Region Proposal Network)。
讓我們看看RPN有哪些提升:
-
在最後一個全連線層後加入RPN
-
RPN直接訓練得到候選區域
RPN總結:
-
在特徵圖上進行視窗滑動
-
建立一個神經網路用於目標分類以及方框的位置迴歸
-
滑動視窗的位置提供關於目標的大致位置資訊
-
迴歸能夠提供一個更加精確的方框位置
四種損失函式:
-
RPN分類
-
RPN迴歸
-
Fast R-CNN分類
-
Fast R-CNN迴歸
速度比較
Faster R-CNN的貢獻在於它設計了一個RPN網路對候選區域進行提取,此步驟代替了耗時過多的選擇性搜尋,使速度得到大幅提升。
總結
總的來說,從R-CNN,SPP-NET,Fast R-CNN到R-CNN,基於深度學習進行目標檢測的步驟得到了簡化,精度得到了提高,速度得到了提升。可以說,基於區域生成的系列R-CNN目標檢測演算法在目標檢測領域已經成為最主要的分支。
本文由北郵 @愛可可-愛生活 老師推薦, 阿里云云棲社群 組織翻譯。
文章原標題《From R-CNN to Faster R-CNN: The Evolution of Object Detection Technology》,作者:Leona Zhang,譯者:Elaine,審校:袁虎。
文章為簡譯,更為詳細的內容,請檢視 原文
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31473948/viewspace-2168490/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一文讀懂目標檢測:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSDCNNASTYOLO
- 【目標檢測】R-CNNCNN
- 深度學習目標檢測(object detection)系列(四) Faster R-CNN深度學習ObjectASTCNN
- 目標檢測入門系列手冊四:Faster R-CNN 訓練教程ASTCNN
- 「技術綜述」一文道盡R-CNN系列目標檢測CNN
- 經典目標檢測方法Faster R-CNN和Mask R-CNN|基於PaddlePaddle深度學習平臺的實戰ASTCNN深度學習
- Faster R-CNNASTCNN
- 【目標檢測】:SPP-Net深入理解(從R-CNN到SPP-Net)CNN
- 【目標檢測】Fast R-CNN演算法實現ASTCNN演算法
- 大話目標檢測經典模型:Mark R-CNN模型CNN
- 深度學習目標檢測(object detection)系列(一) R-CNN深度學習ObjectCNN
- TorchVision Faster R-CNN 微調,實戰 Kaggle 小麥檢測ASTCNN
- 目標檢測 - Sparse R-CNN: End-to-End Object Detection with Learnable ProposalsCNNObject
- 【深度學習】像玩樂高一樣拆解Faster R-CNN:詳解目標檢測的實現過程深度學習ASTCNN
- CVPR 2018|Cascade R-CNN:向高精度目標檢測器邁進CNN
- CVPR 2019 | 天秤座R-CNN:全面平衡的目標檢測器CNN
- Faster R-CNN演算法解析ASTCNN演算法
- 程式碼實踐——Faster R-CNNASTCNN
- CNN--卷積神經網路從R-CNN到Faster R-CNN的理解(CIFAR10分類程式碼)CNN卷積神經網路AST
- 目標檢測入門系列手冊三:Fast R-CNN 訓練教程ASTCNN
- 深度學習與CV教程(12) | 目標檢測 (兩階段,R-CNN系列)深度學習CNN
- Faster R-CNN: Down the rabbit hole of modern object detectionASTCNNObject
- 從滑動視窗到YOLO、Transformer:目標檢測的技術革新YOLOORM
- 賈佳亞等提出Fast Point R-CNN,利用點雲快速高效檢測3D目標ASTCNN3D
- 二階段目標檢測網路-Faster RCNN 詳解ASTCNN
- 目標檢測新正規化!港大同濟伯克利提出Sparse R-CNN,程式碼剛剛開源!CNN
- faster-RCNN臺標檢測ASTCNN
- 多角度SAR動目標檢測技術
- 【Fast R-CNN】Fast R-CNN (2015) 全文翻譯ASTCNN
- Pytorch版Faster R-CNN 原始碼分析+方法流程詳解——訓練篇PyTorchASTCNN原始碼
- 目標檢測
- 3D目標檢測技術有哪些好用的模型?3D模型
- 【目標檢測從放棄到入門】SSD / RCNN / YOLO通俗講解CNNYOLO
- 2018目標檢測
- 九、目標檢測
- 從錨點到關鍵點,最新的目標檢測方法發展到哪了
- YOLO目標檢測從V1到V3結構詳解YOLO
- 移動應用隱私合規檢測簡介及目標檢測技術的應用