sample_smart_ae 快速入门
1. 概述与作用
sample_smart_ae 是 Hi3516CV610 MPP 套件中用于演示 Smart AE(智能自动曝光)端到端能力的样例程序。它在 VI(Video Input)→ VPSS(Video Process Sub-System)→ VENC(Video ENCoder,输出 H.265)常规视频链路之上,并联一条 AI 检测(aidetect)通路:从 VPSS 通道 1 取出小尺寸 NV21 帧(默认 1024×576)送入 hi_mpi_aidetect_process 进行人脸/人形检测,将检测得到的 ROI(Region of Interest)通过 hi_mpi_smartae_update_roi_info 反馈给 ISP(Image Signal Processor)的 Smart AE 模块;同时通过 hi_mpi_isp_set_smart_exposure_attr 配置 Smart Exposure 参数,让 ISP 在后续帧针对人脸/人形 ROI 区域做局部测光与曝光加权,实现"画面中有人脸或人形时优先保证该区域亮度合适"的智能曝光效果。样例同时使用 RGN(OSD Region)模块的 HI_RGN_CORNER_RECT 在 VPSS 通道 0 上以红色角框标出检测到的人脸/人形位置,便于目视验证检测结果。
与传统的全画面平均测光 AE 相比,Smart AE 的核心价值在于:当画面中出现人脸或人形时,即使背景过亮或过暗,也能让人脸/人形区域维持在合适的曝光区间,避免逆光人脸发黑或强光人脸过曝。这在门铃、门禁、IPC(IP Camera)等以人为关注主体的场景中非常关键。样例通过命令行参数 class_type 选择检测类别:0=仅检测人脸、1=仅检测人形、2=同时检测人脸和人形。
VPSS 通道 1 专用于喂给 aidetect 模型,分辨率被强制设为 1024×576(与模型输入尺寸一致),并设置 low-delay line=200 与 depth=2 以稳定取帧。需要注意的是,Smart AE 依赖 AIComponent 包中的 aidetect 模型与库,编译时需先按 readme_cn.txt 步骤安装 AIComponent 并在 Makefile 中开启 AIDETECT_SUPPORT 宏与 libhi_mpi_aidetect 链接(默认 Makefile 中相关行被注释),否则样例的检测与 Smart AE 反馈均不生效。
2. 执行准备
在编译本样例之前,请参照Hi3516CV610环境搭建指南和快速上手指南完成编译环境的搭建。
2.1 编译
进入样例目录执行 make 即可完成编译:
编译成功之后,在当前目录下会生成一个sample_smart_ae的可执行文件,可以放社区支持的开发板上运行。
Makefile 会编译当前目录下所有 *.c 源文件,TARGET 为 sample_smart_ae。默认 sensor 为 HY006_3814_0011_MIPI_4M_30FPS_10BIT
关键前置:开启 AI 检测支持。 默认 Makefile的 AIDETECT_SUPPORT 宏与 libhi_mpi_aidetect 链接行被注释掉,此时样例会编译为"空壳"版本(检测函数指针全为 NULL,Smart AE 不会收到任何 ROI)。要启用完整 Smart AE 功能,需手动取消注释。
完整编译流程(参考 readme_cn.txt)如下:
- 安装 AIComponent:将
Hi3516CV610_AIComponent_REF_Vx.x.x.x.tgz、Hi3516CV610_AIComponent_SDK_Vx.x.x.x.tgz和Hi3516CV610_AIComponent_patch.sh拷贝到 SDK 安装路径同级目录,按需执行./Hi3516CV610_AIComponent_patch.sh ss(基础 SDK)或hi(已装 REF 补丁时安装 REF 软件包)。 - 在
Makefile中打开AIDETECT_SUPPORT宏与 aidetect 库链接(见上文)。 - 在样例目录执行
make,编译产物sample_smart_ae是一个 ARM Linux 可执行文件。
2.2 加载 KO 与依赖环境
ko加载脚本位于 output/mpp/ko/load_ko,有两个脚本:load3516cv610_20s和load3516cv610_20s_debug。区别为load3516cv610_20s_debug脚本会打开 logmpp_show=1(日志记录)、proc_show=1(proc信息打印),并将 mem_process_isolation 置为 0(不启用进程间mmz隔离)。
由于当前版本不支持进程间mmz隔离,因此需要在load3516cv610_20s脚本中将 mem_process_isolation 置为 0或者使用load3516cv610_20s_debug脚本,此处以load3516cv610_20s_debug脚本为例,20s内存大小为128MB,默认分配为 32MB OS、96MB MMZ,加载命令如下:
建议默认使用32MB OS,96MB MMZ,smart ae需要加载模型,如果调大OS可能导致启动时MMZ空间不够。
可以通过-h命令查看具体用法:
./load3516cv610_20s_debug -h
Usage: ./load3516cv610_20s_debug [-option] [-sensor0~1]
options:
-i insert modules
-r remove modules
-a remove modules first, then insert modules
-sensor0~1 sensor_name config sensor type [default: hy006_3814_0011]
-mmz_start config MMZ start addr [default: 0x42000000]
-mmz_size config MMZ mem size [unit: M, default: 96M]
-ir_auto config ir_auto enable [default: 0]
-profile config sys_profile [default: 0]
-h help information
Available sensors:hy006_3814_0011 bt1120/bt656/bt601
for example: ./load3516cv610_20s_debug -i -sensor0 hy006_3814_0011 -sensor1 hy006_3814_0011 -mmz_start 0x42000000 -mmz_size 96M -ir_auto 1
加载后可以通过lsmod查看ko加载情况:

