原标题:只用C++和Python,让你的简笔画实时动起来!

大数据文摘出品

作者:刘俊寰

让蒙娜丽莎笑起来对AI来说已经不是什么新鲜事了。

试想,如果在画纸上创作的图像能够实时地生成动画,达芬奇可能会吓个半死。

没错,文摘菌今天要给大家介绍的,就是捷克技术大学和Snap研究小组合作开发的一种全新的样式转换技术,在论文“使用基于少量补丁的培训进行交互式视频样式化”中,他们提出,该技术将够 将某种绘画风格的静态图像实时格转换为动态动画。

效果嘛还是自己看了才知道:

据了解,研究小组利用了 深度学习,在将手写样式转换为图像或视频的过程中, 仅仅对样式进行转换,内容原型的创作风格丝毫不会受到影响。

同时,与此前的转换方法相比而言,这项技术 无需借助庞大的数据集,甚至无需进行预训练,对关键帧进行的样式设置就是训练网络的唯一数据来源。

20万参数设置,每秒17帧进行风格转换

整个实验中,研究人员主要利用的编程语言是 C++和Python。

对于选定的评估序列中的帧,研究人员计算了它们的样式化,在有48个Nvidia Tesla V100 GPU环境下模拟3天后就完成了。

整个实验总共 抽查了大约200,000个不同设置的超参数(hyperparameters),并在以下区间内进行了对比实验,Wp∈(12,188),Nb∈(5,1000),Nr∈(1,40),α∈(0.0002,0.0032),最终发现 最佳的补丁大小(optimal patch size)为Wp=36。

下图比较了不同超参数设置的视觉质量,其中超参数优化一个很有趣的结果是,在左边的图像中,一个批次的补丁Nb=40相对较少,这与选择的基于补丁的训练方案相互作用。虽然常见的策略是尽可能扩大Nb,以利用GPU能力,但在案例中,增加Nb实际上却只会适得其反,因为它将训练方案变成了全帧方案,往往会使网络在关键帧上过度拟合。

中间的图像即是最佳补丁大小Wp=36,较小的补丁可能无法提供足够的上下文,较大的补丁可能会使网络对目标对象的变形,从而使得网络对目标对象的变形引起的外观变化的抵抗力较差。

但在右图中,令人惊讶的是,ResNet区块数Nr对质量没有明显影响,尽管有一个微妙的鞍点(saddle point),对学习率参数α进行实验也能发现类似的效果。

在将所有的超参数优化后,研究人员发现,对于有效像素10%、分辨率640×640的视频序列,可以 以每秒17帧的速度进行风格转换。

研究人员利用了一组分辨率从350×350到960×540的视频序列对系统进行了评估,这些视频包含不同的视觉内容,如人脸、人体等,以及不同的艺术风格,如油画、粉笔画等。

对于相对简单的序列而言,仅使用一个关键帧就可以进行样式转换,更复杂的序列则需要使用多个关键帧。在训练前,研究人员利用双侧时间滤波器(bilateral temporal filter)对目标序列进行了预滤波,当序列包含有不明确内容时,计算一个辅助输入层利用到了随机有色的高斯混合,以跟踪目标序列中的运动。

在训练阶段,研究人员从所有关键帧k中随机抽取掩码Mk内的补丁,将它们分批反馈给网络来计算丢失和反向传播错误,随后在Nvidia RTX 2080 GPU上进行训练和推理。训练时间与输入补丁数量成正比,例如,对于包含掩码内所有像素的512×512关键帧,训练时间为5分钟。训练完成后,整个序列可以以大约每秒17帧的速度进行风格转换。

实时样式转换如何炼成?

相关样式转换的技术早在2016年就有人想到了,当时,在一篇名为“使用卷积神经网络进行图像样式转换”的论文中,研究人员提出了一种 结合了VGG与CNN的转换技术,能够做到把内容与样式有效区分的同时,保留内容转换样式。

在这之后,出现了一些将该项技术推广到电影或视频领域的应用,其中 找到分离图像内容和样式的损失函数是关键。

2019年,有研究人员提出了一种机制更改视频的一个关键帧,并将其传输到另一个序列(整个视频)中的方法,这种基于补丁的输出能够得到高质量的结果输出。

不过,这些转换技术仍然只能针对连续视频进行样式转换,也就是说,它们不支持 随机访问、并行处理和实时交互,而这些正是能够实时转换图像的技术核心。

为了实现实时样式转换,研究人员在进行系统设计时对之前的研究进行了一定程度的参考,比如在设计滤波器时,他们采用了一种基于U-net的图像到图像转换框架,这种自定义网络架构能够保留原始风格范例的重要高频细节。

但是在训练过程中,他们发现系统产生的结果质量无法达到标准,这是因为原始网络是基于FaceStyle算法产生的大量风格样本数据集训练,这导致该方法在很多场景下不可使用。同时,原始方法没有考虑到时间的连贯性,生成的序列也包含了明显的时间闪烁。

