Metropolis 用户占用和参与度警报#
概述#
Metropolis 占用警报模块对视觉推理元数据进行流式分析,并以用户占用警报的形式生成洞察。
Metropolis 用户参与度警报模块对视觉推理元数据进行流式分析,并以用户注意力区域警报的形式生成洞察。
这些警报发布到 Redis 消息总线。
设计#

输入#
Vision AI 微服务的输出用作 Tokkio 用户占用和参与度模块的输入。它对来自流的每一帧运行实时计算机视觉,并在 visionai redis 频道中输出检测到的相应元数据。每个元数据帧包含所有检测到的人脸的边界框和 2D 身体姿势。
示例元数据帧
{
"version": "4.0",
"id": 1,
"@timestamp": "YYYY-MM-DDTHH:MM:SS.sssZ",
"sensorId": "SENSOR_ID",
"objects":
[
"0|484.822|125.63|705.183|345.99|Face|#|pose2D|18|nose,266.28452,144.77771,0.83630073|neck,-1.0,-1.0,-1.0|right-shoulder,167.94446,250.14096,0.93399066|right-elbow,93.0017,415.3354,0.63592523|right-wrist,91.006836,471.03665,0.28546536|left-shoulder,379.28296,241.4837,0.8813749|left-elbow,481.14264,360.60825,0.82538456|left-wrist,482.97302,420.16254,0.37851536|right-hip,214.57726,487.93814,0.7985392|right-knee,97.43787,466.14273,0.13412973|right-ankle,230.69476,478.4018,0.03407041|left-hip,357.42007,485.96896,0.8217566|left-knee,466.0811,476.68948,0.07266329|left-ankle,466.70682,444.2228,0.04072526|right-eye,243.17857,119.35192,0.7210652|left-eye,289.328,119.19954,0.6104527|right-ear,218.67596,134.33481,0.5708076|left-ear,316.38135,134.21928,0.87809706"
]
}
输出#
示例用户 FOV 占用警报
{
"id": "073835a1-b33b-4f5f-92af-85564d662fc8",
"sensor": {
"id": "SENSOR_ID",
"type": "camera"
},
"analyticsModule": {
"version": "1.0",
"id": "emdat_fov_alerts",
"source": "Nvidia_eMDX",
"description": "eMDAT fov alerting module"
},
"alerts": [
{
"id": "SENSOR_ID::fov::occupancy_threshold_switch::up::YYYY-MM-DDTHH:MM:SS.sssZ",
"rule_id": "occupancy_threshold_switch_id",
"rule_name": "",
"rule_type": "occupancy_threshold_switch",
"start": "YYYY-MM-DDTHH:MM:SS.sssZ",
"end": "YYYY-MM-DDTHH:MM:SS.sssZ",
"data": {
"type": "count",
"description": "FOV occupancy count greater than 1",
"result": {
"time": "YYYY-MM-DDTHH:MM:SS.sssZ",
"value": 1
}
},
"direction": "up"
}
]
}
示例用户参与度区域更改警报
{
"id": "46ecca77-3bf7-4eab-b719-93fcf870f52a",
"sensor": {
"id": "SENSOR_ID",
"type": "camera"
},
"analyticsModule": {
"version": "1.0",
"id": "emdat_userengagement_alerts",
"source": "Nvidia_eMDX",
"description": "eMDAT UserEngagement alerting module"
},
"alerts": [
{
"id": "SENSOR_ID::userengagement::UE_CONFIG_1::TEST_ALERT_RULE_1::zone_change::YYYY-MM-DDTHH:MM:SS.sssZ",
"rule_id": "b8d2ba48-4881-4969-bf9d-4852efdd853b",
"rule_type": "zone_change",
"start": "YYYY-MM-DDTHH:MM:SS.sssZ",
"end": "YYYY-MM-DDTHH:MM:SS.sssZ",
"data": {
"type": "user",
"description": "User's start zone is ENGAGED",
"result": {
"time": "YYYY-MM-DDTHH:MM:SS.sssZ",
"value": "[ENGAGED|DISTRACTED|DISENGAGED]"
}
},
"attributes": [
{
"name": "object_id",
"value": 10023829383
},
{
"name": "from_zone",
"value": "[ENGAGED|DISTRACTED|DISENGAGED]"
},
{
"name": "to_zone",
"value": "[ENGAGED|DISTRACTED|DISENGAGED]"
}
]
}
]
}
Metropolis FOV 占用警报概念#
视野 (FOV)#
视野 (FOV) 代表完整的摄像头视图。FOV 分析模块可以跟踪物体(例如人、脸、车辆)在整个视野内的移动,并提供与其相关的时间序列指标和警报。
占用警报#
当 FOV 占用状态由于人脸的存在/缺失而在 [占用, 空闲] 之间更改时,会引发警报。
占用警报规则#
警报规则可以配置为在人脸进入和退出 FOV 区域时,当 FOV 变为占用或空闲时发出警报。
配置 FOV 占用警报规则#
警报规则可以配置为在物体进入和退出 FOV 区域时,当 FOV 变为占用或空闲时发出警报。
Tokkio 工作流程预配置了传感器模板定义。这在 Tokkio 部署应用程序参数文件 tokkio-app-params.yaml
的 emdx-analytics 部分中定义如下。对于任何新发现的传感器,此模板用于在运行时配置具有 FOV 占用警报的传感器。
默认配置
emdx-analytics:
sensorTemplate:
alert_rules:
fov:
rules:
- count_threshold: 1
id: alert_rule_id_1
rule_type: occupancy_threshold_switch
time_interval: 1
type: fov
parameters:
- name: time_interval_up
value: 1
- name: time_interval_down
value: 2
roi:
rules: []
tripwire:
rules: []
gaze_rois: []
rois: []
tripwires: []
一个安装可以随时间推移拥有多个传感器。上面的 sensorTemplate 用于配置每个新传感器。
传感器可以在属性 sensorTemplate.alert_rules.fov.rules 下定义 FOV 的警报规则。
描述:根据 FOV 中存在的检测到的物体的 count_threshold 上方或下方的占用率变化配置警报规则。
简单的用例是当 FOV 状态从空闲(占用率 == 0)变为占用(占用率 > 0)时。相反的情况是当占用率从占用(占用率 > 0)变为闲置(占用率 == 0)时。
警报规则属性#
- id:指此警报规则的 ID。这在 FOV 的所有警报规则中应该是唯一的
FOV 可以具有与其关联的多个警报规则。
count_threshold:用于确定状态更改的计数阈值。
count_threshold 为零表示当占用率从零变为大于零时发出警报。
相反的情况是当占用率从大于零的正数降至零时,会发出警报。
正的非零 count_threshold (N) 意味着我们希望在占用率超过 N 时发出警报,发出 UP 警报(direction=up),而当占用率降至 N 或以下时,发出 DOWN(direction=down)警报。
警报消息方向属性将包含 ‘up’ 或 ‘down’ 以指示高于和低于阈值的交叉事件。
time_interval:时间窗口。以秒为单位指定。
指示计数需要高于或低于阈值以发出警报的持续时间。
它用于处理占用计数中的抖动,并在发生此类抖动时平滑警报的发布。
可以使用 parameters 扩展为 UP 和 DOWN 事件指定单独的 time_interval 值。请参阅下面的 parameters 属性描述
rule_type:‘occupancy_threshold_switch’
type:固定值 fov
parameters:用于自定义警报规则的附加参数。
提供参数是为了为 UP 和 DOWN 事件指定单独的 time_interval 值。
指定后,这将覆盖顶级 time_interval 属性中指定的 UP/DOWN 事件的默认值。
例如,要为 UP 事件设置 2 秒的 time_interval,为 DOWN 事件设置 3 秒的 time_interval,请向 parameters 属性添加以下两个参数
自定义配置
- name: time_interval_up value:2 - name:time_interval_down value:3
Helm 安装时间值覆盖#
在安装 Tokkio App helm chart 时,可以覆盖这些值,以在 values.yaml 文件中指定自定义 FOV 警报规则定义。
用户参与度概念#
头部姿势估计#
头部姿势估计的核心是确定人头部相对于三维空间中摄像头的方向的过程。这使得可以跟踪用户对摄像头的注意力。

