将嘈杂的低分辨率视频转换为高质量视频,为最终用户带来迷人的体验

nvdev 2022-04-14 18:16:51

由于流行病相关的关闭和在家办公的政策,视频会议、音频和视频流以及电信最近出现了爆炸性增长。企业、教育机构和公共部门机构对虚拟协作和内容创建应用程序的需求正在飙升。在线交流的关键部分是视频流,无论是简单的视频通话还是面向广大受众的流媒体内容。同时,这些流是在线通信中网络带宽最密集的部分,通常伴随着噪声和伪影。

为了解决这些视频质量挑战, NVIDIA Maxine 视频效果 SDK提供了基于人工智能的视觉功能,将嘈杂、低分辨率的视频流转换为令人愉悦的用户体验。这篇文章演示了如何使用标准网络摄像头输入运行这些效果,并轻松地将它们集成到视频会议和内容创建管道中。

添加细节并提高分辨率

对于因图像帧的低分辨率而导致的低视频质量, Maxine video Effects SDK 提供了两种基于人工智能的最先进视觉效果:超分辨率和放大。

超分辨率(图 1 )从提供的输入图像生成具有更高分辨率和更好纹理的优质图像。它提供了全面的增强功能,同时保留了内容。这种视觉效果最好用于无损压缩数据,如 H . 264 。您可以使用此功能将介质缩放 1 . 33 倍、 1 . 5 倍、 2 倍、 3 倍和 4 倍。

In the before/after picture, you can observe increases in both structural details and textures.图 1 。超分辨率功能正在发挥作用

要调整超分辨率效果,请选择其模式:

  • 0 :建议用于包含编码工件的流和使用有损压缩编码的流。
  • 1 :应用强大的视觉增强功能,建议用于使用无损压缩编码的流

Upscaler (图 2 )是一种快速且轻量化的方法,用于提高输入视频的视频分辨率,同时也为图像添加细节。它着重于框架内容的几何结构,并增强其细节。除了更好的图像分辨率外,放大效果还能产生更清晰的图像。

In the before/after picture, you can observe enhanced structural details.图 2 。放大功能正在运行

您可以在[0 , 1]范围内设置 Upscaler 的增强参数:

  • 0 :在不增强图像的情况下提高分辨率。
  • 1 :最大图像清晰度和清晰度视觉效果增强。

默认情况下, Upscaler 的增强参数设置为 0 . 4 。

消除网络摄像头视频噪音并减少编码瑕疵

造成或破坏最终用户体验的视频噪音的根本原因有很多。然而,两种最常见的噪声源是网络摄像头噪声和编码伪影。

网络摄像头噪声源的示例包括摄像头传感器类型、曝光或照明级别。在最终用户生成的流的环境中,如果环境照明不好或使用的相机质量较差,则情况尤其如此。这些类型的噪音在很大程度上取决于摄像头中传感器的类型。

视频流中的编码伪影是传输帧所需的带宽限制的结果。有损压缩通常包括丢弃图像中的一些纹理信息以及数据编码。有损压缩标准的常见示例是图像的 JPEG 和视频的 H . 264 。流式传输此媒体时,每单位时间的流带宽称为比特率。

在流式传输环境中,可用于流式传输压缩内容的带宽不是恒定的。这种可变性导致编码器的比特数少于压缩帧所需的比特数,从而产生压缩伪影。压缩工件可以有多种形式,但最常见的形式之一是块状工件。

Maxine Video Effects SDK 的视频去噪(图 3 )功能使您能够消除网络摄像头流的噪音并保留细节,从而获得更好的最终用户体验。

In the before/after picture, you can observe that camera noise is removed.图 3 。视频噪音消除功能正在发挥作用

此功能有两个具有强度值的变体:

  • 0 :用于较弱的降噪效果,以确保纹理质量的保持。这是低噪音介质的理想选择。
  • 1 :对于可能影响纹理质量的大量降噪效果。此变体可以轻松地与放大或超分辨率链接,以添加细节、增强和提高分辨率。

