介绍:
风格迁移是一种计算机视觉技术,它能够让一张图片看起来像是用另一种风格画出来的。想象一下,你有一张普通的照片,但你希望它看起来像是梵高的印象派画作,或者像是某个著名艺术家的作品,风格迁移就可以实现。
DNN模块是什么:
DNN模块是 OpenCV 中专门用来实现 DNN(Deep Neural Networks,深度神经网络) 模块的相关功能,其作用是载入别的深度学习框架(如 TensorFlow、Caffe、Torch 等)中已经训练好的模型,然后用该模型完成预测等工作。
DNN 模块的特点:
● 轻量: OpenCV 的深度学习模块只实现了模型推理功能,不涉及模型训练,这使得相关程序非常精简,加速了安装和编译过程。
● 外部依赖性低:重新实现一遍深度学习框架使得 DNN 模块对外部依赖性极低,极大地方便了深度学习应用的部署。
● 方便:在原有 OpenCV 开发程序的基础上,通过 DNN 模块可以非常方便地加入对神经网络推理的支持。
● 集成:若网络模型来自多个框架,如一个来自 TensorFlow,另外一个来自 Caffe,则 DNN 模块可以方便地对网络进行整合。
● 通用性:DNN 模块提供了统一的接口来操作网络模型,内部做的优化和加速适用于所有网络模型格式,支持多种设备和操作系统。
图像预处理的功能:
将需要处理的图像转换成可以传入人工神经网络的数据形式。 DNN 模块中的函数 blobFromlmage 完成图像预处理,从原始图像构建一个符合人工神经网络输入格式的四维块。 它通过调整图像尺寸和裁图像、减均值、按比例因子缩放、交换 B 通道和R通道等可选操作完成对图像的预处理,得到符合人工神经网络输入的目标值。
代码步骤
- 读取图像:使用
cv2.imread
函数读取待处理的图像。import cv2 image=cv2.imread('right.jpg')
- 图像预处理:将图像转换为深度学习模型可以接受的格式。
# 获取图像的高度和宽度 (h,w)=image.shape[:2] # 创建一个blob对象,用于网络输入 # 这里将图像缩放到与原图相同的尺寸,不改变图像的宽高比,不进行裁剪 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_new=out.reshape(out.shape[1],out.shape[2],out.shape[3]) # 归一化处理,使像素值在0到1之间 cv2.normalize(out_new,out_new,norm_type=cv2.NORM_MINMAX) # 转换通道顺序,从CHW转换为HWC result=out_new.transpose(1,2,0)
运行结果
完整代码
import cv2
image=cv2.imread('right.jpg')
# 获取图像的高度和宽度
(h,w)=image.shape[:2]
# 创建一个blob对象,用于网络输入
# 这里将图像缩放到与原图相同的尺寸,不改变图像的宽高比,不进行裁剪
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_new=out.reshape(out.shape[1],out.shape[2],out.shape[3])
# 归一化处理,使像素值在0到1之间
cv2.normalize(out_new,out_new,norm_type=cv2.NORM_MINMAX)
# 转换通道顺序,从CHW转换为HWC
result=out_new.transpose(1,2,0)
cv2.imshow('result',result)
cv2.waitKey(0)
cv2.destroyAllWindows()
总结
通过本次实验,我们成功地使用OpenCV和深度学习模型实现了图像的风格迁移。我们了解到,通过预训练的模型,我们可以轻松地将一种风格应用到另一张图像上。这种技术在艺术创作、图像编辑等领域有着广泛的应用。此外,实验也加深了我们对深度学习在图像处理领域应用的理解。