NN Archive
概述
.tar.xz 存档中。 配置文件编码了模型的架构、预处理和后处理以及其他相关信息,这些信息对于在我们生态系统中无缝实现模型至关重要。 例如,这简化了使用 ModelConverter 工具进行模型转换时的转换参数的指定,或者通过 Hub 中的详细转换 进行指定, 或者在 DepthAI 管道中部署模型时处理预处理和后处理。NN Archive 始终描述其中存储的模型可执行文件。如果存档包含
ONNX 模型,则 config.json 中的值应与该 ONNX 模型匹配。如果存档包含已编译的 RVC 模型,则 config.json 中的值应描述该已编译模型。模型可执行文件
- ONNX (
.onnx), - OpenVINO IR (
.xml和.bin),或 - TensorFlow Lite (
.tflite)。
- 二进制大对象 (
.blob或.superblob),适用于 RVC2 和 RVC3 平台,或 - 深度学习容器 (
.dlc),适用于 RVC4 平台。
配置
config.json 文件编码了配置方案版本以及一个表示模型的字典,其中包含输入、输出、头和元数据部分。获取值的来源
ONNX NN Archive 时,最常见的真实来源是:- 原始训练或推理代码,用于预处理和输出语义,
- Netron,用于张量名称、形状和布局,
- 以及
onnxruntime,用于输入和输出名称、形状和数据类型。
输入
- name (str) - 输入层的名称。从存档中存储的模型复制。
- dtype (str) - 输入张量数据类型(例如
float32或uint8)。 这应与模 型输入张量预期的数据类型匹配。 - input_type (str) - 输入数据类型('raw' 或 'image')。
- shape (list of ints) - 输入数据的形状,表示为整数列表(例如
[H,W]、[H,W,C]、[N,H,W,C]等)。 这应与模型输入张量形状完全匹配。 - layout (str) - 输入数据维度的字母代码解释(例如
NCHW)。 这应与模型张量形状使用的顺序匹配。 - preprocessing (dict) - 应用于输入数据的预处理。
- mean (list of floats) - 通道顺序的均值。顺序取决于模型训练时使用的顺序。
- scale (list of floats) - 通道顺序的标准化值。顺序取决于模型训练时使用的顺序。
- reverse_channels (bool) - 如果为 True,则输入到模型的是 RGB,否则为 BGR。已弃用,将在未来版本中被
dai_type标志替换。 - interleaved_to_planar (bool): 如果为 True,则输入到模型的是交错格式 (NHWC),否则为平面格式 (NCHW)。已弃用,将在未来版本中被
dai_type标志替换。 - dai_type (str): DepthAI 输入类型,由 DepthAI 读取以自动设置管道。
mean 和 scale 应描述 NN Archive 中存储的模型所需的预处理。如果原始预处理是 input = (input / 255.0 - mean) / std,则将 255 * mean 存储为 mean,将 255 * std 存储为 scale。在更改 RGB 和 BGR 之间时,不要交换均值和标度值;只需重新排序通道以匹配模型预期的编码。输出
- name (str) - 输出层的名称。
- dtype (str) - 输出数据的数据类型(例如
float32)。 - shape (list of ints) - 输出张量的形状。
- layout (str) - 输出张量维度的字母代码解释(例如
NC或NCHW)。
头
- parser (str) - 负责后处理模型输出的 depthai-nodes 解析器的名称。
- outputs (list of str) - 要馈送到解析器的输出名称列表。如果为 None,则所有输出都将被馈送。
- metadata (dict): 头特定的元数据。有关更多信息,请参阅 源代码。
heads 部分是可选的。如果未定义,我们假定为原始输出(无需后处理)。 当模型输出需要语义解释时,例如分类的类名或检测/分割的解析器特定元数据,请使用 heads。元数据
Metadata 字典。它包含以下字段:- name (str) - 模型的名称。
- path (str) - 模型可执行文件的路径(例如
'model.onnx')。 路径相对于存档根目录。 对于 OpenVINO IR 模型,此处仅提供.xml文件的路径,并确保.bin文件位于同一路径下。 - precision (str) - 模型权重的精度(例如
float32或float16)。 这是模型文件本身的存储精度,而不是单个输入或输出张量的数据类型。
生成
- 准备一个模型可执行文件,方法是将其从头开始训练或从现有来源获取(注意模型格式)。
- 准备一个
config.json。 对于一个简单的单输入/输出源ONNX模型,没有任何预处理(均值=0,缩放=1,反转通道=False)或后处理要求的示例配置:
JSON
1{
2 "config_version": null,
3 "model": {
4 "metadata": {
5 "name": "ModelName",
6 "path": "model_name.onnx",
7 "precision": "float32"
8 },
9 "inputs": [
10 {
11 "name": "input_layer_name",
12 "dtype": "float32",
13 "input_type": "image",
14 "shape": [
15 1,
16 3,
17 256,
18 256
19 ],
20 "layout": "NCHW",
21 "preprocessing": {
22 "mean": [
23 0.0,
24 0.0,
25 0.0
26 ],
27 "scale": [
28 1.0,
29 1.0,
30 1.0
31 ],
32 "reverse_channels": false,
33 "interleaved_to_planar": null
34 }
35 }
36 ],
37 "outputs": [
38 {
39 "name": "output",
40 "dtype": "float32",
41 "shape": [
42 1,
43 3
44 ],
45 "layout": "NC"
46 }
47 ],
48 "heads": []
49 }
50}JSON
1{
2 ...
3 "model": {
4 ...
5 "heads": [
6 {
7 "parser": "ClassificationParser",
8 "metadata": {
9 "postprocessor_path": null,
10 "classes": [
11 "Class1",
12 "Class2",
13 "Class3"
14 ],
15 "n_classes": 3,
16 "is_softmax": true
17 },
18 "outputs": [
19 "output"
20 ]
21 }
22 ]
23 }
24}- 安装 luxonis-ml 并运行 Archive Generator:
Python
1from luxonis_ml.nn_archive.archive_generator import ArchiveGenerator
2from luxonis_ml.nn_archive.config import CONFIG_VERSION
3import json
4
5cfg_path = ... # 配置数据 JSON 的字符串路径。
6with open(cfg_path, "r") as file:
7 cfg_dict = json.load(file)
8cfg_dict["config_version"] = CONFIG_VERSION # 从 luxonis-ml 设置配置版本
9
10generator = ArchiveGenerator(
11 archive_name=..., # 生成的存档的字符串名称。
12 save_path=..., # 要保存存档文件的字符串路径。
13 cfg_dict=cfg_dict,
14 executables_paths=... # 相关模型可执行文件的字符串路径列表。
15 )
16
17generator.make_archive() # 存档文件将保存到指定的 save_path多阶段模型
Heads.Metadata 部分设置 postprocessor_path 参数来简单定义。 它应指向第二阶段模型的可执行文件(路径必须相对于存档根目录)。 可以使用 ArchiveGenerator 构建 NN Archive。确保在 executables_paths 参数中提供了第一阶段和第二阶段模型可执行文件的路径。请注意,配置文件仅与第一阶段模型相关,无法为第二阶段模型定义任何信息。如有必要,我们建议构建两个独立的 NN Archive。