吳恩達Coursera深度學習課程 deeplearning.ai (4-3) 目標檢測--課程筆記

3.1 目標定位

圖片檢測問題

  • 分類問題:判斷圖中是否爲汽車;
  • 目標定位:判斷是否爲汽車,並確定具體位置(框起來);
  • 目標檢測:檢測不同物體並定位。

image

圖片定位的神經網絡結構

  • 假設我們要定位圖片中:行人,汽車,摩托以及背景(沒有符合條件的)並定位。
  • 假設每張圖片上只能出現一個目標。

標記四類存在與否,定位需要定位目標中心座標(b_x, b_y)以及圖片的高度(b_h)和寬度(b_w)

image

損失函數

輸出函數

y_hat 爲softmax 的輸出,爲八個元素

  • 第一個元素 P_c 表示是否有物體(1/0)
  • 接下來四個元素定位目標(b_x, b_y, b_h, b_w),
  • 最後三個元素表示是否是行人(c1:1/0),是否是汽車(c2:1/0)是否是摩托(c3:1/0)
損失函數

Loss:

  • 如果 P_c = 1 表示有目標出現,則 Loos = 8個元素各自的差的平方之和
  • 如果 P_c = 0 表示沒有目標出現,則 Loos = P_c的差的平方

image

3.2 特徵點檢測

卷積神經網絡可以標記圖片上的某些特徵點的位置

  • 比如識別人臉的各個特徵點(眼角, 嘴角,鼻尖,下巴等)來識別人們的面部表情
  • 比如通過身體上一系列特徵點識別運動員的姿態

如果要識別 m 個特徵點,則卷積神經網絡的softmax 輸出需要有2m+1個元素,第一個代表是否出現該目標,其餘每2個元素表示一個特徵點的 x座標和 y 座標。

image

3.3 目標檢測

目標檢測採用的是基於滑動窗口的檢測算法。

訓練模型

  • 訓練集X:將有汽車的圖片進行適當的剪切,剪切成整張幾乎都被汽車佔據的小圖或者沒有汽車的小圖;
  • 訓練集Y:對X中的圖片進行標註,有汽車的標註1,沒有汽車的標註0。

image

滑動窗口目標檢測

利用滑動窗口在實際圖片中實現目標檢測。

  • 首先選定一個特定大小的窗口,將窗口內的圖片輸入到模型中進行預測;
  • 以固定步幅滑動該窗口,遍歷圖像的每個區域,對窗內的各個小圖不斷輸入模型進行預測;
  • 繼續選取一個更大的窗口,再次遍歷圖像的每個區域,對區域內是否有車進行預測;
  • 遍歷整個圖像,可以保證在每個位置都能檢測到是否有車。
    image
缺點
  • 窗口大,步幅大,則預測不夠準確
  • 窗口小,步幅小,則計算成本巨大

3.4 卷積的滑動窗口實現

將全連接層轉化爲卷積層

思路:使用和圖片完全一致(高度/寬度/深度)的卷積核可以將輸出定位到單個元素上,那麼使用 n 個卷積核就可以將圖片定位到深度爲 n 的單位圖像上,用來表示全連接中的 n 維列向量。

image

利用類似卷積核的原理實現滑動窗口

採用和單個窗口同樣的各層的卷積核來操作圖片,可以一次性將所有滑動窗口的結果計算出來,這個原理和卷積核的滑動有異曲同工之妙。

image

優點:不用每個窗口單獨進行計算了,大大減少了計算量。

缺點:定位的目標邊界框不夠精準

3.5 Bounding Box 預測

上一節滑動窗口算法,大大減少計算量,但是定位的目標邊界框不夠精確,比如汽車是一個長方形,或者正好跨越兩個窗口的時候。

YOLO 算法

  • 將圖片分割成n×n個小的圖片
  • 在圖像的n×n個格子中分別應用圖片分類和定位算法
    • 卷積核方式一次計算出所有格子的結果, 計算效率較高
  • 每個格子的輸出爲8個元素(P_c, b_x, b_y, b_h, b_w, c1, c2, c3),則所有格子的結果爲 nxnx8

image

目標定位

  • 對於每個網格,以左上角爲(0,0),以右下角爲(1,1);
  • 中點b_x、b_y 表示座標值,在0~1之間;
  • 寬高b_h、b_w 表示比例值,存在>1的情況。

image

3.6 交併比(Intersection over union)

交併比(IOU):交集大小/並集大小,用來檢測預測邊界框的準確性。

image

