这篇文章最初发表在 NVIDIA 技术博客上。
基于 AI 的计算机视觉 (CV) 应用程序不断增加,对于从视频源中提取实时见解尤为重要。这项革命性的技术使您能够解锁在没有重大操作人员干预的情况下无法获得的宝贵信息,并为创新和解决问题提供新的机会。
NVIDIA DeepStream SDK 旨在为智能视频分析 (IVA) 用例提供从视频流中提取见解的能力,利用机器学习 (ML) 技术。在 NVIDIA 硬件上运行时,DeepStream 利用 GPU 加速和专为 ML 优化的加速硬件,以最大化提升预处理性能。
本文将探讨如何结合使用 NVIDIA Omniverse 和 Edge Impulse,利用 NVIDIA DeepStream SDK 进行模型开发和部署,以便您可以快速创建端到端应用。Edge Impulse 是 NVIDIA 初创加速计划的一部分。
计算机视觉应用
在当今环境中,快速构建复杂、可扩展的 CV 应用程序的能力至关重要。典型的 CV 应用程序包括各种用例,例如车辆识别、交通测量、检查系统、生产线质量控制、通过监控增强安全和安保、智能结账系统实施和流程测量。
集成机器智能以分析业务流程中的多媒体流可以增加巨大的价值。得益于无与伦比的准确性和可靠性,机器智能可以帮助简化操作,从而提高效率。
预构建的 AI 模型并不总是合适的解决方案,通常需要针对预构建模型无法解释的特定问题进行微调。
构建基于 AI 的 CV 应用程序通常需要具备以下三种技能组合的专业知识:MLOps、CV 应用程序开发和部署 (DevOps).如果没有这些专业技能,项目投资回报率和交付时间表可能会面临风险。
过去,复杂的 CV 应用程序需要高度专业的开发者。这转化为漫长的学习曲线和昂贵的资源。
Edge Impulse 与 NVIDIA DeepStream SDK 的结合可提供用户友好型互补解决方案堆栈,帮助开发者快速创建 IVA 解决方案。您可以针对特定用例轻松自定义应用程序,将 NVIDIA 硬件直接集成到您的解决方案中。
DeepStream 可免费使用,而 Edge Impulse 则提供适合许多 ML 模型构建用例的免费级别。
图 1.Edge Impulse 和 NVIDIA DeepStream SDK 解决方案堆栈
使用 NVIDIA DeepStream 构建 CV 应用
DeepStream SDK 是 NVIDIA Metropolis 项目的一部分,旨在支持大规模视频分析。您可以快速且轻松地创建可直接部署在 NVIDIA 硬件设备上的生产就绪型计算机视觉 (CV) 流程。
DeepStream 应用使用以下方法构建:
- 在命令行中
- 以视觉方式使用 Graph Composer
- 如果没有代码,则使用 DeepStream 参考应用和配置文件
- 借助 C++或 Python 代码实现更多自定义
如果您不是开发者,您可以在不到一小时的时间内使用前三个选项之一以及经过训练的 ML 模型创建和运行工作流。如果您需要更多自定义,可以从现有模板构建自定义编码解决方案作为起点。
部署 CV 应用
创建工作流后,您可以直接将其部署在 NVIDIA 硬件设备上,包括边缘设备如 NVIDIA Jetson Nano,以及用于高性能计算 (HPC) 和云部署的设备,还有一种混合部署方法。
您可以部署应用程序,以便在 NVIDIA 边缘硬件上本地运行,并直接连接视频源,以尽可能降低延迟。如果您需要处理复杂的工作流或容纳超过 NVIDIA 边缘设备能力的多个视频源,则可以将同一工作流部署到首选 IaaS 提供商上基于 NVIDIA 的云实例。
混合方法也是可行的,在这种方法中,管道可以部署到 NVIDIA 边缘设备,并且可以使用 NVIDIA Triton 推理服务器。
Triton 支持远程执行模型,从客户端接收输入帧并返回结果。Triton 在存在时利用 NVIDIA GPU,还可以在 x86 上执行推理,并支持并发和动态批处理。Triton 还原生支持大多数热门框架,包括 TensorFlow 和 PyTorch.
DeepStream 通过名为 Gst-nvinfer 推理插件的替代方案 Gst -- nvinferServer 来支持 Triton.此插件使您能够在 DeepStream 应用程序中使用 Triton 实例。
IVA 应用的性能取决于其构建的 ML 模型。虽然有许多预构建模型可用,但用例通常需要自定义模型和 MLOps 工作流程。在这种情况下,易于使用的 MLOps 平台可以实现快速部署,尤其是在与 DeepStream 快速应用开发相结合时。
适用于机器学习的 Edge Impulse
Edge Impulse 提供了一套强大的工具来构建 ML 模型,这些模型可以直接部署到 NVIDIA 目标上,然后放入 DeepStream 应用中。Edge Impulse 与 NVIDIA 硬件加速和 DeepStream SDK 无缝集成,可帮助您快速扩展项目。
在整个过程中,Edge Impulse 可为各个级别的开发者提供指导。经验丰富的 ML 专业人员将欣赏从不同来源导入数据的简便性和便利性,以及端到端模型构建过程。您还可以将自定义模型与自定义学习块功能集成,从而摆脱 MLOps 的繁重任务。
对于机器学习新手,Edge Impulse 流程会指导您在使用环境时构建基本模型。您可以与 DeepStream 一起使用的基本模型类型是 YOLO 物体检测和分类。
您还可以改变为 tinyML 目标构建的模型的用途,以便它们与边缘用例和更强大的 NVIDIA 硬件配合使用。许多边缘 AI 用例都涉及需要更强大计算资源的复杂应用程序。 NVIDIA 硬件可以帮助解决与受限设备的限制相关的挑战。
虽然您可以使用 Edge Impulse 从头开始创建自己的模型,但它还集成了 NVIDIA TAO 工具套件。您可以在 Omniverse 中利用 100 多个预训练模型,通过 计算机视觉 Model Zoo 进行访问。Edge Impulse 是对 TAO 的补充,可用于根据自定义应用调整这些模型。这是企业用户的绝佳起点。
图 2. NVIDIA TAO 与 Edge Impulse Enterprise 相结合
使用 Edge Impulse 构建 DeepStream 模型
完成模型构建后,将其部署到 DeepStream 中。从 Edge Impulse 导出模型文件并将其放入 DeepStream 项目中。然后按照配置步骤确保您的 Edge Impulse 模型与 DeepStream 配合使用。此过程通常包括四个步骤(图 3)。
图 3.将模型文件从 Edge Impulse 部署到 NVIDIA DeepStream 的四个步骤
第 1 步:在 Edge Impulse 中构建模型
首先,在 Edge Impulse Studio 中构建 YOLO 或图像分类模型。DeepStream 推理的 Gst-nvinfer 插件 要求输入层的张量采用 NCHW 格式。请确保选择 Jetson Nano 作为目标设备,并使用 FP32 权重。
第 2 步:从 Edge Impulse 导出模型
Edge Impulse 可以从 Edge Impulse Studio 的控制面板页面导出模型。YOLOv5 可以导出为 ONNX,并且 NCHW 输入层可随时用于 DeepStream.
图 4.Edge Impulse Studio 控制面板,展示了如何导出为 ONNX 模型
DeepStream 中的 IVA 工作流通常由主要推理 (PGIE) 步骤组成,该步骤使用边界框坐标执行物体检测。关联的对象类被传递到对每个对象进行分类的次要推理步骤 (SGIE).每个类别都作为 Gst-nvinfer 插件的实例实现。
第 3 步:将模型转换为兼容 DeepStream 的 ONNX
在将 YOLO 与 DeepStream 结合使用时,需要自定义输出层解析器以从输出层中提取边界框和对象类别,并将它们传递给下一个插件。有关自定义 YOLO 输出解析器的更多详细信息,请参阅 如何使用自定义 YOLO 模型。
Edge Impulse 使用 YOLOv5,这是一个更新、性能更高的模型,其输出张量格式与 YOLOv3 略有不同。YOLOv3 有三个输出层,每个输出层负责检测不同比例的物体,而 YOLOv5 有一个输出层,使用锚框处理各种大小的物体。
DeepStream 基于专为多媒体用例设计的 GStreamer. NVIDIA 已添加支持 GStreamer 流程中深度学习的功能,包括其他与 ML 相关的元数据,这些元数据通过 Gst-Buffer 传递到流程中,并通过 Gst -- Buffer 封装在 NvDsBatchMeta 结构中。
图 5.DeepStream 元数据层次结构
YOLO 输出的张量格式与 DeepStream 需要的 NvDsObjectMeta 中保存的边界框数据不同。要想将 YOLO 与 DeepStream 结合使用,需要开发自定义的输出解析器,以便将 YOLO 的输出转换成符合 NvDsObjectMeta 要求的格式。 NVIDIA 提供了一个示例插件,该插件已适配 YOLOv3,可供参考。
Edge Impulse 使用 YOLOv5.YOLOv3 和 YOLOv5 的输出层之间的差异使 YOLOv3 插件不适合与 YOLOv5 一起使用(图 6)。
图 6.YOLOv3 和 YOLOv5 输出张量结构对比
要在 Edge Impulse 中使用训练好的 YOLOv5 模型,必须创建一个自定义的 YOLOv5 输出解析器来处理单个输出张量。一种可行的实现方式是使用第三方输出解析器,它可以与 Edge Impulse 导出的 ONNX 模型配合使用。
对于图像分类模型,Edge Impulse 以 NHWC 格式提供的默认 TFLite Float32 及其输入层需要转换为 NCHW.
图 7.显示从何处查找 TFLight Float32 的 Edge Impulse Studio 控制面板
这可以通过以下方式轻松实现:tf2onnx
命令:
arduino
python -m tf2onnx.convert --inputs-as-nchw serving_default_x:0 --opset 13 --tflite MODELFILE --output OUTPUT.ONNX
MODELFILE
是输入文件,OUTPUT.ONNX
是输出文件,用于指定 Edge Impulse 生成的输入层名称,serving_default_x:0
.因此,输入层进行了转换,以满足 DeepStream 要求。
图 8.Edge Impulse 默认输入层形状与 DeepStream Gst-nvinfer 插件的比较
第 4 步:创建推理插件配置文件
DeepStream 要求为 Gst-nvinfer 插件的每个实例创建纯文本配置文件,以指定运行时要求。这包括 ONNX 模型文件或生成的 TRT 引擎文件以及包含标签名称的文本文件。图 9 显示了使用 Edge Impulse YOLOv5 和分类模型所需的最小参数集。
图 9.使用 Edge Impulse 构建的模型的 Gst-nvinfer 插件配置参数
请注意,尽管出于说明目的,注释与参数内联显示,但所有配置参数均应分开成新行。
我们的process-mode
参数可用于指定插件是在主要阶段还是次要阶段执行。请注意,一旦指定了 ONNX 文件,DeepStream 就会使用trtexec
来生成 TensorRT 引擎,而NVIDIA TensorRT则在 NVIDIA GPU 上执行。
创建引擎后,使用model-engine-file
参数。model-file
可将参数注释掉,以防止在每次运行时重新创建引擎,从而节省启动时间。
具体取决于model-color-mode
(无论模型是 RGB 还是灰度),必须分别将参数设置为 0 或 2.这将对应于 Edge Impulse Studio 中设置的颜色深度。
前面的示例展示了模型如何用作主要推理插件。通过将模型设置为process-mode
属性如下所示:
ini
process-mode=2 #SGIE
图 9 中的示例还显示了两阶段工作流所需的最小配置文件,其中 YOLO 模型首先检测对象,然后在第二阶段分类器中单独对其进行分类。对于 YOLO 模型,可以编辑默认的 YOLO 标签文件,并且可以根据 YOLO 标准格式将标签替换为自定义模型中的标签,并在新行中添加每个标签。
在分类模型的情况下,标签用分号分开。在运行期间,模型将相应地根据这些文件进行索引,并显示您指定的文本。
可以通过引用工作流中嵌入这些设置的配置文件来使用 DeepStream.
结束语
本文介绍了如何利用 Edge Impulse 和 NVIDIA DeepStream SDK 快速创建 HPC 视觉应用。这些应用包括车辆识别、交通测量、检查系统、生产线质量控制、通过监控增强安全和安保、智能结账系统实现和流程测量。AI 和 IVA 的新用例不断涌现。
如需详细了解 DeepStream,请参阅开始使用 NVIDIA DeepStream SDK。要开始结合使用 Edge Impulse 和 DeepStream,请参阅将 Edge Impulse 与 NVIDIA DeepStream 结合使用。本指南包含一个带有预配置 DeepStream 工作流的资源库链接,您可以使用该资源库来验证性能或开发自己的工作流。还包含适用于 Jetson Nano 架构的预编译自定义解析器,可帮助您快速入门。