本文主要是介绍StrokeNet:a neural painting environment,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
StrokeNet
- Abstract
- Introduction
- Related Work
- StrokeNet的结构
- Stroke的定义
- Agent and Generator
- Generator
- Agent
- Environment
- Training Methods
- Dataset for generator
- Dataset for agent
- Loss Fuction
- Experiments
- Single-Step StrokeNet
- Recurrent-Step StrokeNet
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 64∗64的特征图;
- brush encoder:把颜色和半径编码成 64 ∗ 64 64 * 64 64∗64的特征图。
最后把两个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 64∗64矩阵上的相应位置。这是通过2D高斯函数建模的,其峰值缩放(sigma)为1,这简化为:
对于 i 从 1 到 n 的所有点都计算一遍 64 ∗ 64 64*64 64∗64特征图上每个点 ( x ; y ) (x; y) (x;y)的值,最后得到16个单通道的特征图,每个特征图上都有16个点中的一个点。
通过乘以相应的压力 p i pi pi,现在有16个位置特征。生成器的这一部分用随机坐标单独训练,直到它产生准确可靠的信号。这一步相当于一个映射,通过将16个点的坐标映射到 64 ∗ 64 64*64 64∗64特征图的相应位置。
但是,如果我们直接将这些特征馈送到网络的(反)卷积层中,则由于单个亮度特征的稀疏性,生成器部分失效。相反,我们采用每两个相邻的特征图并将它们加在一起,最终得到15个单通道的特征图。现在,每个特征图 f i fi fi表示笔画的一部分。
通过学习连接 n − 1 n-1 n−1段曲线,我们能够重建笔画。通过附加编码颜色和半径数据,我们现在具有 64 ∗ 64 ∗ n 64 * 64 * n 64∗64∗n形状的特征图。最后再将这个特征图送入反卷积层中。
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 256∗256。
Loss Fuction
首先,我们训练由函数pos引导的位置编码器,该函数将坐标映射到具有 l 2 l_2 l2距离的 64 ∗ 64 64 * 64 64∗64矩阵以测量损失。接下来,我们冻结位置编码器并训练生成器的其他部分,再次使用 l 2 l_2 l2损失来测量三体数据集的性能。可以发现,较小的批次大小可以产生更准确的图像。我们训练生成器的批次大小为64,直到损失不再增加。 然后我们将批次大小设置为32以锐化神经网络。
这里求和项约束相邻点之间的平均距离,其中 λ \lambda λ表示惩罚强度。如果我们丢弃这一项,那么代理就无法了解笔画中点的正确顺序,因为生成器本身对所有输入情况都不鲁棒,并且很可能对相邻点之间具有大间隙的序列产生错误的结果。简单来说就是尽可能让神经网络产生一系列有顺序的坐标点。
Experiments
Single-Step StrokeNet
可以看出,单个笔画为不同形状提供了丰富的表现力。在Omniglot数据集上,由于许多字符由多个笔划组成,而代理只能绘制一个笔划,因此代理会尝试捕获字符的轮廓。
Recurrent-Step StrokeNet
对于更复杂的数据集,需要多个笔画步骤。 同样,代理可以很好地捕获给定图像的轮廓。
github代码
这篇关于StrokeNet:a neural painting environment的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!