Vision AI 概述#

Tokkio Vision AI 微服务是一个强大的视频推理解决方案,旨在从用户视频流中提取面部边界框和身体姿势。它使用 GXF 和 Deepstream 框架实现。

  • 微服务的使用方式如下

    • 用户连接 新用户连接到 Tokkio 用户界面 (UI)。

    • 流初始化 DS SDR 向 Vision AI 微服务发送 HTTP 请求,将用户的视频流作为 RTSP 流传输。

    • 实时处理 Vision AI 微服务对视频流的每一帧执行实时计算机视觉分析,并将检测到的元数据输出到 visionai Redis 通道。

    • 用户断开连接 当用户关闭 UI 时,DS SDR 向 Vision AI 微服务发送“删除流”HTTP 请求。

    • 流终止 Vision AI 微服务停止处理视频流。

如果指定时间内发生数据丢失,微服务会自动重新连接到输入视频流,确保持续运行。此架构提供了一种无缝且高效的方式来实时分析视频流,通过精确的面部和身体姿势检测增强用户交互。

REST 接口#

视觉微服务的 REST API 接口可用于发送和删除实时视频流。端点由 Tokkio 工作流程中的 SDR 调用。我们还在下面提供了端点以供参考

  1. 使用 RTSP 将视频流发送到视觉微服务

import requests
from datetime import datetime, timezone

# Get current date and time in UTC
current_datetime_utc = datetime.now(timezone.utc)

# Format the datetime object to the desired string format
formatted_datetime = current_datetime_utc.strftime("%Y-%m-%dT%H:%M:%SZ")

url = 'http://IP:8082/AddStream/stream'
camera_id = '123'

configData = {
"alert_type": "camera_status_change",
"created_at": formatted_datetime,
"event": {
        "camera_id": camera_id,
        "camera_name": "webcam_" + camera_id,
        "camera_url": "rtsp_url",
        "change": "camera_streaming"
    },
"source": "vst"
}

response = requests.post(json=configData, url=url, timeout=1)
  1. 将本地视频发送到视觉微服务

import requests
from datetime import datetime, timezone

# Get current date and time in UTC
current_datetime_utc = datetime.now(timezone.utc)

# Format the datetime object to the desired string format
formatted_datetime = current_datetime_utc.strftime("%Y-%m-%dT%H:%M:%SZ")

url = 'http://IP:8082/AddStream/stream'
camera_id = '123'

configData = {
"alert_type": "camera_status_change",
"created_at": formatted_datetime,
"event": {
        "camera_id": camera_id,
        "camera_name": "webcam_" + camera_id,
        "camera_url": "file:///opt/nvidia/deepstream/deepstream/samples/streams/sample_1080p_h265.mp4",
        "change": "camera_streaming"
    },
"source": "vst"
}

response = requests.post(json=configData, url=url, timeout=1)
  1. 删除流

import requests
from datetime import datetime, timezone

# Get current date and time in UTC
current_datetime_utc = datetime.now(timezone.utc)

# Format the datetime object to the desired string format
formatted_datetime = current_datetime_utc.strftime("%Y-%m-%dT%H:%M:%SZ")

url = 'http://IP:8082/RemoveStream/stream'
camera_id = '123'

configData = {
"alert_type": "camera_status_change",
"created_at": formatted_datetime,
"event": {
        "camera_id": camera_id,
        "camera_name": "webcam_" + camera_id,
        "camera_url": "rtsp_url",
        "change": "camera_streaming"
},
"source": "vst"
}

response = requests.post(json=configData, url=url, timeout=1)

输出模式#

vision 微服务在 visionai 通道中发送的 Redis 事件的模式如下:sensorId 与 REST 调用中提供的 camera_id 相同。

