NVOFA 应用笔记
NVIDIA® GPU,从 NVIDIA Turing™ 架构开始,包含一个硬件加速器,用于计算帧之间的光流和立体视差(在本文档中称为 NVOFA),它独立于图形/NVIDIA CUDA® 核心工作。通过将端到端光流计算卸载到 NVOFA,图形/CUDA 核心和 CPU 可以自由地执行其他操作。
光流向量在各种用例中都很有用,例如物体检测和跟踪、视频帧率提升、深度估计、拼接等。还观察到,使用流向量进行物体检测还可以提高推理准确性1。
NVOFA 的硬件功能通过称为 NVOF API 的 API 公开。
简介
NVOFA 功能
NVOFA 引擎可以在两种模式下运行
- 光流模式:在此模式下,引擎生成两个给定帧之间的流向量,返回流向量的 X 和 Y 分量。Vulkan 接口不支持基于 Turing 架构的 GPU 的光流模式。
- 立体视差模式:在此模式下,引擎仅在 X 方向生成流向量。此模式适用于不需要向量的 Y 分量,或者先验已知其为零的用例(例如,查找立体捕捉的左右图像之间的视差)。立体视差模式将在未来的 SDK 版本中弃用。客户端应用程序可以替代地使用在光流模式下生成的流的 X 分量。Vulkan 接口不支持立体视差模式。
硬件以块方式生成流向量,每个 4 × 4、2 x 2 和 1 x 1 像素块(称为网格)一个向量。 生成的向量可以在软件中进一步后处理以提高准确性;上采样以生成密集流图。
NVOFA 硬件原生支持多个硬件上下文,上下文切换开销可忽略不计。因此,在硬件性能限制和可用内存的范围内,应用程序可以同时为多个上下文生成运动向量。
所有 Turing GPU(TU117 除外)及更高版本均支持 NVOFA 硬件。
NVOF API
NVOFA 的功能通过 NVOF API 公开。NVOF API 包括三种类型的软件接口
- CUDA:跨平台 API,可在 Linux 和 Windows 10 及更高版本上运行。
- DirectX 11:可在 Windows 10 及更高版本上运行。
- DirectX 12:可在 Windows 10 20H1 及更高版本上运行。
- Vulkan:跨平台 API,可在 Linux 和 Windows 10 及更高版本上运行。WSL(Windows Linux 子系统)架构不支持 Vulkan 接口。
有关更多详细信息,请参阅光流 SDK 中包含的示例应用程序。
表 1 和 表 2 分别总结了 NVOFA 硬件的功能以及光流 SDK 5.x 中通过 NVOF API 公开的新功能。
硬件功能 | Turing | Ampere | Ada |
---|---|---|---|
光流模式 | 是 | 是 | 是 |
支持外部提示 | 是 | 是 | 是 |
4x4 网格大小 | 是 | 是 | 是 |
2x2 和 1x1 网格大小 | 否 | 是 | 是 |
硬件成本 | 否 | 是 | 是 |
感兴趣区域 (ROI) 光流计算 | 否 | 是 | 是 |
最大支持分辨率 | 4096x4096 | 8192x8192 | 8192x8192 |
- 是:支持,否:不支持
序号 | SDK 版本 | 功能 | 描述 |
---|---|---|---|
1 | 5.0 | Vulkan 接口 | 此 SDK 添加了对 Vulkan 接口的支持。应用程序可以为一对 Vulkan 资源生成流。 |
NVOFA 质量和性能
NVOF API 公开了多个质量和性能级别(称为预设),用户可以根据所需的质量和性能要求进行选择。图 1 显示了预期的预设性能/质量权衡。
图 1. NVOF API 中公开的性能/质量预设

