来源:Global Video Tech Meetup:Monte 主讲人:CHris Uehlinger 内容整理:张雨虹 本次演讲主要从研究背景、理论基础和工程实现三个方面介绍了将图像风格变换技术进行落地的过程,整个工程涉及到 WebRTC、FFmpeg、Tensorflow。Stylevision 的代码开源在:https://github.com/chrisuehlinger/stylevision。
目录
- 研究背景
- 学术理论
- Stylevision 框架概述
- Camera Page
- Pion
- FFmpeg
- Multithreaded Python Process
Chris 工作于 TechSlice,他的主要工作包括 3D 图、AR 运动捕获以及利用 WebRTC 对这些技术进行部署。本次演讲从研究背景、风格转换的理论基础以及工程实现对视频的实时风格转换(Real-time Style Transfer)进行了介绍。
风格变换后示意图
研究背景
人们在图像变换方面抱有很大热情,在手机端就可以简单实现图像的变换是人们一直向往的事情。Chris 作了关于图像风格变换(Style Transfer)方面的研究,利用深度学习技术我们可以实现将一种图像的风格应用于另一种图像,把第二种图像的风格变换为第一种。图像风格变换的研究大致开始于 2015 年,目前有许多技术都已落地实现,人们可以利用这些产品在社交平台上分享应用这些技术处理后的个人图像。
学术理论
围绕这个话题有很多的学术成就,演讲中提到了三篇影响较深的文章。
第一篇是 《A Neural Algorithm of Artistic Style》,这篇文章是德国蒂宾根大学Leon A. Gatys、 Alexander S. Ecker、 Matthias Bethge 2015 年发表的学术文章,是目前许多图像风格变换作品的基石。他们研究表明开源图像识别网络 VGG16 可以在图像风格变换中发挥巨大作用,利用 VGG16 中间层的一些输出,可以提取出两张图像的风格和语义信息,并它们可以很好地模拟和映射人类大脑对于图像风格迁移的思考。这篇文章表明对于图像处理其具有不错的效果。
A Neural Algorithm of Artistic Style
第二篇文章是对视频风格变换的研究,《Artistic style transfer for videos》,弗莱堡大学的 Manuel Ruder、 Alexey Dosovitskiy、 Thomas Brox 发表的作品,他们把上述图像的方法应用到视频帧,并利用光流来稳定风格变换过程,以确保一个场景下帧间的连续性,这样来实现视频的风格变换。
之后 Viktoriya Yakubova 把这项研究应用到实际中,制作了 NYC Flow 视频。
从 NYC Flow 可以看到,应用上述视频风格迁移技术很好的实现视频的风格变换。但是,该项技术也有极大的弊端,光流的计算速度通常很慢,这使得即使在硬件设备配置较好的条件下,预测一帧图像仍需要花费大量时间。因此,对于实时的应用来讲,仍迫切需要一个更加快速的方法来实现视频的风格变换。
Justin Johnson、 Alexandre Alahi、 Li Fei-Fei 等人于 2016 年提出了《Perceptual Losses for Real-Time Style Transfer and Super-Resolution》。这项联合工作由 Nvidia 支持,包括了风格变换和超分两部分工作。如下动图所示,这篇文章可以产生相当不错的变换结果,同时它在速度方面大大优于第二篇文章的处理速度,在实时处理方面具有极大的优势,可以实现 20fps 的处理速度。
Johnson 等人方法的变换结果
Stylevision 框架概述
风格变换的工程实现称为 Stylevision,整体流程如下图所示。
Stylevision 流程
整体包括两个 Page,第一个是 Camera Page,利用它我们可以获得用户的相机输入,可以视作输入页,这在现实生活中一般作用于用户手机端。第二个是 Projector Page,它用来展示风格变换以后的结果,可以把它视作输出页。所有的 stylevision 技术部分都在 Docker 容器中运行。整个工程可以在本地电脑进行也可以 terraform 部署到 AWS。
具体实现过程:
- S1: Camera Page 利用 WebRTC 把原始的相机视频馈送到 pion-receiver;
- S2: pion-receiver 对视频流改写成标准输出,把它们传送到 ffmpeg;
- S3: ffmpeg 对其进行解码处理,生成原始视频,并把视频传送到多线程 python 处理过程;
- S4: 视频处理过程包括两个线程,一个线程把这些视频帧处理成队列的形式给 stylizer。stylizer 基于 Tensorflow 框架对视频进行风格化;
- S5: 风格化处理后的视频继续送往 ffmpeg,ffmpeg 对其进行处理变为 VP8 比特流,并传送给 pion-sender;
- S6: pion-sender 利用 WebRTC 传送给 Projector Page 进行输出。
Camera Page
我们首先需要获取一些视频约束,需要提前了解视频的分辨率以及一些环境变量。我们希望可以保证获得的视频分辨率是相同的,720p 或者 480p。之后针对这些限制,告知浏览器我们需要的视频,然后获得需要的视频流。一旦获取到了视频流,就开始创建 RTC 连接到 server。之后向 server 发送一个请求。server 会做出回馈。当我们接收到合适信号就可以建立连接,浏览器可以开始发送视频。
Pion
这部分主要探讨 Pion 库,Pion 是 Go 语言写的 WebRTC 执行库,Pion 在应用中具有极强的灵活性和易组合性,代码比较容易执行和修改。在我们和 camera page 建立连接以后,我们可以接收到视频。之后就开启了不断读取发送到 pion 的 RTP 数据包的模式。(RTP 是一种发包的实时传输协议)。在传输过程中,可能会发生丢包现象,丢掉有用信息,因此一个很好的想法就是保持追踪。另一方面,在我们风格化处理完成后,我们需要把所有的帧回传回来。因此需要创建一个 reader,使其来读 VPA 流。这就开启了下一过程,从编码流中提取风格化的视频。
FFmpeg
Pion 处理的是编码的码流,Tensorflow 处理的是未编码的原始视频,因此这就需要 FFmpeg 来实现这一转码过程。在 pion-receiver 端, FFmepg 将 H.264.码流变换成视频;在 pion-sender 端, FFmepg 将视频变换为 VP8 码流。
Multithreaded Python Process
这是整个工程的关键部分。输入是 FFmpeg 解码得到的原始视频,因此我们需要了解图像的大小,当从流程中获得足够的比特以后,把它重组成 numpy 数组的形式。在实际应用中,Stylizer 处理速度往往比不上接收视频的速度,因此转换的图像是最近帧的变换结果。对于 Stylizer 部分,我们基于 Johnson 等人的工作《Perceptual Losses for Real-Time Style Transfer and Super-Resolution》,并基于相关研究者实现的 Tensorflow 版本的代码进行视频处理,首先加载模型,对输入进行初始化,创建一张全黑的空白帧,之后利用模型进行风格变换。
在硬件上,可以利用 GPU 来加快训练和推理速度,同时,在精度要求不高的条件下,如果想要加快速度,可以用 float 16 的处理来代替 float 32。
附上演讲视频:
http://mpvideo.qpic.cn/0bc3baaasaaadiagyl5dtjqvacgdbeeaacia.f10002.mp4?dis_k=72242838d3d0ae0db01e4e909b7e3faf&dis_t=1638411965&vid=wxv_2155971641107939328&format_id=10002&support_redirect=0&mmversion=false