《OpenCV计算机视觉》—— 使用DNN模块实现图片风格迁移

news2024/11/28 19:44:38

文章目录

  • OpenCV中的DNN模块
    • 一、功能概述
    • 二、支持的模型格式
    • 三、基本使用方法
    • 四、DNN 模块的特点
    • 五、常见应用示例
  • 示例:图片风格迁移

OpenCV中的DNN模块

OpenCV中的DNN(Deep Neural Network)模块是一个功能强大的工具,它允许开发者在计算机视觉应用中使用深度学习模型。以下是对OpenCV DNN模块的详细介绍:

一、功能概述

DNN模块的主要功能是载入其他深度学习框架(如TensorFlow、Caffe、Torch等)中已经训练好的模型,并使用这些模型完成预测等工作。它支持多种深度学习框架和模型格式,并提供了高效的推理能力。此外,DNN模块还与OpenCV的其他模块无缝集成,便于在计算机视觉项目中使用。

二、支持的模型格式

OpenCV的DNN模块支持多种深度学习模型格式,包括但不限于:

  1. Caffe:.caffemodel(模型权重文件)和.prototxt(模型配置文件)。
  2. TensorFlow:.pb(冻结的图文件)、.pbtxt(文本图文件)。
  3. Torch:.t7(Torch7模型)。
  4. ONNX:.onnx(ONNX模型)。
  5. Darknet:.cfg(配置文件)和.weights(权重文件)。
  6. PyTorch:通过ONNX格式导出。

三、基本使用方法

使用OpenCV的DNN模块进行推理的基本步骤如下:

  1. 加载预训练的模型和相应的配置文件

    • 使用cv2.dnn.readNetFromCaffe()加载Caffe模型。
    • 使用cv2.dnn.readNetFromTensorflow()加载TensorFlow模型。
    • 使用cv2.dnn.readNetFromTorch()加载Torch模型。
    • 使用cv2.dnn.readNetFromONNX()加载ONNX模型等。
  2. 对输入图像进行预处理

    • 使用cv2.dnn.blobFromImage()函数将图像转换为DNN模型所需的输入blob,并进行必要的缩放和归一化。
    • 函数cv2.dnn.blobFromImage:实现图像预处理,从原始图像构建一个符合人工神经网络输入格式的四维块。
      blob = cv2.dnn.blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None)
      
    • 参数:
      • image:表示输入图像。
      • scalefactor:表示对图像内的数据进行缩放的比例因子。具体运算是每个像素值*scalefactor,该值默认为 1。
      • size:用于控制blob的宽度、高度。
      • mean:表示从每个通道减去的均值。 (0,0,0):表示不进行均值减法。即不对图像的B、G、R通道进行任何减法操作。若输入图像本身是B、G、R通道顺序的,并且下一个参数swapRB值为True,则mean值对应的通道顺序为R、G、B。
      • swapRB:表示在必要时交换通道的R通道和B通道。一般情况下使用的是RGB通道。而openCV通常采用的是BGR通道,因此可以根据需要交换第1个和第3个通道。该值默认为False。
      • crop:布尔值,如果为True,则在调整大小后进行居中裁剪。
    • 返回值:
      • blob: 表示在经过缩放、裁剪、减均值后得到的符合人工神经网络输入的数据。该数据是一个四维数据,布局通常使用N(表示batch size)、C(图像通道数,如RGB图像具有三个通道)、H(图像高度)、W(图像宽度)表示
  3. 进行推理

    • 使用net.setInput(blob)设置输入。
    • 使用output = net.forward()进行推理,forward函数返回模型的输出。
  4. 解析和处理输出结果

    • 输出的处理方式取决于具体的应用。例如,对于图像分类任务,输出通常是一个概率分布,表示每个类别的概率;对于目标检测任务,输出通常包括检测到的对象的边界框和类别。