Maxine 伪影减少功能(图 4 )减少了视频通话带宽下降时遇到的块状伪影。它还减少了ringing蚊子的噪音,同时保留了原始视频的细节。

In the before/after picture, you can observe that encoding artifacts are rem图 4 。伪影减少功能正在发挥作用

此基于 AI 的功能针对两种模式进行了优化:

  • 0 :保留低梯度信息,同时减少瑕疵。此模式更适合于更高比特率的视频。
  • 1 :提供更好的输出流。此模式应适用于具有较低比特率的高质量无损视频。

允许最终用户选择虚拟背景

为了使最终用户能够在既不涉及个人又不分散注意力的环境中参加会议, Maxine Video Effects SDK 提供了虚拟背景功能。

虚拟背景功能(图 5 )基本上生成了一个遮罩来分割前景,在本例中,是来自流的人。您可以提供任何媒体作为背景,无论是图像还是视频。您还可以实现多个创造性应用程序,例如在同一背景中添加多个用户。例如,如果两位评论员正在谈论一个现场活动,您可以在该活动的现场提要上对这两个评论员进行分段。另一个例子是将用户分割出来,并将其覆盖在计算机的实时提要上。这样,一个或多个用户可以同时实时呈现,同时保持沉浸感。所有这些操作都使用 GPU 提供的并行性,增加了可实时处理的流的数量。

In the picture, a new background is being applied. 图 5 。虚拟背景功能正在运行

虚拟背景功能以两种模式运行:

  • 质量模式:实现最高分割质量
  • 性能模式:实现最快的性能

您还可以使用此功能生成具有可调模糊强度的模糊背景

连锁视频效果功能

为了处理预压缩的视频或带有噪声的视频,以及提供更高的分辨率,我们建议将 Upscaler 链接到伪影减少视频去噪,具体取决于使用情况。有关更多信息,请参阅探索 API 。您还可以使用 SDK 打包的UpscalePipeline 示例应用程序获得开箱即用的体验。

在 Windows 和 Linux 上使用容器和安装 Video Effects SDK

NVIDIA 通过 Docker 容器以 SDK 包的形式在 Windows 和 Linux 平台上提供 Maxine Video Effects SDK 。

使用容器的好处是高可扩展性,并且由于减少了部署和采用时间而节省了时间和成本。将容器与 Kubernetes 一起使用提供了一种健壮且易于扩展的部署策略。此外,由于容器的预包装性质,您不必担心容器内的特定安装。

在本文中,我们将重点介绍如何在容器和窗口中使用 Maxine Video Effects SDK 。继续安装之前,请确保满足所有硬件要求。

如果您对 NVIDIA 软件堆栈有丰富的经验,并且希望在裸机 Linux 系统上部署视频效果 SDK ,请参阅Maxine 开始了页面。

在 Docker 容器中使用视频效果 SDK

在容器上安装和利用高性能视频效果 SDK 及其最先进的 AI 模型需要四个步骤:

您需要访问 NVIDIA 图灵、 NVIDIA 伏特或 NVIDIA 安培体系结构生成数据中心 GPU s : T4 、 V100 、 A100 、 A10 或 A30 。

在 Windows 上安装视频效果 SDK

在 Windows 上安装 SDK 是一个简单的过程:

您必须拥有 NVIDIA RTX 卡,才能从 Windows 上 Maxine Video Effects SDK 的加速吞吐量和缩短延迟中获益。要在数据中心卡(如 A100 )上运行此 SDK ,请使用 Linux 包。

示例应用程序

Video Effects SDK 附带五个示例应用程序:

  • AigsEffectApp
  • BatchEffectApp
  • DenoiseEffectApp
  • UpscalePipelineApp
  • VideoEffectsApp

