UnitBox
論文: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個距離作為獨立的變數 使用
損失來最佳化,如圖1,這就反直覺了,因為這4個距離變數是相關的,所以應該聯合最佳化迴歸。為了平衡樣本,DenseBox 在image中crop 出patch(以目標為中心crop出的是positive patch,以隨機scale隨機地crop出的是random patch)並且resize到一個固定大小(240*240),這也一定程度上影響了效率。
這篇文章提出的UnitBox則高效且有效,採用全卷積網路預測目標邊界框和pixel-wise分類得分。具體而言,使用了新型loss函式 IoU loss,增強了預測框與gt box的overlap,聯合迴歸了pixel到框邊界上下左右 4個距離變數,使得box預測更加準確,訓練收斂更快,訓練的目標scale可以變化(不用固定),且目標shape可以任意(不用固定scale和aspect ratio),不需要對image進行resize等處理,使得test過程也很高效。
L2 LOSS
在這裡,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
定義
為當前(i,j) 處的pixel 到 gt box的四個邊的距離top bottom left right,下文為了簡便,省略了座標(i,j),如圖1所示,不加浪線的
則表示 pixel到 predict box的距離。
需要注意,對於不在gt box內的pixel處的
。計算IOU 損失演算法如下,
這個演算法其實是很清晰的,就是 predict box 與 gt box的 IOU,每一點處的 predict box都不同(由此處的
值決定),所以每一點的IOU loss也不同。
因為
其實本質是交叉熵損失,因為可以將 IoU看成是伯努利分佈的隨機變數 x=1的機率,即
,於是隨機變數的交叉熵損失為
,(這裡的公式與原文稍有不同,我基於自己的理解做了調整,當然原文公式和說明我也沒get到點。如有不對還請指教)。
相較於L2損失,IoU損失將bbox作為一個整體去最佳化,並且 IoU損失範圍歸一化為[0,1],所以沒有L2損失中由於box尺寸不同損失懲罰力度也不同的問題。
IOU LOSS層的反向傳播
這一層的輸入是
(4 channel feature map,表示4個距離變數),計算 IoU損失對 x 的梯度為,
(1)
上式中x是指
,梯度的計算最終還是要回到損失對這些變數的求導,分別將(1)式中的兩個梯度項展開,
梯度/求導 計算比較簡單,就不多說。從(1) 式可以理解:
是對預測框面積的正懲罰,
是對predict box與gt box的重疊部分面積的負懲罰,這表示 既希望
足夠大,同時
也不能太大,否則當predict box 包含gt box時,繼續增大predict box面積
,顯然也不合適,所以predict box與 重疊部分 面積相等 時最好(此時
是零向量)。這兩項前面乘上對應的係數則構成梯度,使得迭代最佳化時損失下降最快。
UnitBox網路
如圖2,
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 得分值為
,那麼
這一點的交叉熵損失為
其中
為這一點真實值(位於gt box內為1,否則為0)。
stage5 (conv5) 後面也如confidence預測分支一樣,接3個layers,conv layer的kernel size為512x3x3x4,輸出channel為4,然後跟一個ReLU,使得4個距離變數非負,最後upsample到input image大小 並crop 使得與image 對齊。最終損失為兩個分支的加權平均,當然,最這個最終損失還可以增加 一個 權重引數正則懲罰項
。
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可能就是方便而已。總之,作者說這個定位策略簡單且有效。