四、DNN 模块的特点

  • 轻量: OpenCV 的深度学习模块只实现了模型推理功能,不涉及模型训练,这使得相关程序非常精简,加速了安装和编译过程。
  • 外部依赖性低:重新实现一遍深度学习框架使得 DNN 模块对外部依赖性极低,极大地方便了深度学习应用的部署。
  • 方便:在原有 OpenCV 开发程序的基础上,通过 DNN 模块可以非常方便地加入对神经网络推理的支持。
  • 集成:若网络模型来自多个框架,如一个来自 TensorFlow,另外一个来自 Caffe,则 DNN 模块可以方便地对网络进行整合。
  • 通用性:DNN 模块提供了统一的接口来操作网络模型,内部做的优化和加速适用于所有网络模型格式,支持多种设备和操作系统。

五、常见应用示例

  1. 图像分类:使用DNN模块进行图像分类的典型步骤包括加载预训练的分类模型、预处理输入图像、进行推理以及解析和显示分类结果。
  2. 目标检测:目标检测任务通常包括加载预训练的检测模型、预处理输入图像、进行推理以及解析检测结果并绘制检测到的对象边界框。
  3. 图像分割:图像分割任务的步骤与分类和检测类似,但输出通常是一个掩码图像,表示每个像素的类别。
  4. 风格迁移:基于深度学习技术的图像处理方法,它允许将一张图片(风格图)中的风格、纹理迁移到另一张图片(内容图)上,同时保留内容图原有的主体结构。

