AI NVR#

我们提供一个人工智能注入的网络视频录像机 (AI-NVR) 作为使用 Jetson 平台服务为 Jetson 堆栈构建的示例应用程序。该应用程序以下载为 docker compose 包(在压缩 tar 文件中)的形式提供,并且可以根据设置部分中提供的说明进行安装。

AI NVR 生产功能摘要#

虽然快速入门指南提供了关于功能性但受限的安装的说明,但本节描述了可以从 Jetson 平台服务为 Jetson 堆栈利用的各种附加功能,这些功能有助于构建生产质量的系统。这些包括

  • 通过使用防火墙和加密存储实现设备安全

  • 系统监控支持

这些功能作为基础服务提供给用户,作为 Linux 服务,并且可以根据其用例启用。

软件配置#

AI NVR 应用程序演示了在 Jetson 平台服务 for Jetson 堆栈中配置和实例化各种组件的最佳实践,包括

  • VST 用于摄像头发现、流摄取、存储和流式传输。VST 的值得注意的配置包括:以太网推理,摄像头发现应通过其发生,“老化策略”,用于管理视频将被删除的水印级别的存储,要支持的并发 WebRTC 流的数量(基于硬件解码器 aka nvdec 限制)

  • DeepStream 用于使用 PeopleNet 2.6 进行实时感知。我们在 DLA 上运行推理,以使 GPU 可用于其他目的(跟踪、分析中的推理等)。此外,推理间隔设置为“1”,以便根据 DLA 中可用的计算能力支持更大的流计数。

  • 分析部署配置 配置参数 指定了线路穿越和感兴趣区域的实现中的空间和时间缓冲区。这定义了用户可以根据其用例在延迟和准确性之间做出的权衡。

作为基础服务的一部分

  • Ingress 已配置了各种微服务的路由。当用户将其自己的自定义微服务引入其应用程序时,可以相应地扩展此配置。

  • Redis 已配置为启用快照,以在重启之间保留状态。

  • 防火墙已配置为允许来自 IoT 网关微服务和 webRTC 流式传输的出站流量。

  • 存储已配置了每个微服务的磁盘配额,以便任何特定的微服务都不能垄断可用的存储。用户可以根据其软件堆栈进一步修改或扩展此文件。

Docker Compose#

为了在 Jetson 设备上部署基于 Jetson 平台服务的系统,我们使用 Docker compose。Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它允许您轻松管理和编排所有应用程序堆栈到一个单一的部署单元中。Docker compose 读取一个或多个包含基础设施配置的 yaml 文件,然后启动您的容器环境。

docker compose 中的微服务配置:Yaml 配置文件是 docker compose 的核心。一个部署应包含一个或多个配置文件。配置文件中的每个块代表一个微服务部署设置。这是一个示例服务配置。

emdx-analytics-01:
  image: nvcr.io/nvidia/jps/emdx-analytics:jps_v1.2.8
  user: "2001:150"
  network_mode: "host"
  logging:
    driver: "json-file"
    options:
      max-size: "8192m"
      max-file: "3"
  environment:
    CONFIG_LOCATION: "/config"
    INSTANCE_ID: emdx-analytics-01
    PORT: 6001
    LOGS_DIR: /logs
  volumes:
    - ./config/emdx-analytics:/config
    - /data/emdx-volume:/data/emdx-volume
    - /data/logging-volume:/logs
  restart: always
  container_name: emdx-analytics-01
  depends_on:
    moj-http-based-init-emdx-analytics:
      condition: service_completed_successfully
  deploy:
    resources:
      limits:
        memory: 512M
    restart_policy:
      condition: always

主要属性

  • image:指的是容器的位置/镜像仓库

  • environment:这是您可以在其中定义要注入到容器中的环境变量的部分

  • volumes:您可以使用此属性将文件或文件夹挂载到容器中。挂载的资产在主机和容器内部都可用

  • restart:此选项定义了容器退出并出现错误时的行为。

  • command:如果存在任何命令,这是启动应用程序的命令

  • depend_on:此属性用于定义启动顺序。此处应列出任何必须在此处定义的服务之前启动的服务

  • network_mode:这是容器的网络配置。在我们的参考部署中,我们在主机网络上运行所有容器。使用主机网络使所有容器在与主机 Jetson 系统相同的网络命名空间中运行,因此能够互相访问。请注意,出于安全考虑,在投入生产时,这必须与防火墙基础服务结合使用,以防止未经授权访问设备 API

