StrokeNet:a neural painting environment

Abstract

这些年来,我们已经看到了图像生成模型的巨大成功。 通过神经网络生成图像通常是基于像素的,这与人类使用画笔创建艺术品的方式根本不同。为了模仿人类绘画,需要环境和代理之间的相互作用以允许试验。但是,环境通常是非可微分,导致收敛速度慢和计算量大。

我们提出了一个新颖的模型StrokeNet,其中代理人是根据绘画环境的精心制作的神经近似来训练的。 通过这种方法,我们的代理人能够以无监督的方式学习比强化学习方法更快地写出MNIST数字等字符。

Introduction

为了学习绘图或书写,人首先在视觉上观察(编码)目标图像并使用笔或笔刷来涂抹(解码),以重建原始图像。对于有经验的画家,他或她在采取任何行动之前预见到结果,并且可以选择最佳动作。

由于中间渲染程序,基于笔划的图像生成与传统的图像生成问题完全不同。对于基于笔画的方法,不是学习生成图像,更多的是学习操纵绘画程序。解决问题的直观、有效的方法是首先使用神经网络学习从笔画数据到结果图像的映射,这类似于学习绘画经验。这种软件映射的一个优点是它提供了连续的转换。对于任何绘画程序,都是基于沿动作轨迹的坐标点计算图像的像素值。特定像素由离散像素坐标索引,也就是根据离散像素点的坐标得到特定点的像素

我们通过给出“笔画”的正式定义来进一步定义“绘图”。 在本文中,“笔画”由颜色,笔刷半径和一系列元组组成,包含沿轨迹的每个点的坐标和压力。

基于这些想法,我们训练了一个可微分的近似我们的绘画软件,我们称之为“生成器”。然后我们通过训练CNN作为代理来测试发生器,该代理将图像编码成“笔画”数据作为生成器的输入。 我们提出的架构StrokeNet基本上包括两个组件,一个生成器和一个代理。

最后使用仅在原始MNIST数据集上训练的分类器评估代理的质量,并在生成的图像上测试分类器。

Related Work

VAEs、GANs在图像生成领域取得了巨大的成功。这些模型直接生成图像到像素级,因此可以通过有效的反向传播进行训练。

为了模仿人体绘图,图形和机器学习社区都进行了尝试。 传统上,试错算法(Hertzmann,2003)被设计成通过最小化能量函数来优化笔划放置,结合启发式,例如,限制笔划的数量。最近基于深度学习的方法通常分为两类:基于RNN的方法和强化学习。

对于基于RNN的方法,如SketchRNN和Graves的RNN手写生成,它们都依赖于顺序数据集。 因此,对于不成对的数据,不能应用这些模型。对于基于强化学习的方法,这些方法训练与绘画环境交互的代理。 对于具有如此大的连续动作空间的强化学习任务,训练过程可能在计算上是昂贵的并且可能需要较长的时间才能收敛。

可微分辨渲染是计算机图形学中广泛研究的主题。 它用于解决逆渲染问题。一些可微分渲染器明确地模拟了参数和观测之间的关系,其他人使用神经网络来近似结果,因为神经网络是强大的函数逼近器。

StrokeNet的结构

Stroke的定义

我们的笔划由更少的点组成。我们认为许多轨迹点是多余的,因为笔划线可以通过具有较少锚点的样条曲线来拟合。例如,为了拟合直线,无论长度如何,仅需要两个端点。
在这里插入图片描述
对这些值进行归一化,使得坐标对应于默认的OpenGL坐标系。

Agent and Generator

在这里插入图片描述

Generator

生成器分为两个部分:

  • position encoder:把 ( x i ; y i ; p i ) (xi; yi; pi) (xi;yi;pi)编码成 64 ∗ 64 64 * 64 6464的特征图;
  • brush encoder:把颜色和半径编码成 64 ∗ 64 64 * 64 6464的特征图。

最后把两个encoder得到的特征图进行concat,送入反卷积层中进行解码。