示例:图片风格迁移

  • 图片的风格迁移就是运用OpenCV中的DNN模块中的方法,引用别人已经训练好的不同风格模型,将自己的图片以另一种风格展现出来

  • 例如将下图中左边的图片以右边的风格展示出来
    在这里插入图片描述

  • 以下链接中提供了几个由Torch训练出来的模型

    • 链接: https://pan.baidu.com/s/1CuxCI9Dco4nQvbui-9INww?pwd=kkrw
    • 提取码: kkrw
  • 代码实现

    import cv2
    
    image_yuantu = cv2.imread("wechat.jpg")	# 读取图片
    # 将图片的大小缩小,可选,根据自己的图片大小决定
    image = cv2.resize(image_yuantu, dsize=None, fx=0.5, fy=0.5)
    cv2.imshow('yuan tu', image)	# 显示图片
    cv2.waitKey(0)
    
    """ -----------图片预处理------------------ """
    
    (h, w) = image.shape[:2]    # 获取图像尺寸
    blob = cv2.dnn.blobFromImage(image, 1, (w, h), (0, 0, 0), swapRB=True, crop=False)
    
    """ ---------------------加载模型------------------------- """
    
    net = cv2.dnn.readNet(r'model\starry_night.t7')	# 统一的调用方法
    # net = cv2.dnn.readNetFromTorch(r'.\model\la_muse.t7')
    # net = cv2.dnn.readNetFromTorch(r'.\model\candy.t7')
    # net = cv2.dnn.readNetFromTorch(r'.\model\composition_vii.t7')
    # net = cv2.dnn.readNetFromTorch(r'.\model\feathers.t7')
    # net = cv2.dnn.readNetFromTorch(r'.\model\udnie.t7')
    # net = cv2.dnn.readNetFromTorch(r'.\model\the_scream.t7')
    
    # 设置神经网络的输入
    net.setInput(blob)
    # 对输入图像进行前向传播,得到输出结果
    out = net.forward()
    # 将输出结果转换为合适的格式
    # out是四维的:B*C*H*W
    # B:batch图像数量(通常为1),C:channels通道数,H:height高度、W:width宽度
    # ======输出处理======
    # 重塑形状(忽略第1维),4维变3维
    # 调整输出out的形状,模型推理输出out是四维BCHW形式的,调整为三维CHW形式
    out_new = out.reshape(out.shape[1], out.shape[2], out.shape[3])
    # 对输入的数组(或图像)进行归一化处理,使其数值范围在指定的范围内
    cv2.normalize(out_new, out_new, norm_type=cv2.NORM_MINMAX)
    # 转置输出结果的维度
    result = out_new.transpose(1, 2, 0)
    
    # 显示转换后的图像
    cv2.imshow('Stylized Image', result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    • 原图如下:
      在这里插入图片描述
    • 效果图如下:
      在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2216039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python pip安装requirements.txt依赖与国内镜像

python pip安装requirements.txt依赖与国内镜像 如果网络通畅,直接pip安装依赖: pip install -r requirements.txt 如果需要国内的镜像,可以考虑使用阿里的,在后面加上: -i http://mirrors.aliyun.com/pypi/simple --…

Linux--多路转接之epoll

上一篇:Linux–多路转接之select epoll epoll 是 Linux 下多路复用 I/O 接口 select/poll 的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统 CPU 利用率。它是 Linux 下多路复用 API 的一个选择,相比 select 和 poll&#xff0c…

自建 Bitwarden 密码管理器

大佬零度解说的文件修改,与原文不太一样,详细请看:自建 Bitwarden 密码管理器!完全免费开源,轻量级,安全又可靠!-零度解说 教程:你的密码真的安全吗?Bitwarden 密码管理器!一键部署…

【Redis】缓存预热、雪崩、击穿、穿透、过期删除策略、内存淘汰策略

Redis常见问题总结: Redis常见问题总结Redis缓存预热Redis缓存雪崩Redis缓存击穿Redis缓存穿透 Redis 中 key 的过期删除策略数据删除策略 Redis内存淘汰策略一、Redis对过期数据的处理(一)相关配置(二)内存淘汰流程&a…

el-table表格里面有一条横线

表格里面 有一条横线&#xff0c; 出现原因&#xff1a;是自定义了表格头.使用了固定列&#xff08;fixed&#xff09;&#xff0c;定宽。就很难受。。。 添加样式文件&#xff1a; <style lang"scss" scoped>::v-deep {.el-table__fixed-right {height: 100%…

植物大战僵尸杂交版之后要出联机版植物大战僵尸?(内测中,可在安卓手机上玩,文末附下载链接)

继植物大战僵尸杂交版之后给大家介绍一个杂交版作者正在酝酿的“植物大战僵尸射击版” 植物大战僵尸射击版介绍 《植物大战僵尸杂交版》的创作者“潜艇伟伟迷”即将推出PVZ改版新作——《植物大战僵尸射击版》。游戏将支持PC、手游和web端&#xff0c;提供单人、双人、三人、…

取证之FTK Imager学习笔记

一、FTK Imager制作镜像详细教程 1、文件-创建磁盘镜像 2、参数详解&#xff1a; 1&#xff09;物理驱动器 整个驱动器&#xff0c;如&#xff1a;识别到的是整块硬盘、U盘等&#xff0c;而不管你分几个分区&#xff1b; 2&#xff09;逻辑驱动器&#xff08;L&#xff09…

数据结构-5.9.树的存储结构

一.树的逻辑结构&#xff1a; 二.双亲表示法(顺序存储)&#xff1a; 1.树中除了根结点外每一颗树中的任意一个结点都只有一个父结点(双亲结点)&#xff1b; 2.结点包括结点数据和指针&#xff1b; 3.上述图片中右边的顺序存储解析&#xff1a;比如A结点左边的0&#xff0c;就…

机器学习:知识蒸馏(Knowledge Distillation,KD)

知识蒸馏&#xff08;Knowledge Distillation&#xff0c;KD&#xff09;作为深度学习领域中的一种模型压缩技术&#xff0c;主要用于将大规模、复杂的神经网络模型&#xff08;即教师模型&#xff09;压缩为较小的、轻量化的模型&#xff08;即学生模型&#xff09;。在实际应…

Java基础 03

⭐输入法的原理&#xff1a;⭐ 1.输入法本质就是输入字符的编码 2. Unicode对应16位编码-->所有字符都是16进制&#xff08;也就是16进制&#xff09; 码点&#xff1a;一套编码表中&#xff0c;单个字符对应的代码串叫做“码点” 3.变量 Java中所有应用的变量都要声明且…

Python面向对象编程:继承和多态③

文章目录 一、继承1.1 什么是继承1.2 定义父类和子类1.3 子类重写父类的方法1.4 多继承 二、多态2.1 什么是多态2.2 多态的实现2.3 抽象类和接口 三、综合详细例子3.1 项目结构3.2 模块代码init.pyshape.pycircle.pyrectangle.py 3.3 主程序代码main.py 3.4 运行结果 四、总结 …

实用篇—高效批量复制INSERT语句,并去除某列

在数据库管理中&#xff0c;常常需要将数据从一个表复制到另一个表。使用 Navicat 等工具可以方便地导出多条 INSERT 语句&#xff0c;但有时我们不需要某些列&#xff08;如 ID 列&#xff09;。本文将介绍如何在 Navicat 中复制多条 INSERT 语句&#xff0c;并去除 ID 列以便…

C语言笔记 14

函数原型 函数的先后关系 我们把自己定义的函数isPrime()写在main函数上面 是因为C的编译器自上而下顺序分析你的代码&#xff0c;在看到isPrime的时候&#xff0c;它需要知道isPrime()的样子——也就是isPrime()要几个参数&#xff0c;每个参数的类型如何&#xff0c;返回什么…

python画图|在三维空间的不同平面上分别绘制不同类型二维图

【1】引言 前序已经完成了基础的二维图和三维图绘制教程探索&#xff0c;可直达的链接包括但不限于&#xff1a; python画图|3D参数化图形输出-CSDN博客 python画三角函数图|小白入门级教程_正余弦函数画图python-CSDN博客 在学习过程中&#xff0c;发现一个案例&#xff1…

XGBoost回归预测 | MATLAB实现XGBoost极限梯度提升树多输入单输出

回归预测 | MATLAB实现XGBoost极限梯度提升树多输入单输出 目录 回归预测 | MATLAB实现XGBoost极限梯度提升树多输入单输出预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 XGBoost的全称是eXtreme Gradient Boosting,它是经过优化的分布式梯度提升库,旨在高效、…

优化UVM环境(三)-环境发包较多时,会触发timeout

书接上回&#xff1a; 优化UVM环境&#xff08;一&#xff09;-环境结束靠的是timeout&#xff0c;而不是正常的objection结束 优化UVM环境&#xff08;二&#xff09;-将error/fatal红色字体打印&#xff0c;pass绿色字体打印 环境发包较多时&#xff0c;会触发timeout 解决…

SpringBoot +Vue3前后端分离项目入门基础实例五

项目说明 项项目名称使用框架说明后端项目springboot_vue_element_demoSpringBoot + MyBatis-plus + MySQL完成基本的增删改查操作API前端项目vue-projectVue3 + ElementUI plus + axios界面展示,调用后端API项目文档目录 SpringBoot +Vue3前后端分离项目入门基础实例一 Spri…

机器学习:opencv--人脸检测以及微笑检测

目录 前言 一、人脸检测的原理 1.特征提取 2.分类器 二、代码实现 1.图片预处理 2.加载分类器 3.进行人脸识别 4.标注人脸及显示 三、微笑检测 前言 人脸检测是计算机视觉中的一个重要任务&#xff0c;旨在自动识别图像或视频中的人脸。它可以用于多种应用&#xff0…

【C++】- STL之vector模拟实现

1.vector的介绍 vector是表示可变大小数组的序列容器。vector采用的连续存储空间来存储元素。意味着也可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是它的大小是可以动态改变的&#xff0c;而且它的大小会被容器自动处理。vector使用动态分配数组来存储它…

三子棋(C 语言)

目录 一、游戏设计的整体思路二、各个步骤的代码实现1. 菜单及循环选择的实现2. 棋盘的初始化和显示3. 轮流下棋及结果判断实现4. 结果判断实现 三、所有代码四、总结 一、游戏设计的整体思路 &#xff08;1&#xff09;提供一个菜单让玩家选择人机对战、玩家对战或者退出游戏…