物件偵測 (Object Detection)(一)

徹底理解物件偵測的原理

Jack Lin
Coding like coffee
6 min readMay 1, 2019

--

What are localization and detection ?

  • 在初學 CNN 的應用中,最常見的就是圖片分類(Image classification),如下方中左邊的圖能夠被辨識出類別為 "車子",這就是分類(Classification)
  • 而之後你要做的是讓你的 NN (Neural Network) 解決另外一個問題:分類且定位(Classification with localization),意思是你不但要標示出這是一台車,而且還需要放一個邊界框(bounding box),把車子所在的地方框出來,如下方中間的圖
  • 更後面你得面對的圖片可能會有多個物件,如汽車 、機車 、公車 、路人等等,必須全部偵測(Detection)出來並且定位(localization)出它們,如下方右邊的圖

Classification with localization

假使我們所做的為自駕車(Self-driving car)的應用,而在一般的圖片分類(Image classification)中,你可能要辨識的類別分別為

  1. pedestrian
  2. car
  3. motorcycle
  4. background

而除了經由 ConvNet 輸出預測的類別外,加入定位(Localization)後就必須包含額外四個數值 bxbybhbw 來表示邊界框(bounding box),這樣一來就能利用監督式學習(Supervised Learning)來讓你的演算法輸出預測的類別以及四個參數,告訴你偵測到的物件的邊界框在哪裡

  • 定義圖片的左上的座標為(0,0),右下角為(1,1)
  • bx 與 by 為邊界框的中心位置,以基準點來看分別落在整張圖中的約50%與60%的位置
  • bh 與 bw 分別為邊界框,分別佔整張圖片高度約40%與寬度約60%

Defining the target label y

接著,我們需定義目標標籤,在分類且定位(Classification with localization)中我們假設圖片都只有一個物件(Object),也就是上圖四種物件中至多出現一種

Defining the target label y

假設有一張作為訓練資料的汽車圖做為輸入 x,則 label y 的

  • 第一維 Pc 為是否包含任何物件 :是→ 1 ; 不是→ 0
  • Pc 為 0,則其他維度皆為 "?" (don’t cares)
  • c1、c2、c3 分別為三個類別(Pc 為 0 代表為 background)

如此以來組成的 (X,Y) 就成為了你的訓練集,並選擇你所定義的損失函數(Loss function)訓練 NN (Neural Network),使你的 NN 輸出預測的類別與額外四個數字(bx、by、bh、bw)來指定邊界框(bounding box)完成定位(Localization)

Landmark detection

現在知道怎麼讓 NN 輸出4個數字來指定一個物件的邊界框(bounding box)來完成定位(Localization)後,在對於更普遍的情況,我們可以讓 NN 輸出圖片中較為重要的點座標 (x,y),也被稱作特徵點(Landmark),作為 NN 要辨識的東西

Landmark detection

假使你需要做一個可以輸出雙眼四個眼角位置的應用,你必須在左眼的左眼角標上座標 (l1x , l1y) 右眼角標上 (l2x , l2y) ,右眼以此類推,則可以修改NN 的最後一層讓他輸出4個眼角的位置;你也可以輸出嘴巴鼻子輪廓等等的座標點(特徵點)來幫助你辨認是不是人臉以及這個人的表情是開心還是不開心,又或者用32個座標來表示一個人的姿勢等等,不過這些前提是必須擁有許多經由手動標記完整特徵點的圖片來幫助我們訓練 NN

Car Detection

在知道了怎麼做物件定位(Object localization)特徵點偵測(Landmark detection)後,就可以用傳統的方式進行物件偵測

img from Andrew Ng

首先我們得先有一個標記好的資料集 x 和 y ,含有準確切好的車子圖片與沒有車的圖片,接著你就能訓練一個 ConvNet ,輸入一張切好的圖片,這個 ConvNet 就能夠輸出 y (1或0)代表是車不是車

Sliding windows detection

img from here
Sliding windows detection
  • 首先你先挑選一個視窗(window)的大小,把這個視窗所包含的圖片區域輸入到 ConvNet ,則 ConvNet 會預測這個視窗的區域是否有車,接著你會根據某個步伐滑動視窗一直重複此動作,直到滑過這張圖片的每個位置,將每個位置分類為 0 或 1,這個過程稱為一次Sliding window 。
  • 接著用大一點的視窗(window)重複一遍這樣的動作,而這個視窗大小必須是 ConvNet 能接受的大小,再用更大的視窗(window)重複一樣的動作,然後在有車的地方輸出 1

⊙ 因為要從圖片切出非常多的區域,每個區域都要獨立跑過 ConvNet,如果你滑的步伐較大(粗略),可以減少跑過 ConvNet 的視窗數目,但是效果可能會很,但若滑的步伐較小(細膩),則會有大量的視窗數目要通過 ConvNet,運算成本就會非常

⊙ 所以在 NN 興起前,大家普遍都用簡單的線性回歸運用在手動設計的特徵上進行目標檢測,因為只是一個線性函數,所以做 Sliding windows 是可行的,但是使用 ConvNet 後 ,跑一次分類要花更多的時間,這樣 Sliding windows 慢到無法接受,而且你也必須使用步伐較小(細膩)的步長,否則你無法準確定位圖片中的物件

⊙ 而這個運算成本的問題在下一篇文章會提到一個有效的方法來解決

References

[1] Redmon et al., 2016

[2] Redmon and Farhadi, 2016

[3] Deeplearning.ai

--

--

Jack Lin
Coding like coffee

Sharing the subject of data science and deep learning