目標檢測入門_上(吳恩達老師深度學習課程學習筆記)

前言:我已經一年半沒有看過吳恩達老師的視頻了,最近不容易開完了題,終於可以從科研中抽出點時間學習下自己感興趣的東西了,嘿嘿~

資料來源:https://www.coursera.org/lecture/convolutional-neural-networks/object-localization-nEeJM

目標定位(object localization)

定位:不僅要用算法判斷圖片是不是汽車,還需要在圖片中標記它的位置。

檢測:圖片中有多個對象,要確定多個對象的位置。

         

 

假設圖片需要定位3個不同類別, 註定位問題中一張圖片只會出現1個類別,則神經網絡的輸出y意義爲:

Pc表示圖片中是否有檢測的目標,bx,by,bw,bh(邊界框的位置),C1, C2, C3表示屬於哪一類(如1,0,0)

這個時候如果損失函數採用平方誤差策略 ,loss用L表示,因爲這裏的y有8個元素

,其中,如果y1=1,則損失值是每個元素相應差值的平方和,如果y1=0,則不用考慮其他元素,只需要關注pc的準確度

上文只是舉例說明,常用方法是隻對邊界框位置應用平方差方法,對Pc應用邏輯迴歸函數

特徵點檢測(landmark detection)

    姿態檢測其實也是特徵點定位問題

假設我想要提取臉部的64個特徵點,有些點甚至可以幫助定位眼角位置和下顎輪廓。我們需要選定特徵點個數,並生成包含這些特徵點的標籤訓練集(注意特徵點1的特徵在所有圖片中都保持一致),然後利用神經網絡輸出特徵點的位置。

具體做法是,準備一個卷積網絡和一些特徵集,將人臉圖片輸入卷積網絡,輸出1或0,1表示有人臉,0表示沒有人臉,然後輸出( )……直到( )。這裏我用 代表一個特徵,所以有129個輸出單元。

(可以理解爲先判斷有沒有,再輸出感興趣點的位置

目標檢測(object detection)

這裏介紹如何用基於滑動窗口的卷積神經網絡實現目標檢測。

  

首先用適當剪切的汽車圖片樣本集(汽車幾乎佔據整個圖片)訓練一個卷積神經網絡模型,然後再測試圖片中,選定一個特定大小的窗口,將這些窗口內的圖像分別送入卷積神經網絡中進行判斷。

滑動窗口目標檢測算法的思路:以固定步幅移動窗口,遍歷圖像的每個區域,把這些剪切後的小圖像輸入卷積神經網絡中,進行分類。

但是這樣的計算成本太高,爲了提高效率,有人研究出了以下內容:

滑動窗口的卷積實現(Convolutional implementation of sliding windows)

爲了構建滑動窗口的卷積應用,首先需要把神經網絡的全連接層轉化爲卷積層,如下圖。

這個圖講的特別清楚,第一個FC層通過一個5×5卷積核代替,所以輸出爲1×1,假設這層有400個卷積核,則輸出是1×1×400。這樣就實現了通過卷積層代替全連接層。

(最後通過1個1×1的卷積核轉化爲4個值(4個類別))

如果是傳統的卷積神經網絡(如ALexNet,卷積層+全連接層),則在16×16×3的圖像中要計算四次大小爲14×14×3滑動窗口(步長爲2),分別得到四個子集的共4個標籤。
如果把卷積神經網絡中的全連接層通過卷積層代替,則只需要計算一次,最後得到一個2×2×4的矩陣,2×2則分別代表四個子集的標籤

但是這樣的問題是:邊界的框架可能不夠準確。

Bounding Box預測

如果完美的邊界框不是正方形,而是長方形呢?通過bounding box方法可以得到更精確的預測框。

著名的YOLO算法是目前最常用的檢測算法(運算快,可以達到實時檢測,並且精確),YOLO的意思是you only look once,目前已經有YOLO v4,v5了。

簡化示意(以圖片分爲3×3爲例),對每個格子分別運用之前的圖像定位算法。(到目前爲止,介紹的定位算法是要輸出邊框座標值,檢測算法是隻用分別在預設的框內做圖片分類)

  (這個綠色座標是綠格子內的紅格子座標,黃色同理)

看中心點位於哪個格子,則算這個格子有沒有目標)

所以目標圖像的輸出是3×3×8,3×3就代表劃分的格子,如果一開始是19×19個格子,則最後輸出是19×19×8,注意這裏統一隻需要計算一次卷積神經網絡,原因如上滑動窗口的卷積實現。(所以劃分的格子數不會影響計算速度)

實際使用是圖片會劃分的很精細,這樣一個格子裏一般不會同時出現兩個對象。

編碼方框的細節

規定點的左上角是(0,0),右下角是(1,1)。x,y是中心點的位置,一定小於1,而w,h是框的長寬,有可能大於1。

注-指定邊界框的方式有很多。

這裏留一個問題:目標檢測-bounding box方法分別在小格內運用圖像定位算法,可如果目標占了兩個小格,那麼這目標的框怎麼確定呢?