init 容器和启动顺序

如上一节所述,有时容器等待某些条件(例如可用的数据库连接)才能启动非常重要。在这种情况下,容器将确保在服务可以启动之前检查 db 连接。可以使用 init 容器来实现此目的。它最初将运行以检查数据库连接,并且在连接建立(或其他定义的条件)之前,它将退出并允许主服务启动。在我们共享的示例配置中,emdx-analytics 依赖于另一个服务。为了确保它在 emdx-analytics 之前启动,我们创建了一个名为 moj-http-based-init-emdx-analytics 的 init 容器。

moj-http-based-init-emdx-analytics:
  image: nvcr.io/nvidia/jps/jps-init-container:v1.0.2_arm64v8
  network_mode: "host"
  environment:
    ENDPOINTS: "5000/api/core/healthz" # sample values "30000/v1/sensor/help,30080/ingess/api/tz"
  deploy:
    restart_policy:
      condition: on-failure

moj-http-based-init-emdx-analytics 容器循环调用某个端点 (localhost:5000/api/core/healthz) 的 api,直到请求成功。然后它将退出。此 init 容器旨在在容器的生命周期内仅运行一次。

创建您的自定义 docker compose 包

让我们通过一个简单的示例来了解如何将新的应用程序服务集成到微服务堆栈中。

步骤 1:创建一个工作环境和 compose.yaml 文件,或使用现有的文件。此 compose.yaml 将包含我们的服务配置。

sh-3.2$ mkdir test-app
sh-3.2$ cd test-app
sh-3.2$ touch compose.yaml

步骤 2:编辑 compose.yaml 以添加您的服务配置。

version: '2'
services:
  test-app:
  image: remove-repository-image:v1.0
  user: "0:0"
  network_mode: "host"
  environment:
    APP-PORT: 8080
  volumes:
    - ./config/test-app/app.cfg:/opt/test-app/config/app.cfg
  restart: always
  container_name: test-app
  command: sh -c '/opt/test-app/start.sh'
  deploy:
    Restart_policy:
      condition: always

步骤 3:将配置挂载到容器中。如果您的服务需要配置,您可以定义您的配置并将其挂载到容器中,就像我们所做的那样。

- /config/test-app/app.cfg:/opt/test-app/config/app.cfg

步骤 4:要通过 ingress 公开您的服务,请创建一个 ingress 配置文件:test-app-nginx.cfg

sh-3.2$ cd test-app
sh-3.2$ touch config/test-app-nginx.cfg

编辑 test-app-nginx.cfg 文件,并确保没有其他服务在主机上的同一端口上运行。

location /app-prefix/ {
  rewrite ^/app-prefix/?(.*)$ /$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:8080;
}

location:指的是您的 ustream api 的前缀。此前缀在所有配置中必须是唯一的。rewrite:此指令用于重写 URL proxy_set_header:设置请求标头以转发到上游服务器 access_log:我们应该在哪里记录日志 proxy_pass:指定上游服务器的目标主机和端口

步骤 5:将您的 ingress 配置从 config 目录复制到 ingress config 文件夹。您可以在基础服务文档的 ingress 部分找到有关如何使用此配置的更多说明。

sh-3.2$ cd test-app
sh-3.2$ cp config/test-app-nginx.cfg /opt/nvidia/jetson/services/ingress/config

步骤 6:启动应用程序服务并启动 ingress。

sh-3.2$ cd test-app
sh-3.2$ sudo docker compose -f compose.yaml up -d --force-recreate
sh-3.2$ sudo systemctl restart jetson-ingress

文件夹结构

../_images/component.png

AI-NVR 完整设置#

先决条件#

设置前的准备

如果您使用的是 Jetson 开发套件,请查看以下列表以获取必要的硬件组件并访问软件组件。如果使用合作伙伴 (ODM) 设备,请查看其设置说明以识别和获取合适的组件。

