之后随笔将更多笔墨着重于NNIE开发系列,下文是关于Hi3359AV100 NNIE开发(1)-RFCN demo LoadModel函数与参数解析,通过对LoadModel函数的解析,能够很好理解.wk文件的具体内容,为方便为对其他不同模型.wk加载时如何进行修改给出参照。

  在RFCN demo中把RFCN的.wk模型文件通过函数导出模型参数,具体如下所示:

1 static SAMPLE_SVP_NNIE_MODEL_S s_stRfcnModel = {0};
2
3 HI_CHAR *pcModelName = "./data/nnie_model/detection/inst_rfcn_resnet50_cycle_352x288.wk";
4
5 //函数输入参数
6 SAMPLE_COMM_SVP_NNIE_LoadModel(pcModelName,&s_stRfcnModel);

  SAMPLE_COMM_SVP_NNIE_LoadModel函数定义原型如下:

1 SAMPLE_COMM_SVP_NNIE_LoadModel(
2 HI_CHAR * pszModelFile,
3 SAMPLE_SVP_NNIE_MODEL_S *pstNnieModel)

  LoadModel函数下SAMPLE_SVP_NNIE_MODEL_S参数定义:

1 typedef struct hiSAMPLE_SVP_NNIE_MODEL_S
2 {
3 SVP_NNIE_MODEL_S stModel;
4 SVP_MEM_INFO_S stModelBuf;//store Model file
5 }SAMPLE_SVP_NNIE_MODEL_S;

  给出SAMPLE_SVP_NNIE_MODEL_S结构体下SVP_NNIE_MODEL_S参数定义:

 1 /*NNIE model*/
2 typedef struct hiSVP_NNIE_MODEL_S
3 {
4 SVP_NNIE_RUN_MODE_E enRunMode;/*枚举类型,网络模型运行模式*/
5
6 HI_U32 u32TmpBufSize; /*temp buffer size 辅助内存大小*/
7 HI_U32 u32NetSegNum; /*网络模型中 NNIE 执行的网络分段数,取值[1,8]*/
8 SVP_NNIE_SEG_S astSeg[SVP_NNIE_MAX_NET_SEG_NUM];/*网络在 NNIE 引擎上执行的段信息*/
9 SVP_NNIE_ROIPOOL_INFO_S astRoiInfo[SVP_NNIE_MAX_ROI_LAYER_NUM]; /*ROIPooling info*/
10
11 SVP_MEM_INFO_S stBase; /*网络其他信息*/
12 }SVP_NNIE_MODEL_S;

  enRunModel:为枚举类型,表示网络模型的运行模式,有SVP_NNIE_RUN_MODE_CHIP(只能在Chip上运行),以及SVP_NNIE_RUN_MODE_FUNC_SIM(只能用于PC端功能仿真)两个枚举值。可以通过打印可以看到RFCN网络模型的运行情况。

u32TempBufSize:为辅助内存大小。

u32NetSegNum:为网络模型中NNIE执行的网络分段数,取值为1~8。这里的分段是指模型执行中可能会分成多段,一些段在NNIE上执行,一些段在CPU或DSP上执行,给出图示之前,首先先给出SVP对扩展层的参考设计:

  当网络中存在 Non-support 层时,需要将网络进行切分,不支持的部分由用户使用 CPU或者 DSP 等方式实现,统称为非 NNIE 方式。由此整个网络会出现 NNIE->非 NNIE->NNIE… 的分段执行方式。以Faster RCNN为例,具体如下图所示:

  u32NetSegNum就是指有多少段是在NNIE上执行的,如果一个网络模型全部都是在NNIE上执行,那么这个u32NetSegNum就是1。由上图可知FasterRCNN网络的NNIE执行分为两段,即u32NetSegNum = 2。

  astSeg[SVP_NNIE_MAX_NET_SEG_NUM]:这个参数是一个结构体数组,SVP_NNIE_MAX_NET_SEG_NUM在hi_nnie.h中定义为8,这个数组表示每一段NNIE网络的各段的具体信息,具体信息有哪些,来看SVP_NNIE_MODEL_S结构体下SVP_NNIE_SEG_S这个结构体:

 1 /***************************************************************/
