实战教学
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种风格模型,可以直接进行模型调用完成图像转换。