所需硬件

  • Orin AGX 开发套件或

  • Jetson Orin NX 16GB 或 8GB 开发套件(自建),带 128GB(最小)NVMe 驱动器或

  • Jetson Orin Nano 8GB 开发套件,带 128GB(最小)NVMe 驱动器

  • SATA 驱动器:2 TB 或更大

  • 连接到 SATA 电源的 SATA 电源和电缆

  • 适用于 Orin AGX 的 SATA PCIe 控制器。如果不可用,可以使用 USB 转 SATA 控制器

  • 用于 Orin NX / Orin Nano 的 USB 转 SATA 控制器

  • NVMe 驱动器可以代替 SATA 用于 Orin AGX。Samsung 980 PRO MZ-V8P2T0B - SSD - 2 TB 或更大 - PCIe 4.0 x4

  • Cat 6 以太网电缆 x 4

  • USB 转以太网适配器,CableCreation USB 3.0 转 10/100/1000 千兆有线 LAN 网络适配器,兼容 Windows PC 等

  • IP 摄像头:建议使用的摄像头是 Amcrest UltraHD 4K (8MP) 户外 Bullet POE IP 摄像头,3840x2160,98 英尺夜视,2.8 毫米镜头,IP67 防水,MicroSD 录制,白色 (IP8M-2496EW-V2)

  • TP-Link AC1200 千兆 WiFi 路由器 (Archer A6) - 双频 MU-MIMO 无线互联网路由器,4 根天线,OneMesh 和 AP 模式,远程覆盖

  • PoE 交换机:TP-Link TL-SG1210MPE V2 - 交换机 - 10 端口 - 智能

  • Ubuntu 20.04 或 22.04 桌面/笔记本电脑

  • USB-C 刷写电缆

  • 显示器、键盘、鼠标

  • 建议在运行 Android 版本 13 的 Android 手机上运行移动应用程序,但它应该可以从 Android 版本 8 开始工作

下图显示了 Orin AGX 硬件设置

../_images/hw_AGX_Setup.png

下图显示了 Orin NX / Orin Nano 硬件设置

../_images/hw_NX_Setup.png

NGC API 密钥

访问 NGC 并通过 快速入门指南 中记录的步骤获取 API 密钥。

硬件设置#

现在继续按照此处描述的步骤设置 Jetson 开发套件的硬件。如果使用合作伙伴 (ODM) 设备,请按照他们提供的说明设置其设备并连接到摄像头和其他外围设备。

硬件设置步骤

连接 SATA 驱动器

Orin AGX 开发套件:确保设备已断电。将 PCIe 控制器卡插入 PCIe 插槽(位于磁性黑色侧面板内部),检查卡是否正确放置在插槽中。使用数据线将其连接到 SATA 驱动器。使用电源连接器电缆将电源连接到 SATA 驱动器。打开驱动器的电源,然后打开设备电源。

Orin NX / Orin Nano 开发套件:确保设备已断电。将 SATA 驱动器连接到电源适配器,对齐电源端口和数据端口。将电源适配器的 USB 电缆连接到设备的 USB 端口之一。打开驱动器的电源,然后打开设备电源。

连接 NVMe 驱动器(AGX 的选项)

如果您没有可用的 SATA 组件,则 NVMe 驱动器可以用作 Orin AGX 的存储。关闭系统并拧下螺钉,将 NVMe 驱动器放入 NVMe 插槽中,然后拧回螺钉。

网络设置*

系统需要两个独立的以太网端口。设备上可用的以太网端口连接到外部网络。基于 USB 的以太网适配器用于连接到 PoE 交换机。然后,此适配器的以太网端口连接到 POE 交换机上行链路端口。

为了将视频流式传输到移动应用程序,它应连接到与 Jetson 相同的本地网络。如果您连接 Jetson 的网络上没有可用的 WiFi,请使用 WiFi 路由器连接到该网络,然后将移动设备连接到该网络。

连接摄像头

将摄像头连接到可用的 POE 端口之一。请注意,虽然 AI NVR 支持为 AGX 连接最多 16 个 H.265 摄像头,为 NX16 连接 8 个 H.265 摄像头,但 PoE 交换机上的端口数量可能会限制您可以连接的摄像头数量。

有关支持的流计数和系统资源利用率的信息,请参阅快速入门指南

有关支持的摄像头列表,请参阅VST

将显示器、键盘和鼠标连接到 Jetson

使用 DP 端口连接显示器,或使用 DP-TO-HDMI 适配器使用 HDMI 连接,或使用 DP-TO-DP 电缆使用 DisplayPort 连接。将 USB 集线器连接到设备上空闲的 USB 端口,并将键盘和鼠标连接到它。

将 Jetson 连接到主机

使用 USB 电缆将主机(Ubuntu 桌面/笔记本电脑)连接到 Jetson 开发套件 USB-C 刷写端口。

