---
title: CartoonGAN
canonical_url: "https://www.modelscope.cn/models/AIBSECO/CartoonGAN"
md_url: "https://www.modelscope.cn/models/AIBSECO/CartoonGAN.md"
repository: AIBSECO/CartoonGAN
last_updated: 2025-11-19
pipeline_tag: image-portrait-stylization
tasks:
  - image-portrait-stylization
library_name:
  - pytorch
frameworks:
  - Pytorch
downloads: 8
stars: 0
---

# CartoonGAN

> CartoonGAN - AIBSECO 在 ModelScope 开源的模型。年份 ：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].…

- **Repository**: AIBSECO/CartoonGAN
- **Tasks**: image-portrait-stylization
- **Downloads**: 8
- **Stars**: 0
- **Last updated**: 2025-11-19

Source: https://www.modelscope.cn/models/AIBSECO/CartoonGAN

---

# 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](https://ieeexplore.ieee.org/document/8579084). DOI:[10.1109/CVPR.2018.00986](https://doi.org/10.1109/CVPR.2018.00986).
> - **问题背景** ：
> 将真实世界图像自动转换为卡通风格图像（Photo Cartoonization），是一项具有技术挑战性与趣味性的任务。通用的图像风格迁移方法（如CycleGAN）在卡通化任务中往往表现不佳，原因在于卡通风格具备独特的表现形式：**清晰的轮廓线条、平滑的色彩块和极简化的纹理结构**，这要求模型具备较高层次的**抽象与简化能力**。文章所提出的 ``CartoonGAN``针对卡通化任务定制化设计了两个损失函数，能有效学习从真实世界照片到卡通图像的映射关系。
> ![CartoonGAN效果展示](./assets/CartoonGAN.png)
> 在当前二次元文化高速发展的时代背景下，卡通风格图像的自动生成或将成为视觉内容创作与商业应用的新热点。无论是在**漫展现场的即拍即转卡通头像服务**、**景区游客打卡生成纪念卡通图等线下消费场景**，还是在**社交媒体内容创作、短视频美化、虚拟形象定制等线上场景**中，图像卡通化都呈现出巨大的消费吸引力与传播潜力。因此，开发**高质量、实时高效**的图像卡通化模型不仅具有学术价值，更具备极高的商业转化空间与市场应用前景。

#### 2.1.2. 算法流程梳理

> <img src="./assets/al.jpg" >

#### 2.1.3. 模型结构上的创新与意义

> GAN框架由生成器$G$和判别器$D$构成，生成器$G$被训练以生成让判别器无法识别的输出，判别器$D$判别图像来自真实目标还是合成的。CartoonGAN中的生成器$G$由降采样模块、8个残差块组成的风格转换模块以及上采样模块组成，而判别器$D$则仅由简单的7个卷积操作组成块级判别器，因为卡通风格图像的判别依赖于图像局部特征而非全局特征。在训练完成后，CartoonGAN仅保留生成器$G$部分用于风格转换。
> 针对图像卡通化任务，CartoonGAN引入了语义内容损失$L_{con}$，在VGG网络的高层特征图上施加稀疏性约束以确保转换后的卡通图像仍然保留原始图像的语义信息，很好地应对了原图像到卡通图像的巨大风格差异；针对其他通用GAN在卡通化任务中出现的轮廓线条不清晰的问题，CartoonGAN引入了边缘增强对抗损失$L_{adv}$，让判别器$D$能更好地对边缘信息进行检查。
> ![网络结构图](./assets/wangluo.jpg)

#### 2.1.4. 前后处理

> 前处理包括将原图重采样到长边为320且长宽比不变、RGB转换到BGR并归一化至[-1，1]；
> 后处理包括BGR转换到RGB、限制数值区间在[-1, 1]以及动态范围复原至[0, 1]。

### 2.2  硬件资源分配

> <img src="./assets/资源划分图.jpg"  width="1000">
>
>  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操作。

```python
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.py``torchscript导出模型，运行一次程序会导全部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``大小固定长宽比的重采样或能有效解决长宽比被改变的问题。

  | 原图                                          | 框架动态图推理                                 | 导出静态模型推理                                    | 解析组件仿真                             | 量化组件仿真                             | 指令组件仿真                             |
  | --------------------------------------------- | ---------------------------------------------- | --------------------------------------------------- | ---------------------------------------- | ---------------------------------------- | ---------------------------------------- |
  | <img src="./assets/origin.jpg" width="200"> | <img src="./assets/0_infer.jpg" width="200"> | <img src="./assets/2_save_infer.jpg" width="200"> | <img src="./assets/p.jpg" width="200"> | <img src="./assets/q.jpg" width="200"> | <img src="./assets/g.jpg" width="200"> |
  
- ### 8bit，16bit，混合精度的精度测试结果

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

  | Saturation | 8bit                                           | 16bit                                           | MixPrecision                                            |
  | ---------- | ---------------------------------------------- | ----------------------------------------------- | ------------------------------------------------------- |
  | kld        | <img src="./assets/8bit_kld.jpg" width="200">  | <img src="./assets/16bit_kld.jpg" width="200">  | <img src="./assets/mix_precision_kld.jpg" width="200">  |
  | ems        | <img src="./assets/8bit_ems.jpg" width="200">  | <img src="./assets/16bit_ems.jpg" width="200">  | <img src="./assets/mix_precision_ems.jpg" width="200">  |
  | null       | <img src="./assets/8bit_null.jpg" width="200"> | <img src="./assets/16bit_null.jpg" width="200"> | <img src="./assets/mix_precision_null.jpg" width="200"> |
