零样本检测工作流程#

概述#

Jetson 平台服务提供多个参考工作流程,演示了如何集成各种基础服务和 AI 服务以创建端到端应用程序。本节介绍了零样本检测工作流程,该工作流程集成了相应的 AI 服务以及相关的组件,包括 VST、Redis 和监控。由此产生的应用程序提供了一个基于 Web 的 UI,用户可以通过该 UI 与系统进行交互,并利用 VST 进行流输入和管理。用户可以以此为参考,提取相关的部分,以创建他们自己利用零样本检测 AI 服务的应用程序。

要获取此工作流程的 docker compose 和配置文件,请从 NGC 或 SDK Manager 下载 Jetson 平台服务资源包。

要启动此工作流程,请首先按照 基于 Jetson 平台服务的零样本检测 页面上的步骤操作,以确保零样本检测服务在您的系统上正常运行。

在验证零样本检测服务按预期工作后,从启动它的同一文件夹中使用 sudo docker compose down 命令将其关闭。

开始入门#

确保必要的基础服务正在运行

sudo systemctl restart jetson-monitoring
sudo systemctl restart jetson-sys-monitoring
sudo systemctl restart jetson-gpu-monitoring

验证平台 ingress 配置文件中所有行(用于监控服务)在以下文件中均未被注释

/opt/nvidia/jetson/services/ingress/config/platform-nginx.conf

这将确保监控仪表板可以通过 API 网关访问。

sudo systemctl restart jetson-ingress
sudo systemctl restart jetson-redis
sudo systemctl restart jetson-vst

请注意,我们还将启动 jetson-vst,因为这将是本工作流程示例中实时流的来源。

启动工作流程

cd ~/zero_shot_detection/example_2
sudo docker compose up

启动后,SDR 会自动将 VST 中的可用视频流添加到零样本检测服务。检测类别可以通过 REST API 控制,输出可以在 RTSP 和 Redis 上查看,如 基于 Jetson 平台服务的零样本检测 页面所示。以下部分将更深入地解释零样本检测服务如何与 Jetson 平台服务的其余部分集成。

使用 SDR 和 VST 进行视频摄取#

生成式 AI 视频应用程序通常被开发为接受文件输入作为视频源。在生产环境中,这些应用程序需要与来自真实世界的视频流进行交互,包括来自摄像头和网络流的视频流。视频存储工具包 微服务提供了一种开箱即用的机制来摄取视频,包括摄像头发现、摄像头重连、监控和摄像头事件通知。在此过程中,VST 为摄像头视频源提供了一个代理 RTSP 链接,服务可以根据 VST API 查询该链接。

VST 支持 ONVIF 协议以发现摄像头。这些摄像头可以直接通过专用的以太网供电 (PoE) 交换机连接到 Jetson 系统;或者连接到设备所连接的网络。另一种选择是用户根据其 IP 地址手动添加设备。

鉴于用户可以动态添加/删除摄像头,应用程序需要收到摄像头更改的通知,以便他们可以合并新流的添加或删除。摄像头事件信息不是由应用程序定期轮询 VST API 来注册更改,而是通过 Redis 消息总线发送,其他服务可以订阅该消息总线。摄像头事件信息包含名称、分辨率和 RTSP URL 端点信息,应用程序可以使用这些信息开始处理(或忽略)来自摄像头的视频流。

除了零样本检测服务之外,此工作流程中的 docker compose 文件还启动了传感器分发和路由 (SDR) 服务。在 基于 Jetson 平台服务的零样本检测 页面中,展示了示例 curl 命令,用于手动从零样本检测服务添加和删除流。通过与我们的 AI 服务一起启动 SDR,SDR 将监听 Redis 上的 VST 流添加/删除事件,然后调用零样本检测服务的添加/删除 API 来控制输入流。这允许 VST 中的摄像头更改动态更新到零样本检测服务的流输入,而无需用户干预。

通过 Ingress、防火墙和 IoTGateway 进行外部 API 访问#

使用 REST API 进行配置和结果输出的 AI 服务可以利用作为 Jetson 平台服务一部分提供的 Ingress、防火墙和 IoTGateway 模块的组合,以实现对 API 的安全远程访问。例如,零样本检测示例使用 REST API 来控制流输入和检测类别。

由于 API 是 Jetson 平台服务的核心,Ingress 通过为每个微服务提供带有指定路由的公共端点,从而提供了一种集中访问它们的方式。例如,零样本检测 API 可以通过两种方式访问

在 API 网关 URI 中,30080 是 Ingress 运行的网络端口,zero_shot_detection 是零样本检测服务通过 Ingress 配置文件 注册的路由。

公开零样本检测 REST API 的路由在 zero_shot_detection-nginx.conf 中设置。