NVOFA 提供实时性能和小 CUDA 核心利用率。表 3 显示了在 KITTI 2105 上使用 1080p 视频序列和 NVOF API 质量的指示性2 FPS 性能,KITTI 2105 是公开可用的数据集。用户可以通过选择正确的预设来权衡质量与性能。请注意,表 3 中的性能数字是在表下列表中列出的假设条件下测量的。性能因 GPU 等级(例如 Quadro、Tesla)而异,并且(几乎)与每个硬件的时钟速度线性缩放。
网格大小 | 预设 | Fl-fg | Fl-all | 1080p 下的 FPS | |||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Turing | Ampere | Ada | Turing | Ampere | Ada | Turing | Ampere | Ada | |||
4x4 | 慢速 | NOC | 24.94 | 26.77 | 23.56 | 21.37 | 18.65 | 17.26 | 225 | 200 | 536 |
OCC | 27.63 | 29.32 | 26.31 | 31.53 | 29.17 | 27.73 | |||||
中速 | NOC | 36.60 | 32.78 | 23.66 | 23.73 | 22.23 | 19.11 | 468 | 405 | 1000 | |
OCC | 38.90 | 35.10 | 26.36 | 33.61 | 32.13 | 28.98 | |||||
快速 | NOC | 47.50 | 38.40 | 29.90 | 26.39 | 25.44 | 23.48 | 768 | 613 | 1296 | |
OCC | 49.42 | 40.65 | 32.44 | 35.91 | 34.85 | 33.07 | |||||
2x2 | 慢速 | NOC | 不适用 | 26.90 | 20.44 | 不适用 | 18.49 | 15.98 | 不适用 | 94 | 210 |
OCC | 29.43 | 23.18 | 29.08 | 26.00 | |||||||
中速 | NOC | 33.16 | 21.38 | 20.51 | 16.13 | 154 | 336 | ||||
OCC | 35.44 | 24.08 | 30.73 | 26.01 | |||||||
快速 | NOC | 35.44 | 30.81 | 23.09 | 23.13 | 261 | 711 | ||||
OCC | 37.75 | 33.28 | 32.92 | 32.41 | |||||||
1x1 | 慢速 | NOC | 26.91 | 22.71 | 18.72 | 16.14 | 29 | 98 | |||
OCC | 29.45 | 25.44 | 29.16 | 26.42 | |||||||
中速 | NOC | 30.38 | 26.29 | 20.24 | 16.27 | 45 | 113 | ||||
OCC | 32.77 | 28.94 | 30.39 | 26.18 | |||||||
快速 | NOC | 34.55 | 29.88 | 22.65 | 20.93 | 85 | 222 | ||||
OCC | 36.84 | 32.40 | 32.58 | 30.59 |
- 以上数据是使用 Windows 11 上的 .\Samples\AppOFCuda 在 RTX6000、RTX3090 和 RTX4090 上针对光流模式生成的。
- 由于 NVIDIA 显示驱动程序内部的已知错误,在使用 CUDA 接口且禁用硬件调度的情况下,Windows 上的性能通常低于 Linux 和启用硬件调度的 Windows 上的性能。
-
所有测量均通过将视频时钟设置为 nvidia-smi 报告的 RTX6000、RTX3090 和 RTX4090 分别为 1679、1708 和 2114MHz 来完成。性能应根据其他 GPU 的实际视频时钟进行缩放。有关 nvidia-smi 的信息,请访问 https://developer.nvidia.com/nvidia-system-management-interface。
- 分辨率/输入格式:1920x1080/YUV 4:2:0
- 软件:光流 SDK 5.0,NVIDIA 显示驱动程序:Windows OS 为 528.24,Linux 为 525.85.05
- Fl-fg = KITTI 2015 上平均 EPE > 3 的前景像素中向量的百分比。
- Fl-all = KITTI 2015 上平均 EPE > 3 的向量的百分比。
- 有关 KITTI 2015 和测试数据集的详细信息,请访问 http://www.cvlibs.net/datasets/kitti/eval_scene_flow.php?benchmark=flow。
- NOC = 非遮挡区域
- OCC = 遮挡区域
NVOFFRUC 性能
NVOFFRUC 性能以 NVOFFRUC 库在输入序列中插补一帧所花费的平均时间来衡量。它计算为 NVOFFRUC 库将输入序列的帧率加倍所花费的总时间除以输入序列中的帧总数。表 4 显示了在公开可用数据集上测量的指示性3 性能。
GPU 名称 | 性能 |
---|---|
GeForce RTX 2080 Ti | 12.01 毫秒 |
GeForce RTX 3090 Ti | 9.23 毫秒 |
GeForce RTX 4090 | 4.41 毫秒 |
- 以上数据是使用 Windows 上以 NV12 CUDA 数组作为输入表面的 \NvOFFRUC\NvOFFRUCSample 生成的。
-
所有测量均通过将视频时钟设置为 nvidia-smi 报告的 1755 MHz 来完成。性能应根据其他 GPU 的实际视频时钟进行缩放。有关 nvidia-smi 的信息,请访问 https://developer.nvidia.com/nvidia-system-management-interface。
- 分辨率/输入格式:1920x1080/YUV 4:2:0
- 软件:光流 SDK 4.0 及更高版本 SDK,NVIDIA 显示驱动程序:522.25
编程 NVOFA
R525 及更高版本的驱动程序支持光流 SDK 5.0。有关所需驱动程序版本的信息,请参阅 SDK 发行说明。
有关如何编程 NVOFA 的详细信息,请参阅 SDK 包中包含的文档和示例应用程序。
OpenCV 支持
OpenCV 是计算机视觉领域中最流行的库之一。OpenCV 库包含多个基于 CPU 和基于 CUDA 的算法,用于计算光流向量。
NVOFA 也可以与 OpenCV 一起使用,以显着加快光流计算速度。
请注意,OpenCV 是一个开源项目,其使用受特定许可和条款与条件的约束。
声明
本文档仅供参考,不应被视为对产品的特定功能、条件或质量的保证。NVIDIA Corporation(“NVIDIA”)对本文档中包含的信息的准确性或完整性不作任何明示或暗示的陈述或保证,并且对本文档中包含的任何错误不承担任何责任。NVIDIA 对因使用此类信息而造成的后果或使用,或因其使用而可能导致的侵犯第三方专利或其他权利的行为不承担任何责任。本文档不构成开发、发布或交付任何材料(如下定义)、代码或功能的承诺。
NVIDIA 保留在任何时候对本文档进行更正、修改、增强、改进和任何其他更改的权利,恕不另行通知。
客户应在下订单前获取最新的相关信息,并应验证此类信息是最新的和完整的。
NVIDIA 产品根据订单确认时提供的 NVIDIA 标准销售条款和条件进行销售,除非 NVIDIA 和客户的授权代表签署的单独销售协议(“销售条款”)另有约定。NVIDIA 特此明确反对将任何客户通用条款和条件应用于购买本文档中引用的 NVIDIA 产品。本文档不直接或间接地形成任何合同义务。
NVIDIA 产品并非设计、授权或保证适用于医疗、军事、航空、航天或生命支持设备,也不适用于 NVIDIA 产品的故障或失灵可能合理预期会导致人身伤害、死亡或财产或环境损害的应用。NVIDIA 对在上述设备或应用中包含和/或使用 NVIDIA 产品不承担任何责任,因此,此类包含和/或使用由客户自行承担风险。
NVIDIA 不保证或声明基于本文档的产品将适用于任何特定用途。NVIDIA 不一定对每个产品的所有参数进行测试。客户全权负责评估和确定本文档中包含的任何信息的适用性,确保产品适合并满足客户计划的应用,并为应用执行必要的测试,以避免应用或产品的默认设置。客户产品设计中的缺陷可能会影响 NVIDIA 产品的质量和可靠性,并可能导致超出本文档中包含的附加或不同的条件和/或要求。对于可能基于或归因于以下原因的任何默认设置、损坏、成本或问题,NVIDIA 不承担任何责任:(i) 以任何违反本文档的方式使用 NVIDIA 产品,或 (ii) 客户产品设计。
商标
NVIDIA、NVIDIA 徽标以及 cuBLAS、CUDA、CUDA Toolkit、cuDNN、DALI、DIGITS、DGX、DGX-1、DGX-2、DGX Station、DLProf、GPU、Jetson、Kepler、Maxwell、NCCL、Nsight Compute、Nsight Systems、NVCaffe、NVIDIA Deep Learning SDK、NVIDIA Developer Program、NVIDIA GPU Cloud、NVLink、NVSHMEM、PerfWorks、Pascal、SDK Manager、Tegra、TensorRT、TensorRT Inference Server、Tesla、TF-TRT、Triton Inference Server、Turing 和 Volta 是 NVIDIA Corporation 在美国和其他国家/地区的商标和/或注册商标。其他公司和产品名称可能是与其关联的各自公司的商标。