finding tiny face心得筆記

花了幾天時間專門對這篇論文做了研究,感覺很有收穫。這篇文章也真的是乾貨滿滿呀。

作者探索了尋找小臉的三個方面:1. 尺度不變性的問題;2. 圖像分辨率的問題;3. 基於周圍內容的推斷問題。

基於此,作者做了三個方面的嘗試:1.對於不同的scale,訓練不同的detector。 detector使用了multi-task fashion,即使用同一個網絡的不同層的特徵。2. 作者用實驗說明了小臉周圍的內容對檢測小臉是非常重要的。3. 通過上採樣、下采樣圖像並作爲輸入,來使用與訓練的神經網絡做小臉識別。

實驗部分:作者使用了不同的策略來構建滑動窗口探測器來探測固定大小的人臉。將固定大小的物體檢測作爲一個二值熱力圖預測問題,所預測熱力圖在(x,y)的值爲一個二值的數(0或者1)來標明這個框裏是否有個人臉。這裏借用了fully convolutional neural network的網絡結構,即使用中間得到的特徵圖反捲積出一個和原圖一樣的熱力圖。這裏有個問題,熱力圖是怎麼得到的?是和RPN一樣設置正例和負例的還是說直接將ground truth的框中心作爲1,其他的地方都是0?文中似乎沒有交代。作者使用了不同res block的最後一層來重構這個heat map。也使用了不同的res block的feature map做完上採樣以後再加起來,做預測的實驗。吐槽一下論文的寫作風格,省略的東西比較多,一些地方真的是含糊不清啊。。。比如圖中的給出的數字沒有說明是什麼數值,是預測的heatmap的數值?還是探測準確度?以下暫時以檢測精度來稱呼這個模糊的指標吧。

第一個實驗的最終結果顯示使用更多的內容(就是將不同層的feature map做上採樣然後加起來)會有效提高小臉的檢測精度,儘管疊加過多的feature map會最終使得檢測精度下降。這一結論個人感覺比較trivial和reasonable,已經有很多的work證明這個問題。比較有意思的結論是對於tiny face來說,使用multi scale feature map的疊加帶來的準確度提升遠遠大於 large face.這也是證明作者觀點的一個有力支撐。作者的這個實驗表明可以構建一個multi task templates的探測器,這些探測器使用了不同大小的feature map, 但是有着相同的感受野。這個multi task template可以簡單的由一個multi-channel heatmap prediction來完成。(即特定的channel和特徵像素位置有不同的binary loss)。作者將這個由不同層的feature map結合起來的東西叫 foveal descriptor(中心凹描述符)。

第二個實驗爲探索多大的檢測窗口爲最優窗口?理論上,可以使用中等尺度的template(比如50x40)來檢測經過上採樣後的小臉(25x20經過上採樣後就爲50x40)。實驗上,作者也是非常吃驚的發現,這個猜想是正確的。那麼對應大臉而言,將一箇中等尺度的模板(125x100)應用在找經過下采樣的大臉上(250x200下采樣後成爲125x100)效果會怎麼樣呢?再次的,作者非常驚奇的發現,準確率從89%到94%。作者尋找後發現答案可能在於數據集不同size的人臉的不均衡性。小臉的比例大大超出大臉的比例。這個解釋可以說明大臉下采樣後被準確率更高,但是卻無法解釋小臉上採樣後檢測率更高。作者又從pre-trained model身上找到了可能的線索。在imagenet數據集中,80%的training example都是中等大小的,高度在40到140像素之間。由於我們使用了這個預訓練的模型做微調,而這個模型又對這個像素的物體有比較強烈的bias,因此最終的結果就變成了這個樣子。(真的是這樣嗎?感覺聽起來很有道理的樣子。如果真的是這樣的話,使用pre train model 是不是不再是一個最好的選擇?)

由上述兩個實驗,作者引出了他的模型。作者想使用multi task learning 來暴力訓練幾個不同的resolution的templates,然後貪婪的選擇一個最好的。作者使用了t(a,b,c)來表示一個模板。這個模板被用來在分辨率爲c的圖像上探測大小爲(a/c,b/c)的物體。比如,可以使用(250,200,1)和(125,100,0.5)兩個模板來尋找250x200的臉。給定訓練數據集後和標記好的bounding box後,我們可以定義一系列的標準bounding box 的形狀來大概的覆蓋bounding box的形狀空間。論文中使用了Jaccard 距離來定義(也就是1減去交併比)。

現在,對於一個每一個目標物體的尺寸來說,我們想問:什麼樣的c會最大化t(a,b,c)的模板的表現?爲了回答這個問題,對於每一個固定的尺寸,作者簡單的訓練了幾個不同的 multi-task 檢測器,然後從中取最好的那個檢測器。有了這些最優的檢測器,作者就可以使用不同分辨率的圖像來重新訓練一個multi task model。有趣的是最終的統計結果顯示,使用1分辨率的檢測器對應的物體尺寸正好是imagenet對應的40到140的尺寸。

在得到最終的模型後,作者又問了一個問題,我們最終得到了一系列不同的檢測器,這些檢測器有冗餘嗎?比如,我有了一個(64,50,1)的檢測器,還需要另外一個(62,50,2)的檢測器嗎?答案是肯定的,我們可以通過剪枝來去除這些冗餘的檢測器。因爲每個圖像都會進入網絡三次,即上採樣一次,下采樣一次,原圖一次,本質上,我們可以將這些檢測器削減到一個小的集合裏(比如40-140個像素的高度)。文中貼出的數據顯示,經過剪枝處理後,模型的表現甚至有了略微的提升。

最後作者詳細說明了他的網絡結構。首先訓練了binary multi channel heatmap predictors來檢測一系列的人臉(高度從40-140px)。然後使用coarse圖像金字塔來找更大和更小的人臉(包括兩倍上採樣和兩倍下采樣)。作者測試了ResNet101,ResNet50和VGG16來當做基準檢測器。

下邊是一些訓練細節。給定了標註好的圖像和template之後,我們定義正例爲IOU大於0.7的,負例爲IOU小於0.3的。其他的位置全部被0填充。這種設定會導致對於每個大的物體來說,正例的數量會遠遠多於負例的數量。爲了解決這個問題,作者使用了平衡採樣和難例挖掘的技巧來減輕這種影響。做完這些後,作者又用線性迴歸器對bounding box做了個微調,用標準非極大值抑制(閾值0.3)來消減框的數量。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章