【计算机视觉40例】案例25:风格迁移

导读】本文是专栏《计算机视觉40例简介》的第25个案例《风格迁移》。该专栏简要介绍李立宗主编《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书的40个案例。

目前,该书已经在电子工业出版社出版,大家可以在京东、淘宝、当当等平台购买。

大家可以在公众号“计算机视觉之光”回复关键字【案例25】获取本文案例的源代码及使用的测试图片等资料。

针对本书40个案例的每一个案例,分别录制了介绍视频。如果嫌看文字版麻烦,可以关注公众号“计算机视觉之光”直接观看视频介绍版。

本文简要介绍了本案例的一些基础知识,更详细的理论介绍、代码实现等内容请参考《计算机视觉40例简介》第24章《深度学习应用实践》以获取更详细信息。

风格迁移(Style Transfer)是指将一张图片(风格图)中的风格、纹理迁移到另一张图片(内容图),同时要保留内容图原有主体结构。简单来说,就是把一张普通的照片变换成某个绘画大师(如毕加索、梵高等)的作品风格。

风格迁移实现在保留原有作品主体结构的基础上,将绘画大师的风格迁移到普通作品上。例如,图1中对左侧的作品进行风格迁移后得到了右侧的图像。

 

图1 风格迁移示例

OpenCV DNN使用的风格迁移模型来自于斯坦福大学李飞飞团队的研究成果,其网络结构如图2所示,包括一个图像转换网络和一个损失网络。图像转换网络是一个深度残差网络,对输入图像进行风格变换,并将其映射成输出图像。

损失网络中,用一个预训练好的用于图像分类的网络来定义损失函数。损失网络定义两个感知损失函数,分别是:

  1. 内容(特征)损失:衡量内容上的差距。目的在于让转换网络的输出非常地接近目标图像,但是又让他们不是完全匹配。
  2. 风格损失:衡量风格上的差距。目的在于惩罚风格上的偏离,如输出图像在颜色,纹理,共同的模式等方面与目标图像的差异。

 

图2 风格迁移模型的网络结构

核心代码如下:

#========加载模型、推理=============
# 加载模型
net = cv2.dnn.readNetFromTorch('model\eccv16\starry_night.t7')
# net = cv2.dnn.readNetFromTorch('model\instance_norm\mosaic.t7')
blob = cv2.dnn.blobFromImage(image, 1.0, (W, H), (0, 0, 0), swapRB=False, crop=False)
# 推理
net.setInput(blob)
out = net.forward()
print(out)
# 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])
# 将输出进行归一化处理
cv2.normalize(out, out,alpha=0.0, beta=1.0, norm_type=cv2.NORM_MINMAX)
# out /= 255 # 修正后,数学运算也可以
# (通道,高度,宽度)转化为(高度,宽度,通道)
result = out.transpose(1, 2, 0)

运行程序,显示如图3所示,其中:

  1. 左侧是原始图像;
  2. 中间是梵高画作《星空》;
  3. 右侧是采用梵高《星空》风格模型处理的原始图像的输出效果(请自己运行代码以观察彩色效果)。

 

图3  输出结果

欢迎大家阅读《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书中第24章《深度学习应用实践》获取详细内容。

《计算机视觉40例——从入门到深度学习(OpenCV-Python)》在介绍Python基础、OpenCV基础、计算机视觉理论基础、深度学习理论的基础上,介绍了计算机视觉领域内具有代表性的40个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测、手势识别、隐身术、以图搜图、车牌识别、图像加密、指纹识别等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面的案例(表情识别、驾驶员疲劳监测、识别性别与年龄等)。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

superdont

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值