《learn to count everything》論文閱讀
模式識別這門課最後選了這篇論文匯報,記錄一下吧。
參考資料:
【論文解讀】CVPR2021 | FamNet:密集場景計數統計實戰 Learning To Count Everything(影像處理|計算機視覺|人工智慧)_嗶哩嗶哩_bilibili
CVPR 2021 | FamNet | Learning To Count Everything - 知乎 (zhihu.com)
本篇論文完成了小樣本新類別密集計數任務,給出少量的樣本標籤即可,是一種半監督的任務。Few-Shot:只給出少量的標籤,讓模型自己學習,讓模型的通用性更強。在本文中,few-shot實現的是:輸入為一張影像以及一些標註資訊,這些標註資訊是少量的目標物體樣例,使用方框標註。輸出是一張“密度圖”,預測和原圖同位置的地方是否有目標。最後對密度圖做一個求和操作。
1.本文創新點:
- 將計數看成是few-shot迴歸任務。
- 構建了一種新的網路結構FamNet 少樣本適應和匹配性網路。
- 在測試時採用了一種新的自適應方案,進一步提高了FamNet的效能。
- 提供了一個新的資料集Few-Shot Counting-147(FSC-147)。
2.主要結構
- Feature Extraction Module:特徵提取模組。使用ImageNet預訓練的網路進行特徵提取。多由預先訓練好的ResNet-50骨幹網的前四個塊組成(這些塊的引數在訓練期間被凍結),透過第三和第四塊的卷積特徵圖來表示一幅影像。
- ROI Pool :只針對關注區域的特徵找到特徵圖。把樣例的特徵圖做上取樣或者下采樣,然後進行拼接。
- Feature Correlation Layer:特徵相關層。為了使密度預測模組對視覺類別不可知,不直接使用從特徵提取模組獲得的特徵進行密度預測。只使用不同scale的樣例特徵和整個影像特徵之間的相關性獲得相關圖,作為密度預測模組的輸入。
- Density Prediction Module:密度預測模組。由五個卷積塊和放置在第一、第二和第三卷積層之後的三個上取樣層組成。最後一層是 1×1 卷積層預測 2D 密度圖。
3.訓練(訓練集下載見github地址,不大)
FSC-147。由6135張影像組成,涉及147個物件類別。資料集中的物件的大小和計數差異很大,7-3731個物件,平均每幅影像的計數為56個物件。
為了生成目標密度圖,使用具有自適應視窗大小的高斯平滑法。首先,使用點註釋來估計物體的大小。點註釋圖每個點都位於物體的近似中心,計算每個點與其最近的鄰居的距離,對影像中所有的點進行平均,平均距離被用作生成目標密度圖的高斯視窗的大小。高斯的標準偏差被設定為視窗大小的四分之一。為了訓練FamNet,將預測的密度圖和GT密度圖之間的平均平方誤差降到最低。使用Adam最佳化器,學習率為1e-5,批次大小為1。每張圖片的大小調整為固定的384高度,寬度也相應調整保持原始縱橫比。
4.測試適應
引數微調:在測試時要先“熱身,使網路更適應於當前的目標類別,要做某一個類別,先做100次迭代,更新引數。同時,在測試時選擇了兩個在訓練的時候沒有的損失函式。其關鍵思想是利用範例邊界框的位置所提供的資訊。
第一個是Min-count Loss,要求在密度圖的原圖樣例位置,方框內密度值求和至少大於等於1,否則損失就很大。
第二個是Perturbation Loss,將方框的中心視作密度值為1,周圍的密度值呈高斯分佈,離中心位置越遠密度值越小。損失函式定義為預測值與中心點的距離(或者說預測密度值與所在位置的實際密度值之差)的平方和。
The combined adaptation Loss.用於測試時間自適應的損失是MinCount損失和擾動損失的加權組合。
5.有無自適應的測試效果
1.預測的密度圖和FamNet的計數。
2.測試時自適應。顯示的是初始密度圖(Pre Adapt)和適應後的最終密度圖(Post Adapt)。在過度計數的情況下,適應性降低了密集位置的密度值。
6.實驗結果
度量標準:均值絕對誤差MAE、均方誤差RMSE
1.與其他少樣本方法的比較
2.相比於目標檢測的方法
3.消融實驗
4.特定類別的目標計數
實驗過程及結果
1.demo測試:
原圖應該共有36個橘子,無適應測試結果是29.15,有適應的結果是30.05,略有改善。
換example box再測試:
特地挑了幾個有樹葉阻擋的橘子作為example box,結果有所改觀。
無適應的結果32.83.
有適應的結果33.86.
換了一張更密集的羊群圖片來測試,誤差會更明顯。
原圖:羊的數量為110左右。
無適應47.16 -> 有適應104.39
在不適應的情況下對測試集進行test
適應的情況下對 val 拆分進行test
官方模型的test
我自己訓練的152輪得到model,然後進行test
可以看到結果還是差一點。
起初執行train.py的沒看清epoch的default為1500,然後跑了12小時發現才150+輪,算了算實驗室的四核GPU得跑五天五夜不止,於是就沒跑完,效果還是次了一點。