物件偵測 (Object Detection)(二)
徹底理解物件偵測的原理
上一篇提到使用傳統的 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 就能預測所有的區域,最後找到汽車的位置
Output accurate bounding boxes
這就是用卷積化的方式來實作 Sliding Windows,讓這整個計算過程變得更加效率,不過這個演算仍有一個弱點,也就是邊界框(Bounding Box)的位置並不會太準確
當使用 Sliding Windows 時,會用預設大小的 window 來跑過圖片的每一個位置,但如下圖所示,每個邊界框可能都無法剛剛好指出汽車的位置
為了要讓邊界框(Bounding Box)預測的位置更準確,有一個在物件偵測(Object detection)相當有名的演算法叫做 - YOLO,下一篇將進一步介紹
References
[4] Deeplearning.ai