如何使用自己的模型
本文说明如何把自有模型接入 FBB ModelZoo,复用现有 application/<scene>/run.sh 完成数据准备、模型转换和板端工程打包。
本文档专注接入自有模型流程:目录约定、
metadata.yaml字段、最小配置改动、检查项。具体场景的 CLI、配置字段完整含义、外部路径请到对应场景 README(如图像分类:application/image_classification/README.md)。
适用范围
当前仓库以图像分类场景为参考实现,已验证的模型格式包括 ONNX、TFLite float32、TFLite int8。新增模型时优先复用已有场景和数据集;只有输入输出语义或板端业务流程不同(例如检测、分割),才需要新增 application/<new_scene> 目录。
公共应用模板的复用范围是单输入、单输出、无状态模型。更换模型时可以调整输入 shape、dtype、布局和量化参数。若存在输入或输出张量数量变化、状态张量循环、特殊后处理或批处理,都需要在场景目录中提供对应的处理代码,不能只修改 metadata.yaml。
如果连续推理需要把上一帧的结果传给下一帧,请在模型文件条目中设置
streaming_state: true。这个字段表示“流式推理需要保存跨帧状态”;普通模型不要设置它。
编译阶段会在 output/.../generated/*/src/app_model_contract.json 留下一份由
metadata.yaml 生成的 I/O 契约快照,便于确认当前模型是否仍可直接复用默认模板;该文件属于生成产物,不需要手工维护或提交。
其中 input_count / output_count 只用于核对模型边界;即使契约记录了多个 inputs / outputs,默认模板也不会自动填充或后处理这些张量,仍需由场景 adapter 显式实现。
目录放置
把自有模型放在独立模型目录下:
models/<scene>/<model_name>/
├── README.md
├── configs/
│ └── config.<CHIP_VERSION>.<PLATFORM>.<TOOLCHAIN>[.<variant>].cfg
└── models/
├── metadata.yaml
└── <model-file>
约束:
models/只放模型资产和metadata.yaml;configs/只放部署配置。- 文件命名中的
variant区分同一芯片 + 工具链下的量化或精度部署路径(例如micro_quant、none、pre_quant、float32、int8)。 - 没有强制要求每个
CHIP_VERSION×TOOLCHAIN组合都提供预设——按你要发布的部署路径提供即可。 - 添加完模型后,需在
models/README.md的"已收录模型"表中登记一行,以保持索引完整。
metadata.yaml 字段
每个可部署模型文件都需要在 files 下登记输入输出语义和格式:
name: my_model
task: image_classification
application:
scenario: my_classification_case
dataset:
name: my_dataset
input_domain: image
output_domain: classification
classes: [0, 1]
files:
model.onnx:
format: onnx
precision: float32
role: deployable_model
input:
name: input
shape: [1, 1, 28, 28]
dtype: float32
layout: NCHW # NCHW / NHWC,必须与模型真实输入一致
output:
name: output
shape: [1, 10]
dtype: float32
classes: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 只有跨帧保留上一帧状态的流式模型才需要:
# streaming_state: true
TFLite Micro 模型
需要额外提供运行期信息:
model-int8.tflite:
format: tflite
precision: int8
tflite_micro:
arena_size: 51200 # 张量内存池字节数(TFLite Micro 在芯片上为中间张量预留的
# 连续内存区)。不确定时可先估算,运行时若日志报
# AllocateTensors() failed / arena size too small,按报错值上调。
operator_count: 7 # 模型包含的算子层数;用 netron 打开模型计数,或:
# python -c "import tensorflow as tf; itp=tf.lite.Interpreter('model.tflite'); itp.allocate_tensors(); print(len(itp._get_ops_details()))"
input:
name: serving_default_input:0
shape: [1, 28, 28, 1]
dtype: int8
layout: NHWC
output:
name: StatefulPartitionedCall:0
shape: [1, 10]
dtype: int8
已量化(int8)模型
无论是 tflite-micro int8 还是 mindspore-lite QUANT_MODE=pre_quant,板端示例都通过 metadata 注入量化参数,不能硬编码。pre_quant 部署路径的完整可工作预设见 models/image_classification/mnist-12/configs/config.WS63.RISCV.mindspore-lite.pre_quant.cfg。
quantization:
input:
dtype: int8
scale: 0.003921568859368563
zero_point: -128
output:
dtype: int8
scale: 0.21915793418884277
zero_point: -12
最小配置改动
从已有模型的 configs/ 复制一份预设作为起点:
mkdir -p models/<scene>/my_model/configs
cp models/image_classification/mnist-12/configs/config.WS63.RISCV.mindspore-lite.micro_quant.cfg \
models/<scene>/my_model/configs/config.WS63.RISCV.mindspore-lite.micro_quant.cfg
至少需要修改:
| 字段 | 改成什么 |
|---|---|
MODEL_NAME |
模型目录名,例如 my_model(决定 output/<MODEL_NAME>/) |
MODEL_DIR |
models/<scene>/my_model/models |
MODEL_FILE |
本次部署选择的模型文件名 |
DATASET_DIR |
对应数据生成脚本目录 |
FIRMWARE_OUTPUT |
将路径中的 mnist-12 替换为新模型名 |
SDK_PATH / ADAPTOR_PATH / MSLITE_PATH / TFLM_PATH / COMPILER_PATH / ACL_HEADER_PATH |
按本机安装位置填写 |
MODEL_METADATA 默认 <MODEL_DIR>/metadata.yaml,一般无需显式设置。其它字段(PLATFORM、CHIP_VERSION、TOOLCHAIN、QUANT_MODE 等)跟随预设命名固定,含义与取值见对应场景 README 的"配置字段"小节。
运行
复制预设到场景目录后执行 run.sh,或运行时通过 --config 指定。具体命令见场景 README。
检查项
MODEL_FILE必须存在于MODEL_DIR,并在metadata.yaml的files下登记。input.layout和input.shape必须和模型真实输入一致;与板端示例代码的预处理保持同样的张量排布 / 精度。CANN与mindspore-lite量化部署路径需要校准数据,数据目录中应包含train_data/bin/*.bin(数据生成脚本默认会生成)。- TFLite Micro 模型必须填
tflite_micro.arena_size与operator_count,否则编译会失败或运行时报内存不足。 - 使用
mindspore-liteQUANT_MODE=pre_quant(外部已量化模型)时,必须填写quantization.input/quantization.output的dtype/scale/zero_point。编译脚本会向生成目录中的ai_main.c模板 注入这些参数,不得硬编码。 - 安装了
requirements.txt中的依赖时,run.sh会生成参考输出(output.npy+output.txt),便于和板端结果比对。