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

效果图

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

相关推荐
weixin_505154462 分钟前
数字孪生包含哪些技术和创新?
大数据·人工智能·物联网·数据安全·数字孪生
京东零售技术4 分钟前
技术天才集结令!6/26 北京高校大模型技术交流开放日来了
人工智能
电院工程师6 分钟前
SM3算法Python实现(无第三方库)
开发语言·python·算法·安全·密码学
京东零售技术8 分钟前
京东零售基于Flink的推荐系统智能数据体系 |Flink Forward Asia 峰会实录分享
人工智能
AI视觉网奇11 分钟前
换颜色 算法笔记
深度学习
snowful world12 分钟前
PolyU Palmprint Database掌纹识别数据集预处理(踩坑版)
数据库·人工智能·opencv
爱意随风起风止意难平13 分钟前
如何用AI赋能学习
人工智能·学习·aigc
Listennnn14 分钟前
Ollama vs. vLLM
人工智能
A达峰绮15 分钟前
AI时代的行业重构:机遇、挑战与生存法则
大数据·人工智能·经验分享·ai·推荐算法
阔跃生物25 分钟前
什么是单细胞测序?
深度学习·阔跃生物·阔跃云