视频直播/远程会议中的AI关键技术探索应用
作者:互联网
随着各种AI新技术的发展和应用,它们不仅为我们带来了对于服务形式、内容,如各种视频特效、功能实现上的改变,更为重要的是对于服务质量以及成本上的优化。本文由NVIDIA深度学习解决方案架构师 吴金钟 在线上分享中的演讲内容整理而成,详细分析探讨了英伟达GPU上的硬编解码方案和CUDA并行计算架构赋能下的音视频AI技术研究与最新实践应用。
文 / 吴金钟
文章整理 / LiveVideoStack
我是英伟达深度学习解决方案架构师吴金钟,今天给大家介绍的是英伟达在直播场景中的解决方案。
英伟达针对直播场景提出了Broadcast engine(RBX)和Maxine两个解决方案,针对的是消费级GPU和数据中心GPU两个应用场景。我会先对这两个解决方案做一个简单的概述,然后再对其中的视频压缩技术codec和transcoding做一个详解,最后是NGC,NGC是英伟达高度优化的解决方案的hub,为开发者使用GPU提供便利。
1. RBX & MAXINE
目前英伟达在直播场景中,GPU的功能按运行平台分成两个部分,一个是RBX,另一个是MAXINE。RBX依托的就是RTX GPU强大的算力,支持了实时的AI特效,比如说背景噪音的剔除、绿幕、超分、人脸跟踪等等。MAXINE是为数据中心准备的,它是英伟达在2020年最新发布的解决方案,不管是RBX还是MAXINE,它们其实都是一组AI能力的集合。
我们看右边的图,这个图就显示了RBX和MAXINE的软件栈结构,它们的功能都是由一组SDK提供,我们刚刚说到的绿幕和超分就是由视频特效SDK提供,背景噪音剔除是由音频特效SDK提供,Face tracking是由AI特效提供的。同时里面还集成了Codec的功能,利用GPU上硬编解码单元,提供了串流的能力。Jarvis是英伟达对话式AI的解决方案,直播中引入Jarvis提供transcription、ASR和TTS等功能。Audio2Face是语音驱动avatar的功能,我们之前在GTC上看到的Misty水滴的效果,就使用到了Audio2Face的功能。同时NVIDIA Research最新的研究成果也会不断地增加进来。我们后面会对其中的AI视频压缩技术做一个详解。
再往下看就是CUDA并行计算架构,提供了GPU强大的并行计算能力。我们刚才提到的这些AI的模型都是需要通过CUDA和TensorRT进行加速来实现实时计算的。TensorRT是英伟达提供的AI模型推理加速的SDK,同时从Volta (如V100)这一代开始GPU上增加了Tensor core矩阵乘单元来对模型推理进一步加速。Tensor core同时也可以通过混合精度训练的方式来对训练进行加速。再往下就是GPU的硬件层。
1.1 RBX
这些是MAXINE主要的功能,它分为几大类。视频特效包括绿幕、超分、upscale、artifact reduction。绿幕的功能是前后景分割,分割后的背景可以被虚化,也可以替换成其他的图片、视频或者游戏画面等等。超分和Upscale都有提升分辨率的能力。超分在视频增强的同时还有一定的artifact reduction的功能,它计算量比较重。Upscale有一定的锐化作用,是一个比较轻量级的算法。Artifact reduction主要是用于消除在低码率下所引起的artifact。
音频特效就包括背景噪音的剔除,比如说PC风扇的声音、直播时背景人群窃窃私语的声音、窗外下雨的声音等等。AR特效包括人脸检测、跟踪、landmark点和3D mesh生成。人脸检测输出的是2D bounding boxes,同时也支持多个bounding boxes的输出。用户也可以根据自己的场景去指定输出bounding box的数量。
人脸关键点的检测输出的是126点的landmark,可以对眼睛、嘴唇、眼球进行跟踪。它输入的数据可以是image + bounding boxes,也可以直接输入image,在内部进行人脸检测再生成bounding boxes。3D mesh和上面二者处理的方式类似,一般情况下输入image + landmark点。如果没有landmark点,也可以在内部计算landmark点,然后通过landmark点拟合出来3D mesh。右下角的网址包含了更多的细节。
1.2 MAXINE
MAXINE是英伟达在视频会议方面的解决方案。据统计,全球每天视频会议的数量已经超过了3000万。由于疫情的影响,视频会议有变成一种常态化需求的趋势。MAXINE的功能与RBX有很多的共同点,但MAXINE是在云端部署的。在云端部署的一个好处是和终端的计算能力解绑,给用户提供一致的服务质量。MAXINE也提供绿幕、超分、upscale、artifact reduction、背景噪音的剔除、转录、NLU、TTS、AR等特效,也使用TRT/tensor core进行加速。在部署上,MAXINE可以通过Kubernetes微服务的方式,也可以通过DeepStream的方式。同时MAXINE也提供开发的SDK,用户可以根据自己的需要把对应的模块集成到自己的系统中。
DeepStream是英伟达提出的端到端视频流的解决方案。它基于的是开源的框架GStreamer,其中主要集成了两个部分:一个是GPU CODEC的功能,一个是AI推理的功能。DeepSteam的plugin结构方便用户开发自己的功能。
*BROADCAST APP DEMO
这是背景噪音的剔除。这个功能已经嵌入进了常用的直播软件中,比如OBS。视频中其他例子是绿幕效果,背景虚化替换成视频或者游戏的画面等等;还有相机跟随的效果。
*NVIDIA MAXINE
这是超分效果,左边是360p,右边是720p。接下来是我们刚才提到的相机跟随的效果,这是在云端部署的。其次是绿幕效果、背景噪音剔除、Audio2Face、视频会议中的翻译、AI视频压缩技术、人脸矫正。
2. AI视频压缩技术
下面我们对AI视频压缩技术做一个详解,这是一个NVIDIA Research最近的研究成果。对于视频会议来说,有两个核心需求:一个是降带宽。视频占用大量的带宽资源,因此降带宽成为了核心需求。另一个需求是用户体验感不高,视频会议中人脸的朝向一般都不是正对着屏幕,无法达到面对面交流的效果,所以提升用户的体验也是一个核心需求。如果可以把人脸的朝向矫正过来,也会大大提升用户体验。
我们再看下传统的视频压缩技术,以H264为例,它采用的是I帧P帧B帧编码的技术。即使是这样,在网络上传送的数据量仍然是巨大的,视频会议有其特殊性。一般情况下,每一路信号里只有一个用户,背景也是静态的。这里介绍的one shot free view的技术提出了只传一幅图像,然后用这幅图像进行初始化,每帧只需要传送非常少的数据就可以进行视频重建的技术。初始化图像包含了用户的appearance identity的信息,每帧只需要传送头部的姿态信息和面部的表情信息delta。这样的好处是每帧传送的数据量大大减少了,视频进一步得到了压缩。同时,使用GAN的技术也保证视频重建的质量。
右图第一张图是原始的视频,第二张图就是重建出来的视频,但重建出来的视频人脸朝向并没有矫正过来,第三张图是经过人脸对齐的、视频重建的结果。这个主要是因为论文中提出的主要关键点分解的技术。将人脸的identity信息和运动信息进行分解,因此在重建的过程中可以只保留人脸面部信息不变,而去调整头部姿态的信息,然后对人脸朝向进行矫正。与现有方法相比,这篇文章是free view的,可以在原图像的view附近较大的一个角度进行旋转。
同时,英伟达在GAN方面做过许多工作,与这篇文章相关的有pix2pixHD、vid2vid来解决时间域连续的问题;再到few shot vid2vid来解决只用较少量图片重建视频的问题;再到one shot free view来解决单shot大角度旋转的问题。另外,和这篇文章密切相关的还有FOMM,first order motion model这篇文章。与FOMM不同的是,本文采用的是隐式的3D的key points,而不是2D的key points。同时将head pose、运动信息、identify信息进行分离来进行人脸的矫正。
再来看下具体的过程。这篇论文包含了两个步骤:第一步是特征提取,包括源图像和driving video的特征提取。先说下人脸关键点的分解,分解出来的信息包括三个部分:第一个是appearance identity,这部分和用户的运动信息无关,只需要通过一张用户的图片就可以提取出来,之后就输入到后面的网络中进行重建;第二个是head pose R/T(旋转或平移两个部分),需要每帧进行传输;第三个是expression delta 面部表情,这部分信息也需要每帧上传,用来重建面部的表情。
左下图网络的输入包括两个部分:一个是source image,一个是driving video。因为需要重建的是source image里面的人物,所以我们要从source image里提取appearance identity的信息,这个和用户的姿态无关,我们只需要用户的一张图片就可以了。随后需要从driving video里提取expression delta和head pose R/T两个数据。因为我们想通过目标人物的表情来驱动source image,所以有了以上三个信息之后就可以进行重建了。如果head pose不是由driving video提供的,而是由用户指定的,那么就可以实现姿态编辑了。
右图是特征提取的过程,里面的每一个方块都是DL的模型,一共有四个DL的模型。首先是appearance feature extractor F,这是提取特征的信息,只需做一次,输出的就是appearance feature fs;第二个是head pose estimator H,输出的是旋转和平移两个矢量,需要每帧传输;第三个是表情delta,也需要每帧传输;第四个是key points detector L,提取一定数量三维的关键点,这里三维关键点是隐式的,并不是真正的在三维空间内,像3D mesh那样的。论文中使用的关键点是20个,是由网络无监督学习出来的。这里的L只需要对源图像进行计算就可以了,输出的Xc,k和Jc,k就提供了缺省的姿态信息。
我们看图中蓝色的箭头,当有了key points Xc,k和Jc,k之后,就可以对其进行旋转或平移了,最后再加上expression delta,随后就可以对目标图像进行重建。这里的Ru和Tu其实就是用户指定的head pose。
直观地看下identity信息和运动信息的分离。左边两张图是source image和driving image。直接用key points Xc,k去重建的是一个正面的图像, Xc,k是三维空间中隐式的关键点,作为演示这里面只显示出了五个关键点;对于关键点进行旋转和平移,重建出来的就是旋转和平移后的图像。可以看到这样的图像的头部的姿态已经和driving image里的头部姿态对齐了,但是面部表情还不一致。最后还得把面部表情delta加进来进行重建。我们可以对比下重建的效果,重建的过程保持了identity信息的不变,同时头部的姿态和表情都与driving video保持一致。
刚才说的是第一步,第二步就是视频重建,这个可以分为两个部分:第一个是feature volume wrapping,第二步是将变形后的Feature volume w(fs)输到generator进行帧重建。这里的feature volume思想是从FFOM中借鉴来的,一个改进就是将原来2D显式的key points替换成了3D隐式的key points,这样就可以对3D隐式的key points进行旋转和平移了。有兴趣的同学可以去看下论文。
下面再看下数据压缩部分。传输的数据包括两个部分:一个是原始图像,只需传输一次;另外是需要每帧传输的R/T、头部姿态和expression delta。这些数据也是需要采用压缩的方式进行传播的。我们来看这张流程图。
输入的图片是d,通过编码之后得到了head pose、R/T和面部表情 delta,这些数据需要传送给接收端进行重建。在传送的过程中,数据编码的格式采用的是熵编码的方式。
这幅图的统计给出了在两种配置下(20个关键点和自适应的关键点)每帧需要传送的数据量。
我们看平均的数据量,每帧需要传输的数据不到100byte。从整体来上看,基于AI视频压缩技术与H264相比,可以节约十倍的网络带宽。当然当背景有新的物体进来时,或者说有帽子、眼镜、口罩等遮挡物时,这时候其实就需要上传一张新的source image,后面再基于这张新的source image进行重建。这张新的source image也可以通过压缩的方式进行上传。
这两幅图是对比的效果,左边是H264,它的带宽每帧是97KB;右图是视频压缩技术,它的带宽只有0.1KB,可以看到 AI视频压缩技术在低码率下重建的效果还是很好的。
我们来看一下效果图,在相同的带宽下,H264编码很多的细节都丢失了。在低带宽的情况下,AI视频压缩有一个比较好的重建。
以上是一些资源。
在直播中一个重要的模块就是编解码。GPU上编辑码的单元和计算单元是独立开的,它们可以同时使用。他们共享的是显存和PCIe的带宽。Encoder方面支持常用的H264、H265的编码格式。Decoder支持的格式更多,比如VP8、VP9等。在最新安培的架构上增加了对解码AV1的支持,分辨率可以达到8192×8192。H264的编解码在GPU上可以达到4096×4096,H265可以达到8192×8192的编解码。
我们来看一下CODEC的性能,这里显示的是在1080p下解码的性能。在不同的格式下,H264、HEVC、HEVC10bit和VP9上各个 GPU 的解码能力的对比。最高的线就是T4,可以看到T4在各个格式下的解码的性能都是比较优越的。T4主要用在线上服务的场景,它的目标就是多样性的任务都可以在T4上面有较好的表现。对于H264来说,T4的解码的Performance大约是1000帧每秒,H265大约是2100帧每秒。
我们再看上面两幅图,左边是H264 1080p30fps的编码,右边是HEVC 1080p30fps的编码。
对于T4 fast来说,分别可以支持19路和13路的并发。这是对latency不太敏感的情况下;如果是对latency比较敏感的情况下,比如云游戏、视频直播,像B帧,还有look ahead技术就没有办法使用了,并发的路数是17路和12路。从整体上来说,使用GPU支持的并发路数都是高于CPU的。
在转码的场景下,Codec 的SDK已经集成进了FFmpeg,使用的流程和传统的方式是一样的。首先视频流进来-->设置 GPU的解码(h264_CUVID)-->在GPU上做一些 filtering(scale/transpose)等-->再设置GPU的编码(h264_nvenc)-->最后是输出视频。
同时在GPU上也支持一到多路的转码。支持多GPU,可以通过-gpu list或-hwaccel_device 1使用。同时也支持GPU和CPU的混合操作,比如有些格式在GPU上不支持,就可以把解码的工作挪到CPU上,等解码完成后,再把解码出来的数据,通过hwupload_cuda传到GPU上。GPU也支持常用的filters,如resize、scale、crop等操作。
这是一个典型的FFmepg的命令行。一般都会指定-vsync 0,这个参数保证了既不产生重复帧也不会丢弃帧。这个参数在对比CPU和GPU的功能时经常会用到。-hwaccel cuvid保证了解码出来的数据是驻留在GPU上的。再设置 h264硬解码的功能,输入视频、拷贝音频,使用h264进行编码,设置bitrate是5M,最后输出视频。
在转码中一个比较容易忽略的点是CPU和GPU之间的隐式的数据交换。为了保证解码出来的数据是驻留在GPU上的,就需要指定-hwaccel cuvid参数。当没有指定这个参数的时候,FFmpeg就会缺省的把解码的数据拷回CPU,当我们后面用GPU进行编码的时候,数据又需要拷回 GPU,这个其实是一个不必要的数据交换,尽量减少这种方式的使用。
在直播中有时候也会有一定的渲染的任务。在服务器端headless服务器上,OpenGL一般是与EGL搭配使用,实现 GPU的离屏的渲染。渲染出来的结果。最简单的方式可以通过 glReadPixels读到 CPU,再进行后续处理,比如滤波等、最后是落盘。
另一个更高效的方式:渲染完成之后,通过CUDA/OpenGL互操作的方式,将其影射到CUDA context里,再由CUDA kernel做滤波的操作,最后再拷到CPU,最后落盘。
真实感渲染也可以使用OptiX SDK进行光线跟踪。比如在V100上,ray tracing是使用CUDA cores来进行光线求交的。从图灵这一代开始,T4上增加了RT cores,专门对光线求交进行加速,可以直接使用OptiX SDK进行开发,也可以使用Vulkan里面的ray tracing扩展进行开发,同时OptiX也集成进了DXR。在服务器端,OpenGL的开发环境可以从NGC上下载,Vulkan可以从container上下载,OptiX可以从产品页下载,有完整的 sample code和文档。Vulkan ray tracing可以参考最下面的文档。如果需要对ray tracing性能进行评估的话,可以使用Nsight Graphics来profiling。
上图总结了在各个模块中数据是如何交换的。涉及到了decoder和encoder,这部分功能都是由Codec的SDK提供的。AI推理和训练,这部分都是CUDA和各种框架来提供的。OpenGL和Vulkan是driver的一部分。这么多模块都需要进行互操作, 因此CUDA就可以作为一个中转。对于decoder,可以在DecodLockFrame和UnlockFrame之间使用CUDA的kernel对像素进行操作。对于encoder,在EncodeFrame之前,可以调用CUDA kernel去做颜色空间的转换等等。对于OpenGL,首先需要将资源注册进CUDA,当渲染完成之后,再用Map和Unmap的方式将其影射到CUDA context。对于Vulkan,可以通过 graphics和computer queues里面的 transfer的功能,拷贝数据到CUDA。对于AI来说,它本身就是在CUDA context下进行的,所以无所谓数据交换了。
3. NGC
下面介绍一下NGC,它提供了英伟达部分解决方案的containers,还有预训练的模型和scripts、helm charts、已经使能了 GPU的训练框架等等。目的是加速产品的研发和部署,针对的是AI、数据科学、HPC、可视化等领域。目前container的数量已经超过了100个,trained model超过30个,支持在x86、ARM、Power平台上使用。支持云、数据中心和edge的场景。
NGC提供的资源都经过了安全的验证,并且经过了全面的测试,支持的不同场景,NGC每月都会更新,提供最新的特性和最好的性能。支持Docker Container、Singularity、Bare metal,VMs、Kubernetes等使用方式。
这张表格显示了在三个不同的场景中,V100和A100训练上的性能对比。以BERT为例,第一个方块显示的是v20.05 V100的性能,第二个方块显示的是v20.07 V100的性能。即使都是在V100 GPU的情况下,也可以通过软件升级等方式来提升性能。同时使用最新一代的GPU A100,训练性能还可以有一个大幅的提升,NGC的团队也会持续不断地对其进行优化。
NGC支持的场景, CV方面有ResNet-50、SSD、MobileNet、VGG16等。NLP方面有WaveGlow、BERT、NeMo。NeMo是NVIDIA开源的、构建对话式AI应用的工具包。对于推荐方面,有Wide & Deep、DLRM等。NGC提供了预训练的模型,可以在此基础上去进行transfer training,也可以直接用来推理。NGC还提供了sample code、定制化的模型、还有复现的脚本等等。
同时,NGC还提供了迁移学习工具包,Transfer Learning Toolkit,解决在工业场景中训练数据不足、标签不足、数据分布不一致、场景不一致等等,需要从现有的模型上重建的问题。在AI推理上,NGC提供了TensorRT的container,使用layer fusion、kernel auto-tuning等多种技术去优化AI推理的过程,来降低延迟、提升吞吐。同时,TensorRT也集成进了主流框架,在框架里就可以使用TensorRT的能力。NGC提供了T4和V100上TRT预训练的模型,包括fp32、fp16和int8的模型等等。
Triton是英伟达提供的轻量级的Inference server,使用的是CUDA streams的方式,支持异构多GPU、支持多个模型同时并行推理、支持从现有的框架里面导入模型,支持TRT、TF、Pytorch等框架。这个项目已经开源了,英伟达提供的工具可以从 NGC下载,下载docker container的方式比较方便快捷,也可以到产品页去下载,自己安装也是可以的。
*视频播放观看地址:
https://mp.weixin.qq.com/s/u-F0VxEsiEH5Gg00FDGXog
标签:视频,关键技术,NGC,AI,可以,直播,CUDA,GPU 来源: https://www.cnblogs.com/livevideostack/p/14699903.html