ncnn param文件格式

发布时间 2023-03-28 22:32:03作者: 半夜打老虎

一、ncnn模型

可由ncnn库中的onnx2ncnn工具将onnx格式模型转换为ncnn格式的.param和.bin两个文件,其中param记录了各算子,param文件可直接由可视化工具Nerton打开查看,这里记录下param文件格式。ncnn模型的加载参考:ncnn加载模型的几种方式

二、param文件格式

1. magic number

文件第一行为:7767517,这个数据可以看作ncnn的一个版本号

2. [layer count] [blob count]

第二行包含网络的层数(layer count)以及 数据转换的次数(blob count),其中blob count通常大于layer count

3. layer line

后面的每一行表示每一层的信息,其格式如下:

[layer type] [layer name] [input count] [output count] [input blobs] [output blobs] [layer specific params]

其中

  • layer type
    当前层的类型名,比如Convolution,Softmax等
  • layer name
    当前层的名称, 该名称在所有层中必须唯一
  • input count
    当前层输入数据blob的个数
  • output count
    当前层输出数据blob的个数
  • input blobs
    输入层的名称,以空格隔开,个数和input count相同,所有名称都必须唯一
  • output blobs
    输出层的名称,以空格隔开,个数和output count相同,所有名称必须唯一
  • layer specific params
    每一层的特殊参数,以key=value或者key=list形式出现,以空格隔开, layer params可以参考operation-param-weight-table

三、例子

如下图为ResNet18前几层的param文件内容

7767517
78 86
Input            input                    0 1 input
Convolution      Conv_0                   1 1 input 123 0=64 1=7 11=7 2=1 12=1 3=2 13=2 4=3 14=3 15=3 16=3 5=0 6=9408
BatchNorm        BatchNormalization_1     1 1 123 124 0=64
ReLU             Relu_2                   1 1 124 125
Pooling          MaxPool_3                1 1 125 126 0=0 1=3 11=3 2=2 12=2 3=1 13=1 14=1 15=1 5=1
Split            splitncnn_0              1 2 126 126_splitncnn_0 126_splitncnn_1

对应的网络如下:

第二行表示该模型由78层,86次数据转换
第三行表示模型输入为名称为input
第四行表示该层为一个卷积层Convolution,该层名称为Conv_0, 该层输入blob为input,输出blob为123
参考operation-param-weight-table
可知:

0=64 表示输出通道数为64
1=7 11=7 表示卷积核的宽和高都为7
2=1 12=1 表示不为空洞卷积,如果大于1,则卷积核的感受野范围相应扩大
3=2 13=2 表示宽和高步长都为2
4=3 14=3 表示填充的宽和高都为3
5=0 表示偏置个数为0
6=9408 表示该卷积层参数个数为9408(N_i*k*K*N_o = 3*7*7*64)

参考链接

param和模型文件结构
各算子对应key_value