软件设置#

软件设置步骤

AI-NVR 应用程序

按照快速入门指南中的步骤获取 NGC 访问权限,刷写 BSP 镜像(如果需要),安装基础服务和 ai_nvr 应用程序包。

需要的一些其他设置步骤是

  • 存储服务

将存储配额文件从应用程序包目录复制到 jetson-configs 目录

sudo cp ai_nvr/config/storage-quota.json /opt/nvidia/jetson-configs

请注意,存储服务将检测任何连接的驱动器并初始化它们以进行存储文件系统。如果您只想使用特定的驱动器,请在 /opt/nvidia/jetson-configs/jetson-storage.conf 中列出它们。请参阅存储

  • 网络服务

如果您使用的是合作伙伴 (ODM) 设备,请检查网络接口的命名方式以及哪些接口连接到摄像头。默认情况下,“eth1”是摄像头接口,但如果使用不同的接口或多个接口,请更新 /opt/nvidia/jetson-configs/jetson-camif.conf。请参阅网络

  • 监控服务

如果您想使用监控服务,请取消注释 ingress 配置文件中的所有行(否则保持注释状态)

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

  • NVStreamer 应用程序

设置 NVStreamer(可选,如果您想流式传输视频文件,除了或代替摄像头馈送)。请参阅快速入门指南,了解如何在您的 Jetson Orin 设备上设置 NVStreamer。

  • 移动应用程序

Google Play 商店安装 AI-NVR 移动应用程序。使用移动应用程序有两种方式 - 一种是直接访问,另一种是通过云访问。此版本不支持通过云访问。

运行 AI-NVR 应用程序#

AI NVR 参考应用程序依赖于各种基础服务,这些服务需要在运行 AI NVR 应用程序之前启用并运行。有关每个基础服务的详细信息,请参阅概述。作为快速参考,步骤概述如下。

启动服务

启动所需的服务

sudo systemctl enable jetson-storage --now

sudo systemctl enable jetson-networking --now

重启系统

sudo systemctl enable jetson-redis --now

如果您愿意,也可以启动其他可选服务,如监控

sudo systemctl enable jetson-monitoring --now

sudo systemctl enable jetson-sys-monitoring --now

sudo systemctl enable jetson-gpu-monitoring --now

在启动上述基础服务后,然后启动 ingress 和 vst 服务

sudo systemctl enable jetson-ingress --now

sudo systemctl enable jetson-vst --now

注意

可以按如下方式禁用和停止任何这些服务

sudo systemctl disable <service-name> --now

启动应用程序

从下载的包中启动应用程序。请注意,docker compose 启动命令取决于其运行的设备

cd ai_nvr

Orin AGX: sudo docker compose -f compose_agx.yaml up -d --force-recreate

Orin NX16: sudo docker compose -f compose_nx16.yaml up -d --force-recreate

Orin NX8: sudo docker compose -f compose_nx8.yaml up -d --force-recreate

Orin Nano: sudo docker compose -f compose_nano.yaml up -d --force-recreate

您可以通过运行 docker ps 命令来检查容器是否按预期运行。

注意

如果需要,可以按如下方式停止应用程序服务

cd ai_nvr

Orin AGX: sudo docker compose -f compose_agx.yaml down --remove-orphans

Orin NX16: sudo docker compose -f compose_nx16.yaml down --remove-orphans

Orin NX8: sudo docker compose -f compose_nx8.yaml down --remove-orphans

Orin Nano: sudo docker compose -f compose_nano.yaml down --remove-orphans

向 VST 添加流

向 VST 添加摄像头或 NVStreamer 视频流。确保可以从 VST 参考 Web 应用程序的 Live Streams 选项卡中查看该流。有关详细步骤,请参阅使用和配置

暴露的端口

暴露的端口#

端口

服务

30080

Ingress

5000

Emdx

81

VST

3000

Grafana

8081

监控

9091

Pushgateway

查看视频叠加层和分析

VST webUI 提供了在视频流上绘制、查看和删除感兴趣区域 (ROI) 和绊线 (TW) 的功能,作为其分析功能的一部分。这些可以与来自分析微服务的实时结果一起,作为叠加层在视频流上查看。

有关如何配置和使用此功能的更多信息,请参阅参考 Web 应用程序

使用移动应用程序