为了保留每个点 ( x i ; y i ; p i ) (xi; yi; pi) (xi;yi;pi)的顺序和压力信息,位置编码器首先通过在该点上放置亮点将 ( x i ; y i ) (xi; yi) (xi;yi)映射到 64 ∗ 64 64 * 64 6464矩阵上的相应位置。这是通过2D高斯函数建模的,其峰值缩放(sigma)为1,这简化为:
在这里插入图片描述
对于 i 从 1 到 n 的所有点都计算一遍 64 ∗ 64 64*64 6464特征图上每个点 ( x ; y ) (x; y) (x;y)的值,最后得到16个单通道的特征图,每个特征图上都有16个点中的一个点。
在这里插入图片描述
通过乘以相应的压力 p i pi pi,现在有16个位置特征。生成器的这一部分用随机坐标单独训练,直到它产生准确可靠的信号。这一步相当于一个映射,通过将16个点的坐标映射到 64 ∗ 64 64*64 6464特征图的相应位置。
在这里插入图片描述
但是,如果我们直接将这些特征馈送到网络的(反)卷积层中,则由于单个亮度特征的稀疏性,生成器部分失效。相反,我们采用每两个相邻的特征图并将它们加在一起,最终得到15个单通道的特征图。现在,每个特征图 f i fi fi表示笔画的一部分。

通过学习连接 n − 1 n-1 n1段曲线,我们能够重建笔画。通过附加编码颜色和半径数据,我们现在具有 64 ∗ 64 ∗ n 64 * 64 * n 6464n形状的特征图。最后再将这个特征图送入反卷积层中。

Agent

代理是类似VGG的CNN,其将目标图像编码成基础笔划表示s。具有不同激活的三个并行FC解码器用于解码来自该特征的位置(tanh),压力(sigmoid)和brush data(sigmoid)。使用平均池化而不是最大池化来改善梯度流。

Environment

用于拟合锚点的的样条曲线通过所有控制点,与更常用的Bezier曲线不同。然后通过采样点进行插值,并在每个中心点周围绘制圆圈。对于圆内的每个像素,其颜色取决于各种因素,包括画笔的属性,混合算法等。
在这里插入图片描述

Training Methods

Dataset for generator

使用三体运动的方法,我们收集了大约600K图像,因为几乎没有生成成本样本。(这部分不太明白)

Dataset for agent

为了证明我们的神经环境的有效性,我们训练了一个代理人在几个流行的数据集上执行绘图任务,从字符到绘图,生成器部分被冻结。

为了证明我们的神经环境的有效性,我们训练了一个代理人在几个流行的数据集上执行绘图任务,从角色到绘图,生成器部分被冻结。

对于MNIST和Omniglot,我们训练了一个代理人在一个笔画中绘制字符。 我们后来在更复杂的数据集上训练了the recurrent StrokeNet,如QuickDraw和KanjiVG。 我们使用抗锯齿和填充将所有输入图像的大小调整为 256 ∗ 256 256*256 256256

Loss Fuction

首先,我们训练由函数pos引导的位置编码器,该函数将坐标映射到具有 l 2 l_2 l2距离的 64 ∗ 64 64 * 64 6464矩阵以测量损失。接下来,我们冻结位置编码器并训练生成器的其他部分,再次使用 l 2 l_2 l2损失来测量三体数据集的性能。可以发现,较小的批次大小可以产生更准确的图像。我们训练生成器的批次大小为64,直到损失不再增加。 然后我们将批次大小设置为32以锐化神经网络。
在这里插入图片描述
这里求和项约束相邻点之间的平均距离,其中 λ \lambda λ表示惩罚强度。如果我们丢弃这一项,那么代理就无法了解笔画中点的正确顺序,因为生成器本身对所有输入情况都不鲁棒,并且很可能对相邻点之间具有大间隙的序列产生错误的结果。简单来说就是尽可能让神经网络产生一系列有顺序的坐标点。

Experiments

Single-Step StrokeNet

可以看出,单个笔画为不同形状提供了丰富的表现力。在Omniglot数据集上,由于许多字符由多个笔划组成,而代理只能绘制一个笔划,因此代理会尝试捕获字符的轮廓。
在这里插入图片描述

Recurrent-Step StrokeNet

对于更复杂的数据集,需要多个笔画步骤。 同样,代理可以很好地捕获给定图像的轮廓。
在这里插入图片描述
github代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值