《TencentNCNN系列》 之param文件(网络结构文件)格式分析


PS:要转载请注明出处,本人版权所有。

PS: 这个只是基于《我自己》的理解,
如果和你的原则及想法相冲突,请谅解,勿喷。

环境说明

  2018.06.25

  ncnn master commit id:b3e24cafc37483dcc97ee61e6f0f6ff1b094300e

前言


  由于公司算法组的算法在某些arm板子的表现不佳,于是需要使用此框架进行优化,初步测试得出的结论为:此框架表现不错,于是需要对此框架进行深入学习。根据相关源码分析,要学习此框架的,最好的开始(突破口)应该在模型参数加载和网络加载部分。今天本文介绍网络文件的格式相关信息(根据其源码分析得出)。





格式分析




param文件举例:
rep_img


上文例图中第一行(版本信息):

  其数值其实代表的是此param文件的版本。

  相关源码说明:

int magic = 0;
fscanf(fp, "%d", &magic);
if (magic != 7767517)
{
    fprintf(stderr, "param is too old, please regenerate\n");
    return -1;
}


上文例图中第二行(层与数据交换结构数量):

  第一个数:层(layer)数量

  第二个数:数据交换结构(blob)数量

  相关源码说明:

// parse
int layer_count = 0;
int blob_count = 0;
fscanf(fp, "%d %d", &layer_count, &blob_count);


上文例图第三四行(相关层的信息):

  前4个值的含义固定:

  1. 层的类型

  2. 层的名称

  3. 输入数据结构(blob)数量(bottom)(input层特殊点)

  4. 输出数据结构(blob)数量(top)

  后面有三种类型的值《《《严格按照顺序排序》》》:

  • 第一种:网络输入层名(一个层可能有多个输入,于是有多个网络输入层名)

  • 第二种:网络输出层名(一个层可能有多个输出,于是有多个网络输出层名)

  • 第三种(可能没有):特殊参数层,一是k=v的类型存在。二是k=len,v1,v2,v3…(数组类型)。此层在ncnn中是存放到paramDict结构中,不同类型层,各种参数意义不一样,需要具体分析。



这里就上文图中第四行的BinaryOp层进行举例分析(其他不同的分析需要具体看不同层的源码)

  层类型:BinaryOp

  层名称:_minusscalar0

  输入数据结构数量(bottom blob):1

  输出数据结构数量(top blob):1

  特殊参数1(第一个k=v):id=0,op_type=1(代表加法Operation_SUB)

  特殊参数2(第二个k=v):id=1,scale val=1

  特殊参数3(第三个k=v):id=2,b=127.50000(因为操作类型为减法,所以此值代表减数)

  By the way:上文图中第五行是做乘法。第四五行合在一起代表的是对输入图像进行归一化。

  相关源码:

op_type = pd.get(0, 0);
with_scalar = pd.get(1, 0);
b = pd.get(2, 0.f);




后记


  无

参考文献




打赏、订阅、收藏、丢香蕉、硬币,请关注公众号(攻城狮的搬砖之路)
qrc_img

PS: 请尊重原创,不喜勿喷。

PS: 要转载请注明出处,本人版权所有。

PS: 有问题请留言,看到后我会第一时间回复。


文章作者: Sky
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Sky !
  目录