跳转至

AIISP 快速入门

1. 概述与作用

本样例演示 Hi3516CV610 上 AIISP(AI Image Signal Processing)子系统的 AIBNR 算法调用流程,隶属于 AI 图像处理域,解决低照度、高 ISO 场景下 RAW 域噪声难以用传统滤波消除的问题,通过 AI 模型对时域参考帧与当前帧联合降噪,输出 H.265 码流。

专业名词与缩写:

  • AIISP — AI Image Signal Processing,海思基于 AI 算法增强画质的 ISP 子系统
  • AIBNR — AI Bayesian Noise Reduction,AI 贝叶斯降噪,对 RAW 域噪声做 AI 模型降噪
  • NLC — Non-Linear Correction,非线性校正
  • SFS — Spatial Filter Strength,空间滤波强度,默认 31
  • WDR — Wide Dynamic Range,宽动态,本样例默认关闭
  • Pro mode — 高 ISO 模式,使用 pro 模型,FPS 降到 5
  • Ref mode — 参考帧模式,时域降噪
  • Line mode — 行模式,12 fps

说明:

本文默认sensor为HY006-3814-0011,如需适配新sensor,请参考《Sensor 调试指南》和《Sensor适配说明》

2. 执行准备

在编译本样例之前,请参照Hi3516CV610环境搭建指南和快速上手指南完成编译环境的搭建。

2.1 编译

进入样例目录执行 make 即可完成编译:

cd samples/mpp/aiisp && make

编译成功之后,在当前目录下会生成一个sample_aiisp的可执行文件,可以放社区支持的开发板上运行。

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,加载命令为:

./load3516cv610_20s_debug -i

可以通过-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

如果需要调整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
```

如果是使用社区默认提供的镜像,这些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服务。

  1. sdk_server同样依赖soc/libs/musl下的so库,因此也需要参照上述export LD_LIBRARY_PATH指定路径;
  2. 如果是使用社区默认提供的镜像,sdk_server进程已经打包到文件系统中,烧录到单板上后位于/usr/bin目录下,并在系统启动时会自动启动sdk_server。
  • 样例运行时候需要的资源文件

运行时所需要的模型文件位于output/mpp/model/aiisp/aibnr目录下,模型文件按照如下规则命名:

output/mpp/model/aiisp/aibnr/aibnr_model_<W>x<H>.bin

output/mpp/model/aiisp/aibnr/aibnr_model_<W>x<H>_high_iso.bin

output/mpp/model/aiisp/aibnr/aibnr_model_<W>x<H>_pro.bin

注意:需要将模型文件放置到与sample_aiisp样例可执行文件一个目录下。本样例默认使用的Sensor对应W=2560、H=1440,如果模型文件找不到,样例运行时会报错(如 realpath file failed),程序异常退出。

2.4 运行样例

调用语法为 ./sample_aiisp <case_id>,case_id 取值为 0–1。可以执行./sample_aiisp -h查看用法。

image-20260807183353065

3. 支持的 Case 列表

调用语法:./sample_aiisp <case_id>

序号 调用示例 简述 备注
0 ./sample_aiisp 0 普通模式,加载xxx.bin和xxx_high_iso.bin,FPS 12 默认 case
1 ./sample_aiisp 1 pro模式,加载xxx_pro.bin,FPS 5 高 ISO 场景

3.1 代码流程

  1. 启动数据流通路,从前往后分别启动各媒体模块(VI、VPSS、VENC......)。

  2. 初始化aibnr模块,详细使用参考接口ss_mpi_aibnr_init。

  3. 加载aibnr的模型文件,详细使用参考接口ss_mpi_aibnr_load_model。

  4. 设置aibnr的算法相关配置参数,详细使用请参考接口ss_mpi_aibnr_set_cfg。

  5. 使能aibnr的数据流开关,详细使用请参考接口ss_mpi_aibnr_enable。

  6. 设置aibnr的属性,详细使用请参考接口ss_mpi_aibnr_set_attr。

  7. 停止业务时,需要先关闭aibnr数据流开关,再卸载aibnr的模型文件,最后去初始化aibnr模块,详细使用请参考接口ss_mpi_aibnr_disable、ss_mpi_aibnr_unload_model、ss_mpi_aibnr_exit。

说明

  1. 本章节涉及的相关接口均参考《AIISP开发参考》“AIBNR API参考”章节。

  2. 需要配置profile=0或者profile=2,配置方法为

该功能由sdk_server服务进程提供,默认情况下profile=0,因此需要打开它重新编译sdk_server,具体方法如下

1)修改文件samples/mpp/common/sdk_init函数sys_init,修改后如下:

static td_s32 sys_init(td_void)
{
    td_u32 sys_profile = 0; /* 或者 2 */
    return ot_sys_mod_init(sys_profile);
}

2)进入samples/mpp/sdk_server执行make clean;make重编sdk_server

3)将新的sdk_server替换掉单板当前运行的sdk_server后,重新启动sdk_server

  1. 线性普通模型推荐用于12帧场景,线性时域pro模型推荐用于5帧场景。

具体操作流程如下图所示。

代码操作流程图

3.2 case 0 - AIBNR线性普通模式

线性普通模式下,通过高ISO模型和低ISO模型的切换,实现不同照度下的图像清晰度提升。

调用命令

./sample_aiisp 0

第一次按回车键使能AIBNR

第二次按回车键选择模型0

第三次按回车键选择模型1

第四次按回车键选择auto模式

第五次按回车键去使能AIBNR

第六次按回车键退出用例

执行结果验证

1.sample同级目录下会生成码流文件stream_chn0.h265;

2.控制台串口无报错打印,输出:

program exit normally!

软件配置流程

可参考代码流程章节,其中加载的aibnr模型包含高ISO和低ISO两种模型,既可以手动指定使用高ISO模型或低ISO模型,又可以根据配置的ISO段自动选择模型,参考接口ss_mpi_aibnr_set_model_attr。

数据流

数据流图

3.3 case 1 - AIBNR线性时域模式

时域模型细节表现更好,可以优化普通模型细节粗的问题。

调用命令

./sample_aiisp 1

第一次按回车键使能AIBNR

第二次按回车键去使能AIBNR

第三次按回车键退出用例

执行结果验证

1.sample同级目录下会生成码流文件stream_chn0.h265;

2.控制台串口无报错打印,输出:

program exit normally!

软件配置流程

可参考代码流程章节,其中加载的aibnr模型是pro时域模型。

数据流

数据流图