技术原理
1. 图像生成编辑类技术发展及应用
学术界自2000年左右开始对图像生成进行研究。日常采集到的图像数量非常有限,而且采集成本相对较高。因此,我们希望计算机能够自动化生成新的图像。但是,如果图像内容随机生成,无法控制生成结果,则图像依然不可用。
因此,学术界更多研究的是内容可控的图像生成。内容可控指可以通过控制生成内容的布局位置或者风格等,比如输入草图/布局、语义/纹理或语言文字,输出内容可控的图像。
AIGC在视觉模型上的呈现是图像生成任务,是AI驱动的内容生成,其任务本质也是按照人类所构思的内容自动化生成图像数据。
图像生成从2000年至今也有了非常大演进。模型本身越来越强大,能够生成非常高质量的图像,并且通用性越来越好,可以适用于很多下游的编辑类任务。可控性方面,会朝着多模态、越来越灵活的方向演进。此前的可控生成大多基于语义的layout或condition进行生成。而现在的多模态生成可以输入语言文字描述想要的内容来生成图像。
从图像生成的发展历史来说,可以分为两个阶段。
第一阶段是传统的纹理合成模型,不涉及网络算法,主要通过非参数化的采样融合的方式将原画拓展为目标图像。其本质非常简单,将本身有图案、有纹理的图像作为源素材。如果想要创建新的图像,会从原始的纹理上采源块进行拼接,再优化其接缝,得到比较好拓展的图像效果。
该类方法的生成质量非常高,但是存在一些缺陷,它更适用于各向同性的纹理,对于结构性的纹理很容易发生纹理错乱、结构丢失等情况,并且依赖在线的迭代优化过程;另外,因此基于在线在迭代优化的方式,时效性较差。
第二阶段,2016、2017年左右,深度的图像生成模型开始被广泛应用。业内会对纹理进行参数化的建模,从最初基于CNN的深度神经网络,到后面生成式对抗网络,发展到现在比较火热的基于多模态大规模的预训练模型。
该类模型的应用场景非常广泛,比如图像内容创作、图像修复、照片美化、人像编辑等。
比如能根据绘制的涂鸦生成对应的真实图像,比如可以选中想要替换的区域,自动进行图像的填充,也可以更换照片风格,可以改变照片中人物的年龄、发型或者人脸属性等。
2. AI人像漫画效果演示
AI人像漫画指:通过对指定的人像照片进行夸张的艺术风格转换,得到人物的二次元卡通形象、手绘风格或者虚拟3D形象等一系列风格化的结果。
传统艺术肖像画的绘制过程中需要一步一步地绘制,非常耗时,成本较高。而AI项目的形式可以实时一键生成不同的风格效果,非常快速。
对于视频,可以对其进行逐帧地拆帧,得到视频的风格化效果,需要帧间的连续处理。
3. AI人像漫画相关技术解析
Ai人像漫画主要基于图像生成类模型,因此随着图像生成模型的发展,AI人像漫画也经历了从神经风格迁移GAN图像翻译,再到预训练图像生成模型,最后到如今的多模态大规模预训练模型的发展。
神经风格迁移的原理为:用深度神经网络生成风格化图像,通过捕获到的图像中的内容表征和风格表征对输出图像做约束。比如输入一张内容图像和一张风格图像,最后输出既有内容又有指定风格的图像。
输入内容图像后,通过image Transform Net得到一张输出图像。那么,如何实现想要的风格?可以基于VGG网络进行feature的提取。某些层的feature更能表达content的特征,而某些层的feature更能表达风格上的表征。
因此,会将生成的结果输入到VGG网络,分别提取其内容表征和风格表征,同时将风格图像也输入VGG网络,提取其风格表征,使风格图像的风格表征和输出图像的风格表征保持一致,同时输出结果的内容表征和内容图像保持一致。
神经风格迁移的缺点在于难以产生非常夸张的几何形变,因为它主要基于全局level,对于所有的feature、所有图像中的patch都平等对待。
随着GAN的广泛应用,AI人像漫画技术逐渐转向基于GAN的图像翻译。原理为:
GAN是一个生成式的对抗网络,生成器能够将一张噪声生成图像,判别器会判别生成图像的真伪,我们会为其提供真实的图像数据分布作为real的样本,提供生成器的图像作为假的样本,通过生成器和判别器不断博弈的过程,生成可以以假乱真的图像。
Image-to-image translation方法主要基于conditional GAN,不仅可以使用噪声到图像的生成,也可以对其设置condition,比如图像编码的空间,通过encoder加decoder的结构加入一些image的condition。
而Image-to-image translation主要为从一个domain到另一个domain的过程,比如可以实现语义图像到真实图像、白天到夜晚、边缘图像到真实图像的效果,将前面的image作为原域的图像,将想要输出的图像作为目标域,学习两个域之间的转换过程,需要有domain a和domain b这样成对的数据。
CycleGAN的出现将训练的要求进一步降低,训练数据中不再需要成对的数据,只要domain a的一堆数据和domain b的另外一堆数据,通过循环一致性的原理,比如将a中的图像通过转化器映射到b,b再传回a,重建结果尽量保持一致,从而实现不需要非成对数据之间的translation。
而卡通画人物本质上是photo-to-cartoon的translation,原域是一堆真实照片,目标域是很多卡通图像,希望学习两个域之间的关系。而基于CycleGAN的思想,也不再需要成对的数据,只需要一堆有真实人脸的数据以及一堆卡通人头的数据即可学习两个domain之间的映射关系,即可实现相应的转换。
基于GAN的图像翻译需要注意三个点:
- 训练数据:需要一堆现实数据以及一堆卡通数据,学习现实域domain到卡通domain的映射关系。
- 网络结构:现有网络大多基于encoder-decoder的结构,要学习从现实域到卡通域的转换,需要先对内容图像进行编码,编码到空间,再通过decoder解码器将其解码到卡通域空间。如何保证内容feature在编码器中编码成了内容的特征?其一,卡通的图像都为同一个风格,先学习编码过程,因为卡通数据都有对应的domain,在decoder网络会自动将风格化参数会在decoder生效,生成卡通的结果。其二,对于风格可控的生成,需要将想要参考的风格本通过编码的形式编码到空间,得到风格编码,将风格编码和内容的feature一起整合到解码器中,再生成对应的结果。
- 约束损失:如何约束生成想要的效果?对于上述第一种方式,会通过VGG的编码器提取内容的表征和纹理的表征,通过VGG层面上的feature保持分别保持一致,进行约束。content loss内容约束希望生成图像的内容表征和输入的图像保持一致。对于style的表征,可以输入style的图像,保持style上的一致性。style loss的另一方式是使用判别器控制,对判别器输入很多真实的样本,告诉判别器这是卡通域的图像。生成结果作为fake样本输入到判别器,用判别器的监督形式可以让输出的结果趋近于卡通的效果。
基于预训练生成模型本身是从噪声生成一张图像。如果希望对特定的内容进行生成,需要加入内容的条件控制,主要包括StyleGAN和diffusion model。
StyleGAN能够基于噪声z,利用generator生成模拟现实域的真实人脸图像。通过transfer learning少量的卡通样本,可以对模型进行迁移学习,从而适配到卡通域。模型经过adaption之后能够生成逼真的卡通样本。上述过程是z到卡通图像的生成。
如果想要实现一张图像到卡通的转换,需要将图像通过编码器编码到隐空间中,找到隐空间中对应的隐变量,再将其generator生成对应的结果,上述过程被称为inversion的过程。
difusionmodel的原理也是从噪声生成一张图像。最广泛应用的是Latent diffusion models。原始的扩散模型每层的分辨率都一样,显存训练难度非常大,LDM相当于做了降维,首先会训练Auto-encoder的结构,将图像映射到隐空间,在feature间学习加噪和去噪的过程,因此成本会更小,也是现在较为常用的结构。
基于diffusion model可以注入很多condition,包括semantic、Text、Image,和z一起contact,或者再从unit中间层进行注入,达到控制的效果。
从应用层面上,使用diffusion model之后如何生成人像风格化效果?比如输入人名+风格生成对应的效果。
图生图的SD可以基于SDEdit方法实现,找到原始的content image,在隐空间中不断加噪,然后做overlap,进行隐分布的重合,从而学习到两者之间的映射关系,得到content image。最后的image的相当于加入内容condition。该种形式下,可以为其提供一张content image,再输入风格控制文本,通过多模态输入生成对应的风格图像。
另一种方式为,不提供Anime style,将diffusion model直接适配到风格化的域,使模型变成能够生成对应卡通风格的model。此时只需输入一张content image也能生成对应的风格化结果。
然而,上文提到的集中方法都存在一些缺陷。
基于GAN的方法:学习domain和domain之间的变换,而本身的卡通图像类非常依赖于训练数据的规模,往往会因为数据量不足在复杂场景下的泛化性不够,比如无法处理配饰或面部遮挡,比如墨镜、口罩。遇到在数据中找不到的内容时,非常容易产生artifacts。并且因此导致生成效果不稳定,质量不足。
基于预训练生成的模型:最大缺陷在于内容的保证性不够。它能够生成非常逼真的效果,但是对一张图像进行转换,首先需要将image embedding到隐空间中,其中可能存在一定编码误差损失。因此,虽然转换质量可以非常高,但一致性难以保证。同时,StyleGAN模型只仅针对头部转换,难以实现全身/全图转换。
DCT-Net(Domain-Calibrated Translation for Portrait Stylization)是基于预校准的图像翻译模型,目标是基于百张小样本进行风格化训练,实现高质量的风格转换结果。
如上图,第一列是输入图像,a、b、c是不同的风格样本,基于不同的风格样本进行模型训练从而生成不同风格的转换图像。
DCT-Net具有三个显著优势:
- 高保真能力:面部相似性、配饰、身体、背景等保留能力更强。下图中左中右分别为输入、基于styleGAN类方法的输出以及基于DCT-Net的输出。
- 强泛化能力:复杂场景中的遮挡,比如戴口罩、戴眼镜以及稀有姿态均能实现比较鲁棒的转换效果。
- 可拓展能力:体现在两方面。其一为全图的精细化转换,此前很多方法只针对头部的转换,得益于本身内容的高保留能力,只需在头部数据上进行训练,即可实现全图像的精细化转换;其二,多种风格普适。模型结构适用于各种风格,可以简单地拓展到各种风格上。
卡通化任务可以理解为模型去学习源域到目标域转换的过程。源域由大批量真实照片构成,特征丰富多变。而目标域是收集到的卡通头像,因为大多是人工制作,数量非常有限且仅有局部观测结果,例如卡通头像。
由于目标域仅有少量风格样本,因此可以看作一个few-shot learning问题,在转换中因目标域中的数据偏置的问题极易导致过拟合,从而产生Artifacts。
而DCT-Net的原则是:calibration first,translation later。先对域进行校准,再学习图像翻译过程。
如上图所示,最左侧蓝色为源域,有非常多均匀的分布,而目标域的空间只有少量几个样本。传统的模式是直接学习两者之间的转换,会因为过拟合的问题产生非常多artifacts。
而DCT-Net首先会对目标域做校准,希望其内容和feature能够更丰富,使分布尽可能达到与source domain一样的状态。主要包含两步骤,分别是内容的校准和几何的校准。
内容校准主要通过transfer learning做,源域内容特征丰富,可以用迁移学习的思想将源域的特征迁移到目标域,使其能在目标域上产生内容更丰富的特征。如右二图片所示,原始特征只有三个星星,而三角形是现在产生的更多特征。
下一步进行几何校准,包括平移、翻转等偏移上的变换,产生了四角星(右一图),特征更强。
最后学习从源域到校准之后的目标域之间的转换关系,学习会变得非常容易。
网络结构包括内容校准网络CCN网络、几何拓展模块GEM、纹理转换网络TTN。
训练主要分为两个stage:
- stage1:训练内容校准网络,进行内容的校准。
- stage2:训练纹理转换网络,学习真实人像到卡通照片的转换关系。
几何拓展只需几何的增强操作,不需要进行网络参数的训练。
如上图所示,比如同样一个噪声z,分别通过真实的生成器生成对应的结果以及通过adaption之后的卡通生成器生成对应的结果,两者之间的距离是最接近的,因为网络会自动调整部分的数试适应风格的转换。但是可以明显看到,该方式依然会存在非常多内容的丢失,比如脸型细节等。因为本身的卡通图像会有一定的数据偏置,导致在adoption过程中很容易发生内容改变。
而纹理转化网络则希望能够进一步提升其局部纹理的保留能力。经过上述阶段之后,用适配好生成器能够产生非常多的卡通样本,但更多的只是global的domain feature,与原始域的feature并不对应。比如source domain域中的特征是五角星,而结果域中是四角星,缺少局部的映射关系。
因此在第二模块中,我们会通过U-Net结构专门将global domain之间的映射转换为局部的纹理映射关系。U-Net包含很多相连的层,有非常强的内容保留能力。使用局部关联非常强的网络进行两个domain之间的学习,可以学到局部的纹理更细致的转化效果。
此处主要通过unsupervised的方式学习,不会使用卡通样本去监督生成,而是使判别器学习到卡通domain的特性,以非监督的方式学习到卡通转换效果,该过程利用局部捕获能力强的纹理转换网络学习global feature的映射关系,使得内容保留能力得到大幅提升。
得益于内容保留能力的增强,对背景内容的转换能力也得到了增强,从而可以轻易拓展到全图像。
基于预训练模型方式做卡通化推理时间较长且模型相对较重。而该方式虽然训练了内容校准网络以及纹理转换网络,在推理阶段时只需将图像输入后者,即可推出对应的结果,快速且轻量。
上图展示了DCT-Net方法的生成效果。
对比于其他学界的SOTA模型,DCT-Net方法可以更好地进行内容的保留,同时也最大程度上减少artifacts以及不真实纹理的生成,在指标上也是明显优于其他SOTA model。
上图为各类模型与DCT-Net的效果对比。
DCT-Net相对于基于image condition的生成式卡通化模型,其artifacts更少,内容保留能力也更好。生成式模型的主要作用是生成,image condition只是作为微小的condition,没有较强的约束能力,因此其内容保留能力相对更强,能够生成的质感是更好,几何形变的程度更大。
DCT-Net在视频上的生成时,得益于其内容保留能力足够强大,即使不做帧间的平滑操作,只是将视频帧拆出,生成好之后再合成视频,也能生成相对比较连贯的效果。
实战教学
1. 搭建创空间应用
上图为创空间页面。
右上角点击创建创空间,进入创建的页面配置。
填入上述配置内容。license可以按自己的需求选择公开或者非公开。接入SDK指如何在前端进行布局的接入,选择默认的Gradio,点击创建创空间。
上图为创建好之后的界面,展示了如何通过git将线上文件copy到本地,以及如何进行代码编辑,将编辑好东西再上传。支持webUI上直接上传。
空间文件已经默认初始化了readme,用户只需要填写入口文件。
关于如何创建,可以访问文档中心-创空间创建和搭建,里面提供了详细的教程,包括入口文件的撰写示例等。
图片输入输出示例代码如上图所示。首先引入Gradio的Python包,可以直接将算法模型封装为webUI的形式。定义了关于图像处理的功能函数,相当于对一张图像旋转45度,声明了关于demo的类,demo的具体内容为:首先初始化gradio的界面,要处理的功能函数是image_mode,输入是一张图像,处理类型为pil的模式。输出为一张image。
demo声明完成之后,启动demo,即可生成上图下方的界面。
接下来,编写入口文件。本示例将采用Notebook编写。
人像动漫画的模型要依托于ModelScope上现有的人像动漫画算法模型,可以直接打开模型库-卡通化专题-模型应用,打开DCT-Net人像卡通化模型的卡片。
模型详情页展示了各种风格的模型,可以点击图片链接直达。下方提供了模型的描述、如何使用、如何进行模型的推理以及相关代码。
点击右上角”Notebook快速开发“,Notebook上已经提供了ModelScope的包,可以直接调用。选择CPU环境。
可以选择Notebook直接进行代码的开发,也可以打开Python的控制台。
编辑入口文件。
先导入ModelScope相关函数进行算法的处理。初始化卡通化的pipeline,task指定为image_portrait_stylization,规定所有代码都走一套模型初始化以及模型推理的flow。所有DCT-Net系列的模型都使用该task,只是modelID不一样,可以指定不同的modelID控制不同风格的生成。modelID在model card界面左上角,直接复制即可使用。
example图像可以通过本地上传的形式,也可以通过给定的一张图像进行处理(点击左上角的上传标识,即可将图片上传至当前工作目录下)。
定义好demo后,通过demo.lunch起订。写完app.python之后,建议在本地将代码调试好再发布到创空间,比较省时,而且会展示对应的错误信息。
通过pip install gradio安装gradio包,然后使用python app.py启动入口文件。
最终生成的创空间页面如上图。
可以直接点击左下角的图片进行转换,也可以拖动本地图片至输入框。
点击submit即可进行图像转换。初次运行时会进行模型的下载,因此速度较慢。
切换为3D风格,更换代码里的modelID,重新起应用。点击图片,点击submit,结果如上图。后台推理代码在推理完成后会显示“infer finished”。如果有任何报错,会在后台显示。
点击控制条左上角file-downlod,将入口文件下载至本地。然后进入创空间的空间文件,点击上传文件,将入口文件上传。再上传一张本地的素材文件。
readme里面包含详细的接口文档,填写domain的类别、tags,数据集和关联模型可选填。
如上图所示,domain类型体现为左下角的“多模态”,tags体现为“text2image generation”、”diffusion model”。可以通过上述关键字进行搜索,更容易找到模型。
关联模型将会体现在如上图右上角。
部署配置指明希望用什么机器部署服务,下面为入口文件,本示例即app.py,还有CPU核数、内存以及GPU的个数、需要的显存等。
可以从其他模型现有的readme文件里复制粘贴至本示例。点击确定,提交修改。点击上线空间展示-确认上线。
上线后的创空间如上图。
也可以创建风格可选的创空间。
与上一示例最大区别在于上述代码。加入了风格选择的radio于组件,与imageinput一起放到input里。
需要对不同风格进行映射,如上图。
不同的风格可以通过上述代码组合成不同的modelID。将modelID替换到的pipeline的初始化即可。
AI人像视频多风格漫画相比图像多了拆帧的过程。
inference函数会进行视频的读取和拆帧的操作,通过不同组合得到不同的modelID,通过ModelScope自带的包直接进行卡通的推理,代码更简洁。最后对每一帧的数据进行处理,做拼接,合成视频。
2. 模型推理实验
点击Notebook快速开发,因为设计到模型的训练,因此需要使用GPU环境。
复制model card上推理相关代码并运行。
首先引入需要使用的第三方包,比如opencv、ModelScope上关于卡通的包。初始化pipeline,task设为image_potrait_stylization,传入想要使用的modelID。
将URL的路径输入到pipeline,能够得到结果,将结果翻译成对应的outputimage,并保存为result.png。
运行完成后,点击左侧目录的result.png即可查看结果。
下载原始输入图像,如上图所示。
下文将演示如何在现有的模型基础上训练,上图为相关代码,此处需注意环境要求。
另外,Notebook本身的算法环境需要兼容非常多模型,卡通的训练内置的Numpy版本与tensorflow版本会存在不兼容性问题,因此需要预先进行Numpy版本的调整,可以通过执行pip install numpy=1.18.5来实现版本更新。安装过程中如果出现冲突问题,并不会干扰到训练过程。
训练会应用到ModelScope对应的卡通训练器、数据集以及推理代码需要用到的包。
首先声明modelID,建议选择与期望的模型风格最接近的模型作为初始版本,基于该版本做训练。加载一个在ModelScope上传好的数据集,本示例选取Mini版本,数量很小,运行非常快。取数据集的train字段,data_dir为数据集的存储路径。
声明data_photo和data_carton两个参数,前者为现实的人脸数据,由data_dir加face_photo构成,后者为卡通的人脸数据,由data_dir加face_carton构成。word_dir指实验的工作目录,在哪个目录下保存实验的中间结果。max_steps指训练时网络的最大迭代次数,实际场景建议设置为30万左右。
初始化trainer,传入modelID,声明在哪个model的基础上进行训练,会将模型自动拉到当地的目录下。因为已经做好了数据集,可以不传到ModelScope上,而是在本地进行加载,只需将data_photo和data_carton替换为本地路径即可。
运行代码。上图高亮部分显示了本次训练从哪个模型开始进行fintune,最下方显示了迭代此处。
运行完成后,打开工作目录文件夹查看输入图像与输出图像。
训练后的模型的checkpoints会被保存下来,为了方便实际使用时的部署,会将其转换位freeze好的pb文件,使用时无需重新加载原始的网络结构,会自动固定化到pb文件。因此可以对模型进行导出,更方便后期大批量部署。
模型导出代码如上图。
首先要指定训练完成的checkpoint在哪里,参数为工作目录、save_models以及model-(epochs个数)。
比如,epoch个数为0,则会找到model-0的相关文件,如上图所示。
pb_path指的希望将转换后的pb存储到哪里,因为推理时还包括其他资源的依赖,因此将其将存储到原始的finetune model目录下,并替换掉原始的carton-h.pb文件,即可直接使用原始的资源进行推理。
然后初始化卡通的模型导出器,调用冻结好的pb文件命令,输入的参数为训练好的ckpt的路径以及希望freeze的pb路径。
运行代码,结果显示模型已经存储至指定目录下,可直接使用该pb文件进行推理。
使用上述pb文件进行推理,代码如上图。
点击查看result.png,如上图。
训练自定义风格的卡通人像目前尚且存在一定的难度,主要受限于训练的数据集准备。卡通数据的质量越高,对训练结果的帮助越大。
DCT-Net本身包含两个训练step的,在ModelScope上主要提供的是local的translation,即最后的一步的模拟转换网络训练,不包含关于前期域的校准、内容的校准以及生成更多的卡通样本。
更多进阶的操作,建议参考GitHub上的DCT-Net项目。上面提供了完整的代码的,包含如何针对自定义风格进行数据的准备,也可以用训练好的效果较为稳定的模型去生成样本,因为前期的百张样本决定了后期的转换质量。
另外,收集的风格样本不仅是人头区,还会有半身像、全身像,要从中提取出适用于数据的人脸,也建议对原始的photo数据进行面部的对齐校准,使得结果更准确。仓库也提供了基于StyleGan的内容校准相关代码,可以通过迁移学习生成相应的卡通样本等指引。
ModelScope上集成的是最终的纹理转换模型,前期的数据准备仍有较多工作需要进行,训练过程还相对复杂。因此,我们更推荐直接使用公开的推理模型,我们提供了7种风格模型,可以直接进行模型调用完成图像转换。