图像风格迁移【老版】

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

深度学习目前为止最有用的东西是图像处理,我们可以用它在极早期判断癌症, 也可以用它在茫茫人海里寻找犯人,但是要我说你能写一个小程序取悦女朋友, 你就不一定能信, 这一招叫艺术风格变换,就是你点击一下,就可以把你女朋友的大头照换成一个毕加索的后现代艺术作品(当然是取代还是找打要看你的艺术品位)。

入行需谨慎

艺术风格迁移是一个古老而现代的主题 , 多少艺术家为了描摹他人作品而竞折腰。 在出现了IT之后, 它也成为adobe之类的公司竞相追求的宠儿,却始终进展缓慢。

而深度学习, 却可以轻轻点击自动完成这个任务, 铁哥在此给大家拆拆招 , 看如何玩转神经风格迁移。

我们说,神经风格迁移就是把一张图片的内容和另一个图片的风格合成的一个方法,比如说你给出一个猫的图片和一个梵高的自画像,就可以生成一只梵高的猫。

在深度学习之前,机器视觉的工程师就尝试用各类神奇的滤镜提取图像的纹理信息,抽取取来的纹理图在经过某个变换放回到原图片里,就得到了一个新的风格的图片。 

深度学习所作的事情,是把这个东西给自动化。我们利用卷积网络的深层结构提取的信息,来替代之前的各种滤镜。 

首先,卷积网络不仅能够做猫狗识别这一类分类任务,在其中间层里,其实包含了丰富的有用信息,而这些信息,正是我们做风格迁移的基础。如果你可视化CNN的各层级结构,你会发现里面的每一层神经元的激活态都对应了一种特定的信息,越是底层的,就越接近画面的纹理信息,如同物品的材质。 越是上层的,就越接近实际内容(能说出来是个什么东西的那些信息),如同物品的种类。

研究人员提出的一套可视化CNN的方法,把深层的内容通过反卷积映射回图象,好比你关心什么,就给你投影出来(Visualizing CNN 2014 )。

底层神经元关心画面的材质

深层神经元关心物品的种类

那么好了,风格迁移不就是这么简单吗,把一张图片的底层信息和另一张图片的上层信息合成一起不久可以了吗? 用适当的数学方法,我们可以在卷积网络的中间层里左手提取图象内容有关的信息,右手提取图象风格有关的信息。

用中间层的信息恢复的内容,可以看到不同层里里都可以找到风格和内容有关的信息, 但是层次越深, 具体的信息就越少, 而“实体” 的概念轮廓犹在

 

看起来是的,我们可以通过一个已经训练好的CNN, 把一张风格图片和内容图片的信息都抽取出来, 然后拼在一起!

为什么这里要用一个已经训练好的CNN呢? 一个用分类任务训练好的CNN,通常已经具有了对世界大多数图像提取信息的能力, 因为图像传递信息的底层机制是想通的。 我们把这个网络连接的权衡直接共享过来, 图片一导进来, 网络就可以生成直接可用的特征! 这正是迁移学习的原理。

这里我们导入一个已经训练好的VGG19网络,一种非常流行的CNN图像分类框架

所有深度学习和机器学习,都是预先设定好一个损失函数,然后在进行梯度回传,这里也不例外,我们可以通过设定合理的损失函数,来解决问题。这个损失函数,正是一种能够测量生成图片与风格图片,内容图片距离的函数。 

来,兄弟们,看我们如何设定这样一个函数。既然我们的深度卷积网络可以做到测量与内容有关的特征, 那么我们只需要在这个层次上找一下特征向量的距离就好了。 

图像无非是高维空间的一个点,通过神经网络变换再经过特定降维方法处理后我们可以给它转化成二维曲面上的一个点, 我们会发现,在这个世界里, 狗在狗的国度 , 猫在猫的国度。 而我们只需要度量不同图像的空间距离,就测量了内容的相似度。

哇, 这不就是定义距离的公式吗!

然后呢,如何搞定风格,风格通常是一个艺术家眼中主关的有点虚无缥缈的概念,也就是我们通常说的感觉, 比如梵高或者莫奈的画,你没有经过艺术熏陶也可以得来。

而在深度学习的角度下, 这种感觉却发现与不同神经元活动的相关性有关! 也就是说,风格是深度网络神经元活动的某种统计特性! 悄悄的,我们把艺术和数学对接上了。 统计果然是上帝的语言啊有木有!

这里我们借助一个叫gram矩阵的数学工具,它通过测量同一层卷积输出不同通道之间的相关性(计算不同通道间的相关性,组成一个矩阵)给出一个对风格的度量。然后,我们在测量一下风格之间的距离不就行了吗?

 

把CNN某一层对应不同特征的神经元像摊煎饼一样摊开, 然后计算之间的相关性

得到一个矩阵,矩阵的每个元素对应不同特征间的相关性

 

这个损失函数就是gram 矩阵之间的距离!

注意,衡量风格之间的距离, 我们是把不同网络层级间的gram矩阵的距离都计算一下加在一起,这样可以把不同层次度量的东西综合起来 。

好了,到这一步, 大功告成, 把两个损失函数叠加在一起就好了。

 

目标函数的设计学问可大了,改变a和b的比例就能造成很多区别,大家注意风格图片的比例越高,图像就越纹理化。

风格的权重变大的时候, 那图像就变成了意大利瓷砖!

 

 

然后我们可以做什么呢? 梯度下降!但注意,这里我们优化的目标不是网络权重而是图像本身,这样我们就大功告成了!

 

当然这里说的只是风格迁移的一种, 这种方法的优点是通俗易懂, 而缺点是速度很慢。 还有一个方法,是借用生成网络,直接给搞出来, 这个方法更快速, 更加适合工业封装。 我来给大家展示一下这个方法的实质。

像不像GAN的结构!

哈哈,这样我们就可以完成一幅艺术作品交给家里领导了,但是不要忘记哦, 这件事给我们的启示绝不止这一个呀。 它给我们启示的是,我们深层神经编码的机制里,深度学习的踪影, 你对风格的认知,其实是和内容的认知一样, 是可以量化的,而不像某些艺术家所言, 完全主观,与数学无关。 不仅可以量化,而且这个信息是可以独立被提取的, 这种信息不是存在于某个神经元之上, 而是分布式的存在于多级神经网络的不同尺度之间, 通过每一层神经元的统计规律表达。

虽然我们尚不知道这些猜想是否正确, 他们我们人类深奥的视觉处理机制提供了一种聪明的理解方法。

 

附: 代码, 看看用pytorch做出来是多么简洁:

计算内容损失函数

计算风格损失函数

设定模型主体!

训练过程!

 


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

相关文章

图像风格迁移-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,…

arm64 smmu 驱动笔记

设备StreamID:sid struct iommu_fwspec {const struct iommu_ops *ops;struct fwnode_handle *iommu_fwnode;void *iommu_priv;unsigned int num_ids;u32 ids[1]; //ids保存的某device使用的streamID }; 通过iommu_fwspec_add_id函数设置: stru…

ARM_SMMU_下

SMMU驱动代码分析 本文主要分析linux kernel中SMMUv3的代码(drivers/iommu/arm-smmu-v3.c) linux kernel版本是linux 5.7, 体系结构是aarch64 SMMU的作用是把CPU提交给设备的VA地址,直接作为设备发出的地址,变成正确的物理地址,访问到物理内…