深度神经网络(dnn)--风格迁移(简单易懂)

概括

深度神经网络(DNN)在风格迁移领域的应用,实现了将一幅图像的艺术风格迁移到另一幅图像上的目标。该技术基于深度学习模型,特别是卷积神经网络(CNN),通过提取内容图像的内容特征和风格图像的风格特征,并定义内容损失和风格损失函数,最终生成融合了两者特征的新图像。风格迁移在艺术创作、图像编辑等领域有着广泛应用,它让艺术风格的传递更加高效且富有创造力。

具体实现

1.图像预处理

python 复制代码
import cv2

image = cv2.imread('./mountain.jpg')
cv2.imshow('image', image)
cv2.waitKey(0)

'''----------图片预处理-------------------'''
(h, w) = image.shape[:2]  # 获取图像尺寸
blob = cv2.dnn.blobFromImage(image, 1, (w, h), (0, 0, 0), swapRB=True, crop=False)

函数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: 需要将图片整体减去的平均值。如果需要对RGB图片的三个通道分别减去不同的值,那么可以使用3组平均值,如果只使用一组,那么就默认对三个通道减去一样的值。减去平均值是为了消除同一场景下不同光照的图片对我们最终的分类或者神经网络的影响。

swapRB: 表示在必要时交换通道的R通道和B通道。一般情况下使用的是RGB通道。而OpenCV通常采用的是BGR通道。因此可以根据需要交换第1个和第3个通道。该值默认为 False。

crop: 一个布尔值,决定是否对图片进行裁剪。
**返回值:blob:**表示在经过缩放、裁剪、减均值后得到的符合人工神经网络输入的数据。该数据是一个四维数据,布局通常使用N(表示batch size)、C(图像通道数,如RGB图像具有三个通道)、H(图像高度)、W(图像宽度)表示

2.加载模型

python 复制代码
# net = cv2.dnn.readNetFromTorch('./model/candy.t7')
# net = cv2.dnn.readNetFromTorch('./model/composition_vii.t7')
# net = cv2.dnn.readNetFromTorch('./model/feathers.t7')
# net = cv2.dnn.readNetFromTorch('./model/la_muse.t7')
# net = cv2.dnn.readNetFromTorch('./model/mosaic.t7')
# net = cv2.dnn.readNetFromTorch('./model/starry_night.t7')
# net = cv2.dnn.readNetFromTorch('./model/the_scream.t7')
# net = cv2.dnn.readNetFromTorch('./model/the_wave.t7')
net = cv2.dnn.readNetFromTorch('./model/udnie.t7')

加载模型net=cv2.dnn.readNet( model[, config[, framework]] )

各参数的含义如下:
model: 模型权重参数文件路径。文件内存储的是训练好的模型的权重值,是二进制文件。
config: 模型配置文件路径。模型配置文件内存储的模型描述文件,描述的是网络结构,是文本文件,文件较小。
framework: DNN框架,可省略,DNN模块会自动推断框架种类。
net: 返回值,返回网络模型对象。

支持的模型格式有Torch,TensorFlow,Caffe,DartNet,ONNX和Intel OpenVINO
model参数 | config参数 | framework参数 | 函数名称

*.caffemodel | *.prototxt | caffe | readNetFremoCaffe

*.pd | *.pbtxt | tensorflow | readNetFromTensorFlow

*.t7 | *.net | torch | readNetFromTorch

*.weight | *.cfg | darknet | readNetFromDarknet

*.bin | *.xml | dldt | readNetFromModelOptimizer

*.onnx | | onnx | readNetFromONNX

模型资源在文章开头

3.设置网络输入,将图片传入到模型并前向计算

python 复制代码
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 = out.reshape(out.shape[1], out.shape[2], out.shape[3])
# 将输出进行归一化处理(0, 1)
cv2.normalize(out, out, norm_type=cv2.NORM_MINMAX)
result = out.transpose(1, 2, 0)  # (通道,高度,宽度)转化为(高度,宽度,通道)
python 复制代码
'''''''======输出图片========='''
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果图

还有多种风格,都在文章资源里,感兴趣的话可以下载尝试一下

相关推荐
测试员周周几秒前
【Appium 系列】第08节-pytest 集成 — conftest.py 中的 fixture 与 hook
开发语言·人工智能·python·功能测试·appium·测试用例·pytest
(initial)几秒前
B-05. Unified Memory:Page Fault、Prefetch、Advise 的性能边
人工智能·cuda
SunnyDays10111 分钟前
如何使用 Python 删除 Word 文档密码和保护
python·删除 word 文档密码·移除 word 文档保护·解密 word 文档
Hui_AI7203 分钟前
电商桌面自动化实战:用RPA实现抖店批量铺货
运维·开发语言·人工智能·自然语言处理·自动化·开源软件·rpa
weixin_459753944 分钟前
mysql如何批量重置数据库用户密码_MySQL批量修改密码Shell脚本
jvm·数据库·python
人道领域4 分钟前
【LeetCode刷题日记】递归与回溯实战 257.二叉树的所有路径——一篇文章彻底搞懂回溯
开发语言·python·算法·leetcode
电子科技圈4 分钟前
XMOS推出适配VS Code编辑器的XTC工具插件
人工智能·mcu·编辑器·视觉检测·音视频·语音识别·视频编解码
AC赳赳老秦6 分钟前
OpenClaw与飞书多维表格联动:自动同步工作数据、生成统计图表,实现高效管理
java·数据库·python·信息可视化·飞书·deepseek·openclaw
云栖梦泽在7 分钟前
AI安全实战:AI供应链安全防护的实战案例
大数据·人工智能·安全
2601_955781987 分钟前
飞书远程控机:OpenClaw+AI机器人配置全攻略
人工智能·机器人·飞书·open claw部署