本文主要介绍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 cv2model_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)

效果展示

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

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

尝试地址:

CV-Studio​cvpy.net

tensorflow contrib模块_OpenCV DNN 模块-风格迁移相关推荐

  1. 有趣的深度学习——使用TensorFlow 2.0实现图片神经风格迁移

    前言 这也是一个重写的项目,之前用Python 2.7 + TensorFlow 1.4写的图片神经风格迁移的项目(TensorFlow 练手项目三:使用 VGG19 迁移学习实现图像风格迁移)直到现 ...

  2. 深度学习与OpenCV DNN模块:权威指南

    计算机视觉领域自20世纪60年代末就已经存在.图像分类和目标检测是计算机视觉领域的一些最古老的问题,研究人员已经努力解决了几十年.使用神经网络和深度学习,我们已经达到了一个阶段,计算机可以开始真正地理 ...

  3. 关于OpenCV for Python入门-DNN模块实现人脸检测

    OpenCV在OpenCV增加了DNN模块,DNN模块可以加载预先训练好的Caffe/tensorflow等模型数据,基本支持所有主流的深度学习框架训练生成与导出模型数据加载. 下面用到的SSD人脸检 ...

  4. TensorFlow练手项目三:使用VGG19迁移学习实现图像风格迁移

    使用VGG19迁移学习实现图像风格迁移 2020.3.15 更新: 使用Python 3.7 + TensorFlow 2.0的实现: 有趣的深度学习--使用TensorFlow 2.0实现图片神经风 ...

  5. 使用Tensorflow实现图片风格迁移,圆梦名画

    一,前期基础知识储备 1)Prisma - 图片风格迁移的鼻祖: 照片可以记录生活的瞬间,变成一幅幅的回忆:而 Prisma 则是可以让瞬间的回忆变成永恒的名画!我们平常用手机随意拍出来的照片效果看起 ...

  6. OpenCvSharp (C# OpenCV) DNN模块加载自己训练的TensorFlow模型做目标检测(含手势识别、骰子识别、菜品识别)(附源码)

    本文作者Color Space,文章未经作者允许禁止转载! 本文将介绍OpenCVSharp DNN模块加载自己训练的TensorFlow模型做目标检测(含手势识别.骰子识别.菜品识别)! 前言: 下 ...

  7. tensorflow 风格迁移二

    前面介绍了利用卷积神经网络实现图像风格迁移的算法原理和基于TensroFlow 的代码实现,这篇博客对前面的代码做了一些改变,设置了一个 image resize 函数,这样可以处理任意size的 i ...

  8. 建立单独的解决方案来开发DNN模块

    在整个DotNetNuke(以下简称DNN)解决方案之下建立和调试DNN模块项目都比较容易并且还可以随时"转到定义"看看DNN框架中类的内容,惟一的缺点就是慢!打开和编译一次DNN ...

  9. OpenCV的dnn模块调用TesorFlow训练的MoblieNet模型

    七月 上海| 高性能计算之GPU CUDA培训 7月27-29日三天密集式学习  快速带你入门阅读全文> 正文共2073个字,2张图,预计阅读时间10分钟. 一.初得模型 那是一个月之前的事情了 ...

最新文章

  1. 【解决方案】Windows10局域网内配置文件夹共享(附网络中没有找到的情况解决方案)
  2. gitlab mysql 配置_gitlab的安装与修改端口配置
  3. keepalive 原理讲解
  4. python怎么使用int四舍五入_使用Python 3的数字格式可以将数字四舍五入到成百上千个...
  5. 我会永远永远的爱你,直到你不爱我的那一天
  6. OC如何跳到系统设置里的各种设置界面
  7. 内部简单二进制编码(SBE)
  8. position有哪些属性?
  9. java调用数据库存储过程_Java调用SQL Server的存储过程详解
  10. DeepEarth自定义图元的中心位置纠偏
  11. cocos2dx mysql_初次接触cocos2dx
  12. 程序员应该具备的12种能力
  13. python中的系统模块_python中与系统发育相关的模块
  14. Pr视频剪辑基础技巧学习
  15. 互联网大厂职级对应薪资一览表
  16. 金融计算机求log,cfa计算器怎么算对数
  17. 计算机网络 王道考研2021 第六章:应用层 -- 域名系统 DNS、域名解析
  18. Eureka Server报错:Retry limit reached; giving up on complet the request
  19. Rancher管理k8s集群
  20. ubuntu下载神器---xdm

热门文章

  1. linux7telnet测试通是提示如何,如何优雅的使用telnet测试端口连通性
  2. 国外程序员薪资曝光,美国最高,均年薪95879美元
  3. OceanBase入选Forrester报告,为什么原生分布式数据库正成为核心系统升级首选?
  4. 程序员真的是太太太太太太太太难了!
  5. 阿里工程师教你 3 分钟实现数据源编排和接入
  6. 腾讯面试题: 百度搜索为什么那么快? | 原力计划
  7. Yann LeCun 会成为下一个居里夫人吗?
  8. 2020 年,远程办公太难?技术大佬齐支招!
  9. 沈向洋离开微软,曾是华人在美科技圈最高级高管,畅谈职业生涯的 7 堂课!...
  10. 围观京东云,您有一份区块链技术礼包待查收!