Python+OpenCV 圖像風格遷移(模仿名畫)

如今不少人都喜歡拍照(自拍)。有限的濾鏡和裝飾玩多了也會膩,因此就有 APP 提供了 模仿名畫風格 的功能,好比 prisma、versa 等,能夠把你的照片變成 梵高、畢加索、蒙克 等大師的風格。python

這種功能叫作「 圖像風格遷移 」,幾乎都是基於 CVPR 2015 的論文《 A Neural Algorithm of Artistic Style 》和 ECCV 2016 的論文《 Perceptual Losses for Real-Time Style Transfer and Super-Resolution 》中提出的算法,以及後續相關研究的基礎上開發出來的。git

通俗來說,就是藉助於 神經網絡 ,預先將名畫中的風格訓練成出模型,在將其應用在不一樣的照片上,生成新的風格化圖像。github

來自《A Neural Algorithm of Artistic Style》算法

而由於神經網絡在計算機視覺方面的應用愈來愈廣,著名的視覺開發庫 OpenCV 在 3.3 版本中正式引入 DNN(深度神經網絡) ,支持 Caffe、TensorFlow、Torch/PyTorch 等主流框架的模型,可用以實現圖像的識別、檢測、分類、分割、着色等功能。
我最近才發如今 OpenCV 的 Sample 代碼中就有圖像風格遷移的 Python 示例(原諒個人後知後覺),是基於 ECCV 2016 論文中的網絡模型實現。因此,即便做爲人工智能的菜鳥,也能夠拿別人訓練好的模型來玩一玩,體會下神經網絡的奇妙。編程

(相關代碼和模型的獲取見文末)微信

OpenCV 官方代碼地址: https://github.com/opencv/opencv/blob/3.4.0/samples/dnn/fast_neural_style.py網絡

目錄下經過執行命令運行代碼:框架

python fast_neural_style.py --model starry_night.t7

model 參數是提供預先訓練好的模型文件路徑,OpenCV 沒有提供下載,但給出的參考項目 https://github.com/jcjohnson/fast-neural-style 中能夠找到人工智能

其餘可設置參數有:spa

  • input 能夠指定原始圖片/視頻,若是不提供就默認使用攝像頭實時採集。
  • widthheight,調整處理圖像的大小,設置小一點能夠提升計算速度。在我本身的電腦上,300x200 的轉換視頻能夠達到 15 幀/秒。
  • median_filter 中值濾波的窗口大小,用來對結果圖像進行平滑處理,這個對結果影響不大。

執行後的效果(取自 jcjohnson/fast-neural-style):

原始圖像ECCV16 modelsinstance_norm models

核心代碼其實很短,就是 加載模型 - > 讀取圖片 -> 進行計算 -> 輸出圖片,我在官方示例基礎上進一步簡化了一下:

import cv2
# 加載模型
net = cv2.dnn.readNetFromTorch('the_scream.t7')
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV);
# 讀取圖片
image = cv2.imread('test.jpg')
(h, w) = image.shape[:2]
blob = cv2.dnn.blobFromImage(image, 1.0, (w, h), (103.939, 116.779, 123.680), swapRB=False, crop=False)
# 進行計算
net.setInput(blob)
out = net.forward()
out = out.reshape(3, out.shape[2], out.shape[3])
out[0] += 103.939
out[1] += 116.779
out[2] += 123.68
out /= 255
out = out.transpose(1, 2, 0)
# 輸出圖片
cv2.imshow('Styled image', out)
cv2.waitKey(0)

另外還改了個多效果實時對比的版本(計算量大了,很卡頓),也一併上傳在代碼中。

PS:前兩天看趙雷演唱會的時候我還說:他演唱會的背景 MV 大量使用了 圖像二值化、邊緣檢測 等操做,讓我想到之前數字圖像處理課的大做業……如今圖像風格遷移的效率達到了實時,想必之後也會常常被使用吧

獲取文中相關代碼和模型下載地址,請在公衆號( Crossin的編程教室 )對話中回覆關鍵字 名畫

════
其餘文章及回答:

如何自學Python | 新手引導 | 精選Python問答 | 如何debug? | Python單詞表 | 知乎下載器 | 人工智能 | 嘻哈 | 爬蟲 | 我用Python | 抓抖音 | requests | AI平臺

歡迎微信搜索及關注: Crossin的編程教室

相關文章
相關標籤/搜索