《深度学习》OpenCV 风格迁移、DNN模块 案例解析及实现

目录

一、风格迁移

1、什么是风格迁移

2、步骤

1)训练

2)迁移

二、DNN模块

1、什么是DNN模块

2、DNN模块特点

1)轻量

2)外部依赖性低

3)方便

4)集成

5)通用性

3、流程图

4、图像预处理功能

三、案例实现

1、定义自动缩放图片函数

2、图像预处理函数解析

1)参数解析:

• image (ndarray):输入图像

• scalefactor (float):图像缩放因子

• size (tuple):目标尺寸(宽度, 高度)

• mean (tuple):归一化图像数据

• swapRB (bool): 是否交换红蓝通道

• crop (bool):是否裁剪图像

• ddepth (int, 可选参数):目标图像的深度

2)返回值

3、图像预处理

调试模式:

4、关于cv2.dnn.readNet和cv2.dnn.readNetFromTorch

1)cv2.dnn.readNet

2)cv2.dnn.readNet参数

3)cv2.dnn.readNetFromTorch

4)参数

5、加载深度学习模型

1)模型文件

2)加载模型

6、图像导入神经网络

调试状态:

7、输出处理

展示结果:

8、也可以自由更换图片以及训练好的风格模型

9、完整代码


一、风格迁移

1、什么是风格迁移

        风格迁移是一种计算机视觉技术,通过将一幅图像的风格与另一幅图像的内容结合,生成一个新的图像。

        在OpenCV中,风格迁移通常使用神经网络来实现。

2、步骤

        1)训练

                首先,使用一幅参考图像作为“风格图像”和一幅目标图像作为“内容图像”,训练一个神经网络模型。训练过程中,网络学习如何将内容图像的内容与风格图像的风格进行组合。

        2)迁移

                一旦模型训练完成,就可以使用该模型将任意图像的内容与风格进行迁移。在迁移过程中,网络会将输入图像的内容与风格图像的风格进行匹配,并生成一个新的图像,该图像具有输入图像的内容和风格图像的风格。

二、DNN模块

1、什么是DNN模块

        DNN模块是 OpenCV 中专门用来实现 DNN(Deep Neural Networks,深度神经网络) 模块的相关功能,其作用是载入别的深度学习框架(如 TensorFlow、Caffe、Torch 等)中已经训练好的模型,然后用该模型完成预测等工作。

2、DNN模块特点

        1)轻量

                 OpenCV 的深度学习模块只实现了模型推理功能,不涉及模型训练,这使得相关程序非常精简,加速了安装和编译过程。

        2)外部依赖性低

                重新实现一遍深度学习框架使得 DNN 模块对外部依赖性极低,极大地方便了深度学习应用的部署。

        3)方便

                在原有 OpenCV 开发程序的基础上,通过 DNN 模块可以非常方便地加入对神经网络推理的支持。

         4)集成

                若网络模型来自多个框架,如一个来自 TensorFlow,另外一个来自 Caffe,则 DNN 模块可以方便地对网络进行整合。

         5)通用性

                DNN 模块提供了统一的接口来操作网络模型,内部做的优化和加速适用于所有网络模型格式,支持多种设备和操作系统。

3、流程图

4、图像预处理功能

        将需要处理的图像转换成可以传入人工神经网络的数据形式。 DNN 模块中的函数 blobFromlmage 完成图像预处理,从原始图像构建一个符合人工神经网络输入格式的四维块。 它通过调整图像尺寸和裁图像、减均值、按比例因子缩放、交换 B 通道和R通道等可选操作完成对图像的预处理,得到符合人工神经网络输入的目标值。

三、案例实现

1、定义自动缩放图片函数

import cv2
def resize(image,width=None,height=None ,inter=cv2.INTER_AREA):  # 输入参数为图像、可选宽度、可选高度、插值方式默认为cv2.INTER_AREA,即面积插值dim = None   # 存储计算后的目标尺寸w、h(h,w) = image.shape[:2]  # 返回输入图像高宽if width is None and height is None:   # 判断是否指定了宽和高大小,如果没有指定则返回原图return imageif width is None:   # 判断如果没有指定宽度大小,则表示指定了高度大小,那么运行内部代码r = height/float(h)   # 指定高度与原图高度的比值dim = (int(w*r),height)   # 宽度乘以比值得到新的宽度,此处得到新的宽高else:  # 此处表示为width不是None,即指定了宽度,与上述方法一致,计算比值r = width/float(w)dim = (width,int(h*r))resized = cv2.resize(image,dim,interpolation=inter)     # 指定图像大小为上述的dim,inter默认为cV2.INTER_AREA,即面积插值,适用于缩放图像。return resized

        如果输入原图尺寸太大,可以直接调用这个函数来缩放图片,手动指定图像的宽度或高度,函数自动生成缩放后图片的高度或宽度。