一般IOU >= 0.5 就認爲可以了,當然你可以定義更嚴格的標準比如0.6,最好的情況是1,完全重合。

3.7 非極大值抑制

上一節的檢測中,可能多個格子都認爲自己是中心,檢測到了一輛車,那麼同一輛車就可能被檢出多次,非最大值抑制可以確保我們的算法對每個對象只檢測一次。(預測的形狀面積重合多的認爲是重複的,只保留概率最高的那個)

image

以單個對象檢測爲例

  • 對於圖片每個網格預測輸出矩陣:yi=[P_c, b_x, b_h, b_w],其中P_c表示有對象的概率
  • 拋棄P_c <= 0.6的邊界框
  • 對剩餘的邊界框(while):
    • 選取最大Pc值的邊界框,作爲預測輸出邊界框;
    • 拋棄和選取的邊界框IoU⩾0.5的剩餘的邊界框。

對於多對象檢測,輸出標籤中就會有多個分量。正確的做法是:對每個輸出類別分別獨立進行一次非最大值抑制。

3.8 Anchor Boxes

使用Anchor box 可以同時檢測出多個對象。

原理

對於重疊的目標,這些目標的中點有可能會落在同一個網格中,對於我們之前定義的輸出:y_i =[P_c, b_x, b_y, b_h, b_w, c_1, c_2, c_3],只能得到一個目標的輸出。

而Anchor box 則是預先定義多個不同形狀的Anchor box(一般爲兩個,矮胖型和瘦高型),我們需要把預測目標對應地和各個Anchor box 關聯起來,所以我們重新定義目標向量:
y_i=[P_c, b_x, b_y, b_h, b_w, c_1, c_2, c_3, P_c, b_x, b_y, b_h, b_w, c_1, c_2, c_3 …]
用這樣的多目標向量分別對應不同的Anchor box,從而檢測出多個重疊的目標。

  • 不使用Anchor box:訓練圖片中的每個對象,根據對象的中點,分配到對應的格子中。輸出大小(例如8):n×n×8
  • 使用Anchor box:訓練圖片的每個對象,根據對象的中點,分配到對應的格子中,同時還分配到一個和對象形狀的IoU最高的Anchor box 中。輸出大小(例如兩個Anchor box):n×n×16

image

難點問題:

  • 如果我們使用了兩個Anchor box,但是同一個格子中卻有三個對象的情況,此時只能用一些額外的手段來處理;
  • 同一個格子中存在兩個對象,但它們的Anchor box 形狀相同,此時也需要引入一些專門處理該情況的手段。

但是以上的兩種問題出現的可能性不會很大,對目標檢測算法不會帶來很大的影響。

Anchor box 的選擇

  • 一般人工指定Anchor box 的形狀,選擇5~10個以覆蓋到多種不同的形狀,可以涵蓋我們想要檢測的對象的形狀;
  • 高級方法:K-means 算法:將不同對象形狀進行聚類,用聚類後的結果來選擇一組最具代表性的Anchor box,以此來代表我們想要檢測對象的形狀。

3.9 YOLO 算法

假設我們要在圖片中檢測三種目標:行人、汽車和摩托車,同時使用兩種不同的Anchor box。

訓練集

  • 輸入X:同樣大小的完整圖片;
  • 目標Y:使用3×3
  • 網格劃分,輸出大小3×3×2×8,或者3×3×16
  • 對不同格子中的小圖,定義目標輸出向量Y。

image

模型預測

輸入與訓練集中相同大小的圖片,同時得到每個格子中不同的輸出結果:3×3×2×8

image

運行非最大值抑制(NMS)

行人,汽車,摩托 分別進行

image

3.10 候選區域(region proposals)

R-CNN(Regions with convolutional networks): 在圖片中選出一些目標的候選區域,在候選區域的窗口上運行卷積網絡,從而避免了傳統滑動窗口在大量無對象區域的無用運算。

具體實現:運用圖像分割算法,將圖片分割成許多不同顏色的色塊,然後在這些色塊上放置窗口,將窗口中的內容輸入網絡,從而減小需要處理的窗口數量。

image

更快的算法

  • R-CNN:給出候選區域,對每個候選區域進行分類識別,輸出對象 標籤 和 bounding box,從而在確實存在對象的區域得到更精確的邊界框,但速度慢;
  • Fast R-CNN:給出候選區域,使用滑動窗口的卷積實現去分類所有的候選區域,但得到候選區的聚類步驟仍然非常慢;
  • Faster R-CNN:使用卷積網絡給出候選區域。

R-CNN 應用較少,速度和應用的頻率都不如 YOLO 算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章