1. 程式人生 > >深度學習在目標檢測中的應用及其tensorflowAPI實踐(二)

深度學習在目標檢測中的應用及其tensorflowAPI實踐(二)

這系列文章的內容目錄如下:

  • 目標檢測的任務

  • 深度學習在目標檢測中的應用

    • RCNN
    • fast RCNN
    • faster RCNN
    • RFCN
    • yolo
    • yolo V2
    • SSD
  • tensorflow目標檢測API的使用

第一篇裡說完了RCNN和fast RCNN,接下來繼續說faster RCNN,建議不瞭解RCNN和fast RCNN的讀者先回頭瞭解了RCNN和fast RCNN在繼續讀下去。

faster RCNN的流程如下:
這裡寫圖片描述
faster RCNN首先通過一個RPN網路生成一堆候選框ROI,後面的操作和fast RCNN基本一致。
我們可以先看看RPN網路是個什麼樣的結構。
首先明確RPN網路的輸入輸出,RPN網路輸入是一張圖片,輸出是這張圖片上有可能是物體的一堆候選框,並對這些框做第一次的bbox-rg。
下圖是一個RPN網路原理的示意圖,我沒有去畫具體的CNN結構,因為這部分是可變的,可以用VGG,也可以用inceptionnet,只要知道一張圖片經過一個CNN後會生成一堆feature map。
這裡寫圖片描述


下面依次解釋上圖的每一步都做了什麼:
圖片經過CNN輸出一堆feature map,每個feature map相較原始圖片是變小了的,取決於你使用的CNN結構,這時候作者基於這堆feature map為其上的每個點設定了一系列anchors(原文是9個),如下圖所示:
這裡寫圖片描述
假設最後得到的feature map形狀如上圖左側所示,為7x7,那麼就會在整張圖片上產生7x7x9個候選框,每個候選框的大小由不同的寬高比來設定。
這樣對應到上圖的RPN接面構,左側的分支softmax就負責預測這些候選框裡是否有物體,可以看到作者設定了18個1x1的卷積,正好對應每個候選框是否有物體。
那麼上面為什麼還要接一個3x3的卷積呢?是為了能讓feature map更好的結合周圍的畫素資訊。
所以RPN網路的作用就是預測這7x7x9個候選框裡是否有物體,並且對所有候選框做第一次的bbox-rg。
最後的proposal是對上面RPN的輸出做一個整理的步驟,做了以下幾件事:

  1. 對上面RPN輸出的bbox-rg引數(寬高縮放比和橫豎偏移量)對候選框進行修正
  2. 根據softmax輸出的每個框裡是否有物體的概率值對所有的框做一個排序,取出最有可能是物體的n個候選框
  3. 刪除根據bbox-rg的結果修正後的候選框裡嚴重超出邊界的候選框
  4. 這時候仍然有很多框,所以做一個nms(非極大抑制),再對剩下的框執行步驟2,保留m個框(m小於n)

綜合以上,我們經過RPN網路,得到了m個有可能是物體的候選框,和fast RCNN裡的selective search步驟的結果一致,只不過現在由深度學習來完成這件事。
ok,繞了一大圈終於得到了我們要的候選框,接下來針對這些候選框的操作就和fast RCNN很類似了。需要注意的是在RPN的最後也是一個多工的學習任務所以也設定了多工的損失函式。
幾乎所有的目標檢測方法都會設定一個多工的損失函式,分為兩部分,一部分用來對分類做softmax損失,另一部分用來對bbox-rg做損失,學習平移量和縮放量,只是具體的損失函式需要對著各個方法的論文去看。


得到了RPN輸出的候選框之後,我們首先對這些候選框進行ROIpooling,把他們做到相同大小,然後送入一個小網路做分類和再一次的bbox-rg,流程如下:
這裡寫圖片描述
上面這個過程的細節不做過多說明,結構很簡單,最後的損失函式也是分兩部分,分類的softmax損失和迴歸的學習平移縮放的損失。
細心的讀者一定會發現,faster RCNN竟然涉及到了兩個獨立的網路,而且有一部分卷積層其實是共享的,但最後接的損失函式是不一樣的,就像下面這樣:
這裡寫圖片描述
上圖中藍色部分為RPN,紅色部分為第二步類似fast RCNN中的處理,前面的卷積層部分其實是共享的。但兩部分的訓練目標是不一樣的,於是作者提出了以下訓練方法,這個方法在後續的RFCN中也用到了:

  1. 訓練RPN,注意一般訓練網路都不會從頭開始訓練,這裡是用在ImageNet預訓練的vgg權重初始化的(tensorflowAPI裡用的不是VGG)
  2. 訓練獨立的fastRCNN檢測網路,使用第一步中生成的ROI,初始化也是用ImageNet預訓練的權重,此時兩個網路是不共享卷積層的。
  3. 使用2中訓練的fast r-cnn檢測網路重新初始化RPN網路,然後固定共享卷積層不訓練,只對RPN後面的幾層進行微調。
  4. 保持3中共享卷積層不訓練,由3訓練後得到的ROI,再訓練fast r-cnn中的全連線層,這樣一個完整的網路訓練完畢。

這種兩個網路交替統一訓練的方法很有開創的意義,在後續的RFCN中也參考了這裡的訓練方法。
faster RCNN提出了anchors的概念,提出了兩個網路共同訓練的方法,對後續的發展起到了很大的推動作用。
下一篇繼續介紹RFCN。戳這裡>>>
持續更新中~