opencv进行ai图像风格迁移

NO.1
风格迁移

参考文档

https://github.com/luanfujun/deep-photo-styletransfer

deep-photo-styletransfer的环境部署相对复杂

本文采用的方式为使用OpenCV,搭配fast-neural-style的公共模型,一键转化

img

NO.2
对应模型

fast-neural-style

地址:https://github.com/jcjohnson/fast-neural-style

模型风格一共有10种,这里在网上获取了9种

img

NO.3
安装opencv

输入命令

 pip install python-opencv

经测试,我的安装不成功,因为是window系统,所以采用另外的安装方式

首先确保先安装python和pip

其次安装numpy

pip install numpy

检测python版本

此处是v3.7.1

python --version

进入opencv下载源

地址:

https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv

选中对应版本下载

img

进入下载文件夹

输入命令

pip install *.whl

至此安装成功

NO.4
DNN图像

直接克隆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
import os
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)

NO.5
模型下载

链接:https://pan.baidu.com/s/1fBcxBt4WsELtPzmMhIITlg

提取码:2slz

下载文件并解压缩

测试图片为1.jpg,测试代码为1.py

img

输入命令

python 1.py --input 1.jpg --model udnie.t7

风格迁移成功

img

压缩代码新加了两行代码

一个是以下代码

为了解决保存图片全是黑色问题

因为原本image是0-255的数值,现在变为0-1之间了,对齐进行255还原

out = out * 255

另一个是以下代码

将风格迁移的图片保存到本地,官方代码只是预览,没有保存,新加保存图片功能

[dsx_def_highlightjs code=code]

 cv.imwrite("../../" + "test.png", out)

NO.6
Tips

代码中接收的参数为

–input输入要迁移的图像位置,

–model指要使用的模型,

–width/–height指的是迁移后的图像宽度和高度,

median_filter 是中值滤波器,理论上数值越大,图像越平滑

下图为去年的房间

END.