2 /*Segment information*/
3 typedef struct hiSVP_NNIE_SEG_S
4 {
5 SVP_NNIE_NET_TYPE_E enNetType; /*网络段的类型*/
6 HI_U16 u16SrcNum; /*网络段的输入节点数*/
7 HI_U16 u16DstNum; /*网络段的输出节点数*/
8 HI_U16 u16RoiPoolNum; /*网络段中包含的 RoiPooling 以及 PSRoiPooling layer 数*/
9
10 HI_U16 u16MaxStep; /*RNN/LSTM 网络中序列的最大“帧数”*/
11
12 HI_U32 u32InstOffset;
13 HI_U32 u32InstLen;
14
15 SVP_NNIE_NODE_S astSrcNode[SVP_NNIE_MAX_INPUT_NUM];/*网络段的第 i 个输入节点信息, SVP_NNIE_MAX_INPUT_NUM为16*/
16
17 SVP_NNIE_NODE_S astDstNode[SVP_NNIE_MAX_OUTPUT_NUM];/*网络段的第 i 个输出节点信息, SVP_NNIE_MAX_OUTPUT_NUM为16*/
18
19 HI_U32 au32RoiIdx[SVP_NNIE_MAX_ROI_LAYER_NUM_OF_SEG]; /*Roipooling info index 网络段的第 i 个 RoiPooling 或者 PsRoiPooling 在SVP_NNIE_MODEL_S 中 SVP_NNIE_ROIPOOL_INFO_S 数组的下标,SVP_NNIE_MAX_ROI_LAYER_NUM_OF_SEG为2*/
20 }SVP_NNIE_SEG_S;

  SVP_NNIE_MODEL_S结构体SVP_NNIE_SEG_S结构体下enNetType参数为枚举类型,具体如下所示:

1 /*Network  type 例子见后面表格 */
2 typedef enum hiSVP_NNIE_NET_TYPE_E
3 {
4 SVP_NNIE_NET_TYPE_CNN = 0x0, /* Non-ROI input cnn net,普通的CNN\DNN网络类型 */
5 SVP_NNIE_NET_TYPE_ROI = 0x1, /* With ROI input cnn net,有RPN层输出框信息的网络类型*/
6 SVP_NNIE_NET_TYPE_RECURRENT = 0x2, /* RNN or LSTM net */
7
8 SVP_NNIE_NET_TYPE_BUTT
9 }SVP_NNIE_NET_TYPE_E;

  包含4种类型:SVP_NNIE_NET_TYPE_CNN表示普通的的CNN网络, SVP_NNIE_NET_TYPE_ROI有RPN层输出框信息的网络类型,这里其实就是指Faster RCNN的NNIE模型中的Proposal层,这个层包含RPN输出框信息,且由CPU来执行。SVP_NNIE_NET_TYPE_RECURRENT则表示RNN循环神经网络或者LSTM长短期记忆网络。
  SVP_NNIE_MODEL_S结构体SVP_NNIE_SEG_S结构体下u16SrcNum:表示这个段的输入节点数,即这个段网络有多少个输入,也是后面的astSrcNode数组的元素的有效个数

  SVP_NNIE_MODEL_S结构体SVP_NNIE_SEG_S结构体下u16DstNum:表示这个段的输出节点数,即这个段网络有多少个输出,也是后面的astDstNode数组的元素的有效个数

  SVP_NNIE_MODEL_S结构体SVP_NNIE_SEG_S结构体下astSrcNode与astDstNode:表示这个段的输入和输出节点的具体信息,其类型为SVP_NNIE_NODE_S,具体如下:

 1 /*Node information*/
2 typedef struct hiSVP_NNIE_NODE_S
3 {
4 SVP_BLOB_TYPE_E enType; /*节点的类型*/
5 union
6 {
7 struct
8 {
9 HI_U32 u32Width; /*节点内存形状的宽*/
10 HI_U32 u32Height; /*节点内存形状的高*/
11 HI_U32 u32Chn; /*节点内存形状的通道数*/
12 }stWhc;
13
14 HI_U32 u32Dim; /*节点内存的向量维度*/
15 }unShape;
16
17 HI_U32 u32NodeId; /*节点在网络中的 Id*/
18 HI_CHAR szName[SVP_NNIE_NODE_NAME_LEN];/*Report layer bottom name or data layer bottom name*/
19 }SVP_NNIE_NODE_S;

  SVP_NNIE_MODEL_S结构体SVP_NNIE_SEG_S结构体SVP_NNIE_NODE_S结构体下enType是枚举类型,其类型SVP_BLOB_TYPE_E如下:

 1 /*Blob type*/
