04 AI降噪 (AI_NR)
AI_NR是一种利用深度学习技术在Bayer Raw域进行降噪的技术。相较于传统降噪算法,AI去噪能够更干净地去除噪声且噪声形态更细腻,在暗环境或极高增益下能提供更高的信噪比,从而满足看清图像的需求。
1 概述与工作原理
AI_NR工具的逻辑架构基于"大模型蒸馏+小模型微调"的思路。首先通过标定得到的FPN(固定模式噪声)和噪声参数,结合通用降噪大模型,对采集的Noisy Raw数据进行处理,生成Noisy-Clean Raw数据对;随后利用这些数据训练小模型,最后将小模型进行量化部署到端侧。
工具的完整使用流程包含六个阶段:
- Preprocess:数据预处理,生成训练数据对。
- Float Finetune:浮点模型微调训练。
- Float Inference:浮点模型推理验证。
- Quant Finetune:量化模型微调训练。
- Quant Inference:量化模型推理验证。
- Quant Deploy:量化模型部署导出。
2 环境搭建与数据准备
2.1 环境搭建
- 硬件环境:需确认当前Sensor的基础信息,包括数据位宽、Bayer pattern、分辨率、最大Again对应的ISO值。
- 软件环境:安装miniconda并配置运行
ai_nr所需的环境。
2.2 数据准备
在开始训练前,必须准备以下数据:
噪声参数:确认需微调Sensor的噪声参数(共五个)及FPN(需包含黑电平信息)。
FPN数据:采集100~200帧黑帧。采集时镜头必须全黑,曝光时间与实际最暗场景一致,
again打满,ispdgain=1,sensor dgian=1。须知
曝光时间越短,FPN暴露的坏点越少,Label学习去坏点能力越弱。更换Sensor需同步更换FPN数据。
训练数据:采集真实场景的Raw序列及对应的Meta信息、AWB及CCM信息。数据存放格式为每组数据存放一个文件夹,以ISO值命名,内含
***.raw、***.txt、awb.txt、ccm.txt。
3 模型训练、量化与部署流程
工具通过修改config.yml文件来控制各阶段的运行。
阶段一:Preprocess (数据预处理)
通过大模型生成当前蒸馏数据的Noise-Clean Raw数据对。
- 配置YML:
state: "preprocess",substate: "preprocess_sm"。 - 填写参数:在
data字段填写bit,max_dgain,max_iso,bayer_pattern及sensor_id。 - 填写噪声参数:在YML末尾填写Sensor的高斯泊松标定参数(KA, KB, BA, BB, BC)。
- 填写路径:配置
fpn_dir(FPN路径)、data_dir(蒸馏数据路径)、dump_pre_root(输出路径)及teacher模型路径。 - 运行与检查:运行结束后,在
dump_pre_root下查看生成的input-label可视化结果,确认预处理是否正常。
阶段二:Float Finetune (浮点微调)
对浮点小模型进行两阶段训练。
配置YML:
state: "float",substate: "float_finetune"。训练设置:在
train字段设置stage(1或2)、learning_rate、batch_size等。模型配置:在
model字段选择net_name(根据Sensor分辨率就近选择,如3M选"4M",6M选"8M")。检查结果:训练后在
train_dump路径下生成input,label,predict图像,检查颜色亮度是否对应。建议
训练建议到60 epoch以上。若Loss为NaN,检查FPN bit/Sensor bit是否正确,或尝试调小学习率、调大batch_size。
阶段三:Float Inference (浮点推理)
直观验证浮点模型效果。
- 配置YML:
state: "float",substate: "float_inference"。 - 输入模型:使用
float_finetune训练出的PSNR值较高的pth模型。 - 推理数据:填写Benchmark路径,可通过
select_iso选择特定ISO推理。
阶段四:Quant Finetune (量化微调)
将浮点模型转化为量化模型,分两阶段进行。
配置YML:
state: "quant",substate: "quant_finetune"。一阶段:在
model字段填写best_float_model路径。运行后生成quant_finetune_stage1.pth。二阶段:将
best_quant_model指向Stage1生成的pth,继续训练生成quant_finetune_stage2.pth。建议
Quant训练建议10 epoch以上。若添加新数据,需生成新的
.h5文件并更新train_name列表。
阶段五:Quant Inference (量化推理)
验证量化模型效果,要求与浮点模型输出无肉眼可见差距,不能出现明显解析力差异或颜色差异。
- 配置YML:
state: "quant",substate: "quant_inference"。 - 输入模型:使用
quant_finetune_stage2的pth模型。
阶段六:Quant Deploy (量化部署)
导出可供TVM编译的ONNX模型及部署文件。
- 配置YML:
state: "quant",substate: "quant_deploy"。 - 关键参数:
padding_w:固定为32(7206_8M部署时为16)。padding_h:计算公式为 $\text{padding_h} = \frac{\left(\left|\frac{h}{(\text{row_num} * 32)}\right| + p_s_ h\right) \times 16 - \frac{h}{(\text{row_num} * 2)}}{2}$one_step_deploy:设为True可一次性跑完三个阶段。
- 输出:生成
_tvm.encrypted模型、权重txt及对应的bin文件。
须知
若部署报错"The model has overflow!!!!",需定位是Quant1还是Quant2阶段溢出,使用未溢出阶段的模型进行Deploy测试。
4 关键参数配置说明
4.1 基础状态控制
| 参数名称 | 取值范围 | 描述 |
|---|---|---|
state | "preprocess", "float", "quant" | 控制工具功能状态。preprocess表示数据处理;float表示浮点模型操作;quant表示量化模型操作。 |
substate | "float_finetune", "float_inference", "quant_finetune", "quant_inference", "quant_deploy", "preprocess_sm" | 具体子状态。配置float操作时state需设为float;配置quant操作时state需设为quant。 |
4.2 模型配置
| 参数名称 | 描述 | 取值范围 |
|---|---|---|
net_name | 选择模型对应的分辨率,根据Sensor分辨率就近选择 | "2M_3g", "2M_5g", "4M_8g", "4M_12g", "8M_19g" |
best_float_model | 预训练浮点模型地址/量化时的浮点模型地址 | 用户自定义路径 |
best_quant_model | 预训练量化模型地址/量化二阶段初始模型 | 用户自定义路径 |
4.3 训练配置
| 参数名称 | 描述 | 取值范围 |
|---|---|---|
stage | 浮点或量化模型训练的阶段 | 1 / 2 |
learning_rate | 训练学习率 | 0.000001 ~ 0.01 |
batch_size | 训练batch size | 1 ~ 16 |
4.4 部署配置
| 参数名称 | 描述 | 取值范围 |
|---|---|---|
one_step_deploy | 量化模型部署开关 | True / False |
deploy_version | 部署的版本 | "7206", "7606" |
layer_bit | 量化bit位宽 | 10 / 12 |
5 模型调优与问题排查
5.1 Sensor噪声模型标定
噪声标定准确与否直接影响通路效果,标定注意事项:
- 确认Sensor去坏点模式关闭(开启DPC可能影响噪声模型和清晰度)。
- 确认AE的SensorDgain为1倍(AI模式下默认不开启)。
- 标定后的K/B Curve需检验是否符合预期。
5.2 AI通路调试
完成基础传统通路调试后,加载AI模型进行finetune:
- 参数切换:BNR中
ainrposswitch&coringposswitch均选择post。 - 阈值设置:AINR开关使能,设置
switchthlow&switchthhigh,建议thdhigh > thdlow >= againmax下的ISO。
5.3 常见问题Q&A
| 问题现象 | 可能原因及排查方法 |
|---|---|
| Float Finetune Loss为NaN | 1. 检查train_dump小图有无异常; 2. 检查YML中FPN bit/Sensor bit是否正确; 3. 检查Input和Label内容、颜色亮度是否对应; 4. 尝试调小学习率,调大Batch Size(如24, 32)。 |
| 极高ISO图像出现渗透 | 通常为时域强度太强。建议先关闭YUVTNR,观察渗透是否与BayerTNR强相关;若相关,微调降低tnrmd阈值;若关闭YUVTNR后有改善,检查YUVTNR的tnrmd及Mdwinsize。 |
| 运动物体较模糊 | 1. 检查STNR中YNR强度是否太强; 2. 调整BNR中运动回叠噪声强度; 3. 调整AINR模块中的K/B增益值调试AI降噪强度。 |
| Quant Deploy报溢出 | 定位是Quant1还是Quant2阶段溢出。用Quant1结果去Deploy,若无溢出则是Quant2训练导致。 |
| 坏点、跳动、伪纹理 | 属于细节过强类问题,可通过开启smooth_on缓解;坏点可通过调节bpc强度调节。 |
| 偏色 | 检查训练数据对是否偏色;若正常,检查测试场景与训练场景差异,差异大则补充测试场景数据。 |
6 sample_ainr使用步骤
- 步骤1:编译
# 在SDK根目录中执行:
source build/env.sh
make clean
make build -j
make sample- 步骤2:将可执行文件与neuron_network.xmm模型文件拷贝到板端
neuron_network.xmm模型文件路径:/tools/linux/pq_board/arm-gcc12.2.0-linux-uclibceabi/configs/sc465sl/neuron_network.xmm
注意
注意模型文件和可执行文件在板端的存放路径需按一下规则存放: 可执行文件会按:../../tools/linux/pq_board/arm-gcc12.2.0-linux-uclibceabi/configs/sc465sl/neuron_network.xmm去访问模型文件
具体可在sample_comm_isp.c(56-80)中修改下列三行

- 运行sample_ainr
参数说明
Usage: ./sample_ainr [scene_mode]
scene_mode:
0: 单路线性ainr 15fps
1: 双路线性ainr 7fps (switch)
2: 双路线性ainr 7fps
3: 双路线性ainr 7fps (外置switch)stream_mode: VENC output
e.g: ./sample_vio 0