头部姿势估计的关键步骤:#
面部地标检测
Movenet 模型用于确定面部地标,包括鼻尖、眼角和耳朵等重要点。提取这些坐标是该过程的关键方面。
摄像头校准
摄像头校准涉及确定摄像头的内在参数,包括焦距和光心。系统使用默认的摄像头校准内在参数值。
旋转估计
旋转向量和矩阵成为估计头部姿势的焦点。这些向量描绘了头部绕 x、y 和 z 轴的旋转。将这些向量转换为有意义的角度使我们能够辨别头部朝向的方向。这是通过使用 PnP 算法完成的。我们从 Pnp 算法返回的旋转矩阵中提取面部法线向量。
头部姿势角度计算
头部姿势角度表示头部偏离摄像头的程度。它是面部法线向量和摄像头前向方向之间的点积。面部法线向量从面部向外指出,当面部直接面向摄像头时,该向量与摄像头的前向方向对齐。摄像头的前向方向沿着正 z 轴。
面部角度方向
0° - 头部与摄像头完全对齐(直接看着它)180° - 头部完全向后转(面部背对摄像头)
区域#
区域是不同面部角度范围的非重叠环。例如,下面说明了三个区域。

如上所述,头部姿势角度范围为 0° 到 180°,其中 0° 是直接面对屏幕,180° 是背对屏幕。此角度是相对于 y 轴的。用户可以为区域定义自己的角度范围。
区域名称是预先确定的,无法更改。
示例
以下是包含 3 个区域的示例配置
区域 |
起始角度 |
结束角度 |
专注 |
0° |
40° |
分心 |
40° |
100° |
不专注 |
100° |
180° |
警报#
通过 Redis 发布 3 种类型的 UE 警报
开始区域警报
当人员(首次出现在场景中)及其初始区域在可配置的时间窗口内稳定下来时,发布警报。我们发布其稳定的区域值以及区域稳定性窗口开始的时间。
例如
{ "id": "46ecca77-3bf7-4eab-b719-93fcf870f52a", "sensor": { "id": "SENSOR_ID", "type": "camera" }, "analyticsModule": { "version": "1.0", "id": "emdat_userengagement_alerts", "source": "Nvidia_eMDX", "description": "eMDAT UserEngagement alerting module" } "alerts": [ { "id": "SENSOR_ID::userengagement::UE_CONFIG_1::TEST_ALERT_RULE_1::zone_change::YYYY-MM-DDTHH:MM:SS.sssZ", "rule_id": "b8d2ba48-4881-4969-bf9d-4852efdd853b", "rule_type": "zone_change", "start": "YYYY-MM-DDTHH:MM:SS.sssZ", "end": "YYYY-MM-DDTHH:MM:SS.sssZ", "data": { "type": "user", "description": "User's start zone is ENGAGED", "result": { "time": "YYYY-MM-DDTHH:MM:SS.sssZ", "value": "ENGAGED" } } "attributes": [ { "name": "object_id", "value": 10023829383 }, { "name": "from_zone", "value": "" }, { "name": "to_zone", "value": "ENGAGED" } ] } ] }
区域更改警报
当人员的头部姿势角度更改区域,并在新区域停留可配置的时间窗口时,我们发布区域过渡时间、当前区域和上一个区域。
例如
{ "id": "46ecca77-3bf7-4eab-b719-93fcf870f52a", "sensor": { "id": "SENSOR_ID", "type": "camera" }, "analyticsModule": { "version": "1.0", "id": "emdat_userengagement_alerts", "source": "Nvidia_eMDX", "description": "eMDAT UserEngagement alerting module" } "alerts": [ { "id": "SENSOR_ID::userengagement::UE_CONFIG_1::TEST_ALERT_RULE_1::zone_change::YYYY-MM-DDTHH:MM:SS.sssZ", "rule_id": "b8d2ba48-4881-4969-bf9d-4852efdd853b", "rule_type": "zone_change", "start": "2YYYY-MM-DDTHH:MM:SS.sssZ", "end": "YYYY-MM-DDTHH:MM:SS.sssZ", "data": { "type": "user", "description": "User changed the zone to DISTRACTED from ENGAGED", "result": { "time": "YYYY-MM-DDTHH:MM:SS.sssZ", "value": "DISTRACTED" } } "attributes": [ { "name": "object_id", "value": 10023829383 }, { "name": "from_zone", "value": "ENGAGED" }, { "name": "to_zone", "value": "DISTRACTED" } ] } ] }
结束区域警报
当人员消失(超出场景)时,我们发布最后稳定的区域占用率以及对象消失的时间。
例如
{ "id": "a6ecca77-3bf7-4eab-b719-93fcD870f23a", "sensor": { "id": "SENSOR_ID", "type": "camera" }, "analyticsModule": { "version": "1.0", "id": "emdat_userengagement_alerts", "source": "Nvidia_eMDX", "description": "eMDAT UserEngagement alerting module" } "alerts": [ { "id": "SENSOR_ID::userengagement::UE_CONFIG_1::TEST_ALERT_RULE_1::zone_change::YYYY-MM-DDTHH:MM:SS.sssZ", "rule_id": "b8d2ba48-4881-4969-bf9d-4852efdd853b", "rule_type": "zone_change", "start": "YYYY-MM-DDTHH:MM:SS.sssZ", "end": "YYYY-MM-DDTHH:MM:SS.sssZ", "data": { "type": "user", "description": "User's end zone is DISTRACTED", "result": { "time": "YYYY-MM-DDTHH:MM:SS.sssZ", "value": "DISTRACTED" } } "attributes": [ { "name": "object_id", "value": 10023829383 }, { "name": "from_zone", "value": "DISTRACTED" }, { "name": "to_zone", "value": "" } ] } ] }
用户参与度配置#
以下是启用用户参与度警报所需的配置。这些配置默认情况下都已定义,但可以修改某些参数以微调用户体验。
用户参与度插件#
UE 插件默认在“occupancy-alerts.”部分中定义如下
occupancy-alerts:
plugins:
- name: UserEngagement
className: core.analytics.plugins.ue.ue.UserEngagement
config:
resultRetensionWindowMaxSize: 3600
exponentialSmootheningAlpha: 0.4
区域配置#
UE 区域配置默认在 occupancy-alerts.sensorTemplate 部分中定义如下
occupancy-alerts:
sensorTemplate:
user_engagement:
- id: UE_CONFIG_1
zones:
- id: ENGAGED
name: Near to Camera
from_angle: 0
to_angle: 40
- id: DISTRACTED
name: Slightly tilted Away from Camera
from_angle: 40
to_angle: 100
- id: DISENGAGED
name: Away from Camera
from_angle: 100
to_angle: 180
frameBuffer: 2 # temporal stability
angleBuffer: 5 # spatial stability
注意
默认情况下,3 个区域(专注/分心/不专注)预定义了角度(from_angle/to_angle)。区域的数量和 ID 无法更改。但是,可以修改角度(from_angle、to_angle)以满足您的需求。
参数 frameBuffer 和 angleBuffer 代表时间和空间稳定性,可以修改以微调平滑算法。请参阅 (高级)头部姿势稳定性 部分,以了解平滑算法。
区域更改警报配置#
UE 区域更改警报默认在 occupancy-alerts.sensorTemplate.alert_rules 中定义如下
occupancy-alerts:
sensorTemplate:
rules:
- id: UE_CONFIG_1 # Should be equal to sensorTemplate.user_engagement.id as defined previous section.
rule_type: zone_change
time_interval: 1 # Zone change alert published only if attention stays in the new zone for 1 sec
name: UE_ALERT_RULE_1
注意
默认情况下,警报配置已定义。如果需要,我们可以调整 time_interval 参数,以获得更好的稳定性并增加延迟。
Helm 安装时间值覆盖#
在安装 Tokkio App helm chart 时,可以覆盖这些值,以在 values.yaml 文件中指定自定义区域配置。
(高级)头部姿势稳定性#
由于 2D 身体姿势检测中的抖动、用户头部运动的急动,可能会产生噪声。这将导致头部姿势向量快速更改区域或抖动。为了获得平滑的最终用户体验,我们需要抑制此类噪声/抖动并提供稳定的头部姿势区域状态。
以下是两种算法及其调整参数,用于稳定区域状态
使用角度缓冲区的空间稳定性
算法等待头部姿势角度从区域过渡角度增加/减少 X°。例如:如果区域过渡角度为 40°,X=5,则头部姿势角度应更改为 > 45 或 < 35,并满足此条件几帧才能进行有效的区域过渡。如果头部姿势角度保持在 35°-45° 范围内,则不会发生区域过渡(有助于控制噪声)。这是区域配置中的可配置参数。
使用帧缓冲区的时间稳定性
头部姿势角度应在过渡区域中连续停留至少 ‘Y’ 帧才能进行有效的状态更改
例如:如果区域过渡角度为 40°,Y=3,则头部姿势角度应从 >40 或 <40 更改,并且该条件对于至少 3 帧都成立才能进行有效的区域过渡(有助于控制噪声)。这是区域配置中的可配置参数。