目標檢測技術演化:從R-CNN到Faster R-CNN

摘要: 一文了解目標檢測技術發展,不要錯過喲。

目標檢測旨在準確地找到給定圖片中物體的位置,並將其正確分類。準確地來說,目標檢測須要肯定目標是什麼以及對其定位。算法

然而,想要解決這個問題並不容易。由於,目標的大小,其在空間中的方向,其姿態,以及其在圖片中的位置都是變化的。網絡

這裏有一張圖片,咱們須要識別圖片中的物體,而且用方框將該物體圈出來。框架

clipboard.png

圖像識別(分類)函數

  1. 輸入:圖像
  2. 輸出:目標類型
  3. 評價指標:精確度

定位:性能

  1. 輸入:圖像
  2. 輸出:方框在圖片中的位置(x,y,w,h)
  3. 評價指標:檢測評價函數(IOU)

現在大火的卷積神經網絡幫助咱們很好地進行圖像識別。可是,咱們仍須要一些額外的功能來進行精肯定位,深度學習在這裏發揮了很好的做用。學習

在本文中,咱們將從目標定位的角度入手探討目標檢測技術的發展。咱們將按着以下的演化順序講述:R-CNN->SPP Net->Fast R-CNN-> Faster R-CNN優化

在開始前,咱們將對基於區域的卷積神經網絡(R-CNN)進行簡單的介紹。spa

將定位看做迴歸問題

若是咱們將其看做是一個迴歸問題,則須要對(x,y,w,h)四個參數進行預測,從而獲得方框所在位置。設計

clipboard.png

步驟13d

  1. 先解決最簡單的問題:使用神經網絡識別圖片
  2. 在AlexNet VGG GoogleLenet上微調(fine-tuning)

clipboard.png

步驟2

  1. 在上述神經網絡的尾部展開(CNN前面保持不變,咱們對CNN的結尾處作出改進:加了兩個頭:「分類頭」和「迴歸頭」)
  2. 將其轉化爲分類 + 迴歸模型

clipboard.png

步驟3

  1. 在迴歸部分使用歐氏距離損失
  2. 使用隨機梯度降低進行訓練

步驟4

  1. 在預測部分結合迴歸和分類
  2. 實現不一樣的功能

接着,咱們將進行兩次微調操做。第一次在AlexNet上進行,第二次將頭部改成迴歸頭。

迴歸部分加在哪裏呢?

兩種解決辦法:

  1. 加在最後一個卷積層後面(如VGG)
  2. 加在最後一個全鏈接層後面(如R-CNN)

可是實現迴歸操做太困難了,咱們須要找到一種方法將其變爲分類問題。迴歸的訓練參數收斂的時間要長得多,因此上面的網絡採起了用分類的網絡來計算網絡共同部分的鏈接權值。

取圖像窗口

  1. 依舊使用前面所說起的分類+迴歸的思路
  2. 首先選取不一樣的大小的方框
  3. 讓方框出如今不一樣的位置,計算出這個方框在不一樣位置的得分
  4. 取得分最高的那方框

clipboard.png

左上角的黑框:得分0.5

右上角的黑框:得分0.75

左下角的黑框:得分0.6

右下角的黑框:得分0.8

根據這些得分,咱們選擇右下角的黑框做爲所要預測的目標位置。

注:有的時候也會選擇得分最高的兩個方框,而後取兩個方框的交集做爲最終須要預測的位置。

問題:方框的大小如何肯定呢?

當取了不一樣的方框後,依次從左上角掃描到右下角。

總結:

對第一張圖片,咱們使用不一樣大小的方框(遍歷整張圖片)將圖片截取出來,輸入到CNN,而後CNN會輸出這個框的分類以及這個框圖片對應的(x,y,w,h)。

clipboard.png

可是,這個方法太耗費時間了,須要作一些優化。最初的網絡模型以下圖所示:

clipboard.png

所作優化:將全鏈接層改成爲卷積層以提升速度。

clipboard.png

目標檢測

當圖中有多個物體存在的時候咱們應該如何作呢?如今咱們所要解決的問題就變成了:多個目標識別+定位。

如今咱們還能將其看做分類問題麼?

clipboard.png

但是,將其看做分類問題的話會有以下矛盾產生:

  1. 你須要找到許多的位置,並提供不一樣大小的方框
  2. 你還須要對方框中的圖像進行分類
  3. 固然,若是你的GPU很強大,將其看做分類問題也沒什麼不妥

若是將其看做分類問題,咱們能作哪些優化呢?咱們並不想使用太多的方框在不一樣的位置間來回嘗試。下面,給出了一種解決方案:

首先,咱們須要找出包含全部目標的方框。其中有的方框會產生重疊或者互相包含,這樣咱們就不用枚舉出全部的方框了。

clipboard.png

對於候選框的獲取,前人發現了不少種方法:好比EdgeBoxes和Selective Search。如下是候選方框獲取方法的性能對比:

clipboard.png

對於「選擇性搜索」是如何選出全部候選方框這個問題,本文不做介紹,有興趣的能夠對其相關論文進行研究。

R-CNN

上述說起的思路推進了R-CNN的面世。讓咱們以一樣的圖片爲例,對R-CNN進行講解。

步驟1

下載一個分類模型(如AlexNet)

clipboard.png

步驟2

對模型進行微調

  1. 將分類數目從1000降至20
  2. 去掉最後一個全鏈接層

clipboard.png

步驟3