这些应用程序包含运行 Video Effects SDK 中所有功能的示例代码。要体验这些功能,还可以构建应用程序并使用预构建的 Windows bash 脚本来运行它们。

您可以使用 SDK 的/VideoFX/share文件夹中的build_samples.sh脚本构建应用程序。如果您使用的是 Docker 容器,则这是条目文件夹。

bash build_samples.sh’

该脚本构建示例应用程序并安装一些示例应用程序特定的依赖项。这一步 MIG 需要几分钟的时间。构建后,在构建应用程序的文件夹中,每个应用程序至少可以找到一个 bash 脚本。以下是其中一个应用程序的详细介绍:

#!/bin/sh . ./setup_env.sh VideoEffectsApp \        --model_dir=$_VFX_MODELS \        --in_file=$_VFX_SHARE/samples/input/input1.jpg \        --out_file=ar_1.png \        --effect=ArtifactReduction \        --mode=1 \        --show VideoEffectsApp \        --model_dir=$_VFX_MODELS \        --in_file=$_VFX_SHARE/samples/input/input1.jpg \        --out_file=ar_0.png \        --effect=ArtifactReduction \        --mode=0 \        --show VideoEffectsApp \        --model_dir=$_VFX_MODELS \        --in_file=$_VFX_SHARE/samples/input/input2.jpg \        --out_file=sr_0.png \        --effect=SuperRes \        --resolution=2160 \        --mode=0 \        --show VideoEffectsApp \        --model_dir=$_VFX_MODELS \        --in_file=$_VFX_SHARE/samples/input/input2.jpg \        --out_file=sr_1.png \        --effect=SuperRes \        --resolution=2160 \        --mode=1 \        --show

这是一个引用示例应用程序之一VideoEffectsApp的命令行示例。您可以调整以下参数以体验不同的功能:

  • --effect:选择效果:工件 CTR 导出、超级资源或高级。
  • --mode:在两种模式之间切换: 0 、 1 。
  • --strength:切换放大倍增器增强倍增器: 0 , 1 。
  • --resolution:用于输入所选介质的目标分辨率。例如,如果要翻倍 720p 介质,请使用 1440 。

在本地运行这些效果时,您可以使用键盘控件切换效果,并通过网络摄像头提要实时体验效果。有关更多信息,请参阅示例应用程序参考。如果您对链接这些效果感兴趣,请继续阅读。最后,如果您有兴趣了解有关批处理和最大化吞吐量的更多信息,请参阅BatchEffectApp示例应用程序。

使用 API 链接多个视频效果功能

链接效果对于许多应用程序来说都非常有趣。这篇文章主要关注如何将两种效果很好地结合在一起:工件减少和放大。另一个例子是为嘈杂的网络摄像头流运行视频噪声消除和超分辨率或放大。您可以选择最适合您的用例的效果。

下面是关于 API 及其用法的更多信息。图 6 显示了使用 Video Effects SDK 函数的高级过程:

  • 创建和配置效果
  • 配置 CUDA 流、分配缓冲区和加载模型
  • 加载数据并运行效果

The process includes the following steps: Create the effect, load the model, and use the effect.图 6 。使用 Video Effects SDK API 的三个简单步骤

下面的视频介绍了这个流程,但是这个流程有很多细节,我们将在后面的文章中讨论。此外,视频还介绍了在 Maxine 虚拟背景下使用 GPU 和 API 详细信息时必须了解的基本知识。本文中的所有代码示例都可以在 SDK 示例应用程序中找到。

视频 1 。创建自己的虚拟背景

创建和配置效果

第一步是创建要使用的效果。在这篇文章中,我们将讨论伪影减少和放大。您可以使用NvVFX_CreateEffect函数创建指定类型的视频效果过滤器的实例。此函数需要效果选择器并返回效果句柄。效果选择器是一个字符串,您可以使用它拾取要创建的效果。

