OpenCV 部署快速风格迁移

仓库

现在我给出了一份全新实现,支持 CUDA 加速,包含了 C++ 和 Python 版本的 OpenCV 推理代码。

1. 快速风格迁移简介

将一张图片的风格迁移到另一张图片上是耗时任务,但是在 2016 年 Perceptual Losses for Real-Time Style Transfer and Super-Resolution在新窗口打开 论文的提出,实现了实时完成这项任务。

此项目的官方网站在新窗口打开 上,可以查看论文和其效果,推荐阅读。

此项目的原始代码托管在 GitHub 上:jcjohnson/fast-neural-style在新窗口打开,可以下载其预训练权重直接部署。

2. OpenCV 部署 Torch 模型

然后我们新建 main.py,然后再任意找一张图片 test.jpg,将文件保存如下:

然后我们对每一个模型都进行推理测试:

import cv2
import numpy as np


def process(image_path: str, model_path: str):
    net = cv2.dnn.readNetFromTorch(model_path)
    net.setPreferableBackend(cv2.dnn.DNN_BACKEND_OPENCV)
    image = cv2.imread(image_path)
    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: np.ndarray = 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)
    return out


model_list = [
    "./models/eccv16/composition_vii.t7",
    "./models/eccv16/la_muse.t7",
    "./models/eccv16/starry_night.t7",
    "./models/eccv16/the_wave.t7",
    "./models/instance_norm/candy.t7",
    "./models/instance_norm/feathers.t7",
    "./models/instance_norm/la_muse.t7",
    "./models/instance_norm/mosaic.t7",
    "./models/instance_norm/the_scream.t7",
    "./models/instance_norm/udnie.t7",
]

if __name__ == "__main__":
    image_path = "test.jpg"
    for model_path in model_list:
        out = process(image_path, model_path)
        print(model_path)
        cv2.imshow("out", out)
        key = cv2.waitKey()
        if key == 27:
            break

如果需要保存,可以使用下面的代码:

out = (out * 255).clip(0, 255).astype(np.uint8)
cv2.imwrite('out.jpg', out)