特徵提取:

  1. 提取出圖像中全部的候選方框(選擇性搜索)
  2. 對每個區域:調整區域的大小,使其與CNN的輸入一致,作一次向前運算,將第五個池化層的輸出存入硬盤中

clipboard.png

步驟4

  1. 訓練一個支持向量機(SVM)分類器(二分類),用以判斷這個候選框裏物體的類別
  2. 判斷SVM是否屬於對應的類別。若是是,就是positive,若是否,就是negative。下面是一個給狗分類的SVM示例。

clipboard.png

步驟5

使用迴歸器對候選方框的位置進行仔細校訂。對於每個分類,都須要訓練一個線性迴歸模型,用以判斷這個方框是否足夠匹配。

clipboard.png

SPP Net

空間金字塔池化(SPP:Spatial Pyramid Pooling)概念的提出對R-CNN的發展有着非凡的意義。在此咱們會對SPP進行簡明的介紹。

SPP有兩個特徵:

1. 結合空間金字塔法,實現CNN的多尺度輸入

通常來講,在CNN後面會接有一個全鏈接層或者一個分類器。它們都須要調整至合適大小方可做爲輸入,所以須要對輸入數據進行分割和變形。然而,這些預處理可能會形成數據的丟失或幾何的失真。SPP Net的第一個貢獻就是將金字塔思想與CNN相結合,實現數據的多尺度輸入。

以下圖所示,在卷積層和全鏈接層之間加入一個SPP層。此時,網絡的輸入尺度能夠是任意的,在SPP層中,池化所需的過濾器會根據輸入自動調節大小,但SPP的輸出尺度確實保持不變的。

clipboard.png

2. 只對原始圖像提取一次卷積特徵

在R-CNN中,每一個候選框會將其尺寸調至統一,而後分別做爲CNN的輸入,但這樣的作法下降了效率。SPP Net針對這個缺點作了相應的優化:只對原始圖像進行一次卷積操做,獲得特徵圖,而後找到每一個候選方框在特徵圖上的映射,而後將該映射做爲卷積特徵輸入SPP層。這種優化方法節約了大量的計算時間,相比 R-CNN快上百倍。

clipboard.png

Fast R-CNN

SPP Net很是實用,有學者就在R-CNN的基礎上結合SPP Net,提出Fast R-CNN,進一步提高了性能。

R-CNN與Fast R-CNN有什麼區別呢?

首先,讓咱們來看看R-CNN的不足之處。儘管它在提取潛在邊框做爲輸入時,使用了選擇性搜索以及其它處理方法,可是R-CNN在運算速度上仍然遇到了瓶頸。這是因爲計算機在對全部區域進行特徵提取時會進行大量的重複計算。

爲了解決這個問題,研究學者提出了Fast R-CNN。

clipboard.png

在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總結:

  1. R-CNN有一些缺點
  2. 主要缺點:由於每個候選方框都須要獨立地輸入到CNN中,此操做十分耗費時間
  3. 次要缺點:在共享層,不是每一個候選方框都做爲輸入進入到CNN中。相反,輸入的是一張完整的圖片,在第五個卷積層提取出每一個候選方框的特徵
  4. 原始方法:大量候選方框(例如2000個)→CNN→獲得每一個候選方框的特徵→分類+迴歸
  5. 如今的方法:完整的圖片→CNN→獲得每一個候選方框的特徵→分類+迴歸

很明顯,Fast R-CNN比R-CNN在速度上有了大幅提高;與R-CNN對每一個候選方框輸入到CNN中提取特徵不一樣的是,Fast R-CNN只對輸入的整張圖片提取一次特徵,而後在第五個卷積層上提取每一個候選方框的特徵,此操做只須要計算一次特徵,剩下的操做在第五個卷積層上完成便可。

性能的提高也十分明顯:

clipboard.png

Faster R-CNN

毫無疑問,Fast R-CNN與傳統的CNN相比,在性能上有了大幅提高。但Fast R-CNN的一個主要問題在於它使用選擇性搜索去找全部的候選方框,這是很是耗時的。

是否有更加高效的方法去找出全部的候選方框呢?

解決辦法:增長一個能夠對邊緣進行提取的神經網絡。換句話說,利用神經網絡去尋找全部的候選方框。可以實現這種操做的神經網絡叫作區域生成網絡(RPN:Region Proposal Network)。

讓咱們看看RPN有哪些提高:

  1. 在最後一個全鏈接層後加入RPN
  2. RPN直接訓練獲得候選區域

clipboard.png

RPN總結:

  1. 在特徵圖上進行窗口滑動
  2. 創建一個神經網絡用於目標分類以及方框的位置迴歸
  3. 滑動窗口的位置提供關於目標的大體位置信息
  4. 迴歸可以提供一個更加精確的方框位置

clipboard.png

四種損失函數:

  1. RPN分類
  2. RPN迴歸
  3. Fast R-CNN分類
  4. Fast R-CNN迴歸

clipboard.png

clipboard.png
速度比較

Faster R-CNN的貢獻在於它設計了一個RPN網絡對候選區域進行提取,此步驟代替了耗時過多的選擇性搜索,使速度獲得大幅提高。

總結

總的來講,從R-CNN,SPP-NET,Fast R-CNN到R-CNN,基於深度學習進行目標檢測的步驟獲得了簡化,精度獲得了提升,速度獲得了提高。能夠說,基於區域生成的系列R-CNN目標檢測算法在目標檢測領域已經成爲最主要的分支。

本文做者:【方向】

閱讀原文

本文爲雲棲社區原創內容,未經容許不得轉載。

相關文章
相關標籤/搜索