NvVFX_Handle _arEff; NvVFX_Handle _upscaleEff; NvVFX_EffectSelector first; NvVFX_EffectSelector second; NvVFX_CreateEffect(first, &_arEff); NvVFX_CreateEffect(second, &_upscaleEff);

然后,使用NvVFX_SetString函数指定特征的模型位置。

NvVFX_SetString(_arEff, NVVFX_MODEL_DIRECTORY, modelDir); NvVFX_SetString(_upscaleEff, NVVFX_MODEL_DIRECTORY, modelDir);

大多数视频特效 SDK 功能都有模式。如前所述,这些模式本质上是相同效果的两种不同变体。在这种情况下,伪影减少有两种模式,您可以使用NvVFX_SetU32函数设置。对于 Upscaler ,这是一个浮点值,可以使用NvVFX_SetF32函数设置为 0 到 1 之间的任何数字。

int FLAG_arStrength = 0; float FLAG_upscaleStrength= 0.2f; NvVFX_SetU32(_arEff, NVVFX_STRENGTH, FLAG_arStrength); NvVFX_SetF32(_upscaleEff, NVVFX_STRENGTH, FLAG_upscaleStrength);

配置 CUDA 流、分配缓冲区和加载模型

创建效果后,下面介绍如何使用 CUDA 并加载模型。 CUDA 流是一组按照发出操作的确切顺序执行的操作。记住这一点,第一步是创建这个流。您可以使用NvVFX_CudaStreamCreate函数创建此流。

CUstream _stream; NvVFX_CudaStreamCreate(&_stream);

现在已经有了流,请将效果指定给流。您可以通过NvVFX_SetCudaStream函数实现这一点。

NvVFX_SetCudaStream(_arEff, NVVFX_CUDA_STREAM, stream)); NvVFX_SetCudaStream(_upscaleEff, NVVFX_CUDA_STREAM, stream);

CUDA 流已经就位,下面介绍如何移动数据。在本例中,您正在移动图像帧。如果您是 GPU s 的新手,您 MIG ht 会问:“为什么我们要将数据移动到哪里?”

GPU 通常有自己的专用视频 RAM ( VRAM )。这就像插入系统主板的普通 RAM 一样。拥有专用 VRAM 的关键优势在于,存储在该存储器中的数据处理速度明显快于常规 RAM 上的数据。当我们说“将数据从 CPU 内存移到 GPU 内存”时,我们指的是这两种 RAM 之间的内存传输。

Memory transfer between CPU and GPU memory goes both ways.图 7 。 CPU 与 GPU 缓冲区概述

在使用单一效果的典型场景中,此传输将毫不费力,需要两个 CPU 内存缓冲区和两个 GPU 缓冲区。在这两种情况下,一个用于源,另一个用于已处理的帧。

Memory transfer for single video effect with CPU and GPU memory for source and processed frame.图 8 。在 GPU 和 CPU 上的不同内存缓冲区之间移动数据

当您链接需要两种不同图像像素布局的功能时,会增加一层复杂性。 GPU 上还必须有两个缓冲区,一个用于存储第一个效果的输出帧,另一个用于存储第二个效果的输入。图 9 显示了流程。现在不要担心函数名;我们将在本文后面的“运行效果”部分中对它们进行回顾。

Memory transfer for chained video effects with additional intermediate buffer layer.图 9 。在 GPU 和 CPU 上的不同内存缓冲区之间移动数据,同时考虑像素格式

考虑到这种高层次的理解,下面介绍如何设置管道。设置此管道有两个步骤:分配内存和指定输入和输出缓冲区。

首先,使用NvCVImage_Alloc函数为 GPU 缓冲区分配内存。

