(一)图像风格迁移

article/2025/9/18 8:56:19

图像风格迁移即把图像A的风格和图像B的内容按照一定比例结合,输出具备图像A风格和图像B内容的图像C.
[github传送门1]https://github.com/anishathalye/neural-style
[github传送门2]https://github.com/Quanfita/Neural-Style/tree/master/examples
系列文章
(二)快速图像风格转换
(三)快速图像风格转换代码解析
(四)快速图像风格迁移训练模型载入及处理图像

1 迁移原理

图像风格迁移包括:

  • 图像内容获取;
  • 图像风格提取;
  • 内容和风格融合;
    使用VGGNet神经网络,分别从原始图片A(风格)和原始图片B(内容)直接提取特征,然后使用梯度下降法,计算风格和内容损失值,获取最优的输出结果.
    迁移框架:

    image
    图1.0 迁移原理图

2 获取图像内容

图形内容获取即图像特征提取,目前较成熟的特征提取非卷积神经网络莫属,图像风格迁移使用VGGNet提取图像特征.原始图像使用VGG处理,图像特征值可从每一层提取VGGNet抽取图像特征,输出内容分类.
看图说话:VGGNet 16层模型为例.


VGG

图2.0 VGG16模型

VGGnet浅层网络提取检测点,线,亮度等较简单的特征,还原图像效果较好,特征值基本保留了原始图像内容的形状,位置,颜色和纹理等信息,深层网络提取较为复杂的特征,如物体轮廓,即图像中物体的形状和位置,但是丢失了部分颜色和纹理信息.
因此,提取图像内容使用VGGNet浅层计算的特征值,通过提取的特征值还原内容图.
还原方法:梯度下降法,即利用梯度下降计算内容损失函数.

序号变量说明
1 p ⃗ \vec{p} p 原始图像
2 x ⃗ \vec{x} x 生成图像
3 l l l卷积层数
4 P i j l P_{ij}^{l} Pijl原始图像 p ⃗ \vec{p} p 在第 l l l层卷积上的"原始"特征值,即每一个卷积层的输入,还未进行卷积计算, i i i为卷积的第i个通道, j j j表示卷积的第 j j j个位置,通常卷积的值为三维arrary(height, width, channel),若将图片拉伸成一个向量,则对应 i i i为channel, j j j为height × \times ×width
4 F i j l F_{ij}^{l} Fijl原始图像 p ⃗ \vec{p} p 在第 l l l层卷积上经过卷积核filter计算出的特征值, i i i为卷积的第i个通道, j j j表示卷积的第 j j j个位置,通常卷积的值为三维arrary(height, width, channel),若将图片拉伸成一个向量,则对应 i i i为channel, j j j为height × \times ×width
5 L c o n t e n t ( p ⃗ , x ⃗ , l ) L_{content}(\vec{p},\vec{x},l) Lcontent(p ,x ,l)内容损失函数

内容损失为:
L o s s c o n t e n t ( p ⃗ , x ⃗ , l ) = 1 2 ∑ i , j ( F i j l − P i j l ) 2 Loss_{content}(\vec{p},\vec{x},l)=\frac{1}{2}\sum_{i,j}(F_{ij}^{l}-P_{ij}^{l})^2 Losscontent(p ,x ,l)=21i,j(FijlPijl)2
结果:

  • L o s s c o n t e n t ( p ⃗ , x ⃗ , l ) Loss_{content}(\vec{p},\vec{x},l) Losscontent(p ,x ,l)越小,生成图像与原始图像内容越接近;
  • L o s s c o n t e n t ( p ⃗ , x ⃗ , l ) Loss_{content}(\vec{p},\vec{x},l) Losscontent(p ,x ,l)越大,生成图像与原始图像内容差别越大;

3 获取图像风格

