从头训练一个神经网络!教它学会莫奈风格作画!
  • 作者:韩信子@ShowMeAI
  • 深度学习实战系列:www.showmeai.tech/tutorials/4…
  • PyTorch 实战系列:www.showmeai.tech/tutorials/4…
  • 本文地址:www.showmeai.tech/article-det…
  • 声明:版权一切,转载请联系渠道与作者并注明出处
  • 收藏ShowMeAI检查更多精彩内容
从头训练一个神经网络!教它学会莫奈风格作画!

现在 AI 艺术创作才能越来越强壮,在艺术作画上表现也异常惊人,咱们在ShowMeAI的文章 AI绘画 | 运用Hugging Face发布的diffuser模型快速绘画AI绘画 | 运用Disco Diffusion根据文本束缚绘画 了解新技能发展和 AI 作画作用展现,其中 OpenAI 的 DALL-E 2 和 Google 的 ImageGen 等项目根据文本提示作画的成果和真实艺术家的制品难辨真假。

但上述作用好的大厂项目通常是付费而非开源的,即使有少量开源项目,也远远超出了本地电脑的计算才能(至少关于那些电脑没有 GPU 的宝宝来说)。 本篇咱们用不同于 diffuser 模型的另外一种方法:GAN(生成对立网络)来完结AI作画。

本篇内容中ShowMeAI将带咱们来运用 GAN 生成对立网络完结莫奈风格作画。

从头训练一个神经网络!教它学会莫奈风格作画!

GAN简介

咱们本篇运用到的技能是GAN,中文名是『生成对立网络』,它由两个部分组成:

  • 生成器:『生成器』担任生成所需的内容(在当前场景下是图画),未经练习的生成器随机生成的作用相似噪声,但随着练习进程推动,生成器会产出越来越逼真的成果,直至『判别器』无法分辩真实图画与AI制作的图画。

  • 判别器:『判别器』担任监督生成器学习,它将真实图画与生成器生成的图画进行比较,检测和分辩真假。随着练习进程推动,它越来越有分辩才能,并督促生成器不断优化。

下图是一个简易的 GAN 示意图:

从头训练一个神经网络!教它学会莫奈风格作画!

自2014年第一个 GAN 被研究者提出,经过多年它已经有非常长足的前进,发生越来越好的成果。在本教程中,ShowMeAI将根据 Pytorch 基础上的一个 GAN 东西库 torchgan 完结一个 DCGAN 并应用于莫奈风格的图画制作使命上。

从头训练一个神经网络!教它学会莫奈风格作画!

数据集&数据处理

本篇运用到的数据集来源于闻名大师莫奈的画作,咱们根据这些优异的画作,让神经网络学习和尝试发生相似的内容。法国画家 克劳德莫奈 生活在 19 世纪,他的画作能够在 www.wikiart.org/en/claude-m… 获取。

从头训练一个神经网络!教它学会莫奈风格作画!

因为期望模型学习到的信息更充沛,咱们还扩充运用了很多相似大师风格的图画,更大的数据量能够使练习进程更容易。咱们人类有很多布景常识先验常识,例如天空是蓝色的,树木是绿色的,但从神经网络的角度来看,任何图画都只是一个 RGB 数组,更多的数据能够帮助它们把握这些基本规律。

从头训练一个神经网络!教它学会莫奈风格作画!

关于数据处理与神经网络的详细原理常识,咱们能够检查ShowMeAI制作的深度学习系列教程和对应文章

  • 深度学习教程:吴恩达专项课程 全套笔记解读

  • 深度学习教程 | 深度学习的有用层面

  • 深度学习与计算机视觉教程:斯坦福CS231n 全套笔记解读

  • 深度学习与CV教程(7) | 神经网络练习技巧 (下)

不过,即使采用了外观相似的图画,数据量依旧有点小。咱们将使『数据增强』技能——它经过对图画的改换来构建新的图画到达数据扩增的作用。

咱们创立一个自界说 Dataset 类,借助于 pytorch 的 transforms 功用,能够轻松完结数据扩增中的各种改换:

import torch.nn as nn
import torch.utils.data as data
import torchvision.datasets as dsets
import torchvision.transforms as transforms
import torchvision.utils as vutils
from PIL import Image
import globimg_size = 256
class ImagesDataset(data.Dataset):
    def __init__(self, images_path: str):
        self.files = glob.glob(images_path)
        self.images = [None] * self.__len__()
    def __len__(self):
        return 1000
    def __getitem__(self, index):
        if self.images[index] is None:
            self.images[index] = self.generate_image()
        return self.images[index]
    def generate_image(self):
        index = random.randint(0, len(self.files) - 1)
        img = Image.open(self.files[index]).convert('RGB')
        transform = transforms.Compose(
           [transforms.Resize(img_size + img_size//2),                                                   
            transforms.RandomCrop(img_size),
            transforms.RandomHorizontalFlip(),
            transforms.ToTensor()])
        resized = transform(img)
        return resized, index

上面的代码中,咱们将一切图画调整为稍大的尺度,然后应用随机裁剪和翻转构建新的输出图画。 关于莫奈的画,只运用了水平翻转和裁剪比较稳妥,但关于现代艺术样本,笔直翻转或随机旋转可能也是适用的。

咱们随机取一点数据集,做可视化和验证有效性:

import torchvision.utils as vutils
import matplotlib.pyplot as plt
def show_images(batch):
    plt.figure(figsize=(12, 12))
    plt.axis("off")
    plt.title("Training Images")
    plt.imshow(np.transpose(vutils.make_grid(batch, padding=2, 
                            normalize=True).cpu(), (1, 2, 0)))
    plt.show()dataset = ImagesDataset(images_path="Paintings/Monet/*.png")
dataloader = data.DataLoader(dataset, batch_size=batch_size,  
                             shuffle=True)
batch = next(iter(dataloader))
show_images(batch[0][:64])

运转代码后,咱们能够看到如下成果:

从头训练一个神经网络!教它学会莫奈风格作画!

莫奈创作了大约 2500 幅画作,当然完整的画作集中可能会包括不同的内容物,咱们看能够稍作筛选。

构建神经网络

咱们准备好数据集后,下一步就开始创立神经网络模型了。咱们根据 torchgan 东西库,构建 GAN 并不复杂:

import torch
from torchgan.models import *
from torchgan.losses import *
dcgan_network = {
    "generator": {
        "name": DCGANGenerator,
        "args": {
            "encoding_dims": 100,
            "step_channels": 40,
            "out_channels": 3,
            "out_size": img_size,
            "nonlinearity": nn.LeakyReLU(0.3),
            "last_nonlinearity": nn.Tanh()
        },
        "optimizer": {"name": Adam, 
                      "args": {"lr": 0.0005, "betas": (0.5, 0.999)}}
    },
    "discriminator": {
        "name": DCGANDiscriminator,
        "args": {
            "in_channels": 3,
            "in_size": img_size,
            "step_channels": 40,
            "nonlinearity": nn.LeakyReLU(0.3),
            "last_nonlinearity": nn.LeakyReLU(0.2)
        },
        "optimizer": {"name": Adam, 
                      "args": {"lr": 0.0006, "betas": (0.5, 0.999)}}
    }
}
lsgan_losses = [LeastSquaresGeneratorLoss(),
                LeastSquaresDiscriminatorLoss()]

咱们经过配置的方法,经过字典对网络结构和参数进行了设置。咱们这儿界说的DCGAN模型包括一个生成器 DCGANGenerator 和一个判别器 DCGANDiscriminator

下一步咱们练习网络:

# 运用GPU或许CPU
if torch.cuda.is_available():
    device = torch.device("cuda:0")
    torch.backends.cudnn.deterministic = True
else:
    device = torch.device("cpu")batch_size = 64
# 迭代轮次
epochs = 2000
# 练习器
trainer = Trainer(dcgan_network, lsgan_losses, 
                  sample_size=batch_size, epochs=epochs,
                  device=device,
                  recon="./torchgan_images",
                  checkpoints="./torchgan_model/gan2",
                  log_dir="./torchgan_logs",
                  retain_checkpoints=2)
# 练习
trainer(dataloader)
trainer.complete()

上述代码中涉及的参数都能够调整,每一轮练习后会在 torchgan_images 文件夹中生成图画样本,练习得到的模型保存在 torchgan_model 文件夹中(模型文件不小,关于 256×256 的小尺度图画,它的大小约为 440M Bytes),但咱们仅在磁盘上保存最终 2 个模型 checkpoint。

练习进程中的中间数据日志记录在 torchgan_logs 文件夹下,咱们能够经过 TensorBoard 东西实时检查练习中间状态,只需求运转 tensorboard -logdir torchgan_logs 指令即可,运转后咱们能够在浏览器界面的 http://localhost:6006 URL中检查中间练习进程,如下图所示:

从头训练一个神经网络!教它学会莫奈风格作画!

练习与优化

GAN的练习进程是比较缓慢的,咱们可能需求一些耐性。 GeForce RTX 3060 显卡 GPU + Ryzen 9 CPU 的设备上,对尺度为 256×256 的图画数据集进行 2000 次练习大约需求 4 小时。

整个练习进程中,能够看到神经网络逐步生成越来越好的图画,咱们把不同阶段的生产作用做成动图,如下所示:

有兴趣咱们能够试着调整一下输入参数,也能够采集和提供更多的练习图片,作用可能会更好。

总结

对比之前 ShowMeAI 提到过的 diffuser 模型,咱们这儿运用 DALL-E Mini 的在线版别 也生成了莫奈画作的图画,如下所示:

从头训练一个神经网络!教它学会莫奈风格作画!

咱们的DCGAN代码生成的成果分辩率会弱一点:

从头训练一个神经网络!教它学会莫奈风格作画!

DALL-E Mini 的模型结构做过调整,且在数百万张图画进行过练习,比咱们几个小时练习完的小模型作用好是正常的。咱们如果采集更多的数据,尝试不同模型参数,成果可能会更好,快来一同试一试吧。

参考资料

  • AI绘画 | 运用Hugging Face发布的diffuser模型快速绘画:www.showmeai.tech/article-det…
  • AI绘画 | 运用Disco Diffusion根据文本束缚绘画:www.showmeai.tech/article-det…
  • 克劳德莫奈:en.wikipedia.org/wiki/Claude…
  • Claude Monet 画作:www.wikiart.org/en/claude-m…
  • 深度学习教程:吴恩达专项课程 全套笔记解读:www.showmeai.tech/tutorials/3…
  • 深度学习教程 | 深度学习的有用层面:www.showmeai.tech/article-det…
  • 深度学习与计算机视觉教程:斯坦福CS231n 全套笔记解读:www.showmeai.tech/tutorials/3…
  • 深度学习与CV教程(7) | 神经网络练习技巧 (下) :www.showmeai.tech/article-det…
  • torchgan:github.com/torchgan/to…
  • DALL-E Mini 的在线版别:huggingface.co/spaces/dall…

从头训练一个神经网络!教它学会莫奈风格作画!