为此,研究人员改变了网络的训练方式,并提出了一个优化问题,允许对网络的结构和超参数进行微调,以获得与当前最先进的风格化质量相媲美的风格化质量,这样的话,即使只有少量的训练样本也可实现目的,而且训练时间较短。

当然,除了滤波器设计之外,要实现实时样式的转换,研究团队还做出了不少创新,文摘菌在这里就不过多剧透了,想要了解更多细节的小伙伴们快去原文挖宝吧~

论文链接:

https://ondrejtexler.github.io/res/Texler20-SIG_patch-based_training_main.pdf

提供300分钟视频讲解,教学大纲、课件、教案、习题答案、程序源码等配套资源。

扫码,优惠购书

凡是在京东购书的用户,可以将订单信息和评价发到itbook8@163.com,将会获取超值大礼包(包括案例源码,超多的视频教程,数据集等资源)返回搜狐,查看更多

责任编辑:

python简笔画程序_只用C++和Python,让你的简笔画实时动起来!相关推荐

  1. python简笔画大全_只用C++和Python,让你的简笔画实时动起来!

    原标题:只用C++和Python,让你的简笔画实时动起来! 大数据文摘出品 作者:刘俊寰 让蒙娜丽莎笑起来对AI来说已经不是什么新鲜事了. 试想,如果在画纸上创作的图像能够实时地生成动画,达芬奇可能会 ...

  2. python中终止程序_如何结束运行python程序

    有时当一个条件成立的情况下,需要终止程序,可以使用sys.exit()退出程序. sys.exit()会引发一个异常 1.如果这个异常没有被捕获,那么python编译器将会退出,后面的程序将不会执行. ...

  3. python怎么导出程序_[272]如何把Python脚本导出为exe程序

    一.pyinstaller简介 pyinstaller将Python脚本打包成可执行程序,使在没有Python环境的机器上运行 最新版是pyinstaller 3.1.1.支持python2.7和py ...

  4. python回测代码_只用3行Python回测你的交易策略

    作者|Lorenzo Ampil 编译|VK 来源|Towards Data Science 自从我开始学习投资,我接触了不同的股票分析方法-技术分析和基本面分析.我甚至读过很多关于这些技巧的书和文章 ...

  5. python求众数程序_求众数(python实现)

    题目描述: 给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: [3,2,3] ...

  6. python嵌入到程序_在应用中嵌入Python:转

    前面的章节讨论如何扩展Python,如何生成适合的C库等.不过还有另一种情况:通过将Python嵌入C/C++应用以扩展程序的功能.Python嵌入实现了一些使用Python更合适的功能.这可以有很多 ...

  7. Python 图像 一样大小_#带你学Python# 表白利器:用Python发微信表情画-带你认识图片的秘密...

    首先感谢大家对上篇文章"python实现传染病模型"的肯定: 孙小白:#带你学Python# 疫情当前,在家没事?你也可以用Python预测疫情发展​zhuanlan.zhihu. ...

  8. python编程第一程序_第一个Python程序_Python编程开发教程

    第一个Python程序 用notepad++编写程序代码 语言设置为python(高量显示函数和关键字)(注意:行首不能有空格,Python对缩进要求严格) 命令提示符运行 cd \文件名 #打开py ...

  9. python写机器人程序_用Python写的一个多线程机器人聊天程序

    本人是从事php开发的, 近来想通过php实现即时通讯(兼容windows).后来发现实现起来特别麻烦, 就想到python.听说这家伙在什么地方都能发挥作用.所以想用python来做通讯模块...所 ...

最新文章

  1. 过年回家抢票不求人,试试这个开源抢票神器吧!
  2. Java 压缩字符串
  3. MySQL-MMM架构部署(有图)
  4. 模拟银行取钱 (多线程操作的好处)
  5. 如何设计一门语言(三)——什么是坑(面向对象和异常处理)
  6. LeetCode 12/13 罗马数字与整型互转(哈希,贪心)
  7. 检测Linux系统是否支持某系统调用
  8. 六、访问CGI变量 (基础教程6)
  9. FPGA时钟激励编写(方法三)
  10. c++ std::async的注意事项
  11. 【零基础学Java】—类的定义(七)
  12. SharePoint 2010 使用代码创建视图查询条件
  13. 点线面的意义_如何运用设计中的点线面?
  14. 二元序列游程编码c语言,基于游程编码数据压缩算法设计与实现.doc
  15. NAT64实例(ENSP实现)
  16. CUDA入门2——获取显卡参数
  17. centos格式化优盘命令_Centos7 格式化分区并挂载
  18. Endnote X9 插入参考文献、设置参考文献格式
  19. bitbucket搭建
  20. 十七、电话号码的字母组合

热门文章

  1. Java:实现Prim算法(附完整源码)
  2. RISC-V 开发工具链的使用
  3. robomongo 连不上mongodb 权限问题
  4. Android——动画的实现
  5. libxml2常用库函数详解
  6. JavaScript阻塞与非阻塞
  7. Face Attention Network: An Effective Face Detector for the Occluded Faces
  8. MySQL 时间戳操作
  9. 如何验证白光干涉仪精度丨科普篇
  10. excel服务器项目管理软件,用excel做项目管理系统