使用 Jetson 平台服务进行零样本检测#

概述#

诸如 CLIP 之类的生成式 AI 视觉 Transformer 使得构建能够进行开放词汇对象检测的零样本检测模型成为可能。这意味着,该模型不受一组预定义类别的限制来检测。要检测的对象由用户在运行时配置。

零样本检测 AI 服务支持使用 Jetson 服务快速部署生成式 AI,以在视频直播输入上进行开放词汇检测。零样本检测 AI 服务公开 REST API 端点来控制流输入和要检测的对象。

API 端点

描述

/api/v1/live-stream

管理 AI 服务可以访问的直播流。

/api/v1/detection/classes

设置要检测的对象类别

此 AI 服务以预构建 Docker 容器的形式提供,可以使用 Docker Compose 启动。它通过 JSON 配置文件进行配置,并与基础服务(如 jetson-redis 和 jetson-ingress)集成。我们在参考工作流程资源中提供了示例 Compose 和配置文件,以便于部署。

Zero Shot Detection AI Service Diagram

服务

必需

注释

jetson-ingress

需要通过 API 网关端口 (30080) 访问零样本检测 REST API。

jetson-redis

需要用于检测元数据输出。

jetson-vst

建议用于管理可用作 AI 服务输入的 RTSP 流。如果与 SDR 集成则为必需。

jetson-storage

建议用于帮助存储容器和模型,但不是必需的。此服务所需的存储空间应适合大多数 Jetson 设备默认配置。

jetson-firewall

建议在实际部署中使用,以限制对 API 网关端口以外端口的访问。

jetson-monitoring

仅在需要跟踪系统指标时需要

jetson-sys-monitoring

仅在需要跟踪系统指标时需要

jetson-gpu-monitoring

仅在需要跟踪 GPU 指标时需要

jetson-networking

仅在使用 VST 和带有 VLM 服务的 IP 摄像头时需要

入门指南#

在开始使用此示例之前,请仔细阅读先决条件部分。

先决条件#

首先,请按照快速入门指南设置您的 Jetson 平台服务系统。建议同时按照 Hello World 示例熟悉 Jetson 平台服务。在继续之前,请使用 Docker Compose down 命令关闭任何先前启动的 JPS 示例,如 AI-NVR。

零样本检测 AI 服务在 RTSP 流上运行。RTSP 流可以来自任何来源,例如 IP 摄像头、视频存储工具包 (VST) 或 NVStreamer。获取 RTSP 流进行测试的最快方法是使用 NVStreamer,它可以将视频文件作为 RTSP 流提供。要了解如何使用 NVStreamer 创建 RTSP 流,请参阅Jetson Orin 上的 NVStreamer页面。

零样本检测 AI 服务以预构建 Docker 容器的形式提供,可以使用 Docker Compose 启动。它通过 JSON 配置文件进行配置,并与 Jetson 平台服务(如 jetson-redis 和 jetson-ingress)集成。

要获取 Docker Compose 和配置文件,请从 NGC 或 SDK Manager 下载 Jetson 平台服务资源包下载后,找到 zero_shot_detection-2.0.0.tar.gz 文件并将其放在您的主目录中。以下命令将假定 tar 文件从您的主目录开始。

cd ~/
tar -xvf zero_shot_detection-2.0.0.tar.gz
cd ~/zero_shot_detection/example_1

零样本检测 AI 服务将使用 jetson-ingress 和 jetson-redis 服务。需要配置 jetson-ingress 服务以公开零样本检测 REST API。将提供的默认配置复制到相应的服务配置目录。

sudo cp config/zero_shot_detection-nginx.conf /opt/nvidia/jetson/services/ingress/config

然后重启基础服务

sudo systemctl start jetson-ingress
sudo systemctl start jetson-redis

注意

如果之前启动过任何 Jetson 服务,请使用“restart”命令而不是“start”。

现在部署零样本检测 AI 服务!

sudo docker compose up -d

要检查是否所有必要的容器都已启动,您可以运行以下命令

sudo docker ps

输出应类似于下图。

Zero Shot Docker PS

注意

首次启动时,它将自动下载并优化零样本检测模型。这将需要一些时间。

与零样本检测服务交互#

  1. 通过 REST API 控制流输入

您可以首先添加一个 RTSP 流,供零样本检测模型使用,使用以下 curl 命令。这将在 live-stream 端点上使用 POST 方法。

  • 将 0.0.0.0 替换为您的 Jetson IP,并将 RTSP 链接替换为您的 RTSP 链接。

curl --location 'http://0.0.0.0:5010/api/v1/live-stream' \
--header 'Content-Type: application/json' \
--data '{
"liveStreamUrl": "rtsp://0.0.0.0:31554/nvstream/root/store/nvstreamer_videos/video.mp4"
}'

注意

除了 curl 命令之外,REST API 还可以通过 API 文档页面直接进行测试,该页面在零样本检测服务启动时在http://0.0.0.0:5010/docs提供。

此请求将返回一个唯一的流 ID,该 ID 稍后用于设置检测类别和删除流。

{
    "id": "a782e200-eb48-4d17-a1b9-5ac0696217f7"
}

