AI 目标识别
功能概述
开启目标识别后,飞行器实时检测画面中的目标,可识别行人、骑行者、车辆、船只、无人机以及烟雾与火等,完整取值见“目标类型”。
在目标识别的基础上还支持以下能力:
| 能力 | 说明 |
|---|---|
| 目标跟踪 | 点选或框选画面中的目标,飞行器持续跟随,支持简单跟踪与盘旋跟踪 |
| 目标锁定自动变焦 | 锁定目标后自动调整变焦倍率,使目标在画面中保持合适大小 |
| 区域搜索 | 飞行器在指定多边形区域内按航线飞行并识别目标 |
| AI 布防 | 识别到指定类型的目标时自动录像或拍照 |
| 违停证据采集 | 对选定车辆采集违停证据,并上报车牌、车身颜色与位置信息 |
识别结果分两条通道下发:视频流 SEI 逐帧携带目标框、目标类型、置信度与跟踪 ID,供拉流端解析后在直播画面上实时叠加;MQTT 事件携带检测帧图片地址、违停车辆信息与证据采集进度,供业务留档与后续处理。
MQTT 事件如下,字段定义见“接口详细实现”:
| Method | 说明 |
|---|---|
| target_detect_result_report | 目标识别结果上报,包含检测帧图片地址与目标列表 |
| evidence_collection_status | 违停证据采集的任务进度与单车采集结果 |
| ai_service_illegal_parking_info | 违停车辆的车牌、颜色、位置、检测时间与证据图片地址 |
如果出现错误,请通过返回的错误码在 错误码 章节中查询对应的错误描述。
AI_detect_shoot_notify(AI 识别拍摄结果上报)已弃用,该结果改由视频流 SEI 承载。
视频流 SEI 解析
SEI(Supplemental Enhancement Information)是 H.264/H.265 码流中的帧对齐元数据,与视频内容严格对齐。识别结果以 user_data_unregistered(payloadType = 5)类型的 SEI 周期性写入码流,有效载荷为 Protobuf 序列化数据(proto3,package video.sei,消息 SeiPayload)。
封装结构
| 段 | 长度 | 内容 |
|---|---|---|
| 起始码 | 4 字节 | 00 00 00 01 |
| NAL 头 | H.264 一字节、H.265 两字节 | H.264 06(nal_unit_type = 6);H.265 4E 01(nal_unit_type = 39,PREFIX_SEI) |
| payloadType | 1 字节 | 05,即 user_data_unregistered |
| payloadSize | 可变长 | 每个 0xFF 累加 255,末字节为余数。其值为 RBSP 域长度,即 16 + 4 + Protobuf 字节数,不含防竞争字节 |
| UUID | 16 字节 | dc45e9bd-e6d9-48b7-962c-d820d923aaaa |
| 标识字段 | 4 字节 | 41 74 41 69,即 AtAi |
| Protobuf 数据 | payloadSize - 20 | SeiPayload 序列化字节 |
| 结束字节 | 1 字节 | 80 |
两种编码仅 NAL 头长度不同,其后结构一致。
解析流程
- 以起始码
00 00 00 01切分 NAL 单元。 - 读 NAL 头判断类型,H.264
nal_unit_type = 6、H.265nal_unit_type = 39为 SEI,其余跳过。 - 读 payloadType,须为 5。
- 读变长 payloadSize,得到 RBSP 域长度。
- 去除防竞争字节
0x03(连续00 00后跟<= 03时插入了该字节)。 - 校验前 16 字节 UUID 须为
dc45e9bd-e6d9-48b7-962c-d820d923aaaa、随后 4 字节标识字段须为41 74 41 69,不匹配的 user data SEI 属其它用途,忽略。 - 其余字节按
SeiPayload反序列化。
第 5 步必须先于第 7 步:防竞争字节可能插在 Protobuf 数据中间,实测浮点字段是高发位置,字节对照见“实测样例”。
消息定义
syntax = "proto3";
package video.sei;
message SeiPayload {
// 帧时间
int32 year = 1;
int32 month = 2;
int32 day = 3;
int32 hour = 4;
int32 minute = 5;
int32 second = 6;
int32 millisecond = 7;
SeiPayloadCamera camera = 8;
SeiPayloadUav uav = 9;
SeiPayloadSpeed speed = 10;
AIServiceDetectResult detect_result = 11;
ARTrajectoryProjection trajectory = 12;
}
message SeiPayloadCamera {
int32 sei_type = 1;
int32 length = 2;
int32 gimbal_type = 3;
int32 zoom_value = 4;
int32 focus_length = 5;
int32 focus_length_35mm = 6;
int32 h_fov = 7;
int32 v_fov = 8;
}
message SeiPayloadUav {
int32 sei_type = 1;
int32 length = 2;
int32 lon = 3;
int32 lat = 4;
int32 abs_alt = 5;
int32 sea_alt = 6;
int32 rel_alt = 7;
int32 uav_yaw = 8;
int32 uav_roll = 9;
int32 uav_pitch = 10;
int32 gimbal_pitch = 11;
int32 gimbal_roll = 12;
int32 gimbal_yaw = 13;
int32 lon_center = 14;
int32 lat_center = 15;
int32 lon_tl = 16;
int32 lat_tl = 17;
int32 lon_tr = 18;
int32 lat_tr = 19;
int32 lon_bl = 20;
int32 lat_bl = 21;
int32 lon_br = 22;
int32 lat_br = 23;
}
message SeiPayloadSpeed {
int32 sei_type = 1;
int32 length = 2;
int32 x_speed = 3;
int32 y_speed = 4;
int32 z_speed = 5;
}
message AIServiceDetectResult {
int32 sei_type = 1;
int32 length = 2;
int32 len_id = 3;
int32 mode_id = 4;
int32 frame_id = 5;
int32 resolution_width = 6;
int32 resolution_height = 7;
int32 obj_num = 8;
repeated DetectObjInfo detect_obj_infos = 9;
}
message DetectObjInfo {
float start_x = 1;
float start_y = 2;
float width = 3;
float height = 4;
int32 type = 5;
int32 confidence = 6;
int32 object_id = 7;
int32 status = 8;
uint32 car_color = 9;
uint32 car_type = 10;
uint32 gender = 11;
uint32 age = 12;
uint32 top_type = 13;
uint32 lower_type = 14;
uint32 top_color = 15;
uint32 lower_color = 16;
uint32 military = 17;
uint32 danger_level = 18;
}
message ARTrajectoryProjection {
int32 sei_type = 1;
int32 length = 2;
bytes traj_px = 3;
bytes traj_py = 4;
bytes mission_px = 5;
bytes mission_py = 6;
bytes home_px = 7;
bytes home_py = 8;
int32 camera_id = 9;
}
解析时注意四点:
start_x、start_y、width、height为 float32(wire type 5,定长 4 字节小端 IEEE 754),其余数值字段均为 int32 varint,按 varint 解这四个字段会得到错误结果。- proto3 不序列化零值,字段缺失一律按 0 处理,不可因字段不存在而丢弃该帧或该目标。实测
focus_length_35mm与gimbal_roll从未出现,速度三轴仅部分帧出现。 - int32 负数按 64 位符号扩展编码占 10 字节,例如
rel_alt为 -100(即 -10 m)时编码为9C FF FF FF FF FF FF FF FF 01。手工解 varint 时须按有符号 64 位读取后截断为 int32。 - 各子消息的
length实测与真实字节数不一致,定位边界请用 Protobuf 自身的长度前缀,忽略该字段。
字段说明
顶层为帧时间(年至毫秒)与五个子消息,各子消息的 sei_type 标识段类型。前四段每帧都会填充,trajectory 仅在自主飞行且轨迹有效时注入,须每帧判断存在性,不要缓存上一帧。下列各表的“缩放”列为整数放大倍数,真实值 = 原始值 / 缩放。
相机参数 camera(sei_type = 1)
| 字段 | 含义 | 缩放 |
|---|---|---|
| gimbal_type | 云台形态 | — |
| zoom_value | 变焦倍率 | 100 |
| focus_length / focus_length_35mm | 焦距、35mm 等效焦距(mm) | 10 |
| h_fov / v_fov | 水平、垂直视场角(°) | 10 |
位置姿态 uav(sei_type = 2)
| 字段 | 含义 | 缩放 |
|---|---|---|
| lon / lat | 飞行器经纬度(°) | 10⁷ |
| abs_alt / sea_alt / rel_alt | 绝对、海平面、相对起飞点高度(m) | 10 |
| uav_yaw / uav_roll / uav_pitch | 机身航向、横滚、俯仰角(°) | 100 |
| gimbal_pitch / gimbal_roll / gimbal_yaw | 云台俯仰、横滚、偏航角(°) | 100 |
| lon_center / lat_center | 画面中心投影经纬度(°) | 10⁷ |
| lon_tl 至 lat_br | 画面四角投影经纬度(°),依次为左上、右上、左下、右下 | 10⁷ |
速度 speed(sei_type = 3)
| 字段 | 含义 | 缩放 |
|---|---|---|
| x_speed / y_speed / z_speed | 北向、东向、地向速度(m/s) | 100 |
检测跟踪 detect_result(sei_type = 4)
| 字段 | 含义 |
|---|---|
| len_id | 镜头类型:0 广角,1 变焦,2 红外,3 夜视 |
| resolution_width / resolution_height | 检测所基于的图像宽、高(px) |
| obj_num / detect_obj_infos | 目标个数与目标数组,数组长度等于 obj_num |
目标数组元素 DetectObjInfo:
| 字段 | 含义 |
|---|---|
| start_x / start_y / width / height | 目标框左上角坐标与宽高,归一化 0 至 1 |
| type / confidence / object_id | 目标类型(见“目标类型”)、置信度 0 至 100、跟踪 ID |
目标框换像素:像素 = 比例 × 对应的检测图像尺寸。检测图像尺寸可能与播放分辨率不同,播放端缩放过须按播放尺寸再换算一次。status 至 danger_level 等扩展属性当前固件未上报。
AR 轨迹投影 trajectory(sei_type = 5)
轨迹点、任务点与归巢点在当前画面上的位置,供播放端叠加。
| 字段 | 含义 |
|---|---|
| traj_px / traj_py | 轨迹点 x、y 序列,两者等长,逐点相连成折线 |
| mission_px / mission_py | 任务点 x、y |
| home_px / home_py | 归巢点 x、y |
| camera_id | 镜头类型,取值同 len_id |
坐标为 0 至 255 的比例值,像素 = 值 / 255 × 画面尺寸。mission_* / home_* 长度为 1 表示该点在画面内、即其投影位置,为 2 表示在画面外、两值指示大致方位。
目标类型
下表为识别结果中 type 字段的取值,下发 target_type_list 时用同一套取值指定参与识别的目标类型,传空表示识别当前场景下支持的全部类型。
| 目标类型ID | 目标名称 |
|---|---|
| 0 | 背景(暂不支持) |
| 1 | 动物(暂不支持) |
| 2 | 船 |
| 3 | 小车 |
| 4 | 行人 |
| 5 | 骑行者 |
| 6 | 大车 |
| 34 | 无人机 |
| 35 | 烟雾 |
| 36 | 火 |
| 99 | 未检测到目标 |
实测样例
一帧 H.265 SEI:NAL 887 字节,含 1 个防竞争字节,去转义后 RBSP 886 字节,其中 Protobuf 858 字节。
码流原样字节的前 32 字节,依次为起始码、NAL 头、payloadType、payloadSize、UUID、标识字段。此处偏移含起始码,比下表大 4:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F |ASCII|
00000000 00 00 00 01 4E 01 05 FF FF FF 71 DC 45 E9 BD E6 |....N.....q.E...|
00000010 D9 48 B7 96 2C D8 20 D9 23 AA AA 41 74 41 69 08 |.H..,. .#..AtAi.|
本帧唯一的防竞争字节落在 obj[2].height 上,去转义前后对照:
原样 … 3C 25 00 00 03 00 3D 28 03 30 …
RBSP … 3C 25 00 00 00 3D 28 03 30 …
25 是 height 的 tag,其后 4 字节 00 00 00 3D 才是 float32 的 0.03125。不去 0x03 不只读错这一个值,后续字段边界会一起错开。
去转义后的逐字段拆解,时间字段与画面四角同构部分已折叠,目标数组只列首个:
偏移 段 字段 号 原始字节 原始值 换算 / 含义
- 封装 起始码 - 00 00 00 01 4 字节 在 RBSP 之前,不计入偏移
0x00 封装 nal_unit_header - 4E 01 2 字节 H.265 头,nal_unit_type = 39
0x02 封装 payloadType - 05 5 user_data_unregistered
0x03 封装 payloadSize - FF FF FF 71 878 = 16 + 4 + 858
0x07 封装 uuid - DC 45 E9 BD E6 D9 48 B7 … 16 字节 ✓ 匹配本协议
0x17 封装 标识字段 - 41 74 41 69 "AtAi" ✓
0x1B SeiPayload year ~ millisecond 1~7 08 EA 0F … 38 AA 05 7 个字段 帧时间 2026-08-21 14:23:57.682
0x2B camera camera 8 42 10 16 字节 子消息 SeiPayloadCamera
0x2D camera sei_type 1 08 01 1 相机参数
0x2F camera length 2 10 0C 12 实际 16 字节,勿用于定位
0x31 camera gimbal_type 3 18 01 1
0x33 camera zoom_value 4 20 64 100 1 x
0x35 camera focus_length 5 28 58 88 8.8 mm
0x37 camera h_fov 7 38 C0 04 576 57.6 deg
0x3A camera v_fov 8 40 C9 03 457 45.7 deg
0x3D uav uav 9 4A 72 114 字节 子消息 SeiPayloadUav
0x3F uav sei_type 1 08 02 2 位置姿态
0x41 uav length 2 10 42 66
0x43 uav lon 3 18 BF E0 D8 A0 04 1142304831 114.2304831 deg
0x49 uav lat 4 20 C4 F8 EB 6D 230358084 23.0358084 deg
0x4E uav abs_alt 5 28 CB 59 11467 1146.7 m
0x51 uav sea_alt 6 30 8E 5C 11790 1179 m
0x54 uav rel_alt 7 38 9C FF FF FF FF FF FF FF FF 01 -100 -10 m
0x5F uav uav_yaw 8 40 42 66 0.66 deg
0x61 uav uav_roll 9 48 01 1 0.01 deg
0x63 uav uav_pitch 10 50 0D 13 0.13 deg
0x65 uav gimbal_pitch 11 58 B2 FF FF FF FF FF FF FF FF 01 -78 -0.78 deg
0x70 uav gimbal_yaw 13 68 3F 63 0.63 deg
0x72 uav lon_center 14 70 D6 E3 D8 A0 04 1142305238 114.2305238 deg
0x78 uav lat_center 15 78 C2 FC EB 6D 230358594 23.0358594 deg
0x7D uav lon_tl 16 80 01 9B E2 D8 A0 04 1142305051 114.2305051 deg
画面四角其余 6 个字段同构,字段号 17~22
0xAB uav lat_br 23 B8 01 88 F9 EB 6D 230358152 23.0358152 deg
0xB1 speed speed 10 52 0F 15 字节 子消息 SeiPayloadSpeed
0xB3 speed sei_type 1 08 03 3 速度
0xB5 speed length 2 10 06 6
0xB7 speed z_speed 5 28 FF FF FF FF FF FF FF FF FF 01 -1 -0.01 m/s
0xC2 detect_result detect_result 11 5A B0 05 688 字节 子消息 AIServiceDetectResult
0xC5 detect_result sei_type 1 08 04 4 检测跟踪
0xC7 detect_result length 2 10 A3 06 803
0xCA detect_result len_id 3 18 01 1 变焦
0xCC detect_result mode_id 4 20 01 1
0xCE detect_result frame_id 5 28 FF FF 03 65535
0xD2 detect_result resolution_width 6 30 80 0A 1280
0xD5 detect_result resolution_height 7 38 C0 07 960
0xD8 detect_result obj_num 8 40 18 24
0xDA detect_result.obj[0] detect_obj_infos 9 4A 1A 26 字节 子消息 DetectObjInfo
0xDC detect_result.obj[0] start_x 1 0D 5E 13 0B 3F 0.543264 float32
0xE1 detect_result.obj[0] start_y 2 15 9A 99 39 3F 0.725 float32
0xE6 detect_result.obj[0] width 3 1D 86 4E F8 3C 0.030311 float32
0xEB detect_result.obj[0] height 4 25 9A 99 19 3D 0.0375 float32
0xF0 detect_result.obj[0] type 5 28 03 3
0xF2 detect_result.obj[0] confidence 6 30 5A 90 0.9
0xF4 detect_result.obj[0] object_id 7 38 02 2
余 23 个目标结构相同,共 24 个
该帧共 24 个目标,首个目标框按 resolution_width = 1280、resolution_height = 960 换算,位于 (695, 696)、尺寸 39 × 36 像素。H.264 帧仅 NAL 头为单字节 06,其后结构一致。
目标跟踪
目标跟踪按 intelligent_lock_enter → select_tracking_target → start_track 的顺序下发,下发 start_track 时飞行器须已在空中。
选择目标支持两种方式:
| 方式 | 参数 |
|---|---|
| 点选 | width、height 传 0,start_x、start_y 为目标点坐标 |
| 框选 | width、height 大于 0,与起始点共同构成目标框 |
跟踪方式由 track_type 指定:
| track_type | 说明 |
|---|---|
| 1 | 简单跟踪,飞行器跟随目标移动 |
| 3 | 盘旋跟踪,飞行器绕目标盘旋 |
locked 决定机头与云台的相对关系:取 false 时仅云台转动、机身不动;取 true 时机头随云台一起转动。
退出分三级:target_tracking_close 退出目标锁定但继续检测目标,intelligent_lock_exit 退出智能跟踪,target_detect_close 关闭目标识别。
交互时序图
接口详细实现
- 开启目标识别
- 关闭目标识别
- 进入智能跟踪
- 退出智能跟踪
- 选择锁定目标的信息
- 退出目标锁定
- 开始跟踪
- 目标锁定自动变焦
- 区域搜索
- 选择违停目标
- AI布防设置
- 目标识别结果上报
- 证据采集状态上报
- 违停检测信息上报