图形风格使用卷积层特征值的格拉姆(Gram)矩阵表示.
Gram矩阵:
n n n维欧式空间任意 k k k( k ≤ n k\leq n kn)个向量, α 1 ⃗ , α 2 ⃗ , ⋯   , α k ⃗ \vec{\alpha_1},\vec{\alpha_2},\cdots,\vec{\alpha_k} α1 ,α2 ,,αk 内积组成的矩阵:
Δ ( α 1 ⃗ , α 2 ⃗ , ⋯   , α k ⃗ ) = [ ( α 1 ⃗ , α 1 ⃗ ) ( α 1 ⃗ , α 2 ⃗ ) ⋯ ( α 1 ⃗ , α k ⃗ ) ( α 2 ⃗ , α 1 ⃗ ) ( α 2 ⃗ , α 2 ⃗ ) ⋯ ( α 2 ⃗ , α k ⃗ ) ⋮ ⋮ ⋱ ⋮ ( α k ⃗ , α 1 ⃗ ) ( α k ⃗ , α 2 ⃗ ) ⋯ ( α k ⃗ , α k ⃗ ) ] \Delta(\vec{\alpha_1},\vec{\alpha_2},\cdots,\vec{\alpha_k})=\begin{bmatrix}(\vec{\alpha_1},\vec{\alpha_1})&(\vec{\alpha_1},\vec{\alpha_2})& \cdots& (\vec{\alpha_1},\vec{\alpha_k})\\ (\vec{\alpha_2},\vec{\alpha_1})&(\vec{\alpha_2},\vec{\alpha_2})& \cdots& (\vec{\alpha_2},\vec{\alpha_k})\\ \vdots & \vdots & \ddots & \vdots\\ (\vec{\alpha_k},\vec{\alpha_1})&(\vec{\alpha_k},\vec{\alpha_2})& \cdots& (\vec{\alpha_k},\vec{\alpha_k})\end{bmatrix} Δ(α1 ,α2 ,,αk )=(α1 ,α1 )(α2 ,α1 )(αk ,α1 )(α1 ,α2 )(α2 ,α2 )(αk ,α2 )(α1 ,αk )(α2 ,αk )(αk ,αk )
即为 k k k个向量 α 1 ⃗ , α 2 ⃗ , ⋯   , α k ⃗ \vec{\alpha_1},\vec{\alpha_2},\cdots,\vec{\alpha_k} α1 ,α2 ,,αk 的格拉姆矩阵.
矩阵内积:行向量乘以列向量,结果是一个数,也称点积,表示为:
( α 1 ⃗ , α 2 ⃗ ) = α 1 ⃗ T α 2 ⃗ (\vec{\alpha_1},\vec{\alpha_2})=\vec{\alpha_1}^T\vec{\alpha_2} (α1 ,α2 )=α1 Tα2

序号变量说明
1 p ⃗ \vec{p} p 原始图像
2 x ⃗ \vec{x} x 生成图像
3 l l l卷积层数
4 A i j l A_{ij}^{l} Aijl原始图像 p ⃗ \vec{p} p 在第 l l l层卷积上的"原始"Gram矩阵,即每一个卷积层的输入,还未进行卷积计算, i i i为卷积的第i个通道, j j j表示卷积的第 j j j个位置,通常卷积的值为三维arrary(height, width, channel),若将图片拉伸成一个向量,则对应 i i i为channel, j j j为height × \times ×width
5 G i j l G_{ij}^{l} Gijl原始图像 p ⃗ \vec{p} p 在第 l l l层卷积上经过卷积核filter计算出的Gram矩阵, i i i为卷积的第i个通道, j j j表示卷积的第 j j j个位置,通常卷积的值为三维arrary(height, width, channel),若将图片拉伸成一个向量,则对应 i i i为channel, j j j为height × \times ×width
6 L c o n t e n t ( p ⃗ , x ⃗ , l ) L_{content}(\vec{p},\vec{x},l) Lcontent(p ,x ,l)内容损失函数
7 N l N_l Nl l l l层卷积通道数, 1 ≤ i ≤ N l 1\leq i \leq N_l 1iNl
8 M l M_l Ml l l l层卷积图像尺寸 M l = h e i g h t × w i d t h M_l=height\times width Ml=height×width, 1 ≤ j ≤ M l 1\leq j \leq M_l 1jMl

Gram矩阵元素:
G i , j l = ∑ k F i k l F j k l G_{i,j}^{l}=\sum_{k} F_{ik}^{l} F_{jk}^{l} Gi,jl=kFiklFjkl
其中,
F i l = ( F i 1 l , F i 2 l , ⋯   , F i j l , ⋯   , F i M l l ) F_{i}^{l}=(F_{i1}^l,F_{i2}^l, \cdots,F_{ij}^l, \cdots, F_{iM_l}^{l}) Fil=(Fi1l,Fi2l,,Fijl,,FiMll)
Gram矩阵在一定程度上可以反应原始图像的"风格",风格损失函数为 L o s s s t y l e ( p ⃗ , x ⃗ , l ) Loss_{style}(\vec{p},\vec{x},l) Lossstyle(p ,x ,l)
内容损失为:
L o s s s t y l e ( p ⃗ , x ⃗ , l ) = 1 4 N l 2 M l 2 ∑ i , j ( A i j l − F i j l ) 2 Loss_{style}(\vec{p},\vec{x},l)=\frac{1}{4N_{l}^{2}M_{l}^{2}}\sum_{i,j}(A_{ij}^{l}-F_{ij}^{l})^2 Lossstyle(p ,x ,l)=4Nl2Ml21i,j(AijlFijl)2
其中,
1 4 N l 2 M l 2 \frac{1}{4N_{l}^{2}M_{l}^{2}} 4Nl2Ml21是归一化项,防止风格损失比内容损失过大.实际应用,有多层风格损失,加权值作为风格损失,即:
L o s s s t y l e ( p ⃗ , x ⃗ ) = ∑ l w l L o s s s t y l e ( p ⃗ , x ⃗ , l ) Loss_{style}(\vec{p},\vec{x})=\sum_{l}w_{l}Loss_{style}(\vec{p},\vec{x},l) Lossstyle(p ,x )=lwlLossstyle(p ,x ,l)
其中,
w l w_l wl为第l层卷积的权重.
结果:

  • L c o n t e n t ( p ⃗ , x ⃗ , l ) L_{content}(\vec{p},\vec{x},l) Lcontent(p ,x ,l)越小,生成图像风格与原始图像风格越接近;
  • L c o n t e n t ( p ⃗ , x ⃗ , l ) L_{content}(\vec{p},\vec{x},l) Lcontent(p ,x ,l)越大,生成图像风格与原始图像风格差别越大;