{
"version" : "4.0",
"id" : "frame_id",
"@timestamp" : "YYYY-MM-DDTHH:MM:SS.sssZ",
"sensorId" : "123",
"objects" : [
    "0|xmin|ymin|xmax|ymax|Face|
    #|pose2D|18|
    nose,x,y,conf|
    neck,-1,-1,-1|
    right-shoulder,x,y,conf|
    right-elbow,x,y,conf|
    right-wrist,x,y,conf|
    left-shoulder,x,y,conf|
    left-elbow,x,y,conf|
    left-wrist,x,y,conf|
    right-hip,x,y,conf|
    right-knee,x,y,conf|
    right-ankle,x,y,conf|
    left-hip,x,y,conf|
    left-knee,x,y,conf|
    left-ankle,x,y,conf|
    right-eye,x,y,conf|
    left-eye,x,y,conf|
    right-ear,x,y,conf|
    left-ear,x,y,conf|
    "]
}

关于模型#

视频推理服务使用 Movenet 模型,该模型根据 Apache 2 许可证分发。为了提高性能,该模型被转换为 NVIDIA TensorRT ,对其进行优化以实现低延迟和高吞吐量。这种转换确保了高效处理,使其适用于实时应用程序。

UCF 微服务#

示例参数:
ds-visionai:
checkInterval: '1'
jitterbufferLatency: 2000
peerPadIdSameAsSourceId: 'true'
redisCfg:
    payloadkey: message
    topic: visionai
rtspReconnectInterval: 10
streammuxResolution:
    height: 720
    width: 1280
videoSink: none

示例连接:

connections:
  ds-visionai/redis: redis-timeseries/redis
  tokkio-ds-sdr/httpds: ds-visionai/http-api

所有参数:

所有微服务参数#

参数

描述

dsServicePort: (integer )

DS 服务端口。默认 8084

remoteAccess: (string )

启用远程访问或仅限本地主机。默认 ‘True’

addStreamApiPath: (string )

服务添加流的 API 路径。默认 AddStream

removeStreamApiPath: (string )

服务删除流的 API 路径。默认 RemoveStream

getStatusApiPath: (string )

服务获取状态的 API 路径。默认 Status

apiResourceName: (string )

流的 REST API 资源名称。默认 stream

recycleSourceId: (string )

删除流后回收并重用 DS 内部源 ID。默认 ‘False’ [强制性:False, 允许值:{ True, False }]

maxNumSources: (integer )

允许添加的最大源数量。默认 6

batchSize: (integer )

streammux 和推理的批处理大小。默认 8

rtspReconnectInterval: (integer )

自上次从 RTSP 源接收到数据以来等待强制重新连接的超时时间(秒)。0=禁用超时。默认 10

rtpProtocol: (integer )

要使用的 RTP 协议。0 表示 TCP/UDP;4 表示仅 TCP。默认 0 [强制性:False, 允许值:{ 0, 4 }]

peerPadIdSameAsSourceId: (string )

在 streammux 流索引中使用来自源流的 ID。默认 ‘True’ [强制性:False, 允许值:{ true, false }]

jitterbufferLatency: (integer )

管道源组件抖动缓冲区大小(毫秒)。默认 100 [强制性:False]

fileLoop: (string )

循环文件输入。默认 ‘True’ [强制性:False, 允许值:{ true, false }]

msgConvPayloadType: (integer )

DS msgbroker 负载模式。0 DS;1 DS 最小;256 保留;257 自定义。默认 1 [强制性:False, 允许值:{ 0, 1, 256, 257 }]

redisCfg: (object )

Redis broker 配置

payloadkey: (string )

消息的负载密钥。默认 metadata

topic: (string )

redis 消息的主题或流名称。默认 ‘test’

enableLatency: (string )

是否启用每帧延迟测量。默认 ‘false’ [强制性:False, 允许值:{ true, false }]

enableCompLatency: (string )

是否启用每组件延迟;仅当 enableLatency 为 ‘True’ 时使用。默认 ‘False’ [强制性:False, 允许值:{ true, false }]

videoSink: (string )

视频接收器类型。默认 ‘none’ [强制性:False, 允许值:{ rtsp, fake, file, none }]

sinkSync: (string )

管道接收器组件在时钟上同步。默认 ‘false’ [强制性:False, 允许值:{ true, false }]

streammuxResolution: (object )

DS 输入视频分辨率配置

height: (integer )

预期的视频帧高度。默认 1080

width: (integer )

预期的视频帧宽度。默认 1920

checkInterval: (string )

init 容器检查间隔(秒)。默认 ‘1’