Skip to content

第 3 章:NCNN 模型解析

1. Param 模型文件解析

我们先来分析一下 NCNN 的 .param 文件,这是一个文本文件,例如:

txt
7767517
3 3
Input         input    0 1 data 0=4 1=4 2=1
InnerProduct  ip       1 1 data fc 0=10 1=1 2=80
Softmax       softmax  1 1 fc prob 0=0

第一行只有一个数,被称为 魔数(Magic Number),大致可以理解为文件类型识别码,就是说只要是 NCNN 的 .param 文件第一行一定是 7767517

什么是魔数

ELF 文件头会写入一个魔数,检查这个数和自己预想的是否一致可以判断文件是否损坏。在缓冲区数组旁放一个魔数,这种做法被称为 金丝雀测试(Canary Testing),通过检查是否一致可检测缓冲区溢出攻击。关于魔数的详细解释和作用可以参考网络更多资料。

第二行有两个数,分别是层行的数量,和 Blob 的数量。

其实 .param 文件从第三行开始每一行都是一层,也就是说层数是该文件非空行数减 2。Blob 的数量通常大于等于层数。

从第三行开始,文件的内容有固定格式,每一行都是一层,按照下面的格式确定:

层类型层名字输入 Blob 数量输出 Blob 数量输入 Blob输出 Blob参数字典

参数字典使用 i=vi = v 的格式,用空格隔开,一个参数如果是向量则使用逗号区分每个数。对于不同的层类型,参数字典的含义也不同:

层类型层类型译名参数含义举例
Input输入层[宽度, 高度, 通道数]0=227 1=227 2=3

参考

[1] https://github.com/Tencent/ncnn/wiki/param-and-model-file-structure

[2] https://github.com/Tencent/ncnn/wiki/operation-param-weight-table

[3] https://zhuanlan.zhihu.com/p/338121531