1. 磐创AI-开放猫官方网站首页
  2. Medium

Make-A-Monet:用自行车传递图像风格

作者:科林·柯蒂斯(Colin Curtis),Adhvaith VijayColin Curtis

引言

在Research@DataRes这里,我们总是试图突破深度学习的极限,跟上该领域的所有发展。虽然毫无疑问,最近ML研究在学术方面的进步非常令人印象深刻,但除非它们能够部署到生产环境中,否则这些模型几乎没有实际应用。这就是为什么对于我们最新的项目,我们决定确保我们可以将最终的模型与任何人都可以使用的可部署应用程序集成在一起。

计算机视觉(CV)在过去的十年中无疑经历了复兴,而生成性对抗性网络(GAN)可能是现代深度学习中最吸引人的例子之一。这个想法非常直观:如果我们想生成与我们的数据集匹配的图像,那么我们可以有一个生成器网络,它提取随机噪声并生成图像,而鉴别器试图区分生成的图像和真实的图像。反向传播的魔力确保了,从理论上讲,生成器可以产生更好的图像,以至于生成的图像和真实的图像是无法区分的。

在我们的项目中,我们决定将重点放在GaN研究中一个有趣的领域,即图像风格转移。例如,这个区域研究我们如何拍摄一张照片,并用艺术家的风格来转换图像。具体地说,为了我们的最终目标,我们想要一种能够在给定照片的情况下,用莫奈绘画的风格来修饰照片的GAN。幸运的是,Cycle GAN可以做到这一点:它可以通过两个生成器和两个鉴别器在两个图像域(在我们的例子中是莫奈绘画和照片)之间进行转换。最重要的是,因为这些模型都是独立的网络,所以我们可以在培训结束时保存照片到绘画生成器,以便在我们的Web应用程序中使用。

循环GAN

因为我们的目标是创作莫奈的画,所以我们需要很多画。我们最终在monet2Phots数据集中发现了这一点,该数据集包含数千个莫奈绘画和照片的示例。幸运的是,由于周期GaN没有配对,我们只需要一堆照片和绘画,这意味着对数据的限制很少。

在模型体系结构方面,确实没有什么特别的事情发生。生成器取一幅512×512的图像,用两个卷积层对其进行下采样,然后有五个残留层来帮助保证图像中的特征匹配。鉴别器获取真图像或假图像,并返回它认为图像是真图像还是假图像的概率。下面的图片在高层次上说明了该模型,其中X和Y表示图像域,G和F是生成器,D表示它们各自的图像域的鉴别器。

也许关于循环GaN最有趣的事情是一系列的发电机损耗,这有助于确保我们能够生成照片级的真实感图像。这是通过周期、特性和GaN损耗捕获的,所有这些都将在下面描述。

我们决定在Google Cloud GPU实例上培训我们的网络,因为GAN以其繁重的计算需求而臭名昭著。生成我们在Web应用程序中使用的模型的培训运行花了大约一天的时间,但遗憾的是,TensorBoard日志已损坏,因此我们无法在此处显示它们。相当有趣的是,在训练神经网络期间,损失并没有像人们希望看到的那样不断减少,但对于甘斯来说,人们的共识似乎是,损失曲线在超过一定程度后并不真正重要,因为主要目标只是风格转移。

结果

一旦对模型进行了训练,我们希望使用我们的照片到绘画生成器实际生成一些图像。考虑到我们只为少数几个时期训练了模型,结果还是不错的(尽管这仍然需要很长时间)。下面显示了原始图像和转换后的图像。

仅从这个例子我们就可以看出,这个模型实际上学习了我们想要它做的事情,因为正确的图像看起来确实有点像莫奈的画。该模型在模糊原始图像中的细节方面做得很好,并突出了颜色,特别是橙色和紫色的色调。

我们试图做的一件有趣的事情是将生成的图像再次传递给生成器,看看会发生什么。我们对结果相当惊讶,因为这幅图像看起来更像莫奈的风格。

最耐人寻味的是,它提供了生成器如何为图像添加样式的洞察力。在训练中,生成器可能学会了如何模糊和调整输入图像的颜色,以便更好地欺骗鉴别器,因为这些都是莫奈绘画中最强烈的品质。

