这是我最近在 Twitter 和 vimeo 上发布的网络摄像头 pix2pix 演示的源代码和预训练模型。它使用深度学习,或者引入一些流行语:深度卷积条件生成对抗网络自动编码器。
视频1
视频2
这个特定存储库中的代码实际上与 pix2pix、GAN 甚至深度学习无关。它只是加载任何预先训练的张量流模型(只要它符合一些约束),为其提供经过处理的网络摄像头输入,并显示模型的输出。恰好我训练和使用的模型是pix2pix(详情如下)。
即步骤可以概括为:
我从维基媒体上的谷歌艺术项目中收集了来自世界各地的艺术收藏品。很多图像都是富有的白人的经典肖像,所以我只使用了大约 150 个集合,试图保持数据尽可能在地理和文化上多样化(我使用的完整列表在这里)。但数据仍然非常以欧洲为中心,因为单个欧洲博物馆可能有数百或数千个扫描,但阿拉伯博物馆只有 8 个扫描。
我下载了 300px 版本的图像,并运行了批处理:
我还运行了一个批处理过程来从图像中获取多种裁剪(而不是不均匀地调整大小),但我还没有接受过这方面的培训。我不再使用精明的边缘检测,而是开始研究 Xie 和 Tu 提出的更好的“整体嵌套边缘检测”(又名 HED)(如原始 pix2pix 论文所使用),但还没有对此进行培训。
这是由 preprocess.py 脚本完成的(抱歉没有命令行参数,编辑脚本以更改路径和设置,应该是不言自明的)。
可以在此处查看训练数据的小样本(包括训练模型的预测)。最右列是原始图像,最左列是预处理版本。这两个图像作为“对”输入到 pix2pix 网络中进行训练。中间的列是模型在仅给定最左边的列的情况下学习生成的列。 (图像显示了每次训练迭代 - 即左侧的数字,从 20,000 到 58,000,因此在页面上越往下,它逐渐变得越好)。
我还训练了一个无条件 GAN(即在相同训练数据上的正常 DCGAN。其输出示例如下所示。(这会生成类似于训练数据的“完全随机”图像)。
训练和架构是 Isola 等人(又名 pix2pix)的“使用条件对抗网络的图像到图像转换”。我使用 @affinelayer (Christopher Hesse) 的 TensorFlow 端口进行了训练,这也是最近病毒式传播的“sketch-to-cat”演示的动力。他还写了一篇关于 pix2pix 如何工作的很好的教程。非常感谢作者(以及他们所依赖的每个人)将他们的代码开源!
我只对 tensorflow-pix2pix 训练代码做了一个极其微小的更改,那就是使用人类可读的名称将tf.Identity添加到生成器的输入和输出中,以便我可以轻松地提供和获取张量。因此,如果您想在此应用程序中使用自己的模型,则需要执行相同的操作。 (或者记下输入/输出张量名称,并相应地修改 json,更多内容见下文)。
您可以从“发布”选项卡下载我的预训练模型。
这个特定应用程序的作用是加载预训练模型,对网络摄像头输入进行实时预处理,并将其提供给模型。我使用 opencv 用老式的基本计算机视觉进行预处理。它确实非常简单和基本。您可以看到下面的 GUI(GUI 使用 pyqtgraph)。
不同的场景需要不同的设置。
例如,对于“真人表演”,我发现canny可以提供更好的(恕我直言)结果,这就是我在顶部第一个视频中使用的。阈值(canny_t1、canny_t2)取决于场景、细节量和所需的外观。
如果图像中有很多噪点,您可能需要添加一点pre_blur或pre_median 。或者与它们一起玩以获得“艺术效果”。例如,在第一个视频中,在 1:05-1:40 左右,我添加了大量中位数(值在 30-50 左右)。
对于绘制场景(例如第二个视频),我发现自适应阈值比 canny 提供更有趣的结果(即禁用 canny 并启用自适应阈值),尽管您可能不同意。
对于完全静态的输入(即,如果冻结捕获,禁用相机更新),输出可能会闪烁非常少量,因为模型对同一输入做出不同的预测 - 尽管这通常非常微妙。然而,对于实时摄像机馈送,输入中的噪声可能会在输出中产生大量闪烁,特别是由于精明或自适应阈值对噪声的高度敏感性,因此一些时间模糊可以有所帮助。
Accum_w1和Accum_w2用于在进入模型之前对输入进行时间模糊:new_image = old_image * w1 + new_image * w2(因此理想情况下它们应该加起来为 1 - 或接近)。
Prediction.pre_time_lerp和post_time_lerp也进行时间平滑: new_image = old_image * xxx_lerp + new_image * (1 - xxx_lerp) pre_time_lerp 是进入模型之前, post_time_lerp 是离开模型之后。
任何时间模糊为零都会禁用它们。这些的价值取决于您的品味。对于上面的两个视频,我将所有 pre_model 模糊(即 Accum_w1、accum_w2 和 pre_time_lerp)设置为零,并使用不同的 post_time_lerp 设置进行播放,范围从 0.0(非常闪烁和闪烁)到 0.9(非常慢、褪色和“梦幻”) )。通常 0.5-0.8 左右是我最喜欢的范围。
如果您想使用其他模型,则需要设置一个类似于以下文件的 JSON 文件。这里的动机是,我的 app/models 文件夹中实际上有一堆 JSON,我可以动态扫描和重新加载它们,并且模型数据存储在其他磁盘上的其他位置,并且应用程序可以在运行时和规模上加载和在模型之间交换自动输入/输出等。
{
"name" : "gart_canny_256", # name of the model (for GUI)
"ckpt_path" : "./models/gart_canny_256", # path to saved model (meta + checkpoints). Loads latest if points to a folder, otherwise loads specific checkpoint
"input" : { # info for input tensor
"shape" : [256, 256, 3], # expected shape (height, width, channels) EXCLUDING batch (assumes additional axis==0 will contain batch)
"range" : [-1.0, 1.0], # expected range of values
"opname" : "generator/generator_inputs" # name of tensor (':0' is appended in code)
},
"output" : { # info for output tensor
"shape" : [256, 256, 3], # shape that is output (height, width, channels) EXCLUDING batch (assumes additional axis==0 will contain batch)
"range" : [-1.0, 1.0], # value range that is output
"opname" : "generator/generator_outputs" # name of tensor (':0' is appended in code)
}
}
仅在 Ubuntu 16.04 上测试,但应该适用于其他平台。
我使用 Anaconda python 发行版,它几乎包含了您需要的所有内容,那么它(希望)就像这样简单:
从 https://www.continuum.io/downloads 下载并安装 anaconda
安装tensorflow https://www.tensorflow.org/install/(如果你有anaconda,这通常非常简单,因为包含了大多数依赖项)
安装opencv和pyqtgraph
conda安装-c menpo opencv3 conda安装pyqtgraph
再次无限感谢