摘要: 想不想將神經網絡訓練成一個「放大鏡」?咱們就訓練了一個這樣炫酷的神經網絡,點擊文章一塊兒看下吧!git
低分辨率蝴蝶的放大github
當咱們網購時,咱們確定但願有一個貼近現實的購物體驗,也就是說可以全方位的看清楚產品的細節。而分辨率高的大圖像可以對商品進行更加詳細的介紹,這真的能夠改變顧客的購物體驗,讓顧客有個特別棒的購物之旅。idealo.de是歐洲領先的比價網站,也是德國電子商務市場最大的門戶網站之一,在此基礎上,咱們但願可以在此基礎上爲用戶提供一個用戶友好、有吸引力的購物平臺。算法
在這裏,咱們利用深度學習來評估數百萬酒店圖像的美學層次和技術質量,另外,那些沒有任何信息的、特別難看的小的產品圖像對咱們來講是無效的,所以須要想辦法解決。數組
購物網站上並非全部的商店都能爲顧客提供高質量的圖像,相反,商家提供的圖像特別小、分辨率特別低、質量也很低。爲了向用戶展現高質量的高分辨率圖像,咱們基於2018年的論文《圖像超分辨率的RDN網絡》,訓練了一個特別先進的卷積神經網絡。服務器
咱們的目標很簡單:拍攝一些特別小的圖像,而後就像使用放大鏡同樣,對圖像進行放大,而且還要保持高分辨率。網絡
本文對實現這一目標作了詳細介紹,另外,具體實現的細節,請查看GitHub。框架
總概ide
與大多數深度學習項目同樣,咱們的深度學習項目主要有四個步驟:函數
1.回顧前人對該項目所作的貢獻。性能
2.實施一個或多個解決方案,而後比較預先訓練的版本。
3.獲取數據,訓練並測試模型。
4.針對訓練和驗證結果對模型進行改進和優化。
具體來講,本文主要有如下幾方面的內容:
1.介紹模型訓練的配置,如何評估模型的性能
2. 查看早期訓練和測試結果,瞭解從哪方面進行改進。
3.指出後續須要探索的方向。
訓練
與以往「標準」的監督深度學習任務不一樣,咱們這個「放大鏡」深度學習模型輸出的不只僅是類標籤或一個分數,而是一整幅圖像。這就意味着訓練過程以及評估會跟以往略有不一樣,咱們要輸出的是原始高分辨率圖像,爲了更好的對模型進行評估,咱們須要一種測量縮放輸出圖像「質量」的方法,該方法更詳細的優缺點將在後面進一步作詳細闡釋。
損失函數
損失函數是用來評估神經網絡的性能究竟如何,這個有不少方法能夠評估。這個問題的本質爲你們留下了創造力空間,若有些聰明的人會用高級特徵和對抗網絡。對於第一次迭代,咱們使用標準方法:網絡的超分辨率(SR)輸出和高分辨率輸出(HR)之間的像素均方差(MSE)。
評估
咱們用峯值信噪比(PSNR)來評估輸出圖像的質量,峯值信噪比是基於兩個圖像之間的像素均方差(MSE)。因爲峯值信噪比是最經常使用的評估輸出圖像質量的方法,所以咱們也使用這一評估標準,以便將本文模型與其餘模型做比較。
開始
咱們在p2.xlarge AWS EC2實例上進行訓練,直到驗證損失函數收斂,訓練結束,這大概須要90個週期(一個週期24小時),而後使用Tensorboard跟蹤訓練數據集及驗證數據集的損失函數和PSNR值。
90個訓練時期的Tensorboard圖
如上圖所示,左上角爲在每一個週期結束時,反向傳播到神經網絡上的訓練損失函數。右上角爲跟蹤泛化性能的非訓練數據及的損失。左下角爲訓練數據集的PSNR值。右下角爲驗證數據集的PSNR值。
結果
輸出的結果以下所示,咱們先看看模型的輸出結果,再考慮如何對該模型進行改進。左側是驗證數據集中的整個圖像,中間是卷積神經網絡的輸出提取圖像塊,右側是使用標準過程將中間輸出提取圖像塊按比例放大後的輸出,這裏使用了GIMP的圖像縮放功能
LR圖像(左),重建SR(中),GIMP基線縮放(右)。
這個結果確定不是特別完美:蝴蝶的天線周圍有些不必的噪聲,蝴蝶的頸部和背部的毛髮及翅膀上有些斑點輪廓,神經網絡的輸出圖像(中)看起來要比GIMP基線輸出圖像(右)更加清晰。
結果分析
爲了進一步理解模型有哪些優缺點,咱們須要從驗證數據集中提取具備高PSNR值的圖像塊和具備低能量度值的圖像塊。
不出所料,性能最佳的圖像塊是具備較多平坦區域的圖像塊,而較爲複雜的圖像塊難以準確再現。所以,咱們重點關注這些較複雜的圖像塊,以便對結果進行訓練和評估。
一樣的,咱們也可使用熱圖(heatmap)突出顯示原始HR圖像和神經網絡輸出SR圖像之間的偏差,顏色較暗的部分對應於較高的像素均方偏差(較差的結果),顏色較淺的部分對應於較低的像素均方偏差(或較好的結果)
HR-SR像素偏差熱圖。顏色越暗,偏差越大。
咱們能夠看到,具備多種模式的區域的偏差會更大,可是看起來「更簡單」的過渡區域則是至關黑暗的(例如雲、天空),這是能夠改進的,由於它與idealo的目錄用例相關。
淺談深度學習任務中的非真實數據
與常見的分類問題或輸出爲一個分值的監督式深度學習任務不一樣,咱們用於評估神經網絡輸出的真實數據是原始HR圖像。
這既有好處,也有壞處。
壞處:像Keras這樣的當前較爲流行的深度學習框架沒有預先制定訓練解決方案,好比生成器。實際上,它們一般依賴於從一維數組中獲取訓練和驗證標籤或文件,或者是直接從文件結構中派生出來的,這會涉及到一些額外的編碼算法。
好處:沒有必要花太多時間來得到標籤,給出一個HR圖像池,咱們能夠對其進行簡單的縮小,得到咱們所須要的LR訓練數據,並使用原始HR圖像來評估損失函數
一般來講,使用圖像數據對神經網絡進行訓練時,須要從訓練數據集中隨機的選擇多個圖像來建立訓練批次。而後將這些尺寸從新縮小到一個較小的尺寸,通常來講,大小約爲100*100像素。咱們隨時使用隨機變換對圖像進行加強,並反饋到神經網絡中。在這種狀況下,沒有必要向神經網絡反饋整張圖像,而且這也很是不可取。這是由於,咱們不能將圖像從新縮放到100*100的小像素點。畢竟,咱們想要對圖像進行放大。同時,咱們也沒法用較大尺寸的圖像進行訓練,好比大小爲500*600像素的圖像,由於處理這種大圖像須要很長的時間。相反,咱們能夠從整個圖像中提取一個很是小的隨機色塊,好比大小爲16*16像素塊,這樣一來,咱們就有了更多的數據點,由於每一個圖像均可以提供數百個不一樣的色塊。
咱們之因此可以處理這種小色塊,是由於咱們不須要將一堆圖像進行分類,好比:腿+尾巴+鬍鬚+死老鼠=貓。所以,模型的末端就沒有全鏈接層。咱們只須要使用神經網絡來構建這些模式的抽象表示,而後學習如何對其進行放大,除此之外,還要對塊進行從新組合,使組合後的圖像變得有意義。這種抽象表示由卷積層和放大層來完成,其中,卷積層是該網絡中惟一的一種層類型。
咱們還要說明的是,全卷積結構使該網絡的輸入大小相互獨立。也就是說,這意味着它與普通的分類卷積神經網絡有所不一樣,你能夠向徹底卷積神經網絡中輸入任何大小的圖像:不管輸入圖像原始大小是什麼,網絡都會輸入一個輸入圖像大小2倍的圖像。
有關圖像超分辨率的RDN網絡更加詳細的介紹,請查看文末連接。
另外一方面,咱們還須要思考如何從圖像中提取這些塊。思路以下:從數據集中提取出n個隨機圖像,而後從每一個圖像中提取p個隨機快。咱們嘗試了幾種方法,以下圖所示:
提取塊的不一樣方法
首先,從一個均勻的網格中提出塊,並建立一個完整的塊數據集。在訓練的時候,咱們隨機的提取其batch_size,並對其進行放大,反饋給網絡。這種方法的缺點是須要靜態的存儲很是大的數據集,若是要用雲服務器進行訓練,這種方法其實並不理想:移動和提取數據集是一項至關耗時的操做,而且具備肯定性定義的數據集可能並非最佳數據集。
另外一種方法是隨機選擇batch_size大小的圖像,並從中提取單個塊。這種方法須要從磁盤中讀取數據,這就大大下降了訓練時間(咱們設置的每一個訓練時間爲15min-1h)。
最後,咱們將原始數據集中隨機提取的單個圖像塊進行融合,並從中提取動態的batch_size塊,這不只能存儲原始數據集,同時,也能保持較快的訓練速度。
拓展
這是放大idealo網站產品目錄的第一步,咱們已經完成了。
下面是咱們將產品圖像中低質量、低分辨率的圖像進行放大,並輸出。
涼鞋的低分辨率圖像
涼鞋的放大圖像
從上圖中,咱們能夠看到,圖像中較爲平坦的地方會產生較爲明顯的噪聲,文本也會略有失真。這就是咱們計劃要改進的地方。
在下一步的探索中,咱們將在本身的產品圖像數據集上對神經網絡進行訓練。
相關連接
Github: Image Super Resolution
Paper: Residual Dense Network for Image Super-Resolution (Zhang et al. 2018)