2、图像预处理函数解析

cv2.dnn.blobFromImage(image, scalefactor, size, mean, swapRB=False, crop=False, ddepth=CV_32F)
        1)参数解析:
                • image (ndarray):输入图像

                     通常是一个通过cv2.imread读取的BGR图像。

                • scalefactor (float):图像缩放因子

                     这个值决定了图像在送入模型之前需要被缩放的程度。例如,如果设置为1.0,则图像保持原尺寸;如果设置为0.5,则图像的高度和宽度都会减半。

                • size (tuple):目标尺寸(宽度, 高度)

                     这个参数指定了图像在送入模型之前应该被调整到的尺寸。如果设置为(0, 0),则图像不会被调整尺寸,而是保持原样(但仍然会被缩放scalefactor指定的倍数)。

                • mean (tuple):归一化图像数据

                     从每个通道减去的均值。这个参数通常用于归一化图像数据,以匹配模型训练时使用的预处理步骤。它是一个包含三个元素的元组,分别对应B、G、R通道的均值。如果模型训练时没有使用均值减法,可以设置为(0, 0, 0)

                • swapRB (bool): 是否交换红蓝通道

                     是否交换红色和蓝色通道,即1通道和3通道交换,由于OpenCV默认使用BGR格式,而大多数深度学习框架(如PyTorch和TensorFlow)使用RGB格式,因此通常需要将B和R通道交换。如果设置为True,则会自动交换红色和蓝色通道。

                • crop (bool):是否裁剪图像

                     如果设置为True,并且size参数指定了一个非零尺寸,则图像会被裁剪到指定的尺寸。裁剪是通过从图像中心裁剪出一个矩形区域来实现的,该矩形区域的尺寸等于size指定的尺寸,并且尽可能保持图像的纵横比。如果设置为False,则图像会被调整(缩放和/或填充)到指定的尺寸,而不会裁剪

                • ddepth (int, 可选参数):目标图像的深度

                     这个参数在OpenCV的某些版本中可能不存在或不被使用。它通常设置为cv2.CV_32F(即32位浮点数),以确保图像数据以浮点数的形式传递给模型。然而,在最新版本的OpenCV中,这个参数可能已经被移除或不再是必需的,因为函数内部可能已经默认处理了图像数据的类型转换。

        2)返回值

                表示在经过缩放、裁剪、减均值后得到的符合人工神经网络输入的数。该数据是一个四维数据,布局通常使用N(表示batch size为批量大小)、C(图像通道数,如RGB图像具有三个通道)、H(图像高度)、W(图像宽度)表示

3、图像预处理

# 读取鑰入图像
a = cv2.imread('huanghelou.png')
image = resize(a,400)
# 显示输入图像
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)  # 将原始图像构建成神经网络可识别的格式,四维块
        调试模式:

4、关于cv2.dnn.readNet和cv2.dnn.readNetFromTorch

        1)cv2.dnn.readNet

                是一个更通用的函数,主要用于加载 Caffe、TensorFlow(通过中间转换为 .pb 文件或冻结图)、ONNX 等格式的深度学习模型。

        2)cv2.dnn.readNet参数

                model:参数指定模型架构文件的路径。

                config(可选):指定模型权重文件的路径。然而,对于某些格式(如 ONNX 和冻结的 TensorFlow.pb文件),权重和架构通常已经包含在同一个文件中,因此不需要config参数。

        3)cv2.dnn.readNetFromTorch

                是一个专门用于加载 Torch7(旧版 Torch)深度学习模型的函数。

        4)参数

                必需参数:模型文件的路径(通常是 .t7 扩展名),不需要额外的 config 参数,因为 Torch7 模型文件通常同时包含架构和权重信息。

5、加载深度学习模型

        1)模型文件

                模型文件皆是从网上下载的

        2)加载模型
