animegan2_face2paint_v2
bryandlee/naver-webtoon-faces

AnimeGANv2

项目

[Project]AnimeGANv2

摘要

在计算机视觉和艺术风格转移方面,将现实世界场景的照片转换为动漫风格的图像是一项有意义且具有挑战性的任务。我们之前提出的AnimeGAN结合了神经风格迁移合生成对抗网络(GAN)来完成这项任务。但是,AnimeGAN仍然存在一些明显的问题,例如模型生成的图像中存在高频伪影。因此,在本研究汇总,我们提出了AnimeGAN的改进版本,即AnimeGANv2。它通过简单的改变网络中特征的归一化来防止高频伪影的产生。此外,我们进一步缩小了生成器网络的规模,以实现更高效的动画风格转换。在新建立的高质量数据集上训练的AnimeGANv2可以生成视觉质量比AnimeGAN更好的动画图像。

方法

AnimeGANv2使用特征成归一化来防止网络在生成的图像汇总产生高频伪影。但是,Anime GAN由于使用了实例归一化,很容易产生高频伪影,这与styleGAN产生高频伪影的原因是一样的。事实上,总变化损失并不能完全抑制高频噪声的产生。实例归一化通常被认为是风格迁移中最好的归一化方法。它可以使特征图中的不同通道具有不同的特征属性,从而促进模型生成的图像中风格的多样性。层归一化可以使特征图中的不同通道具有相同的特征属性分布,可以有效防止局部噪声的产生。

AnimeGANv2中生成器的网络结构如图2所示。K表示卷积核的大小,S表示步长,C表示卷积核的个数,IRB表示反向残差块,resize表示插值上采样方法,SUM表示逐元素相加。AnimeGANv2的生成器参数大小为8.6MB,AnimeGAN的生成器参数大小为15.8MB。AnimeGANv2使用与AnimeGAN相同的判别器,不同之处在于判别器使用层归一化而不是实例归一化。

AnimeGANv2使用的三个动画风格数据集如表1所示。训练中使用的图像尺寸为256*256,这些风格图像均来自对应的高清风格电影中的视频帧。图3显示了AnimeGANv2在三种风格的测试数据集上的定性结果。

Download Style Dataset Link

源码(TensorFlow版本)

TachibanaYoshino/AnimeGANv2

AnimeGANv2的改进

AnimeGANv2的改进方向主要包括以下4点:

  • 解决生成图像中高频伪影的问题。
  • 训练简单,直接实现论文中的效果。
  • 进一步减少生成器网络的参数数量。 (生成器大小:8.17 Mb),精简版具有较小的生成器模型。
  • 使用新的高质量风格数据,尽可能来自BD电影。

要求

使用

  • inference
python test.py --checkpoint_dir checkpoint/generator_Hayao_weight --test_dir dataset/test/HR_photo --save_dir Hayao/HR_photo
  • train

结果

  • Photo to Paprika Style

- Photo to Hayao Style

- Photo to Shinkai Style


源码(PyTorch版本)

bryandlee/animegan2-pytorch
AnimeGANv2 的 PyTorch 实现。

基本用法

python test.py --input_dir /opt/xxx/data/image --checkpoint_dir ./weights/face_paint_512_v2.pt --device cpu

Torch Hub用法

TORCH.HUB
Pytorch Hub 是一个预训练模型存储库,旨在促进研究的可重复性。

  1. 发布模型
    Pytorch Hub 支持通过添加一个简单的 hubconf.py 文件将预训练模型(模型定义和预训练权重)发布到 github 存储库;
    hubconf.py 可以有多个入口点。 每个入口点都定义为一个 python 函数(例如:您要发布的预训练模型)。

    如果我们在 pytorch/vision/hubconf.py 中扩展实现,这里有一个代码片段指定 resnet18 模型的入口点。 在大多数情况下,在 hubconf.py 中导入正确的函数就足够了。 这里我们只是想以扩展版本为例来说明它是如何工作的。 你可以在 pytorch/vision repo 中看到完整的脚本。
  • 依赖项变量是加载模型所需的包名称列表。 请注意,这可能与训练模型所需的依赖项略有不同。
  • args 和 kwargs 被传递给真正的可调用函数。
  • 该函数的文档字符串用作帮助消息。 它解释了模型做什么以及允许的位置/关键字参数是什么。 强烈建议在此处添加一些示例。
  • 入口点函数可以返回模型(nn.module)或辅助工具以使用户工作流程更顺畅,例如 标记器。
  • 以下划线为前缀的可调用对象被视为辅助函数,不会出现在 torch.hub.list() 中。预训练的权重可以本地存储在 github 存储库中,也可以通过 torch.hub.load_state_dict_from_url() 加载。 如果小于 2GB,建议将其附加到项目版本并使用版本中的 url。 在上面的示例中,torchvision.models.resnet.resnet18 处理预训练,或者您可以将以下逻辑放入入口点定义中。

    注意:发布的模型应该至少在一个分支/标签中。 它不能是随机提交。
    2.从 Hub 加载模型
    Pytorch Hub 提供了方便的 API,可以通过 torch.hub.list() 探索 hub 中的所有可用模型,通过 torch.hub.help() 显示文档字符串和示例,并使用 torch.hub.load() 加载预训练模型。





    请注意,torch.hub.load() 中的 *args 和 **kwargs 用于实例化模型。 加载模型后,如何找出可以对模型执行的操作? 建议的工作流程是
  • dir(model) 以查看模型的所有可用方法。
  • help(model.foo) 检查 model.foo 需要哪些参数来运行
    为了帮助用户在不来回参考文档的情况下进行探索,我们强烈建议 repo 所有者使函数帮助消息清晰简洁。 包含一个最小的工作示例也很有帮助。


    默认情况下,我们不会在加载后清理文件。 如果 get_dir() 返回的目录中已经存在缓存,则 Hub 默认使用缓存。
    用户可以通过调用 hub.load(…, force_reload=True) 来强制重新加载。 这将删除现有的 github 文件夹和下载的权重,重新初始化一个新的下载。 当更新发布到同一个分支时,这很有用,用户可以跟上最新版本。
    Torch hub 通过导入包来工作,就像它已安装一样。 在 Python 中导入会引入一些副作用。 例如,您可以在 Python 缓存 sys.modules 和 sys.path_importer_cache 中看到新项目,这是 Python 的正常行为。
    这里值得一提的一个已知限制是用户不能在同一个 python 进程中加载​​同一个 repo 的两个不同分支。 就像在 Python 中安装两个同名的包一样,不好。 如果您真的尝试,Cache 可能会加入聚会并给您带来惊喜。 当然,将它们加载到单独的进程中是完全可以的。

权重转换(TensorFlow->PyTorch)

  • 安装原始仓库的依赖项:python 3.6, tensorflow 1.15.0-gpu
  • 安装 torch >= 1.7.1
  • 克隆原始仓库并运行
git clone https://github.com/TachibanaYoshino/AnimeGANv2
python convert_weights.py
  • 示例
    转换后的 Paprika 样式模型的结果(从左到右为:输入图像,原始 tensorflow 结果,pytorch 结果)。注意:由于双线性上采样问题,转换权重的结果略有不同。

附加模型权重