2 typedef enum hiSVP_BLOB_TYPE_E
3 {
4 SVP_BLOB_TYPE_S32 = 0x0, /*Blob 数据元素为 S32 类型*/
5
6 SVP_BLOB_TYPE_U8 = 0x1, /*Blob 数据元素为 U8 类型*/
7
8 /*channel = 3*/
9 SVP_BLOB_TYPE_YVU420SP = 0x2, /*Blob 数据内存排布为 YVU420SP*/
10
11 /*channel = 3*/
12 SVP_BLOB_TYPE_YVU422SP = 0x3,/*Blob 数据内存排布为 YVU422SP*/
13
14 SVP_BLOB_TYPE_VEC_S32 = 0x4, /*Blob 中存储向量,每个元素为 S32 类型*/
15
16 SVP_BLOB_TYPE_SEQ_S32 = 0x5,/*Blob 中存储序列,数据元素为 S32 类型*/
17
18 SVP_BLOB_TYPE_BUTT
19 }SVP_BLOB_TYPE_E;

  (以Fast RCNN为例)通过打印输出SVP_NNIE_MODEL_S结构体中的astSeg,即打印两段NNIE网络信息的输入输出节点信息,具体如下:

  从打印的信息,我们首先看段与节点的类型,这个对于以后的分析有用,因为后面的一些初始化操作会根据不同的类型有不同的操作,如下表:

  将以上打印与下面网络图结合,这里的节点名szName,个人的理解是,如果作为输入节点,则显示的是该层的bottom的名字,如果作为输出节点,则显示top的名字。第1段有1个输入节点,即data层的输入。输出节点的数量打印显示是4个输出,而下面的网络图中只有3个输出,即conv5, rpn_bbox_pred, rpn_cls_prob_reshape,打印显示多了一个rpn_cls_score。在RuyiStudio的网络图里rpn_cls_score是在第一段的中间,并非作为输出,为什么会把它当输出呢?玄机就在网络描述文件.prototxt里面,我们来看rpn_cls_score这一层,如下:

 1 layer {
2 name: "rpn_cls_score"
3 type: "Convolution"
4 bottom: "rpn/output"
5 top: "rpn_cls_score_report"
6 convolution_param {
7 num_output: 18 # 2(bg/fg) * 9(anchors)
8 kernel_size: 1 pad: 0 stride: 1
9 weight_filler { type: "gaussian" std: 0.01 }
10 bias_filler { type: "constant" value: 0 }
11 }
12 }

  这一层的top输出是rpn_cls_score_report,即rpn_cls_score加了后缀_report。在《HiSVP开发指南》的3.2.7章节,如下:

  可以看到,中间层的top加上_report后当作该段的一个输出,因此从打印那里可以看到这一段有rpn_cls_score作为输出。

  通过点击Ruyistudio 软件中Mark 按钮进入工具自动标记后的 Prototxt 的网络拓扑图:(以Fast RCNN为例)

