本週為第四課的第三週內容,這一課所有內容的中心只有一個:計算機視覺。應用在深度學習裏,就是專門用來進行圖學習的模型和技術,是在之前全連接基礎上的“特化”,也是相關專業裏的一個重要研究大類。
這一整節課都存在大量需要反覆理解的內容和機器學習、數學基礎。 因此我會盡可能的補足基礎,用比喻和實例來演示每個部分,從而幫助理解。
第三週的內容將從圖像分類進一步拓展到目標檢測(Object Detection) 這一更具挑戰性的計算機視覺任務。
與分類任務只需回答“圖中有什麼”不同,目標檢測需要同時解決“ 有什麼”以及“在什麼位置”兩個問題,因此在模型結構設計、訓練方式和評價標準上都更為複雜。
本篇的內容關於目標定位與特徵點檢測。

1.目標定位

這個標題想必不用解釋,在原本的分類算法中,我們構建模型來識別輸入的圖像“”是什麼“,而現在,我們想進一步進行定位,找到檢測內容在圖像中的位置。
這並不是另起爐灶,而是在原本的分類基礎上的進一步發展,因此在這部分,我們就來看看如何從”是什麼“到”在什麼位置“。

1.1 圖像分類的傳播邏輯

圖像分類的邏輯對我們來説早就不陌生了,我們再簡單梳理一遍,來看這樣課程裏這樣一個例子:

吳恩達【深度學習工程師】 04.卷積神經網絡 第三週目標檢測 (1)基本的對象檢測算法_目標檢測


你會發現,在監督學習中,我們對每個樣本都規定了它的”標準答案“。

因此,網絡才能在”傳播——對比——改正“這樣的循環中不斷學習,最終實現分類。

用通俗的話來説,這其中的一個關鍵點在於:模型並不知道汽車是什麼,但是你通過標籤告訴它:這是汽車。

而目標定位也是同樣的邏輯:我們不僅要通過標籤告訴模型什麼是汽車,還要告訴它汽車在哪

1.2 從分類到定位

通過上一部分的瞭解,我們知道,要實現從分類到定位的邏輯,首先就要在標籤中增加檢測目標的位置信息。

吳恩達【深度學習工程師】 04.卷積神經網絡 第三週目標檢測 (1)基本的對象檢測算法_特徵點檢測_02


我們知道,在分類問題中,可以用標籤 0 和 1 來表示二分類,用獨熱編碼來表示多分類。

但顯然,表示目標在圖像中的位置是一個更復雜,需要更多參數的問題。

你可能會想,可不可以在標籤中增加四個參數對,來表示檢測目標的四角?

這的確是一種方法,但實際上,我們使用的是另一種參數量更少且更普適的方法

吳恩達【深度學習工程師】 04.卷積神經網絡 第三週目標檢測 (1)基本的對象檢測算法_特徵點檢測_03


再規範一下:

在目標檢測中,通常使用一個邊界框(Bounding Box) 來描述目標在圖像中的位置與大小。

相比直接記錄四個頂點座標,更常見也更通用的做法是用中心點 + 寬高來表示:

  1. \(b_x\):表示目標邊界框中心點在水平方向上的位置,通常是相對於整張圖像寬度的歸一化座標,取值範圍為 \([0,1]\)。
  2. \(b_y\):表示目標邊界框中心點在垂直方向上的位置,同樣是相對於圖像高度歸一化後的座標。
  3. \(b_w\):表示目標邊界框的寬度,一般以圖像寬度為基準進行歸一化,用來描述目標在水平方向上所佔的比例。
  4. \(b_h\):表示目標邊界框的高度,同樣以圖像高度為基準歸一化,用來描述目標在垂直方向上所佔的比例。

通過這四個參數,模型不僅能夠判斷“是什麼”,還可以同時給出“在什麼位置、佔多大範圍”,從而完成最基本的目標定位任務。

1.3 定位問題的完整樣本標籤

瞭解瞭如何表示檢測目標在圖像中的位置信息後,繼續延續上面的例子,來看看如何完整地表示一個樣本的標籤:

吳恩達【深度學習工程師】 04.卷積神經網絡 第三週目標檢測 (1)基本的對象檢測算法_特徵點檢測_04

