CartoonGAN
2. 方案简介
2.1 算法流程介绍
2.1.1. 模型或算法背景
- 年份 :2018
- 来源 :Chen Y, Lai Y K, Liu Y J, 2018. CartoonGAN: Generative Adversarial Networks for Photo Cartoonization[C/OL]//2018 IEEE/CVF Conference on Computer Vision and Pattern Recognition. 9465-9474[2025-06-16]. https://ieeexplore.ieee.org/document/8579084. DOI:10.1109/CVPR.2018.00986.
- 问题背景 : 将真实世界图像自动转换为卡通风格图像(Photo Cartoonization),是一项具有技术挑战性与趣味性的任务。通用的图像风格迁移方法(如CycleGAN)在卡通化任务中往往表现不佳,原因在于卡通风格具备独特的表现形式:清晰的轮廓线条、平滑的色彩块和极简化的纹理结构,这要求模型具备较高层次的抽象与简化能力。文章所提出的
CartoonGAN针对卡通化任务定制化设计了两个损失函数,能有效学习从真实世界照片到卡通图像的映射关系。在当前二次元文化高速发展的时代背景下,卡通风格图像的自动生成或将成为视觉内容创作与商业应用的新热点。无论是在漫展现场的即拍即转卡通头像服务、景区游客打卡生成纪念卡通图等线下消费场景,还是在社交媒体内容创作、短视频美化、虚拟形象定制等线上场景中,图像卡通化都呈现出巨大的消费吸引力与传播潜力。因此,开发高质量、实时高效的图像卡通化模型不仅具有学术价值,更具备极高的商业转化空间与市场应用前景。
2.1.2. 算法流程梳理
2.1.3. 模型结构上的创新与意义
GAN框架由生成器$G$和判别器$D$构成,生成器$G$被训练以生成让判别器无法识别的输出,判别器$D$判别图像来自真实目标还是合成的。CartoonGAN中的生成器$G$由降采样模块、8个残差块组成的风格转换模块以及上采样模块组成,而判别器$D$则仅由简单的7个卷积操作组成块级判别器,因为卡通风格图像的判别依赖于图像局部特征而非全局特征。在训练完成后,CartoonGAN仅保留生成器$G$部分用于风格转换。 针对图像卡通化任务,CartoonGAN引入了语义内容损失$L_{con}$,在VGG网络的高层特征图上施加稀疏性约束以确保转换后的卡通图像仍然保留原始图像的语义信息,很好地应对了原图像到卡通图像的巨大风格差异;针对其他通用GAN在卡通化任务中出现的轮廓线条不清晰的问题,CartoonGAN引入了边缘增强对抗损失$L_{adv}$,让判别器$D$能更好地对边缘信息进行检查。
2.1.4. 前后处理
前处理包括将原图重采样到长边为320且长宽比不变、RGB转换到BGR并归一化至[-1,1]; 后处理包括BGR转换到RGB、限制数值区间在[-1, 1]以及动态范围复原至[0, 1]。
2.2 硬件资源分配
![]()
PLin工程中图像输入由ImageMake Session完成,归一化和通道转换在PL端使用FPGA资源完成; 网络前向时使用NPU进行计算; 后处理均由PS端CPU进行计算。
3. 模型导出说明
3.1 NPU加速部分
CartoonGAN模型的生成器$G$较简单,全部由卷积操作及激活函数、Norm构成,都使用NPU进行计算。
3.2 导出过程修改点
源码中使用作者自己实现的InstanceNormalization类进行Norm操作,算子预检时有pow、div(张量/张量)等算子不支持,故替换为
nn.InstanceNorm2d,affine参数由权重中获取并手动进行affine操作。
class InstanceNormalization(nn.Module):
def __init__(self, dim, eps=1e-9):
super().__init__()
self.norm = nn.InstanceNorm2d(dim, affine=False, eps=eps)
self.scale = nn.Parameter(torch.FloatTensor(dim))
self.shift = nn.Parameter(torch.FloatTensor(dim))
self._reset_parameters()
def _reset_parameters(self):
self.scale.data.uniform_()
self.shift.data.zero_()
def forward(self, x):
# 使用 InstanceNorm2d 做标准化(无affine)
x_norm = self.norm(x)
# 手动加 scale 和 shift
scale = self.scale.view(1, -1, 1, 1)
shift = self.shift.view(1, -1, 1, 1)
return x_norm * scale + shift
3.3 1_scripts中的脚本运行说明
0_infer.py:python 0_infer.py使用源码进行推理,可自由选择图像style。结果放在1_scripts\0_infer_output。可通过--style参数选择具体风格,包括Hayao/Shinkai/Hosoda/Paprika。1_save.py:python 1_save.pytorchscript导出模型,运行一次程序会导全部4种图像风格的320x320以及352x640两个大小的模型。2_save_infer.py:python 2_save_infer.py使用导出后模型进行推理,可自由选择图像style。结果放在1_scripts\2_save_infer_output。可通过--style参数选择具体风格,包括Hayao/Shinkai/Hosoda/Paprika。
4. CPU处理部分C++工程移植说明
- Psin工程中CPU环节负责前后处理。
- 由于生成模型特殊性,未对PSin工程进行定量测试,仅定性判断图像生成结果,见下文。
- 各环节耗时,取
适配阶段仿真耗时结果,一次运行取14张图像耗时平均。CPU:i7-11800H@2.30GHz
前处理 模型推理 后处理 8.45ms 3699.67ms 0.77ms
5. ICRAFT编译
-
编译说明
2_compile中提供
compile_sequential.bat与compile_all.bat。compile_sequential.bat依次compile所有config。compile_all.bat同时compile所有图像风格/大小的模型,对CPU有要求,性能欠佳可能会卡死,运行5min左右。运行后会打开8个cmd窗口,请不要惊慌😊。也可以icraft compile config/xxx.toml进行单独编译
-
使用运行时仿真得到的仿真效果
可以看到解析后模型的生成结果在边缘处不够清晰,问题在于框架前处理将长边设定为
320并保留长宽比,而仿真时将图像重采样到320x320。在plin工程上对输入的1080x1920原图采用352x640大小固定长宽比的重采样或能有效解决长宽比被改变的问题。原图 框架动态图推理 导出静态模型推理 解析组件仿真 量化组件仿真 指令组件仿真 





-
8bit,16bit,混合精度的精度测试结果
由于生成模型特殊性,此处不做定量测试。以下是不同量化策略下量化组件仿真结果。可以看到,16bit方式量化下结果均没有问题,而 8bit量化与混合精度时存在不同程度问题。saturation=kld时大块图斑会出现异常纹理,ems和null结果在全局出现颜色失真。
Saturation 8bit 16bit MixPrecision kld 


ems 


null 


在当前二次元文化高速发展的时代背景下,卡通风格图像的自动生成或将成为视觉内容创作与商业应用的新热点。无论是在漫展现场的即拍即转卡通头像服务、景区游客打卡生成纪念卡通图等线下消费场景,还是在社交媒体内容创作、短视频美化、虚拟形象定制等线上场景中,图像卡通化都呈现出巨大的消费吸引力与传播潜力。因此,开发高质量、实时高效的图像卡通化模型不仅具有学术价值,更具备极高的商业转化空间与市场应用前景。