可以轻描淡写地说,建造和训练这辆自行车GAN花了很多工作,但我们只完成了一半。我们仍然必须构建一个允许我们部署模型的Web应用程序,而ML部署无疑是任何ML项目中最复杂的部分。

模型部署

因为我们是在PyTorch中构建模型的,所以在培训结束时,我们可以将模型权重保存在一个.pt文件中。然后可以将这些权重加载到Web服务器中,实质上允许我们加载训练期间存在的模型,但现在我们将使用它进行推理。

在部署ML应用程序时,困难不再在于构建模型的研究代码,而在于创建一个用户可以上传要通过模型传递的数据的环境。在我们的示例中,我们需要允许用户发出上传图像的POST请求,然后我们可以使用代码来解码Web服务器中的图像字节,从而为我们提供用户上传的图像。

模型管道

毫无疑问,任何已部署的ML应用程序最重要的部分都是模型管道。这描述了通过服务器和模型本身的完整数据流,而糟糕的管道可能会使原本良好的模型变得毫无用处。模型管道的流程图如下所示。

该图像在解释一般管道方面做得相当好,但仍然有一些想法应该强调,特别是对于首次模型部署。重要的一点是,在推理管道中,性能是游戏的名称。我们通过首先使用TorchScript JIT编译加载模型来解决这一问题,这样可以将我们从缓慢的Python解释器中解放出来,从而加快推理速度。

此外,我们在训练过程中将模型从Float32量化为推理过程中的int8。这实质上将模型权重从原始浮点转换为更紧凑的整数表示,从而加快了模型速度并减少了RAM占用。这两个变化都导致推理时间减少了约半秒。

部署为Web应用程序

为了方便用户交互,我们决定将我们的工作作为Web应用程序进行托管。使用Dash(一个数据仪表板Python框架),我们在各种Dash引导组件的帮助下构建了应用程序的前端。然后,FASK后端服务器处理用于执行模型管道并允许用户下载和上传图像的路由。

由于DBC主题,我们的应用程序使用薄荷布局,由两个单独的页面组成。第1页专门用于我们的主页,用户可以在这里与应用程序交互,上传、处理并最终下载他们转换后的图像。第2页从头到尾说明了我们模型的体系结构。

最后,为了使我们的Web应用程序可以公开访问,我们使用了Heroku–一个非常适合小型应用程序的云平台。

挑战

毫无疑问,部署该模型最具挑战性的部分是该模型所需的计算资源。因为我们在一个免费的Heroku VM上部署了部署Docker映像,所以我们无法访问GPU或大量RAM来处理大的512×512映像。即使网页运行正常,在测试过程中在本地电脑上运行3秒左右就会生成一张图片,但是如果容器超过了分配给它的资源,Heroku就会终止该进程,导致网页破裂。

如果网页幸运地在通过生成器的正向传播过程中没有破裂,那么仍然需要大约11秒来完成图像的生成。毫无疑问,通过在GPU推理服务器上运行模型可以解决推理过程中的这一瓶颈,但这将额外产生较高的成本。

结论

总体而言,我们在过去几个月中在Cycle Gans中的工作提供了一个很好的机会,可以深入到复杂而有趣的深度学习部署领域。从研究到生产时引入的挑战为我们介绍了一种更面向行业的机器学习研究方法,同时也使我们能够探索GANS的前沿。

该项目的研究方面需要进一步探索的领域包括测试生成器中不同数量的残留层及其对模型性能的影响,以及使用NVIDIA TensorRT或PyTorch Onnx之类的工具进行部署端代码优化可以产生有趣的基准测试。我们为这个项目以及从中学到的东西感到非常自豪,我们期待着在秋季通过Research@DataRes探索深度学习的前沿。

此项目的代码可在https://github.com/colinpcurtis/datares_GANs免费获得https://github.com/colinpcurtis/datares_GANs

原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/07/02/make-a-monet%ef%bc%9a%e7%94%a8%e8%87%aa%e8%a1%8c%e8%bd%a6%e4%bc%a0%e9%80%92%e5%9b%be%e5%83%8f%e9%a3%8e%e6%a0%bc/

联系我们

400-800-8888

在线咨询:点击这里给我发消息

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息