同樣再次列舉一下:
單目標檢測的設定下,一個樣本的標籤通常由以下幾部分組成:

  1. \(p_c\):表示當前圖像中是否存在需要檢測的目標,這是一個二值變量,通常取值為 \(0\) 或 \(1\)。
    當 \(p_c = 1\) 時,表示圖像中確實存在目標,此時後續的位置信息和類別信息才是“有效”的;
    當 \(p_c = 0\) 時,表示圖像中不存在目標,其餘參數通常被忽略或置為 0。
  2. \(b_x,b_y,b_h,b_w\) :表示檢測目標的位置信息
  3. \(c_n\):表示目標所屬的類別信息
    在二分類問題中,它可以是一個標量;
    在多分類問題中,通常採用獨熱編碼 的形式,用一個向量來表示目標屬於哪一類。

因此,在單目標檢測任務中,一個完整的標籤可以被表示為:

\[y=(p_c,b_x,b_y,b_w,b_h,c_1,c_2,…,c_n)\]

它同時包含了是否存在目標、目標的位置與尺度,以及目標的類別信息

這樣,我們就在數據層面上為目標檢測問題完成了準備工作。
為了邏輯的完整性,下一步網絡如何學習目標檢測的問題就放在下一篇來展開。
下面我們簡單拓展一下課程裏提到的另一項應用:特徵點檢測。

2.特徵點檢測(Keypoint Detection)

在我們瞭解瞭如何對圖像中的目標進行定位後,結合實際,你會發現在很多實際任務中,我們關注的目標並不是汽車、行人這類需要用邊界框描述的宏觀物體,而是一些更精細、更局部的結構,例如:

  • 人的眼角、瞳孔
  • 人體的關節位置
  • 筆尖的位置
  • 面部輪廓上的關鍵點

這類目標本身幾乎不具備“面積”或“尺寸”概念,用一個邊界框來描述反而顯得冗餘。
在這種情況下,目標往往可以直接用一個二維座標點來表示。

因此,與目標檢測類似,我們同樣可以通過人工標註關鍵點座標,構建訓練樣本,讓神經網絡學習這個關鍵點是否存在,以及如果存在,它在圖像中的具體位置。

從建模角度看,特徵點檢測本質上是一個對連續座標進行預測的迴歸問題

這種任務,就叫特徵點檢測(Keypoint Detection)

來看課程裏這樣一個例子:

吳恩達【深度學習工程師】 04.卷積神經網絡 第三週目標檢測 (1)基本的對象檢測算法_目標檢測_05


我們可以通過檢測得到的特徵點做進一步應用,比如根據面部特徵點分佈判斷人的表情,根據人的關節特徵點位置預測人的動作等等。

3.總結

概念

原理

比喻

圖像分類

通過標籤告訴模型“輸入圖像是什麼”,模型在傳播—對比—修正中學習從圖像到類別的映射關係

像給學生一張照片,並直接告訴他:“這是汽車”

目標定位

在分類的基礎上,進一步通過標籤告訴模型目標在圖像中的什麼位置

不僅説“這是汽車”,還用手指指出“汽車在這裏”

邊界框(Bounding Box)

用一個矩形區域描述目標的位置與大小,統一表示空間信息

在照片上用框把目標圈出來

\(b_x, b_y\)

描述目標中心點在圖像中的相對位置(歸一化座標)

用“地圖座標”標出目標的中心點

\(b_w, b_h\)

描述目標在水平方向和垂直方向所佔的比例

告訴別人這個框“有多寬、多高”

中心點 + 寬高表示法

相比四個角座標,參數更少、形式更統一,便於網絡學習

不報四個角地址,而是説“在市中心,方圓兩公里”

\(p_c\)(目標存在性)

指示圖像中是否存在需要檢測的目標,決定後續標籤是否有效

先確認“房間裏有沒有人”,再討論他站在哪

類別向量 \(c_1,\dots,c_n\)

表示目標屬於哪一類,可用標量或獨熱編碼

給被圈出來的目標貼上“身份標籤”

特徵點檢測

不用邊界框,而是直接預測關鍵點的二維座標

不給人畫框,只標出“眼睛、關節、筆尖的位置”