圖像風格遷移已經屬于比較成熟的領域了,現在連實時的風格遷移都不成問題。之前一直想出一篇這樣的文章,但無奈于大部分開源項目配置起來非常麻煩,比如 luanfujun/deep-photo-styletransfer 項目,需要安裝 CUDA、pytorch、cudnn等等,配置能花一天的時間。
不過最近我發現一個非常好的開源應用項目,那就是基于OpenCV的DNN圖像風格遷移。你只需要安裝OpenCV就可以使用。
它也有局限性,我們只能用別人訓練好的模型進行風格遷移,如果我們要自定義風格,那就必須配置cudn等工具,使用 deep-photo-styletransfer 等項目的方法進行訓練。
不過作為初學者,我們只需要體驗一下這樣的風格遷移算法即可。感興趣的同學可以再自己深入研究。今天的教程我們拿 fast-neural-style 訓練好的模型對下面的圖片做一次風格遷移。
1.準備
開始之前,你要確保Python和pip已經成功安裝在電腦上,如果沒有,可以訪問這篇文章:超詳細Python安裝指南 進行安裝。
**(可選1) **如果你用Python的目的是數據分析,可以直接安裝Anaconda:Python數據分析與挖掘好幫手—Anaconda,它內置了Python和pip.
**(可選2) **此外,推薦大家用VSCode編輯器,它有許多的優點:Python 編程的最好搭檔—VSCode 詳細指南。
請選擇以下任一種方式輸入命令安裝依賴 :
- Windows 環境 打開 Cmd (開始-運行-CMD)。
- MacOS 環境 打開 Terminal (command+空格輸入Terminal)。
- 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.
pip install python-opencv
2.選擇模型
fast-neural-style放出的模型風格一共有9種,我們將一一嘗試,其中部分風格如下比如:
3.克隆OpenCV源碼
我們直接克隆OpenCV開源項目中關于DNN圖像遷移的例子,地址是:
https://github.com/opencv/opencv/blob/3.4.0/samples/dnn/fast_neural_style.py
代碼:
import cv2 as cv
import numpy as np
import argparse
parser = argparse.ArgumentParser(
description='This script is used to run style transfer models from '
'https://github.com/jcjohnson/fast-neural-style using OpenCV')
parser.add_argument('--input', help='Path to image or video. Skip to capture frames from camera')
parser.add_argument('--model', help='Path to .t7 model')
parser.add_argument('--width', default=-1, type=int, help='Resize input to specific width.')
parser.add_argument('--height', default=-1, type=int, help='Resize input to specific height.')
parser.add_argument('--median_filter', default=0, type=int, help='Kernel size of postprocessing blurring.')
args = parser.parse_args()
net = cv.dnn.readNetFromTorch(args.model)
if args.input:
cap = cv.VideoCapture(args.input)
else:
cap = cv.VideoCapture(0)
cv.namedWindow('Styled image', cv.WINDOW_NORMAL)
while cv.waitKey(1) < 0:
hasFrame, frame = cap.read()
if not hasFrame:
cv.waitKey()
break
inWidth = args.width if args.width != -1 else frame.shape[1]
inHeight = args.height if args.height != -1 else frame.shape[0]
inp = cv.dnn.blobFromImage(frame, 1.0, (inWidth, inHeight),
(103.939, 116.779, 123.68), swapRB=False, crop=False)
net.setInput(inp)
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)
t, _ = net.getPerfProfile()
freq = cv.getTickFrequency() / 1000
print t / freq, 'ms'
if args.median_filter:
out = cv.medianBlur(out, args.median_filter)
cv.imshow('Styled image', out)
注意,源代碼是基于Python2的,所以第46行少了括號,如果你是Python3請注意補上括號。
這份代碼可以直接使用, parser 里定義了5個參數,--input輸入要遷移的圖像寬度和高度, median_filter 是中值濾波器, 基本思想是用像素點鄰域灰度值的中值來代替該像素點的灰度值 ,因此理論上數值越大,圖像越平滑,輸出的結果細節越好(不確定)。
親自試了一下median_filter對圖像的影響,發現改變微乎其微,因此直接為默認值即可。
4.開始遷移
將第二步的代碼保存到一個文件中,命名為1.py,在CMD/Terminal中帶參數運行腳本,其中input是源圖像路徑,model是遷移的風格模型文件,如運行:
python 1.py --input 1.jpg --model udnie.t7
-
模型
+關注
關注
1文章
3171瀏覽量
48711 -
編輯器
+關注
關注
1文章
801瀏覽量
31119 -
OpenCV
+關注
關注
30文章
628瀏覽量
41261 -
dnn
+關注
關注
0文章
59瀏覽量
9041
發布評論請先 登錄
相關推薦
評論