美文网首页实战OpenCV与深度学习
OpenCV DNN 模块-风格迁移

OpenCV DNN 模块-风格迁移

作者: 冰不语 | 来源:发表于2020-07-05 22:12 被阅读0次
    风格迁移5 - 副本.png

    本文主要介绍OpenCV的DNN模块的使用。OpenCV的DNN模块自从contrib仓库开始,就是只支持推理,不支持训练。但是仅仅只是推理方面,也够强大了。现在OpenCV已经支持TensorFlow、Pytorch/Torch、Caffe、DarkNet等模型的读取。本文们就以风格迁移为例,来看一下OpenCV DNN模块的用法。

    相比于复杂而耗时的模型训练过程,模型推理就显得简单多了。简单来说,过程就是:

    1. 加载模型
    2. 输入图像预处理(跟训练过程一样的方式,增强除外)
    3. 模型推理

    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)
    

    效果展示

    找一张测试图片,选择不同的风格,试一下效果。

    风格迁移5.png

    想用自己的图片风格迁移一下吗?cvpy.net网站刚部署成功,来试试吧。
    尝试地址:传自己的图片尝试一下吧!

    相关文章

      网友评论

        本文标题:OpenCV DNN 模块-风格迁移

        本文链接:https://www.haomeiwen.com/subject/qcmbqktx.html