有关与 AI-NVR 系统交互并查看 Jetson 平台服务生成的视频、分析和警报的丰富的基于 Android 的客户端,请参阅AI-NVR 移动应用程序用户指南

AI-NVR 移动应用程序使用户能够访问完整的 AI-NVR 设备功能。移动应用程序由 NVIDIA 通过 Play 商店分发。移动应用程序有两个启动器入口点。一个是直接访问 AI-NVR 设备,另一个是通过云远程访问设备。

选项 A:直接访问

使用设备 IP 地址直接从移动应用程序访问设备。您将看到一个对话窗口,用于输入设备的 IP 地址。提交 IP 地址后,应用程序将启动 UI,其中包含连接到设备的摄像头列表。

选项 B:基于云的访问

此版本不支持。

支持的流计数#

基于 Jetson 平台服务的应用程序支持的流(摄像头)数量取决于多种因素,包括

  • 使用的硬件平台(Orin AGX、Orin NX16、Orin NX8、Orin Nano)

  • 使用的模型:PeopleNet 2.6 是一个未剪枝的模型,以更高的资源利用率为代价提供卓越的准确性。模型架构、剪枝和量化技术的使用会影响利用率,从而影响支持的流计数

  • DeepStream 配置:影响资源利用率的配置属性包括推理间隔、使用的跟踪器类型、streammux/inference/tracker 间隔

  • 流分辨率和编码:这些决定了解码器限制,因为 H.265 支持比 H.265 更大的解码限制(1080p 分辨率为 26 对 14)

  • WebRTC 并发流的数量:webRTC 流式传输消耗内存,对于 RAM 较小的设备,较高流计数下消耗的内存可能是瓶颈

最终,处理超出系统支持的流会导致系统资源的饱和,包括 GPU、DLA、RAM、内存带宽、解码器/编码器利用率。输入超出系统可以支持的流将导致底层 DeepStream 管道的 FPS 降至低于实时性能(通常为 30 fps),从而导致系统丢帧。可以通过使用 tegrastats 实用程序来识别这些资源的利用率。

本快速入门指南中展示的 AI-NVR 参考应用程序可以支持以下流计数,基于在 Orin AGX、Orin NX16 和 Orin NX8 上使用 DLA 推理和 NVDCF 跟踪器以及精度配置在 PVA 上运行的 PeopleNet 2.6 模型。Orin Nano 配置使用 GPU。

  • Orin AGX 开发套件(带 32GB RAM)上的 16 个 H.265 流

  • Orin NX16 上的 8 个 H.265 流

  • Orin NX8 上的 4 个 H.265 流

  • Orin Nano 上的 4 个 H.265 流

这些数字基于在 DLA 上运行的推理,以及在 Orin AGX、Orin NX16 和 Orin NX8 上在 PVA 和 GPU 组合上运行的跟踪器 - 从而为运行其他 AI 节省了 GPU。由于 Orin Nano 没有这些硬件加速器,因此任务改在 GPU 上运行。

另请注意,由于当前在使用 VIC 时管道冻结的问题(在 故障排除中概述),图像预处理操作(包括用于推理和跟踪的缩放)配置为在 GPU 而不是 Orin AGX 平台的 VIC 上运行。

除了上述内容外,我们还能够在 Orin AGX 和 Orin NX16 上启动 2 个流的 webRTC 流式传输,且流式传输质量良好。

需要注意的一个方面是,硬件解码器的一个实例分别由以下项使用

  • DeepStream 处理来自 VST 的每个视频流

  • 在移动应用程序(客户端)和 Jetson 设备之间启动的每个 webRTC 流实例

因此,上述总和必须在支持的解码器流计数范围内。开发人员可以根据需要分配这两种用法之间的数量。

下表显示了 Orin 上各种系统资源的利用率指标。

平台

流计数

CPU

RAM

GPU

VIC

DLA0/1(平均)

PVA

Orin AGX 32GB

16

57%

9,877 MB

64%

NA%

74%

17%

Orin NX16

8

53%

7,972 MB

35%

52%

56%

19%

Orin NX8

4

34%

3,198 MB

7%

49%

61%

6%

Orin Nano 8GB

4

72%

3,274 MB

60%

52%

N/A%

N/A%

请注意,剩余可用的 GPU 支持同时执行其他 AI 工作负载。

使用 tegrastats 实用程序来监控您的场景中是否有任何系统资源接近完全利用,这将导致 FPS 和流式传输质量下降。