您的位置 首页 培训

OpenCV DNN 模块-风格搬迁

本文主要介绍OpenCV的DNN模块的使用。OpenCV的DNN模块自从contrib仓库开始,就是只支持推理,不支持训练。但是仅仅只是推理方面,也够强大了。现在OpenCV已经支持TensorFlo

本文首要介绍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((3output.shape[2], output.shape[3]))
output[0] += 103.939
output[1] += 116.779
output[2] += 123.680
output = output.transpose(120)

作用展现

找一张测验图片,挑选不同的风格,试一下作用。

OpenCV DNN 模块-风格搬迁

想用自己的图片风格搬迁一下吗?cvpy.net网站刚布置成功,来试试吧。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/peixun/114415.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部