net = cv2.dnn.readNet(r'model\starry_night.t7')   # 得到一个PyTorch训练之后的梵高的星空模型
# 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')

6、图像导入神经网络

# 设置神经网络的输入
net.setInput(blob)
# 对输入图像进行前向传播,得到输出结果
out = net.forward()
# out是四维的:B*C*H*W
        调试状态:

7、输出处理

# 重塑形状(忽略第1维),4维变3维
out_new = out.reshape(out.shape[1], out.shape[2], out.shape[3])
cv2.normalize(out_new, out_new, norm_type=cv2.NORM_MINMAX)  # 对输入数组out_new进行归一化处理,处理完的数组命名为out_new,可以手动设置归一化的值的范围,写None话则自动选择范围,cv2.NORM_MINMAX表示归一化类型为最小值到最大值归一化,未指出则使用0和255或者-1和1
result = out_new.transpose(1,2,0)  # 对多维数组进行转置,对于图像数据,意味着交换维度
cv2.imshow('Stylized Image',result)
cv2.waitKey(0)
cv2.destroyAllWindows()
        展示结果:

8、也可以自由更换图片以及训练好的风格模型

        可私信联系转化几个模型。

        (图片来源网络,如有侵权,敬请联系删除)

9、完整代码

import cv2
# 读取鑰入图像
image = cv2.imread('huanghelou.png')
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')   # 得到一个PyTorch训练之后的星空模型
# 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_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.mzph.cn/web/55006.shtml

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

相关文章

postman变量,断言,参数化

环境变量 1.创建环境变量 正式环境是错误的,方便验证环境变化 2.在请求中添加变量 3.运行前选择环境变量 全局变量 能够在任何接口访问的变量 console中打印日志 console.log(responseBody);//将数据解析为json格式 var data JSON.parse(responseBody); conso…

linux上的smb共享文件夹

需求描述 公司的打印机使用扫描功能的时候,需要发送大量文件。然鹅公司的电脑都是加入了AzureAD的,不能在公司电脑上简单设置共享。好在公司有很多阿里云上的服务器,Linux和Windows的都有,所以就来尝试用阿里云的服务器来进行smb…

科研绘图系列:R语言绘制SCI文章图2

文章目录 介绍加载R包导入数据图a图b图d系统信息介绍 文章提供了绘制图a,图b和图d的数据和代码 加载R包 library(ggplot2) library(dplyr) library(readxl) library(ggpmisc)导入数据 数据可从以下链接下载(画图所需要的所有数据): 百度网盘下载链接: https://pan.baid…

【算法思想·二叉树】用「遍历」思维解题 II

本文参考labuladongsuanfa笔记[【强化练习】用「遍历」思维解题 II | labuladong 的算法笔记] 如果让你在二叉树中的某些节点上做文章,一般来说也可以直接用遍历的思维模式。 270. 最接近的二叉搜索树值 | 力扣 | LeetCode | 给你二叉搜索树的根节点 root 和一个目…

解决新版Android studio不能连接手机的问题

我要说的是一个特例,装了22年的版本AS可以正常连接手机,装了23年以后新版本,AS不能正常连接手机了,但是在CMD控制台可以正常的执行adb命令,并且CMD和AS都是指向D:\android_sdk\platform-tools\adb.exe 一、 为什么会出…

通信工程学习:什么是SDRAM同步动态随机存取存储器

SDRAM:同步动态随机存取存储器 SDRAM,全称为Synchronous Dynamic Random Access Memory,即同步动态随机存取存储器,是一种广泛应用于计算机和嵌入式系统中的内存技术。以下是对SDRAM的详细介绍: 一、SDRAM的定义与特点…

linux线程 | 线程的控制(二)

前言: 本节内容是线程的控制部分的第二个小节。 主要是列出我们的线程控制部分的几个细节性问题以及我们的线程分离。这些都是需要大量的代码去进行实验的。所以, 准备好接受新知识的友友们请耐心观看。 现在开始我们的学习吧。 ps:本节内容适合了解线程…

云轴科技ZStack入选信通院《高质量数字化转型产品及服务全景图》AI大模型图谱

