物件偵測 (Object Detection)(二)

徹底理解物件偵測的原理

Jack Lin
Coding like coffee
5 min readMay 6, 2019

--

上一篇提到使用傳統的 Sliding windows 會因為需要切出大量的區域並讓每個區域獨立跑過 ConvNet ,造成極高運算成本

而在提到如何解決此問題前,先來看如何將 NN 的全連結層(Fully connected layers)轉換成卷積層(convolutional layers)

Turning FC layer into convolutional layers

  • 假使你的物件偵測的演算法接受 14*14 *3 的圖片(通常不會這麼小)
  • 用16個 5*5 的過濾器(Filter),將 14*14 *3 的圖片轉成 10*10*16
  • 接著用 2*2 的最大池化(Max pooling)縮減到5*5*16
  • 然後接兩個400個單元(Unit)的全連結層(Fully connected layers)
  • 最後我們取消原本用 Softmax 輸出最大機率的類別 y,取而代之的是把 y 看成四個數值,分別對照到四個類別(前篇提到的行人、汽車、機車、背景 )的機率

我們要做的,就是把後面的 FC Layers 轉換成卷積層(convolutional layers),而前面幾層的 ConvNet 架構保持原狀(如上圖第二個網路)

  • 對於第一個 FC Layer ,我們使用400個 5*5的過濾器(Filter),則輸出的維度為 1*1*400,也就是我們不再把這400個當成一堆單元(Unit),而是看成一個 1*1*400 的容積(Volume)

Note : 在意義上,這400個單元每個點都有 5*5*16 的過濾器,也就是說這400 個值每一個代表前一層5*5*16個經過某種線性函數(Linear function)啟動值(Activation)

  • 接著要做下一個卷積層,這裡使用400個 1*1 的過濾器(Filter),則輸出的維度為 1*1*400
  • 最後需要再使用 1*1 的過濾器(Filter),後面再接著 Softmax 輸出1*1*4 的容積(Volume),也就是對應類別的4個機率

接著就可以使用卷積化的方式實作Sliding Windows(Convolutional Implementation of Sliding Windows),解決計算成本的問題

Convolutional Implementation of Sliding Windows

這個方法是基於《Sermanet et al., 2014, OverFeat: Integrated recognition, localization and detection using convolutional networks》這篇論文

假使和上述一樣,使用 Sliding Windows 的 ConvNet 吃的是 14*14*3 的圖片,後面架構也皆相同,最後輸出1*1*4的容積(Volume),而上圖為了方便只畫出2維的圖示

  • 若你的測試集圖為16*16*3(如圖黃色部分),則在原版的 Sliding Windows 會將原圖的藍色區塊餵給 ConvNet 跑過一次,將其分類為 0 或 1
  • 接著用兩個像素(Pixel)的滑步(Stride)向右滑,如上圖綠色的區域重跑一遍 ConvNet,得到分類為 0 或 1
  • 相同的方式跑過紅色區域後,並再進行最後一次(為了簡化圖形最後一次並沒有畫出來)完成共 4次 ConvNet 的計算,最後得到4個分類

而在這 4次 ConvNet 的計算過程中可以發現,其中有很多的運算其實是重複的,而卷積化的 Sliding Windows 就是讓這4次 ConvNet 的正向傳播(Forward propagation)共用很多的運算

所以這卷積化的計算做的就是,與其把圖片的四個區域各自獨立做了共四次正向傳播,還不如把這四個整合成一次的正向傳播(Forward propagation),利用這四塊14*14*3的共同區塊共享大量的運算

我們就可以把一整張圖(如28*28)使用卷積的方式,只要用一次大的 ConvNet 就能預測所有的區域,最後找到汽車的位置

Convolutional Implementation of Sliding Windows

Output accurate bounding boxes

這就是用卷積化的方式來實作 Sliding Windows,讓這整個計算過程變得更加效率,不過這個演算仍有一個弱點,也就是邊界框(Bounding Box)的位置並不會太準確

當使用 Sliding Windows 時,會用預設大小的 window 來跑過圖片的每一個位置,但如下圖所示,每個邊界框可能都無法剛剛好指出汽車的位置

為了要讓邊界框(Bounding Box)預測的位置更準確,有一個在物件偵測(Object detection)相當有名的演算法叫做 - YOLO,下一篇將進一步介紹

References

[1]《Sermanet et al., 2014, OverFeat: Integrated recognition, localization and detection using convolutional networks》

[2] Redmon et al., 2016

[3] Redmon and Farhadi, 2016

[4] Deeplearning.ai

--

--

Jack Lin
Coding like coffee

Sharing the subject of data science and deep learning