Hi3359AV100 NNIE开发(1)-RFCN demo LoadModel函数与参数解析的更多相关文章

  1. document.execCommand()函数可用参数解析

    隐藏在暗处的方法-execCommand() 关键字: javascript document document.execCommand()方法可用来执行很多我们无法实现的操作. execComman ...

  2. 【C/C++开发】C语言实现函数可变参数

    函数原型: int printf(const char *format[,argument]...)        返 回 值: 成功则返回实际输出的字符数,失败返回-1.  函数说明:        ...

  3. python中函数的参数解析

    python中函数的各种参数梳理: 1.形参:函数定义时传入的参数 2.实参:函数调用时传入的参数 (有形参必传实参,形参里自身特点可不传的,可传可不传) 3.缺省参数:不传为默认值,传了会覆盖(下面 ...

  4. C语言中函数可变参数解析

    大多数时候,函数中形式参数的数目通常是确定的,在调用时要依次给出与形式参数对应的所有实际参数.但在某些情况下希望函数的参数个数可以根据需要确定.典型的例子有 大家熟悉的函数printf().scanf ...

  5. C语言中的main函数的参数解析

    main()函数既可以是无参函数,也可以是有参的函数.对于有参的形式来说,就需要向其传递参数.但是其它任何函数均不能调用main()函数.当然也同样无法向main()函数传递,只能由程序之外传递而来. ...

  6. Hi3559AV100 NNIE开发(2)-RFCN(.wk)LoadModel及NNIE Init函数运行过程分析

    之后随笔将更多笔墨着重于NNIE开发系列,下文是关于Hi3559AV100 NNIE开发(2)-RFCN(.wk)LoadModel及NNIE Init函数运行过程分析,通过对LoadModel函数及 ...

  7. Hi3559AV100 NNIE开发(4)mobilefacenet.cfg参数配置挖坑解决与SVP_NNIE_Cnn实现分析

    前面随笔给出了NNIE开发的基本知识,下面几篇随笔将着重于Mobilefacenet NNIE开发,实现mobilefacenet.wk的chip版本,并在Hi3559AV100上实现mobilefa ...

  8. Hi3559AV100 NNIE开发(6)RFCN中NNIE实现关键线程函数->SAMPLE_SVP_NNIE_Rfcn_ViToVo()进行数据流分析

    前面随笔给出了NNIE开发的基本知识,下面几篇随笔将着重于Mobilefacenet NNIE开发,实现mobilefacenet.wk的chip版本,并在Hi3559AV100上实现mobilefa ...

  9. 基于Hi3559AV100的SVP(NNIE)开发整体流程

    在之后的hi3559AV100板载开发中,除了走通V4L2->VDEC->VPSS->VO(HDMI)输出,还有需要进行神经网络的开发学习,进行如face detection的开发等 ...

随机推荐

  1. python常用连接字符串

    1.使用占位符% print(('%s%s%s' % ('one','two', 'three'))) 2.'+'号连接 字符串是不可变对象,每次改变会申请一块新的内存,操作符+连接字符串的时候会涉及 ...

  2. Kubernets二进制安装(7)之部署主控节点服务--apiserver二进制安装

    kube-apiserver集群规划 主机名 角色 IP地址 mfyxw30.mfxyw.com kube-apiserver主 192.168.80.30 mfyxw40.mfyxw.com kub ...

  3. Leetcode(29)-两数相除

    给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输 ...

  4. nyoj-2357

    2357: 插塔憋憋乐 时间限制: 1 秒  内存限制: 128 MB提交: 107  解决: 28提交 状态 题目描述 众所不知,LLM是一位红警3大佬,打的非常厉害,但是曾经也是一位萌新,喜欢在家 ...

  5. 51nod 1073约瑟夫环 递归公式法

    约瑟夫环问题的原来描述为,设有编号为1,2,--,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,- ...

  6. Hacker101 CTF-Micro-CMS v2

    一.打开网站是这个样子 找到一个登录框,存在注入漏洞 3.我们可以这样更改用户名中的输入: admin' or 1=1 -- 4.错误消息显示Invalid Password,因此我们也应该尝试构造一 ...

  7. Linux 驱动框架---cdev字符设备驱动和misc杂项设备驱动

    字符设备 Linux中设备常见分类是字符设备,块设备.网络设备,其中字符设备也是Linux驱动中最常用的设备类型.因此开发Linux设备驱动肯定是要先学习一下字符设备的抽象的.在内核中使用struct ...

  8. Clipboard API

    Clipboard API click copy click copy demo clickGetNewsLink(data_ref = `newsLink`) { let that = this; ...

  9. cocos2d-x & cocos2d-js

    cocos2d-x & cocos2d-js cocos2d-x new https://github.com/cocos2d/cocos2d-x cocos2d-x is a multi-p ...

  10. ES6 Generator vs ES6 async/await

    ES6 Generator vs ES6 async/await next yield promise refs xgqfrms 2012-2020 www.cnblogs.com 发布文章使用:只允 ...