AI_NR是一种利用深度学习技术在Bayer Raw域进行降噪的技术。相较于传统降噪算法,AI去噪能够更干净地去除噪声且噪声形态更细腻,在暗环境或极高增益下能提供更高的信噪比,从而满足看清图像的需求。
AI_NR工具的逻辑架构基于"大模型蒸馏+小模型微调"的思路。首先通过标定得到的FPN(固定模式噪声)和噪声参数,结合通用降噪大模型,对采集的Noisy Raw数据进行处理,生成Noisy-Clean Raw数据对;随后利用这些数据训练小模型,最后将小模型进行量化部署到端侧。
工具的完整使用流程包含六个阶段:
ai_nr所需的环境。在开始训练前,必须准备以下数据:
again打满,ispdgain=1,sensor dgian=1。须知曝光时间越短,FPN暴露的坏点越少,Label学习去坏点能力越弱。更换Sensor需同步更换FPN数据。***.raw、***.txt、awb.txt、ccm.txt。工具通过修改config.yml文件来控制各阶段的运行。
通过大模型生成当前蒸馏数据的Noise-Clean Raw数据对。
state: "preprocess", substate: "preprocess_sm"。data字段填写bit, max_dgain, max_iso, bayer_pattern及sensor_id。fpn_dir(FPN路径)、data_dir(蒸馏数据路径)、dump_pre_root(输出路径)及teacher模型路径。dump_pre_root下查看生成的input-label可视化结果,确认预处理是否正常。对浮点小模型进行两阶段训练。
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。直观验证浮点模型效果。
state: "float", substate: "float_inference"。float_finetune训练出的PSNR值较高的pth模型。select_iso选择特定ISO推理。将浮点模型转化为量化模型,分两阶段进行。
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列表。验证量化模型效果,要求与浮点模型输出无肉眼可见差距,不能出现明显解析力差异或颜色差异。
state: "quant", substate: "quant_inference"。quant_finetune_stage2的pth模型。导出可供TVM编译的ONNX模型及部署文件。
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)}}one_step_deploy:设为True可一次性跑完三个阶段。_tvm.encrypted模型、权重txt及对应的bin文件。须知
若部署报错"The model has overflow!!!!",需定位是Quant1还是Quant2阶段溢出,使用未溢出阶段的模型进行Deploy测试。
| 参数名称 | 取值范围 | 描述 |
|---|---|---|
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。 |
| 参数名称 | 描述 | 取值范围 |
|---|---|---|
net_name |
选择模型对应的分辨率,根据Sensor分辨率就近选择 | "2M_3g", "2M_5g", "4M_8g", "4M_12g", "8M_19g" |
best_float_model |
预训练浮点模型地址/量化时的浮点模型地址 | 用户自定义路径 |
best_quant_model |
预训练量化模型地址/量化二阶段初始模型 | 用户自定义路径 |
| 参数名称 | 描述 | 取值范围 |
|---|---|---|
stage |
浮点或量化模型训练的阶段 | 1 / 2 |
learning_rate |
训练学习率 | 0.000001 ~ 0.01 |
batch_size |
训练batch size | 1 ~ 16 |
| 参数名称 | 描述 | 取值范围 |
|---|---|---|
one_step_deploy |
量化模型部署开关 | True / False |
deploy_version |
部署的版本 | "7206", "7606" |
layer_bit |
量化bit位宽 | 10 / 12 |
噪声标定准确与否直接影响通路效果,标定注意事项:
完成基础传统通路调试后,加载AI模型进行finetune:
ainrposswitch & coringposswitch 均选择 post。switchthlow & switchthhigh,建议 thdhigh > thdlow >= againmax下的ISO。| 问题现象 | 可能原因及排查方法 |
|---|---|
| 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强度调节。 |
| 偏色 | 检查训练数据对是否偏色;若正常,检查测试场景与训练场景差异,差异大则补充测试场景数据。 |
- 步骤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