論文:UnitBox: An Advanced Object Detection Network

文章簡介部分先回顧了目標檢測的三步驟:1。 region proposals提取,比如Selective Search,EdgeBoxes,或者級聯的上一個stage的檢測器的輸出;2。 region proposals送入CNN網路進行識別和分類;3。 bounding box迴歸對region proposals座標調整。其中第一步是瓶頸所在,限制了定位準確度和計算效率。這是因為在 image 上提取 region proposals往往使用的是 low-level features,這就使得對目標被部分遮擋等不利因素所幹擾,另外一方面,大部分region proposals提取方法基於 image over-segmentation (比如selective search 使用felzenszwalb先進行分割,然後再合併關聯區域生成最終的region proposals)或者 密集 sliding windows,使得計算比較耗時,從而限制了實時檢測應用。為了解決這個問題,faster r-cnn提取了RPN用於自動生成anchor,但是這些anchor使用預定義的固定的scale和aspect ratio,從而難以處理尺寸變化較大的目標,比如不容易檢測小目標。

另一種檢測框架是DenseBox,利用feature map上的所有pixel進行距離迴歸,這裡距離值得是 當前pixel與object candidate的四個邊的距離,可見,feature map應該是4 channel,每個pixel處是一個4-D距離向量,但是DenseBox中 將這4個距離作為獨立的變數 使用

L_2

損失來最佳化,如圖1,這就反直覺了,因為這4個距離變數是相關的,所以應該聯合最佳化迴歸。為了平衡樣本,DenseBox 在image中crop 出patch(以目標為中心crop出的是positive patch,以隨機scale隨機地crop出的是random patch)並且resize到一個固定大小(240*240),這也一定程度上影響了效率。

UnitBox

這篇文章提出的UnitBox則高效且有效,採用全卷積網路預測目標邊界框和pixel-wise分類得分。具體而言,使用了新型loss函式 IoU loss,增強了預測框與gt box的overlap,聯合迴歸了pixel到框邊界上下左右 4個距離變數,使得box預測更加準確,訓練收斂更快,訓練的目標scale可以變化(不用固定),且目標shape可以任意(不用固定scale和aspect ratio),不需要對image進行resize等處理,使得test過程也很高效。

L2 LOSS

\mathcal L(x, \tilde x) = \sum_{i \in \{t,b,l,r\}} (x_i-\tilde x_i)^2 \\

在這裡,L2 損失有兩點不足:1。 四個距離變數是相關的,但是在L2中是作為獨立變數進行最佳化;2。 由於L2損失未歸一化,對於大 bbox與 小 bbox而言,顯然大 bbox中 pixel 的L2損失懲罰更大,拿圖1來看,如果將 gt box和 predict box均相同的縮小(保持相對位置不變),那麼紅點的L2損失將變小,這導致CNN網路將專注於最佳化大目標而忽略小目標(因為損失小,反饋不足去糾正目標定位),DenseBox中將input patch resize到一個固定的值 來解決這個問題,但是這導致計算效率下降。本文引入 IOU loss來解決這個問題。

IOU LOSS

定義

\tilde { \bold x}_{i,j} = (\tilde x_{t_{i,j}}, \tilde x_{b_{i,j}}, \tilde x_{l_{i,j}}, \tilde x_{r_{i,j}}) \\

為當前(i,j) 處的pixel 到 gt box的四個邊的距離top bottom left right,下文為了簡便,省略了座標(i,j),如圖1所示,不加浪線的

\mathbb x

則表示 pixel到 predict box的距離。

需要注意,對於不在gt box內的pixel處的

\tilde {\mathbf x}_{i,j} = \mathbf 0

。計算IOU 損失演算法如下,

UnitBox

這個演算法其實是很清晰的,就是 predict box 與 gt box的 IOU,每一點處的 predict box都不同(由此處的

\mathbf x_{i,j}

值決定),所以每一點的IOU loss也不同。

因為

0\le IoU \le1, \ \mathcal L=- \log (IoU)

其實本質是交叉熵損失,因為可以將 IoU看成是伯努利分佈的隨機變數 x=1的機率,即

p_1=p(x=1)=IoU, \ p_0= p(x=0)=1-IoU

,於是隨機變數的交叉熵損失為

\mathcal L = -\sum t_i p(x=t_i)=-t_1 \log(p_1) - (1-t_1) \log (1-p_1)=-\log (IoU)

,(這裡的公式與原文稍有不同,我基於自己的理解做了調整,當然原文公式和說明我也沒get到點。如有不對還請指教)。

相較於L2損失,IoU損失將bbox作為一個整體去最佳化,並且 IoU損失範圍歸一化為[0,1],所以沒有L2損失中由於box尺寸不同損失懲罰力度也不同的問題。

IOU LOSS層的反向傳播

這一層的輸入是

\mathbf x

(4 channel feature map,表示4個距離變數),計算 IoU損失對 x 的梯度為,

\begin {aligned} \nabla_x {\mathcal L} &=- \frac 1 {IoU} \nabla_x(IoU) \\ &=-\frac U I \frac {U \nabla_xI - I \nabla_xU} {U^2} \\ &=\frac {I (\nabla_x X-\nabla_x I)-U \nabla_xI} {UI} \\&=\frac 1{U} \nabla_xX- \frac {U+I} {UI} \nabla_x I \end{aligned}

