繼上一篇文章Object Detection : One-stage Detector YOLO,我們可以窺探到迴歸(regression)、端到端(end-to-end)思想在目標檢測問題上的應用。下面開始單階段目標檢測器系列的第二篇,DenseBox。
YOLO -> DenseBox -> SSD -> YOLO v2 -> Retina -> YOLO v3 -> CornerNet -> CenterNet -> AlignDet
DenseBox: Unifying Landmark Localization with
End to End Object Detection
論文地址:1509.04874v3
1. 背景介紹
在卷積神經網絡(CNN)興起之前,大多模型是基於滑動窗口法(sliding-window based method)進行目標檢測:首先提取圖片不同尺寸(scales),不同位置(locations)的手工特徵(handcrafted features);然後有些模型可能會做一些幾何限制(geometric constraints),比如人的頭、手臂、軀幹、腿;最後用分類器(classifier)對這些特徵進行分類。CNN興起之後,人們使用全卷積網絡(FCN)近似(approximate)滑動窗口法,這種方法使得模型能夠端到端(end-to-end)訓練,而且從零學習參數和特徵提取(scratch)的方式大大提升了目標檢測器的性能。
如上圖,將輸入的16x16x3的圖片經過多層卷積操作(convolution),得到2x2x4的輸出。整個過程相當於在原圖上做14x14的窗口滑動,且步長爲2,產生四個候選框(proposals), 輸出的每個像素(pixel)對應於一個候選框。這就是全卷積網絡近似滑動窗口法的過程描述。(ps:圖中的FC不是全連接,依然是卷積操作)
不過,這樣固定大小與步長的窗口是遠遠不夠的 (可以瞭解一波overfeat)。對此YOLO就淘汰了滑動窗口法:它將原始圖片分割成互不重合的網格單元(cell),每個網格單元負責檢測落入其中的目標,通過卷積產生的特徵圖的各元素對應於原圖的每個網格單元,然後用特徵圖各元素的值去定位中心(center)落在對應網格單元內的目標。這也不失爲一種優雅的解決方式。
與YOLO相似,DenseBox也是全卷積網絡,但仍遵循滑動窗口的特性(sliding window fashion)。它致力於小目標(small objects)以及遮擋檢測(occlusion),比如人臉(human face),遠處的汽車(far-away car)。
雖然兩階段模型在精度上較單階段檢測器有更大的優勢,但由於R-CNN兩階段模型產生區域提議(proposals)分辨率較低(low resolution),同時缺乏上下文信息(context),直接或間接影響了分類的性能。所以DenseBox朝着小目標突破也是有一定的前瞻性的。
所以作者的貢獻在於:(1) 設計全卷積網絡實現小目標及遮擋目標的高精度檢測;(2) 使用多任務訓練(multi-task)進一步提升檢測性能,也就是添加了標識點定位(landmark localization)任務分支。
2. 模型介紹
由上圖可以瞭解到DenseBox的檢測流程:首先是輸入多個尺寸的同一張圖片,即圖像金字塔(image pyramid); 然後經過卷積&池化操作,再進行上採樣,融合淺層與深層的特徵再進行卷積操作,將得到的結果轉化爲檢測框,並對檢測框進行非極大值抑制(non-maximum supression, NMS),得到最終的結果。
2.1 模型的輸入&輸出
接下來定義一些符號。假如輸入的圖片大小爲, 則模型的最終輸出是,這意味着每4個像素點生成一個檢測框,這樣一來可以產生很密集的檢測框,故命名爲DenseBox。定義目標檢測框的左上角(left top)和右下角(right bottom)爲 , ,最終輸出的每個像素點描述了檢測框的信息,用向量表示,其中是檢測框中包含目標的置信度(confidence score),,, ,預測的檢測框相對於輸出特徵圖各個位置的距離(原文鏈接1)。所以可以根據最終模型的輸出,將其轉化爲檢測框信息(confidence, xmin, ymin, xmax, ymax)。轉化後得到的檢測框肯定有冗餘情況,所以需要對置信度超過設定閾值的檢測框做非極大值抑制進行篩選,以得到最終的檢測結果。
原文鏈接1: ,, , denote the distance between output pixel location with the boundary of target bounding box.
2.2 模型真值生成 (Ground Truth Generation)
DenseBox訓練的輸入並不是完整的圖片,而是從原圖中切割出來的包含人臉以及足夠(sufficient)背景信息的圖片塊(patches),這是因爲引入全圖會導致卷積操作在背景上消耗過多的計算資源。
對此,訓練數據是做過處理的。爲了使模型對任意輸入有更好的預測,需要在測試時需要採用圖像金字塔作爲輸入,以彌補這種訓練方式帶來的“後遺症”。(原文鏈接2)
原文鏈接2: The RPN is trained on multi-scale objects while the DenseBox presented in this paper is trained on one scale with jitter-augmentation, which means our method need to evaluate feature at multiple scale.
作者覺得它的訓練方式與分割的思想有點相似(a segmentation-like way),結合下圖的可視化可能會更好理解一些。首先,將這些圖片塊縮放(resize)至240x240,人臉處於圖片塊的中間(center),高度(height)大約是50像素(pixels)。由於下采樣的比例(ratio)是4,所以真值的規模是。其中,第一個channel是置信度的真值,正樣本區域(positive labeled region)是一個半徑(radius)爲的實心圓(filled circle),該圓的半徑與檢測框的大小成比例,比例(scaling factor)爲0.3,而圓心位於人臉檢測框的中心,即圓內區域標註爲正,圓外區域標註爲負。這個實心圓的意義是:圓內像素的感受野(receptive field)包含一定大小、居中的目標。剩餘的四通道則是檢測框與輸出各位置的距離,即五通道的像素點(5-channel pixel)代表一個檢測框。
需要注意的是當多張人臉出現在一個圖片塊中時,與居中圖片塊的人臉(中心)相距一定範圍(scale range)的其它人臉可以標註爲正樣本,該範圍定義爲0.8~1.25(與中心人臉檢測框尺寸的倍數關係),在範圍外的其它人臉定義爲負樣本(原文鏈接2)。
原文鏈接3: Note that if multiple faces occur in one patch, we keep those faces as positive if they fall in a scale range(e.g. 0.8 to 1.25 in our setting) relative to the face in patch center. Other faces are treated as negative samples/
2.3 模型設計 (Model Design)
上圖爲DenseBox模型的簡易設計。該模型一共有16個卷積層:前面的12個卷積層由ImageNet預訓練的VGG-19進行初始化,主要進行特徵提取;後面的4個卷積層使用xavier的初始化方式【補充1】 ,分爲兩組,一組用於分類,得到通道數爲1的輸出,將其作爲分類的分數(class score map),另外一組用於檢測框的迴歸,得到通道數爲4的輸出,將其作爲預測邊框的相對位置(relative position of bounding boxes)。這兩組的最後一層1x1卷積扮演着全連接層(fully connected layer)的角色。
補充1:
神經網絡中激活值的方差是逐層遞減的,這導致反向傳播中的梯度也逐層遞減。要解決梯度消失,就要避免激活值方差的衰減,最理想的情況是,每層的輸出值(激活值)保持高斯分佈。(ps:所以後來也就有了Batch Normalization)
一般初始化:均值爲0,方差爲1的高斯分佈
Xavier初始化:一般初始化後乘以rescale係數 ,n爲輸入參數的個數
Kaiming初始化:一般初始化後乘以rescale係數
參考鏈接:一文搞懂深度網絡初始化
從圖中還可以觀察到conv3_4與上採樣後的conv4_4的特徵融合(multi-level feature fusion),上採樣採取的是雙線性插值。淺層特徵(low-level feature)或者局部特徵(local feature)能夠提供具有判別力的外貌特徵(discriminative appearance part),而深層特徵(high-level feature)或全局特徵(global feature)或目標級特徵(object-level feature)有更大的感受野,可以提供一些全局信息(global textures and context)。
2.4 多任務訓練 (Multi-task Training)
DenseBox的簡易設計有兩個分支(sibling output branches)。第一個分支輸出的是包含目標的置信度,其對應的真值標籤爲,所以分類的損失函數(classification loss)可以定義爲:
作者在人臉以及車輛檢測兩個任務都採用了L2 損失,沒有嘗試鉸鏈損失函數(hinge loss)【補充2】或交叉熵損失函數(cross entropy)。
補充2:
Hinge Loss是機器學習領域中的一種損失函數,可用於“最大間隔(max-margin)”分類,其最著名的應用是作爲SVM的目標函數。
(1)在二分類的情況下,公式:。
其中,y是預測值(-1到1之間),t爲目標值(1或 -1)。其含義爲,y的值在 -1到1之間即可,並不鼓勵 |y|>1,即讓某個樣本能夠正確分類就可以了,不鼓勵分類器過度自信,當樣本與分割線的距離超過1時並不會有任何獎勵。目的在於使分類器更專注於整體的分類誤差。
(2)在多分類的情況下,採用變式:。
其中,y是正確預測的得分,y′是錯誤預測的得分,兩者的差值可用來表示兩種預測結果的相似關係,margin是一個由自己指定的安全係數。我們希望正確預測的得分高於錯誤預測的得分,且高出一個邊界值 margin,換句話說,y越高越好,y′ 越低越好,(y–y′)越大越好,(y′–y)越小越好,但二者得分之差最多爲margin就足夠了,差距更大並不會有任何獎勵。這樣設計的目的在於,對單個樣本正確分類只要有margin的把握就足夠了,更大的把握則不必要,過分注重單個樣本的分類效果反而有可能使整體的分類效果變壞。分類器應該更加專注於整體的分類誤差。
參考鏈接:理解Hinge Loss
第二個分支輸出的檢測框迴歸係數偏移,其對應的真值標籤爲,所以檢測框迴歸損失函數定義爲:
(ps: 原論文這部分公式有點錯誤,我根據自己理解做了訂正)
2.5 樣本平衡 (Balance Sampling)
訓練的過程中,如果在一個參數更新週期(mini-batch)中使用所有負樣本(negative samples),它們很有可能會主導(dominate)梯度使預測的結果產生偏離(bias prediction)。還有,對於一些處於臨界區域的樣本(lying in the margin of positive and negative region),如果對這些樣本進行懲罰(penalize),也很有可能會導致檢測器的性能下降。若能平衡正負樣本比例,充分挖掘臨界樣本,一定程度上是可以提升檢測器的性能表現。
對於臨界樣本,論文中並不考慮去挖掘它的價值,而是通過設定一個忽視灰域(Ignoring Gray Zone),位於該區域的樣本損失的權重(loss weight)應當設置爲0。區域的標識實用實現。對於輸出空間中(output coordinate space)帶有負標籤的像素點,如果在以該像素點爲圓心,半徑爲的區域內包含帶有正標籤的像素,則標記爲需要忽視的負樣本,記。
對於負樣本中的難例(hard negative examples),論文進行了充分的挖掘,這樣做可以得到預測更爲魯棒,噪聲更少(原文鏈接3)。論文使用的是在線(online)的難例挖掘:在前傳階段,對負樣本的損失按照降序排列,取前1%作爲難例(hard-negative)。在訓練的過程中,作者保留了所有正樣本,並保持正負樣本比例爲1:1,而且,負樣本中,難例樣本佔到一半,剩餘一半的從非難例樣本中隨機選出。爲實現方便,對被選擇的樣本進行標識,記。
原文鏈接4: After negative mining, the badly predicted samples are very likely to be selected, so that gradient descent learning on those samples leads more robust prediction with less noise.
作者對以上兩種方式(忽視灰域、難例挖掘)進一步封裝,使用Mask來決定確定損失權重是否爲0:
結合該Mask,可以得到多任務損失函數(multi-task loss):
其中,是網絡參數,是艾佛森括號函數(Iverson bracket function),是用於平衡分類與迴歸的損失,實驗中設置爲3。作者在實驗中將通過除以標準目標高度(50/4)進行規範化(normalize)。
在訓練的過程中,論文還用了其它騷操作(tricks)。論文中定義正樣本圖片塊(positive patch)爲包含一定尺度的居中目標,該圖像塊中負樣本圍繞着正樣本。爲了充分利用數據集中的負樣本,論文采用了隨機截取(random crop)的方式,從訓練圖片中隨機截取圖片塊並縮放到於正樣本圖片塊同樣尺寸並加入到模型訓練中。這兩種類型的樣本比例是1:1。不僅如此,作者對每一個輸入的圖像塊做隨機抖動(jitter),即左右反轉(left-right flip),平移25像素點(transition shift of 25 pixels),尺度變化(scale deformation from [0.8, 1.25])。
訓練細節:作者採用小批量隨機梯度下降(mini-batch SGD)訓練,批量大小(batch size)設置爲10。損失與輸出梯度都需要除以參與貢獻的像素點數量(原文鏈接4)。全局學習率(learning rate)從0.001開始,然後每隔10000次迭代以0.1倍的速度衰減。動量(momentum)設置爲0.9,權重衰減因子(weight decay factor)設置爲0.0005。
原文鏈接5: The loss and output gradients must be scaled by the number of contributing pixels, so that both loss and output gradients are comparable.
2.6 使用關鍵點定位改進模型 (Refine with Landmark Localization)
從上圖可以清晰的看到,作者將關鍵點定位的引入用在了兩個方面:(1) 加入了關鍵點定位新分支,使用多任務訓練的方式優化模型;(2)融合分類任務的分數(classification score map)與關鍵點定位任務的輸出 (landmark localization maps/ heatmaps)進行卷積挖掘(具體原因見原文鏈接5),進一步改進檢測結果。以上僅需通過簡單的堆疊卷積層實現(原文鏈接6)。
原文鏈接6: An appropriate solution could be using high-level spatial model to learn the constraints of landmark confidence and bounding box score, to further increase the performance of detections.
原文鏈接7: In our implementation, we use convolutions with ReLU activation to approximate the spatial model.
如果有N個關鍵點,關鍵點定位分支就輸出N個響應圖(response map),響應圖上的每個像素代表關鍵點在該位置的置信度。該任務的真值產生類似於檢測任務:對於第i個實例第k個關鍵點,其真值對應到第k個響應圖,正標籤區域是一個半徑爲1的實心圓,圓心的感受野包含該關鍵點。該實心圓的半徑要相對小,否則會影響準確率(accuracy)。該任務也採用了L2損失函數,同時採用了上文提到的難例挖掘以及忽視灰域。
加入關鍵點定位任務後,損失函數如下:
其中,爲前文的損失函數,爲關鍵點定位損失函數,爲改進分支(refine branch)的損失函數,與用於平衡着三個任務的損失,在實驗中分別賦值爲1,0.5。
3. 實驗部分
作者沒有在主流的通用目標檢測數據集上驗證模型的性能,而是在MALF(Multi-Attribute Labelled Faces) 與 KITTI car detection 數據集上進行驗證。
KITTI car detection的驗證度量(evaluation metric)與通用目標檢測任務不同,KITTI要求與真陽性(True Positive)有70%的交疊,而其它任務一般只要求50%。所以在非極大值抑制閾值設置上,KITTI任務設置爲0.75,MALF上設置爲0.5。
具體實驗設計細節見原論文,這裏就不再說了~
從實驗可以看出,DenseBoxEnsemble > DenseBoxLandmark > DenseBoxNoLandmark,且DenseBoxEnsemble達到了SOTA(state-of-the-art)。DenseBoxEnsemble整合了10個來自不同batch的DenseBoxLandmark。
由上圖結果發現,加入關鍵點標註任務在KITTI上與MALF相比並沒有得到太大的性能增益,這可能是因爲對於汽車的關鍵點標註不夠,導致該分支的增益有限。
4. 總結
DenseBox在人臉與汽車的檢測上取得了很好的性能,然而其最大的侷限在於速度,尤其是輸入圖像金字塔這個操作非常耗時。作者稱後續DenseBox2解決了這個問題,我找個時間再分享一下它們的後續工作!