如果需要调整os和mmz的大小,需要参考《内存布局调整指南》对内存大小进行调整。
如果是使用社区默认提供的镜像,这些ko已经打包到文件系统中,烧录到单板上后位于
/ko目录下,在系统启动后会自动加载这些ko。
2.3 运行时依赖文件
在运行样例前,需要提前准备:
- 指定运行时依赖的so库路径
MPP样例依赖的so库位于soc/libs/musl下,需要将该目录下的so库拷贝到开发板上(或将这些so库所在的目录挂载到开发板上),并指定运行时依赖库的环境变量,假设这些so库位于/mnt/libs/,执行如下命令:
```shell
export LD_LIBRARY_PATH=/mnt/libs/:$LD_LIBRARY_PATH
```
安装 AIComponent会将AI检测相关的so拷贝到so库的目录中,如果运行样例时报ai_detect相关so找不到,可能是AIComponent未安装成功。
如果是使用社区默认提供的镜像,这些so库已经打包到文件系统中,烧录到单板上后位于
/usr/lib目录下,该目录是系统默认搜索目录,不需要执行export LD_LIBRARY_PATH命令去指定。
- 启动MPP服务
当前MPP媒体模块处于用户态,通过一个独立进程提供相关接口的调用服务,该进程位于samples/mpp/sdk_server下,执行如下命令即可生成sdk_server可执行文件:
```shell
cd samples/mpp/sdk_server && make
```
在单板上执行./sdk_server &即可启动MPP服务,并在后台运行。
- sdk_server同样依赖
soc/libs/musl下的so库,因此也需要参照上述export LD_LIBRARY_PATH指定路径;- 如果是使用社区默认提供的镜像,sdk_server进程已经打包到文件系统中,烧录到单板上后位于
/usr/bin目录下,并在系统启动时会自动启动sdk_server。
- 模型文件
样例默认从
./model/normal/det_hvf_normal.bin加载 aidetect 模型。按readme_cn.txt,需将 AIComponent 包Hi3516CV610_AIComponent_SDK_Vx.x.x.x_B00x.tgz解压后model/目录下的det_hvf_hor.bin拷贝到样例同目录下的./model/normal/,并重命名为det_hvf_normal.bin。若该文件缺失,样例在模型初始化阶段直接退出。
2.4 运行 sample_smart_ae
调用语法为 ./sample_smart_ae <class_type>,class_type 为单数字 0–2。运行 ./sample_smart_ae -h 或不带参数时会打印 usage:
usage : ./sample_smart_ae <index>
index:
(0) only detect face.
(1) only detect people.
(2) detect face and people.
3. 支持的 Case 列表
样例只有一个主流程(VI→VPSS 双通道→VENC + aidetect),通过 g_type 在三类检测目标之间切换,因此 case 划分按检测类别而非路由模式。三个 case 的差别体现在:sample_smart_ae_config_aidetect_param 中下发给 aidetect 通道的 detect_threshold[](class_type 与阈值);完整 3 个 case 如下:
3.1 case 0 only detect face
调用命令
输出文件
本case会输出 stream_chn0.h265 与 stream_chn1.h265两个码流文件。可通过 ls -l ./stream_chn0.h265 确认大小持续增长。码流中应能看到画面,并且当画面中有人脸/人形时,对应位置出现红色角框。
控制台日志
启动成功时控制台会打印:
g_input_frame_width:768 g_input_frame_height:448
[sample_smart_ae_proc_model_info]-279: input image w:768,h:448, class num: 3
class type:face,det threshold:0.510000, track miss num:30,model priority:[1,3,0,0]
class type:human,det threshold:0.560000, track miss num:30,model priority:[1,3,0,0]
class type:vehicle,det threshold:0.690000, track miss num:30,model priority:[1,3,0,0]
正确性判断
在画面中放入人脸目标,观察 stream_chn0.h265:
- 红色角框应跟随目标出现,只能检测出人脸。
- 保持场景光照不变,当目标进入画面时,会根据人脸区域亮度,将整体画面调亮或调暗。
注意:
- 当人脸模型不可用,只有人形模型可用时,红外模式下计算的曝光系数不会高于1倍。
- Smart AE是调节全局亮度,不能很好地处理亮度不均匀问题。例如人脸接收的光照不均匀一半亮一半暗的时候,AE只能保证整体人脸的亮度合适,但是可能存在暗区太暗亮区过曝的问题。
软件配置流程
- 注册SIGINT/SIGTERM信号处理,初始化IPC服务端;
- 获取VB池配置(raw/yuv/vpss chn1三路),初始化系统并配置VB补充掩码,设置VI/VPSS为HI_VI_OFFLINE_VPSS_OFFLINE模式;
- 解析命令行参数选择检测类型(0-人脸/1-人形/2-人脸+人形),读取AI检测模型文件,创建AI检测通道;
- 获取通道属性,获取模型信息(输入尺寸、类别数),视频输入模式下配置跟踪属性;
-
获取VI默认配置,获取VPSS默认配置,启动VI,启动VPSS; 启动VENC编码通道(H265/30fps/CBR),绑定VI→VPSS,绑定VPSS→VENC,开始获取码流;
-
设置AI检测参数(检测类别、置信度阈值、跟踪丢失帧数),设置通道跟踪和运动检测属性;
- 获取智能曝光属性,配置使能、目标亮度、曝光系数范围、间隔、速度、延迟帧数等参数后,启动智能曝光;
- 创建角矩形区域用于绘制检测框,创建检测线程循环执行:从VPSS通道1取帧,执行AI检测,将检测结果(人脸/人形坐标)更新给SmartAE,在画面上绘制检测框,释放帧;
- 销毁AI检测通道,销毁区域,释放通路资源,去初始化IPC服务端。
注意:本文后续章节无特殊说明起通路流程与此次保持一致,不再重复描写。
3.2 case 1 only detect people
- case 1
only detect people— 仅检测人形(人体)。画面中只对人形画红色角框,Smart AE 仅对 human ROI 做曝光加权。适合周界防范、人形检测 IPC 等只关注人体亮度的场景。
调用命令
输出文件
- 与case 0相同
控制台日志
- 与case 0相同
正确性判断
在画面中放入人脸或人形目标,观察 stream_chn0.h265:
- 红色角框应跟随目标出现,只能检测出人形。
- 保持场景光照不变,当目标进入画面时,会根据人形区域亮度,将整体画面调亮或调暗。
3.3 case 2 detect face and people
- case 2
detect face and people— 同时检测人脸与人形。 画面中人脸与人形分别画红色角框,Smart AE 对 face 与 human 两类 ROI 同时做曝光加权。这是最常用的 case,覆盖门铃/IPC 等既关注人脸又关注人体的复合场景。
调用命令
输出文件
- 与case 0相同
控制台日志
- 与case 0相同
正确性判断
在画面中放入人脸或人形目标,观察 stream_chn0.h265:
- 红色角框应跟随目标出现,同时框人脸和人形。
- 保持场景光照不变,当目标进入画面时,会根据人脸/人形区域亮度,将整体画面调亮或调暗。