圖片風格快速轉換的簡單web實現
圖片風格轉換,是指利用深度學習算法學習某種風格圖片的特徵,將其應用到另一張圖片中,合成新風格的圖片,目前技術較爲成熟,github上有很多有趣的項目與應用。
本項目核心代碼基於fast-neural-style-tensorflow,在此基礎上,添加了簡單的flask框架,實現了頁面上傳圖片,選擇轉換風格,生成轉換圖片並展示的流程。
項目的介紹、配置與部署見Github,地址:fast-neural-style-flask
一、核心代碼分解
由於我對圖像的深度學習算法和web都是剛入門學習,所以接下來只是簡單介紹一下,不涉及核心算法。如果文中有說的不對的地方,還請大家多多指正。
我將這個項目分爲三個部分:訓練風格模型,實現圖片轉換,flask框架。
1. 訓練風格模型
原項目中,作者提供了重新訓練模型的方法,以訓練鉛筆畫風格 pencil 爲例。
首先,需要下載 VGG16 model 預訓練模型和 COCO dataset 數據集。將模型存放在根目錄新建 pretrained 文件夾中,將數據集解壓後,用軟鏈接指向train2014。
然後,準備風格圖片pencil.jpg,存放在img/pencil.jpg文件夾中。
下一步,準備配置文件pencil.yml,參考conf/wave.yml,修改風格圖片和模型名字。
最後,執行命令
python train.py -c conf/pencil.yml
2.快速風格轉換
在上一步中,我們生成了鉛筆畫風格模型,保存在 models/pencil.ckpt-done 中。
執行命令
python eval.py --model_file models/pencil.ckpt-done --image_file img/test.jpg
即可生成test.jpg的鉛筆畫風格圖片。
online_eval.py代碼文件是將eval.py稍微做了一點修改,便於web框架調用。
3.flask框架
不得不說,前端也是個技術活,整個項目中這部分內容花費的時間是最長的,ajax、JQ稍有不慎就出現各種問題。。。
flask服務端代碼文件爲predict_flask.py,使用了gevent協程包,整個邏輯爲:
頁面上傳圖片和選擇風格 --> 判斷圖片是否合法 --> 生成圖片唯一id --> 保存圖片 --> 調用模型併合成圖片到指定目錄 --> 將合成圖片目錄返回給頁面 --> ajax讀取合成圖片並展示。
前端頁面使用了ajax,實現了不刷新頁面展示結果。頁面有點簡陋,但是對於零基礎的我來說,真的用了洪荒之力!
二、開發web遇到的問題以及解決方法
1. 訓練新的模型較爲耗時,需要較高的資源。
在12G顯卡的GPU上運行,大約需要4小時多的時間。
2. 風格轉換的效果如何?
原項目提供了一些參數可以調試,但是需要考慮訓練成本。總體來說,如果圖片的線條較爲清晰、對比度高的情況下,效果比較好。
3. gevent的安裝與部署
windows系統可以安裝gevent,但是無法使用。mac os 不能直接使用pip安裝,需要從源代碼處clone並build。linux系統直接pip安裝即可。
4. ajax傳遞圖片
本來想用form序列化的方式傳遞參數,試了很多網上查找的方法,最後還是用FormData上傳成功了。
5. ajax接收返回數據
後臺正確執行程序並返回正確結果,ajax卻總是跳進error:function()中,是因爲返回的數據類型與dataType不一致導致的。
6. ajax展示圖片
ajax只能讀取static文件夾中的靜態文件,所以要講生成的文件路徑設置爲static下才行。
三、效果演示與總結
用我自己的圖片展示一下鉛筆畫的效果,感謝同事芳芳的辛苦訓練!
四、後續計劃
- 嘗試訓練其他風格的模型。
- 計劃部署在雲服務器上,可以開放頁面給大家來玩。
- 如果有時間,考慮學習html5,開發手機版本的演示頁面,更方便大家來玩。