深度神经网络(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()

效果图

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

相关推荐
nancy_princess8 小时前
clip实验
人工智能·深度学习
飞哥数智坊8 小时前
TRAE Friends@济南第4次活动:100+极客集结,2小时极限编程燃爆全场!
人工智能
AI自动化工坊8 小时前
ProofShot实战:给AI编码助手添加可视化验证,提升前端开发效率3倍
人工智能·ai·开源·github
飞哥数智坊8 小时前
一场直播涨粉 2 万的背后!OpenClaw + 飞书,正在重塑软件交付的方式
人工智能
飞哥数智坊8 小时前
养虾记第3期:安装、调教、落地,这场沙龙我们全聊了
人工智能
再不会python就不礼貌了8 小时前
从工具到个人助理——AI Agent的原理、演进与安全风险
人工智能·安全·ai·大模型·transformer·ai编程
AI医影跨模态组学8 小时前
Radiother Oncol 空军军医大学西京医院等团队:基于纵向CT的亚区域放射组学列线图预测食管鳞状细胞癌根治性放化疗后局部无复发生存期
人工智能·深度学习·医学影像·影像组学
A尘埃9 小时前
神经网络的激活函数+损失函数
人工智能·深度学习·神经网络·激活函数
没有不重的名么9 小时前
Pytorch深度学习快速入门教程
人工智能·pytorch·深度学习
有为少年9 小时前
告别“唯语料论”:用合成抽象数据为大模型开智
人工智能·深度学习·神经网络·算法·机器学习·大模型·预训练