基於caffe的CNN_訓練+預測_思考記錄(2)

在對數據集進行預處理並且製作完成之後,便要開始訓練數據集了,一般情況下CNN的搭建都是參考業內大牛的網絡,或者在大牛的網絡上進行細微的修改,所以對於大多數CNN使用者來說,搭建網絡並非主要任務,最重要的是如何使用網絡。當數據集輸入然後輸出網絡時,對於數據集圖片,最關心的問題便是輸入輸出的圖片尺度大小,因爲網絡的輸入與輸出端對圖片有着嚴格的要求,並且在整個網絡訓練和預測過程中,還會對圖片進行尺度的變化,所以就大多數項目的要求來看,輸入和輸出網絡的理想狀態便是黑盒狀態,即對於使用者來說,無需關注網絡所要求的尺寸,只要知道輸入與輸出的尺度是否滿足項目需求就可以。這就要求在網絡的前端和後端要對圖片進行合理而有效的縮放,以適應網絡的要求以及項目的需求。


還是以我的人羣密度估計項目爲例。CNN是參考onoro教授在2016年eccv上寫的一篇文章,網絡的輸入要求圖片尺度爲72×72,其中雖然經過了幾個卷積層,但是卷積層的kernel_size和pad大小剛好抵消,所以經過卷積層的圖片尺度並沒有發生改變。但是在其中兩個卷積層之後分別跟隨有一個池化層,其kernel_size均爲2,經過此兩個池化層圖片的長和寬均縮小爲原來的四倍,即輸出featuremap成爲18×18。就項目的黑盒要求來看,自然是要求輸入爲158×238的圖片,輸出爲158×238的人羣密度圖,這就必須要對CNN的輸入端和輸出端的圖片進行適當的預處理和後續處理。


首先來看輸入,因爲數據集UCSD的尺度爲158×238,所以需要對數據集圖片進行分塊,使得子塊大小爲72×72,才能滿足輸入網絡的尺度要求。分塊時不僅僅要對數據集圖片進行分塊,還要對以人羣密度真值圖爲基礎的標籤進行分塊,同時要使得分塊的標準在圖片和標籤上完全相同,這樣才能在訓練和預測時一一匹配,以便後續的拼接。


關於分塊,有兩種分塊方式,一種爲等距離分塊,另一種爲隨機分塊。因爲考慮到要儘可能地將圖片和標籤全方位地覆蓋到,所以採取等距離全覆蓋分塊,使得整幅圖片和標籤上的每一處都能夠在分塊所產生的子塊中找到,從而減少因爲隨機分塊而導致的數據集圖片和標籤缺失部分的現象。


因爲CNN使得圖片在輸入端和輸出端的尺度不同,而標籤是要與圖片在經過網絡後輸出的featuremap比較的,首先要保證尺度相同,所以在對數據集圖片和標籤分塊之後,還要對標籤進行reshape,使其符合網絡輸出featuremap的尺度大小,這樣才能作出有效的比較,進而在訓練時才能保證在比較結束後,使得比較結果對下一次迭代起到參考和調整的作用。


在所有數據集圖片通過CNN之後,即訓練結束之後,輸出得到則是衆多18×18的featuremap圖,與我們所想要的整體圖片的密度圖還相去甚遠,所以接下來要做的首先是要將這些18×18的featuremap恢復到72×72的大小。最簡單的一種關於圖片縮放的方法便是,縮小時進行抽值,放大時進行插值。


在將featuremap恢復大小之後,接下來便是要按照當初分塊時所對應的分塊座標點對於reshape後的featuremap進行重新排列組合,使其恢復到原始圖像大小,最終得到的纔是我們想要的關於輸入整體圖片的人羣密度圖。


CNN網絡對於輸入輸出數據圖片有着嚴格的尺度要求,只有預先對數據集進行圖片尺度的預處理,才能保證網絡的正常運行。其次,還要在圖片輸出網絡後,對得到的featuremap進行後續的處理。特別是在迴歸問題的時候,因爲此類問題多數情況下輸出的featuremap便是我們最終所要的迴歸目標的一部分,只有對其進行正確的後續處理,才能得到我們最終想要的結果。


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