在基於卷積神經網絡的應用過程當中,圖像Resize是必不可少的一個步驟。一般原始圖像尺寸比較大,好比常見監控攝像機出來的是1080P高清或者720P準高清畫面,而網絡模型輸入通常沒有這麼大,像Yolo系列目標檢測的網絡模型輸入大小通常爲608*608/512*512 等等。那麼如何將大尺寸圖像輸入到網絡模型呢?很容易想到的一個方法就是對原始圖像進行Resize,將1920*1080的原始圖像Resize到網絡模型輸入尺寸,好比608*608。在壓縮圖像的過程當中,有如下兩個問題須要重點討論:算法
一、圖像Resize先後,是否應該保持寬高比例一致?圖像內容變形是否對模型效果有影響網絡
二、圖像Resize過程,應該選擇什麼樣的插值方式?框架
對於第一個問題,其實兩種方式都可,前提是要保證模型訓練和模型推理時的操做方式一致。也就是說,若是在網絡模型訓練時,全部的訓練素材都是直接拉伸到網路的輸入尺寸(不保持寬高比例),那麼模型推理時也應該如此,反之亦然。其中保持寬高比例的作法通常是用增長padding的方式,而後用固定顏色填充,保證圖像畫面中部的內容不變形。下圖說明兩種方式的差別:函數
圖1 是否保持寬高比學習
其實對於網絡模型來說,圖像是否變形其實不過重要。若是在訓練的時候,模型認爲一個變形的動物是貓,那麼通過大量數據擬合後,在推理階段,它一樣會正確識別出變形的目標。固然根據相關資料顯示,一般通常推薦使用直接拉伸的方式去作圖像Resize,緣由是增長padding填充後會對網絡帶來必定噪音,影響模型準確性,具體影響有多大我目前沒有具體數據證實。這裏須要指出的是,一些算法應用框架對細節封裝得太好,對原始圖像進行Resize的過程被隱藏起來,具體Resize的方式也不得而知。若是你發現模型集成後的準確性降低嚴重,這時候就須要檢查一下框架對圖像Resize的方式跟咱們模型訓練時是否一致。測試
對於第二個問題,圖像Resize過程應該選擇什麼插值方式?若是對插值不太瞭解的朋友能夠上網搜索一下。這裏簡單介紹一下圖像插值的含義:咱們在對圖像進行上下采樣時(縮放),有時候要在原有像素基礎上刪除一些像素值(縮小),有時候要在原有像素基礎上增長一些像素值(放大),增長/刪除像素的方式叫圖像插值算法。對OpenCV比較熟悉的朋友可能知道它裏面的Resize函數其實有一個‘插值模式’的參數,這個參數有一個默認值:INTER_LINER線性插值。它是一種插值方式,若是你在調用Resize函數時沒有修改該參數值,那麼該函數就以「線性插值」的方式進行圖像縮放。除此以外,還有其餘的一些插值方式,每種插值算法的區別請具體參考OpenCV文檔。spa
圖2 插值示意圖blog
經過上面的介紹,圖像在進行Resize操做時,本質上是改變數字圖像矩陣大小和矩陣內容,Resize時採用不一樣的插值方式最終會獲得不一樣的結果(這裏說的結果是指微觀上像素矩陣,可能肉眼查看畫面差異不大)。那麼在深度學習應用過程當中,咱們應該採用什麼樣的插值方式呢?通過實際測試驗證,無論用哪一種方式進行插值,模型訓練階段對圖像Resize的插值方式跟模型推理階段對圖像Resize的插值方式最好能保持一致,先後兩個階段不一樣的插值方式確實會影響最終模型的效果。文檔
圖3 不一樣插值結果深度學習
除了Resize插值方式應該保持一致以外,Resize的次數最好也能保持統一,若是在模型訓練階段,咱們將原始圖像素材從1000*800縮放到400*400,而後輸入網絡進行訓練,那麼咱們在模型推理階段,一樣應該將原始圖像以相同的插值方式一次性縮放到400*400,而後輸入網絡進行推理。之因此強調一次性縮放,由於有些算法應用框架在作圖像預處理時隱藏了圖像縮放的細節,有可能不止一次縮放操做,好比先將原圖縮放到800*800,而後再進行二次縮放,最終變成400*400,雖然兩次用到的插值方式都跟模型訓練階段保持一致,可是因爲進行了兩次操做,仍是會影響最終推理效果。
圖4 縮放次數不一致
最後總結一下圖像縮放方式對模型效果的影響:在模型訓練和模型推理階段,應保持相同的圖像預處理方式,這樣才能充分發揮模型的推理效果。緣由很簡單,模型訓練的過程就是尋找數據集規律的過程,若是訓練用到的和實際推理的數據規律不同,必然會影響模型效果。固然,本文雖然討論圖像縮放的不一樣方式對模型效果有影響,可是因爲深度學習是一個基於大量數據統計的過程,在有大量數據擬合的狀況下,這種影響可能相對來說並不大,若是你很是在乎(或者實際觀察發現影響很是大),那麼本文講到的問題可能對你有幫助。