图像风格转移

1. 加载模型

因为OpenCV只支持推理,所以首先你需要有一个训练好的模型。OpenCV支持所有主流框架的大部分模型。从OpenCV的readNet系列函数就可以看出来:

  • readNetFromCaffe

  • readNetFromTensorflow

  • readNetFromTorch

  • readNetFromDarknet

  • readNetFromONNX

  • readNetFromModelOptimizer

本文所用风格迁移模型是李飞飞的文章<<Perceptual Losses for Real-Time Style Transfer and Super-Resolution>>开源的Torch/Lua的模型,地址在这里:https://github.com/jcjohnson/fast-neural-style。他们提供了十种风格迁移的模型,模型的下载脚本在:https://github.com/jcjohnson/fast-neural-style/blob/master/models/download_style_transfer_models.sh。显然这里需要用OpenCV的readNetFromTorch函数去加载模型,由于模型较多,这里提供的函数可以选择加载指定的模型:

import cv2

model_base_dir = "/cvpy/style_transfer/models/"
d_model_map = {
    1: "udnie",
    2: "la_muse",
    3: "the_scream",
    4: "candy",
    5: "mosaic",
    6: "feathers",
    7: "starry_night"
}

def get_model_from_style(style: int):
    """
    加载指定风格的模型
    :param style: 模型编码
    :return: model
    """
    model_name = d_model_map.get(style, "mosaic")
    model_path = model_base_dir + model_name + ".t7"
    model = cv2.dnn.readNetFromTorch(model_path)
    return model

2. 图像预处理

在OpenCV中,输入给模型的图像需要首先被构建成一个4维的Blob,看到Blob这个词感觉是受到了Caffe的影响。在构建Blob的时候会做一些诸如resize、归一化和缩放之类的简单预处理。OpenCV提供的函数为:

blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None)

这个函数在构建Blob的之前会先做如下计算:

(image - mean) * scalefactor。

函数中的swapRB参数的含义是swap Blue and Red channels,干的是cvtColor(image, cv2.COLOR_BGR2RGB)的事情。

本文的风格迁移所需要做的图像预处理很简单,只是三通道分别减去均值即可。代码如下:

(h, w) = img.shape[:2]
blob = cv2.dnn.blobFromImage(img, 1.0, (w, h), (103.939, 116.779, 123.680), swapRB=False, crop=False)

3. 模型推理

模型推理过程就是神经网络模型进行一次前向传播,在OpenCV中,用以下可读性非常强的两行代码即可完成:

net.setInput(blob)
output = net.forward()

把第一节构建的blob输入给模型,然后执行一次前向传播。

得到输出output再做一些处理使得我们可以更好的可视化图像:

# reshape输出结果, 将减去的平均值加回来,并交换各颜色通道
output = output.reshape((3, output.shape[2], output.shape[3]))
output[0] += 103.939
output[1] += 116.779
output[2] += 123.680
output = output.transpose(1, 2, 0)

效果展示

图像风格转移

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值