您还可以使用 live-stream 端点上的 GET 方法列出添加的流及其 ID

curl --location 'http://0.0.0.0:5010/api/v1/live-stream'
  1. 添加检测类别

零样本检测模型能够在运行时更新其检测类别。此端点接受要检测的对象列表和关联的阈值。阈值是检测的灵敏度。较高的值将减少误报。较低的值将增加误报。0.1-2.0 之间的值通常效果良好。设置检测类别后,模型将持续评估输入流。

目前,此服务仅支持 1 个流,但在未来,此 API 将允许支持多流。

curl --location 'http://0.0.0.0:5010/api/v1/detection/classes' \
--header 'Content-Type: application/json' \
--data '{
    "objects": ["a zebra", "an elephant", "a giraffe"],
    "thresholds": [0.03, 0.02, 0.01],
    "id": "a782e200-eb48-4d17-a1b9-5ac0696217f7"
}'
  1. 查看 RTSP 流输出

添加流后,它将传递到输出 RTSP 流。您可以在rtsp://0.0.0.0:5011/out查看此流。添加查询或警报后,我们可以在此输出流上查看 VLM 响应。

  1. 查看检测元数据输出

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

redis-cli XREAD COUNT 1 BLOCK 5000 STREAMS owl $

请注意,如果在容器运行时系统重新启动,它将自动恢复,但添加的流和检测类别将不会持久保存。它们需要重新添加。为了使流在重启后持久保存,AI 服务可以与 SDR 结合使用,如零样本检测工作流程页面所示。

  1. 关闭

要关闭示例,您可以首先使用 live-stream 端点上的 DELETE 方法删除流。请注意,流 ID 已添加到此 URL 路径中。

curl --location --request DELETE 'http://0.0.0.0:5010/api/v1/live-stream/a782e200-eb48-4d17-a1b9-5ac0696217f7'

然后从用于启动示例的 compose.yaml 文件所在的同一文件夹中运行

sudo docker compose down

总而言之,本节介绍了如何启动零样本检测 AI 服务,然后通过 REST API 与其交互,并查看 RTSP 输出和 Redis 输出。

以下是与零样本检测服务交互时有用的地址摘要。

零样本检测服务的访问点

名称

本地 URI

API 网关 URI

描述

REST API 文档

http://0.0.0.0:5010/docs

http://0.0.0.0:30080/zero_shot_detection/docs

零样本检测 AI 服务 REST API 文档

REST API

http://0.0.0.0:5010/api/v1/

http://0.0.0.0:30080/zero_shot_detection/api/v1

零样本检测 AI 服务的控制 REST API

RTSP 输出

rtsp://0.0.0.0:5011/out

检测叠加输出

配置#

所有配置文件都可以在 ~/zero_shot_detection/example_1/config 目录下找到。可用的配置选项分为两类。

  • 零样本检测服务配置

    • main_config.json

  • 基础服务配置

    • zero_shot_detection-nginx.conf

main_config.json

main_config.json 配置了流式传输管道,该管道将使用 NanoOWL 评估流输入,并公开 REST API 以配置流输入和检测类别。

{
    "api_server_port": 5010,
    "stream_output": "rtsp://0.0.0.0:5011/out",
    "redis_host": "0.0.0.0",
    "redis_port": 6379,
    "redis_stream": "owl",
    "redis_output_interval": 60,
    "log_level": "INFO"
}

值类型

值示例

描述

注释

“api_server_port”

int

5010

主管道将公开其 REST API 以进行流和模型控制的端口

“stream_output”

int

5012

AI 服务生成的 RTSP 流的输出 URI。

“redis_host”

str

“0.0.0.0”

Redis 服务器的主机

如果使用 jetson-redis 服务在本地运行 Redis,请将此值设置为“0.0.0.0”。

“redis_port”

str

6379

要连接的 Redis 服务器端口

如果使用 jetson-redis 服务在本地运行 Redis,请将此值设置为 6379。

“redis_stream”

str

“owl”

用于输出元数据的 Redis 流名称

“redis_output_interval”

str

60

将根据此值将每 N 帧的元数据输出到 Redis。

“log_level”

str

“INFO”

基于 Python 的日志级别

支持的值:[“DEBUG”, “INFO”, “WARNING”, “ERROR”, “CRITICAL”]

基础服务配置

  • zero-shot-detection-nginx.conf

zero-shot-detection-nginx.conf 用于配置 jetson-ingress 服务(API 网关),以将 HTTP 流量路由到零样本检测 AI 服务。jetson-ingress 的文档可在API 网关 (Ingress)中找到。

工作流程集成#

零样本检测服务可以与 Jetson 平台服务的其他部分集成,以构建用于零样本检测的完整端到端工作流程。要了解有关完整工作流程以及零样本检测服务如何与 VST、SDR、监控和 Redis 集成的更多信息,请转到零样本检测工作流程页面。

延伸阅读#

要了解有关零样本检测 AI 服务的更多信息,请查看 jetson-platform-services 存储库上的开源代码。

Jetson 上对零样本检测的支持来自 NanoOWL 项目

有关 Jetson 上的基准测试和其他生成式 AI 示例,请访问 Jetson AI 实验室