location /zero_shot_detection/ {
    rewrite ^/zero_shot_detection/?(.*)$ /$1 break;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    access_log /var/log/nginx/access.log timed_combined;
    proxy_pass https://127.0.0.1:5010;
}

当按照 基于 Jetson 平台服务的零样本检测 页面上的设置进行操作时,zero_shot_detection-nginx.conf 将被复制到 ingress 配置文件中,然后重新启动 jetson-ingress 服务以使路由生效。

开发人员可以在系统部署时通过提供 ‘route’ 以及其应用程序服务 API 的内部端口,类似地注册他们自己的 AI 应用程序微服务。收到该路径的传入请求后,ingress 微服务会自动将请求转发到正确的微服务。

用于保护 API 的标准模式是将 Ingress 与 防火墙平台服务 结合使用,以便只有 ingress 端口可以从外部访问,并且所有内部微服务(例如 Redis)和各种微服务提供的内部端口都与外部世界隔离。

使用 Redis 输出元数据#

一旦 SDR 将流添加到零样本检测服务并设置了检测类别,零样本检测模型将开始推理并生成检测元数据。

可以使用命令行中的 redis-cli 查看元数据输出。

redis-cli XREAD COUNT 1 BLOCK 5000 STREAMS owl $

检测元数据以 Metropolis Minimal Schema 格式输出

{
    "metadata": {
        "version": "4.0",
        "id": 154,
        "@timestamp": "2024-05-03T17:16:47.885Z",
        "sensorId": 1,
        "objects": [
        "46|816.09375|497.34375|1107.1875|739.6875|a giraffe"
        ]
    }
}

对于检测到的每个对象,它将具有六个属性,以 ‘|’ 字符分隔。属性顺序如下

  1. 对象 ID

  2. 边界框左上角 X 坐标

  3. 边界框左上角 Y 坐标

  4. 边界框右下角 X 坐标

  5. 边界框右下角 Y 坐标

  6. 检测类别

在 Python 中,可以使用 redis-py 包 读取元数据,然后用于实现自定义分析微服务。

监控#

Jetson 平台服务提供监控作为一种即用型平台服务,使开发人员能够跟踪系统利用率和性能 KPI。鉴于生成式 AI 应用程序在 GPU 利用率和内存可用性方面都推动了系统能力,基于 Prometheus 的监控仪表板提供了一种方便的方式来观察这些指标的利用率,因为应用程序正在运行。这些指标会实时更新,向用户展示应用程序执行并开始处理不同输入时的实时利用率视图。

查看 使用与配置 页面,了解有关监控服务和功能的更多详细信息。

安全存储#

AI 应用程序使用和生成各种数据,包括模型、推理输出等。Jetson 平台服务提供对微服务使用的存储进行加密,AI 应用程序可以利用这种加密来确保其数据(模型、权重、输入、输出)在静止时是安全的。存储平台服务 描述了如何启用加密,以及微服务如何从连接的外部存储(如硬盘)请求存储配额。

进一步的定制与集成#

为了促进将生成式 AI 应用程序(通常用 Python 编写)集成到使用 Jetson 平台服务的系统中,我们重点介绍了一系列开发人员可以利用的 Python 模块。GitHub 上提供的零样本检测服务的源代码说明了如何使用这些模块来实现这种集成。

这些 Python 模块的列表包括

  • jetson-containers : 为 Jetson 上的生成式 AI 应用程序提供容器、模型、vectorDB 和其他构建块

  • jetson-utils : NVIDIA 提供的 Python 模块,用于硬件加速的图像和多媒体操作,支持 RTSP 流输入/输出、视频解码和高效的视频叠加创建

  • jetson-platform-services : 包含参考 AI 服务和工作流程的开源 GitHub 仓库。

  • moj-utils: NVIDIA 新提供的 Python 模块,用于与 Jetson 平台服务的其余部分集成。

mmj_utils 模块可以从 GitHub 安装

pip install git+https://github.com/NVIDIA-AI-IOT/mmj_utils

该模块提供了将 Python 应用程序与 Jetson 平台服务集成的实用程序,包括

  • 对视频存储工具包 (VST) 的支持:VST API 实现了流发现和内省等功能。vst 子模块提供了一个类抽象,用于调用相关 API 以发现、添加、删除流等操作

  • 元数据创建:零样本检测服务使用 Metropolis schema 作为标准化规范来捕获模型输出;schema_gen 子模块提供了一个现成的 JSON schema 生成器,基于来自像 NanoOWL 这样的模型的对象检测输出。

  • 叠加生成:DetectionOverlayCUDA 子模块启用硬件加速的边界框和文本叠加生成,以方便在实时视频中可视化模型输出。