(1)

上式中x是指

x_t, x_b, x_l, x_r

,梯度的計算最終還是要回到損失對這些變數的求導,分別將(1)式中的兩個梯度項展開,

\frac {\partial X} {\partial x_t (\mathbf {or} \ \partial x_b)} = x_l +x_r \\ \frac {\partial X} {\partial x_l (\mathbf {or} \ \partial x_r)} = x_t +x_t \\ \frac {\partial I} {\partial x_t (\mathbf {or} \ \partial x_b)} = \begin {cases} I_w, & x_t < \tilde x_t \ (\mathbf {or} \ x_b < \tilde x_b)  \\ 0, & \text{otherwise}\end{cases} \\ \frac {\partial X} {\partial x_l (\mathbf {or} \ \partial x_r)}= \begin {cases} I_h, & x_l < \tilde x_l \ (\mathbf {or} \ x_r < \tilde x_r)  \\ 0, & \text{otherwise}\end{cases}

梯度/求導 計算比較簡單,就不多說。從(1) 式可以理解:

\nabla_x X

是對預測框面積的正懲罰,

\nabla_x I

是對predict box與gt box的重疊部分面積的負懲罰,這表示 既希望

I

足夠大,同時

X

也不能太大,否則當predict box 包含gt box時,繼續增大predict box面積

X

,顯然也不合適,所以predict box與 重疊部分 面積相等 時最好(此時

\nabla_{\mathbf x} {\mathcal L}=\mathbf 0

是零向量)。這兩項前面乘上對應的係數則構成梯度,使得迭代最佳化時損失下降最快。

UnitBox網路

如圖2,

UnitBox

backbone使用VGG16,移除了末尾的fc 層,從stage4(conv4)的輸出分出一支,經過3 layers(conv,up-sample和crop)得到 1-channel的feature map預測confidence,因為這裡是人臉檢測,所以是1-channel,feature map上每一點預測是否位於 object內,這3 layers中,conv kernel size為512x3x3x1(一個filter,大小為3x3,channel為512),conv的輸出channel為1,up-sample使用線性插值將feature map還原到 input image大小,crop layer用於將feature map與image對齊。得到這個1-channel的feature map後使用 sigmoid cross-entropy loss迴歸 confidence heatmap。By the way,recall一下 sigmoid 交叉熵損失,設feature map上一點confidence 得分值為

s_i

,那麼

f(s_i)=\frac 1 {1+e^{s_i}}

這一點的交叉熵損失為

\mathcal L_i = -t_i \log f(s_i)

其中

t_i

為這一點真實值(位於gt box內為1,否則為0)。

stage5 (conv5) 後面也如confidence預測分支一樣,接3個layers,conv layer的kernel size為512x3x3x4,輸出channel為4,然後跟一個ReLU,使得4個距離變數非負,最後upsample到input image大小 並crop 使得與image 對齊。最終損失為兩個分支的加權平均,當然,最這個最終損失還可以增加 一個 權重引數正則懲罰項

\lambda ||\mathbf w||_2^2

confidence預測分支接在stage4之後,bbox 座標迴歸預測分支接在stage5之後,作者認為bbox分支需要更大的感受野(RF)。直覺上來講,bounding box可以從confidence heatmap上進行預測,我理解是 confidence heatmap 已經pixel-wise 判斷是否是object,可以 delineate 出object的shape,bbox 分支看作一個自底向上的策略,從confidence heatmap上進一步抽象出bounding box。相較於DenseBox,UnitBox更加高效,因為預測分支僅增加了一個conv layer,而DenseBox中預測分支增加了三個conv layer。參考圖2,bbox預測分支和confidence預測分支共享了底層了一些layers(stage1-4),當然也可以不共享這些layers,分開訓練這兩個分支來提高正確率。

上面UnitBox網路設計用於人臉檢測,所以其實是一個二分類(人臉和bg)問題,作者實驗也確實使用的人臉檢測資料集。為了生成人臉的bbox,首先對confidence heatmap使用一個閾值去匹配出一個個橢圓,然後這個匹配出的橢圓是粗糙的,所以進一步地,選擇這些橢圓的中心,然後從bbox heatmaps上根據4個距離值生成bbox。怎麼在confidence heatmap上把人臉fit進橢圓,作者沒有詳細說明,

我理解的是

:預定義好一個形狀的橢圓,然後在confidence heatmap 上 sliding這個橢圓,只要橢圓內的任一點的confidence 值均大於一個 閾值,就認為匹配成功,當然這個橢圓不能太大。因為如果橢圓包含於人臉內(很可能沒有完全覆蓋人臉,且橢圓本身也不一定就位於人臉中間,即橢圓中心與人臉中心存在偏差)時,比較容易匹配成功,所以匹配出來的橢圓自然也是粗糙的,不過沒有完全覆蓋人臉沒關係,此時根據橢圓中心點 bbox heatmap來生成人臉predict box,理論上,如果預測的足夠好,使用橢圓內任意一點的4個距離來生成predict box均可,故,預定義的橢圓形狀不需要太講究(是說方法robust?),而使用橢圓中心點來預測bbox可能就是方便而已。總之,作者說這個定位策略簡單且有效。