3 内容和风格融合

将图像A的内容和图像B的风格相融合,即可获取图像C,C包含A的内容和B的风格.融合损失函数:
L o s s t o t a l ( p ⃗ , a ⃗ , x ⃗ ) = α L o s s c o n t e n t ( p ⃗ , x ⃗ ) + β L o s s s t y l e ( a ⃗ , x ⃗ ) Loss_{total}(\vec{p}, \vec{a}, \vec{x})=\alpha Loss_{content}(\vec{p},\vec{x})+\beta Loss_{style}(\vec{a}, \vec{x}) Losstotal(p ,a ,x )=αLosscontent(p ,x )+βLossstyle(a ,x )
其中,
α , β \alpha,\beta α,β是平衡内容损失和风格损失的超参数,如果 α \alpha α偏大,还原的图像包含的内容较多, β \beta β偏大,还原的图像包含风格较多.

4 结果

迁移结果.


在这里插入图片描述

图4.0 迁移结果
  • 图A为原始内容图形,图B~F中左下角图为风格图,大图为转换结果,该模型可完成风格迁移;

5 总结

  • 该方法效果良好,由于每次进行转换都是从原始图形进行计算,所以转换效率大打折扣.
  • 致命缺点是转换速度慢,CPU上训练,生成一张图片需要10分钟至几个小时不等,GPU上训练,输出一张结果也需要几分钟.
  • 开山鼻祖,不适合生产使用.

[参考文献]
[1]A Neural Algorithm of Artistic Style
[2]Very Deep Convolutional Networks for Large-Scale Image Recognition
[3]https://blog.csdn.net/czp_374/article/details/81185603
[4]https://blog.csdn.net/juanjuan1314/article/details/79731457



http://chatgpt.dhexx.cn/article/dqdFYN4e.shtml

相关文章

图像风格迁移与快速风格迁移的对比(感知损失)

最近一段时间要写数字图像处理的文献综述,《深度学习在图像风格迁移中的原理与应用综述》。只能感慨自己一时选题不审,导致期末火葬场啊…… 这个问题我纠结了一天,看了N多篇文献(全是英文的…),结果还是没…

图像风格迁移【老版】

深度学习目前为止最有用的东西是图像处理,我们可以用它在极早期判断癌症, 也可以用它在茫茫人海里寻找犯人,但是要我说你能写一个小程序取悦女朋友, 你就不一定能信, 这一招叫艺术风格变换,就是你点击一下&…

图像风格迁移-DSTN

样式传输的目的是从参考图像中再现具有样式的内容图像。现有的通用风格转换方法成功地以艺术或照片逼真的方式将任意风格传递给原始图像。然而,现有作品所定义的“任意风格”的范围由于其结构限制而在特定领域内受到限制。具体而言,根据预定义的目标域来…

学习笔记:图像风格迁移

所谓图像风格迁移,是指利用算法学习著名画作的风格,然后再把这种风格应用到另外一张图片上的技术。著名的国像处理应用Prisma是利用风格迁移技术,将普通用户的照片自动变换为具有艺术家的风格的图片。这篇文章会介绍这项技术背后的原理&#…

图像风格迁移实战

最近看了一些基于深度学习的Style Transfer, 也就是风格迁移相关的paper,感觉挺有意思的。 所谓风格迁移,其实就是提供一幅画(Reference style image),将任意一张照片转化成这个风格,并尽量保留原照的内容(Content)。之前比较火的…

Pytorch实现图像风格迁移(一)