近日,由中国互联网协会中小企业发展工作委员会主办的“2024大模型数字生态发展大会暨铸基计划年中会议”在北京成功召开。会上发布了中国信通院在大模型数字化等领域的多项工作成果,其中重点发布了《高质量数字化转型产品及服务全景图(2024上…

前端开发笔记--html 黑马程序员1

文章目录 前端开发工具--VsCode前端开发基础语法VsCode优秀插件Chinese --中文插件Auto Rename Tag --自动重命名插件open in browserOpen in Default BrowserOpen in Other Browser Live Server -- 实时预览 前端开发工具–VsCode 轻量级与快速启动 快速加载:VSCo…

怎么ping网络ip地址通不通

怎么Ping网络IP地址通不通?要检查网络中的IP地址是否连通,可以使用‌Ping命令。Ping命令通过发送ICMP(Internet Control Message Protocol,因特网控制消息协议)Echo请求报文并等待回应,来判断目标主机是否可…

微知-Mellanox网卡如何导出firmware中的config文件以及文件中有些什么?(ini配置文件,8个区)

背景 Mellanox网卡早期版本以及Engineer simple的DPU支持导出配置文件,该配置文件就是用来告诉firmware的行为。但不是mlxconfig真正设置的文件(mlxconfig -d xxx -e -q应该就是把这个文件读取出来,并且有3个文件,包括默认的,当前…

WebGl学习使用attribute变量绘制一个水平移动的点

在WebGL编程中,attribute变量是一种特殊类型的变量,用于从客户端传递数据到顶点着色器。这些数据通常包括顶点的位置、颜色、纹理坐标等,它们是与每个顶点直接相关的信息。attribute变量在顶点着色器中声明,并且对于每个顶点来说都…

【linux】信号(下)

8. 阻塞信号 (一)信号其他相关常见概念 实际执行信号的处理动作称为信号递达(Delivery)信号从产生到递达之间的状态,称为信号未决(Pending)进程可以选择阻塞 (Block )某个信号被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作(即被阻塞的信…

如何在阿里云一键部署FlowiseAI

什么是FlowiseAI FlowiseAI 是一个开源的低代码开发工具,专为开发者构建定制的语言学习模型(LLM)应用而设计。 通过其拖放式界面,用户可以轻松创建和管理AI驱动的交互式应用,如聊天机器人和数据分析工具。 它基于Lang…

c++速成之从string类中获取那些知识

温馨提示:本篇文章依旧是c速成系列的文章,因为从这里开始,内容就已经开始复杂,但博主还是以是什么,怎么用的原则继续给大家讲解知识点,希望大家能够耐心看完,并给博主留个三连,博主先…

Redis-缓存过期淘汰策略

缓存淘汰策略 生产上redis内存设置为多少 设置为最大内存的 3/4 redis 会占用物理机多少内存 默认大小是 0,64 位系统下表示不限制内存大小,32位系统表示 3G 如何设置修改redis内存大小 config get maxmemory 查看修改方式 配置文件 单位是字节 2.…

深入Postman- 自动化篇

前言 在前两篇博文《Postman使用 - 基础篇》《玩转Postman:进阶篇》中,我们介绍了 Postman 作为一款专业接口测试工具在接口测试中的主要用法以及它强大的变量、脚本功能,给测试工作人员完成接口的手工测试带来了极大的便利。其实在自动化测试上,Postman 也能进行良好的支…

校车购票微信小程序的设计与实现(lw+演示+源码+运行)

摘 要 由于APP软件在开发以及运营上面所需成本较高,而用户手机需要安装各种APP软件,因此占用用户过多的手机存储空间,导致用户手机运行缓慢,体验度比较差,进而导致用户会卸载非必要的APP,倒逼管理者必须改…

软考《信息系统运行管理员》- 4.1信息系统软件运维概述

4.1信息系统软件运维概述 文章目录 4.1信息系统软件运维概述信息系统软件运维的概念信息系统软件的可维护性及维护类型对软件可维护性的度量可以从以下几个方面进行:软件维护分类: 信息系统软件运维的体系1.**需求驱动**2.**运维流程**3.**运维过程**4.*…

斯坦福 CS229 I 机器学习 I 构建大型语言模型 (LLMs)

1. Pretraining -> GPT3 1.1. Task & loss 1.1.1. 训练 LLMs 时的关键点 对于 LLMs 的训练来说,Architecture(架构)、Training algorithm/loss(训练算法/损失函数)、Data(数据)、Evalu…