NvCVImage _srcGpuBuf; NvCVImage _interGpuBGRf32pl; NvCVImage _interGpuRGBAu8; NvCVImage _dstGpuBuf; // GPU Source Buffer NvCVImage_Alloc(&_srcGpuBuf, _srcImg.cols, _srcImg.rows, NVCV_BGR, NVCV_F32, NVCV_PLANAR, NVCV_GPU, 1); // GPU Intermediate1 Buffer NvCVImage_Alloc(&_interGpuBGRf32pl, _srcImg.cols, _srcImg.rows, NVCV_BGR, NVCV_F32, NVCV_PLANAR, NVCV_GPU, 1); // GPU Intermediate2 Buffer NvCVImage_Alloc(&_interGpuRGBAu8, _srcImg.cols, _srcImg.rows, NVCV_RGBA, NVCV_U8, NVCV_INTERLEAVED, NVCV_GPU, 32); // GPU Destination Buffer NvCVImage_Alloc(&_dstGpuBuf, _dstImg.cols, _dstImg.rows, NVCV_RGBA, NVCV_U8, NVCV_INTERLEAVED, NVCV_GPU, 32);

这似乎是一个复杂的函数,但在较高的层次上,您正在为给定类型的图像帧指定所需类型的缓冲区的基本参数。例如,它是 RGBA 图像吗?每个组件都有 8 位吗?这些位是平面、粗块还是其他格式?有关详细信息,请参阅设置输入和输出图像缓冲区

其次,使用NvVFX_SetImage函数指定为每个效果创建的输入和输出缓冲区。

// Setting buffers for NvVFX_SetImage(_arEff, NVVFX_INPUT_IMAGE,  &_srcGpuBuf); NvVFX_SetImage(_arEff, NVVFX_OUTPUT_IMAGE, &_interGpuBGRf32pl); NvVFX_SetImage(_upscaleEff, NVVFX_INPUT_IMAGE, &_interGpuRGBAu8); NvVFX_SetImage(_upscaleEff, NVVFX_OUTPUT_IMAGE, &_dstGpuBuf);

最后,加载模型。NvVFX_Load函数也执行相同的操作。它还验证为生效选择的参数是否有效。

NvVFX_Load(_arEff); NvVFX_Load(_upscaleEff);

运行效果

现在管道已经设置好,您可以继续运行效果。将帧从 CPU / GPU 源移动到相应的输入缓冲区。NvCVImage_Transfer函数可用于移动帧, NvVFX _ Run 函数用于运行效果。

// Frame moves from CPU buffer to GPU src buffer NvCVImage_Transfer(&_srcVFX, &_srcGpuBuf, 1.f/255.f, stream, &_tmpVFX); // Running Artifact Reduction NvVFX_Run(_arEff, 0); // Frame moves from GPU intermediate buffer 1 to buffer 2 NvCVImage_Transfer(&_interGpuBGRf32pl, &_interGpuRGBAu8, 255.f, stream, &_tmpVFX); // Running Upscaler NvVFX_Run(_upscaleEff, 0)); // Frame moves from GPU destination buffer to CPU buffer NvCVImage_Transfer(&_dstGpuBuf, &_dstVFX, 1.f, stream, &_tmpVFX));

第一步,似乎有多个运动部件,但只有三个主要步骤:创建效果、设置 CUDA 流以及管理数据流,最后运行效果。

所有三种 Maxine SDK- 视频效果 SDK音频效果 SDK增强现实 SDK的设计都类似。您可以将相同的概念应用于音频效果和增强现实 SDK ,只需稍作修改。

将视频效果 SDK 集成到您的应用程序中

如本文所示, Maxine Video Effects SDK 提供了许多 AI 功能,使您能够拍摄嘈杂的低分辨率视频,并向最终用户提供高质量的视频。此外,您可以将多个效果链接在一起,并创建视频管道。要将这些视觉效果应用于视频会议、流媒体或电信应用程序,请参见Maxine 开始了页。让我们知道您的想法或您是否有任何疑问。

阅读原文

...全文
626 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

1,209

社区成员

发帖
与我相关
我的任务
社区描述
NVIDIA 开发者技术交流
人工智能 企业社区
社区管理员
  • nvdev
  • 活动通知
  • AI_CUDA_Training
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