图像风格迁移是图像纹理迁移研究的进一步拓展,可以理解为针对一张风格图像和一张内容图像,通过将风格图像的风格添加到内容图像上,从而对内容图像进行进一步创作,获得具有不同风格的目标图像。基于深度学习网络的图像风格迁移主要有三种类型,分别为固定风格固定内容的风格…

毕设 深度学习图像风格迁移 - opencv python

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这…

图像风格迁移

文章目录 前言一、传统的图像风格迁移(Traditional style transfer)1.1计算机图形学领域和计算机视觉领域(Computer Graphics&Computer Vision)1.2非真实感图形学(Non-photorealistic graphics)和纹理迁…

ARM SMMU的原理与IOMMU

首先放一个社区iommupatch的网址:https://lore.kernel.org/linux-iommu/ 1: arm smmu的原理 1.1: smmu 基本知识 如上图所示,smmu 的作用和mmu 类似,mmu作用是替cpu翻译页表将进程的虚拟地址转换成cpu可以识别的物理地址。同理,sm…

ARM SMMU学习笔记

1. 什么是SMMU? SMMU(system mmu),是I/O device与总线之间的地址转换桥。 它在系统的位置如下图: 它与mmu的功能类似,可以实现地址转换,内存属性转换,权限检查等功能。 2. 为什么需要SMMU? 了解…

SMMU架构手册之数据结构和转换流程(1)

SMMU使用内存中一组数据结构来放置转换数据。寄存器指向初始根结构STE的基地址。STE包含stage2转换表基地址指针,同时也指向stage1的配置结构,该配置结构包含转换表基指针。CD表示stage1转换,STE表示stage2转换。 因此SMMU使用两组明确的结构…

SMMU架构手册之数据结构和转换流程(2)

STE包含每个stream的配置: 是否使能来之设备的流量;是否是stage1转换;是否是stage2转换哪个数据结构定位到stage1的转换表 若使用stage1,STE使用域STE.S1ContextPtr来指示内存中的一个或多个CD的地址。 CD关联起streamID和stage1…

ARM_SMMU_上

本篇参考 arm 官网公开材料 和 小崔的linux 专栏 https://zhuanlan.zhihu.com/p/105005488 宋宝华老师MMU介绍 armv8-armv9 MMU深度学习 MMU简介 MMU是Memory Management Unit的缩写,中文名是内存管理单元。它是一种负责处理中央处理器(CPU)…

SMMU架构手册之数据结构和转换流程(3)

3. 配置和转换的查找 图中 描述了配置查找和转换查找所涉及的相关概念。 正如3.3.2中所描述的,传入的事务首先受配置查找的约束,而SMMU决定怎样开始进行事务的转换。这涉及到找到合适的STE,如果有必要也需要CD。 配置的查找不依赖于输入的地址…

简谈MMU与SMMU

在服务器的处理器firmware开发中,经常会遇到大家讨论MMU和SMMU的概念,而且会进一步讨论的相关的TLB和huge TLB概念。实不相瞒,一开始我是非常懵逼的,只是写code而已,最多是有用到MMIO来写device的寄存器,MM…

arm smmu 学习(1)

文章linux 4.14 代码分析smmu 流程 linux 在驱动找到对应的设备后会执行driver_probe_device 函数,具体dev和drv 匹配参考文章链接 driver_probe_device->really_probe->dma_configure->of_dma_configure int of_dma_configure(struct device *dev, str…

linux内核笔记之SMMU代码分析

2020/06/10: first version, 主要介绍smmu驱动的初始化流程 在前一篇博文ARM SMMU学习笔记中, 介绍了SMMU的一些基本概念以及SMMU地址转换的基本流程,本文主要分析linux kernel中SMMUv3的代码(drivers/iommu/arm-smmu-v3.c) linux kernel版本…

smmu实现分析

1.概述 1.1 SMMU产生背景 了解SMMU产生背景之前,首先要了解DMA工作原理。因为SMMU的产生主要是为了解决虚拟化平台下的DMA重映射问题。 DMA,外设和内存的连接件,用于解放CPU。外设可以通过DMA,将搜集的数据批量传输到内存&…

ARM SMMU介绍

SMMU:system Memory Management Unit系统存储管理单元 类似于CPU流水线中的MMU,SMMU负责翻译IO主设备对内存等从设备的读写请求地址,例如DMA,主设备读写请求也会发送到CPU物理地址总线上。IO设备上的DMA会对CPU物理地址总线上的内…

SMMU学习这一篇就够了

快速链接: . 👉👉👉 个人博客笔记导读目录(全部) 👈👈👈 付费专栏-付费课程 【购买须知】:【精选】ARMv8/ARMv9架构入门到精通-[目录] 👈👈👈引流关键词: SMMU,mmu500,mmu600,mmu700,system mmu,Non-cacheable,Cacheable, non-shareable,inner-shareable,…