
图2 NNIE开发流程
而在定义网络层时,需要注意NNIE中所支持的网络层,一个网络的层可分为如下的 3 类:
(1)标准层:NNIE 支持的 Caffe 标准层,比如 Convolution,Pooling 层等;
(2)扩展层:NNIE 支持的公开但非 Caffe 标准层,分为 2 种:
一种是基于 Caffe 框架进行自定义扩展的层,比如 Faster RCNN 中的ROIPooling 层、SSD 中 Normalize 层、RFCN 中的 PSROIPooling 层,SegNet 中的 UpSample 层等;
另外一种是来源于其他深度学习框架的自定义层,比如 YOLOv2 中 Passthrough层等;
(3)Non-support 层:NNIE 不支持的层,比如 Caffe 中专用于 Tranning 的层、其他非Caffe 框架中的一些层或者用户自定义的私层等。
对于扩展层,有相应的规则:Faster RCNN、SSD、RFCN 和 SegNet 等网络都包含了一些原始 Caffe 中没定义的层结构,如 ROIPooling、Normalize、PSROI Pooling 和 Upsample 等。NNIE 的 mapper 目前仅支持 Caffe 框架,且以 Caffe1.0 为基础。为了使 mapper 能支持这些网络,需要对原始的 Caffe 进行扩展。
而对于NNIE开发,使用的工具为RuyiStudio,RuyiStudio 集成 windows 版的 NNIE mapper 和仿真库,具 生成 NNIE wk 功能、仿真NNIE 功能,同时具 代码编辑、编译、调试、执行功能、网络拓扑显示、目标检测画框、向量相似度对比、调试定位信息获取等功能。RuyiStudio 集成 windows 版的 NNIE mapper 基于 Visual Studio 2015 64bit 版本编译,所以其依赖库也需要使用 Visual Studio 2015 64 bit 进行编译。RuyiStudio 集成仿真库基于 MinGW-W64 7.3.0 编译,所以其依赖的编译链环境也需要是 MinGW-W64。其安装步骤需要参考相关的说明文档,注意一定要和python版本等匹配,否则容易报错。安装完成之后,大家可以导入demo工程,可以参考官方写的代码,如图所示:

图3 RuyiStudio 工程示例
- 1 int main(int argc, char* argv[])
- 2 {
- 3 if (argc < 2)
- 4 {
- 5 SAMPLE_RUNTIME_Usage(argv[0]);
- 6 return HI_FAILURE;
- 7 }
- 8
- 9 #ifdef ON_BOARD
- 10 SAMPLE_COMM_SVP_SysInit();
- 11 #endif
- 12
- 13 switch (*argv[1])
- 14 {
- 15 case '0':
- 16 SAMPLE_AlexNet();
- 17 break;
- 18 case '1':
- 19 SAMPLE_RFCN();
- 20 break;
- 21 case '2':
- 22 SAMPLE_Model_Group_RFCNAlexNet();
- 23 break;
- 24 case '3':
- 25 SAMPLE_SSD();
- 26 break;
- 27 case '4':
- 28 SAMPLE_Model_Group_RFCN_GOTURN_ALEXNET(1, 5);
- 29 break;
- 30 default:
- 31 printf("index[%s] error !!!!!!!!!!\n", argv[1]);
- 32 SAMPLE_RUNTIME_Usage(argv[0]);
- 33 break;
- 34 }
- 35
- 36 #ifdef ON_BOARD
- 37 SAMPLE_COMM_SVP_SysExit();
- 38 #endif
- 39 return HI_SUCCESS;
- 40 }
图4 示例main()代码
其中非常重要的是xxx.cfg文件,其中有自己训练好的.caffemodel模型及对应prototxt(需要时NNIE所支持的网络层)

图5 xxx.cfg文件重要内容
部分prototxt代码如下所示:
- 1 name: "mxnet-mdoel"
- 2 input:"data"
- 3 input_shape {
- 4 dim:1
- 5 dim:3
- 6 dim:112
- 7 dim:112
- 8 }
- 9
- 10
- 11 layer {
- 12 bottom: "data"
- 13 top: "conv_1_conv2d"
- 14 name: "conv_1_conv2d"
- 15 type: "Convolution"
- 16 convolution_param {
- 17 num_output: 64
- 18 kernel_size: 3
- 19 pad: 1
- 20 stride: 2
- 21 bias_term: false
- 22 }
- 23 }
- 24
- 25 layer {
- 26 bottom: "conv_1_conv2d"
- 27 top: "conv_1_batchnorm"
- 28 name: "conv_1_batchnorm"
- 29 type: "BatchNorm"
- 30 batch_norm_param {
- 31 use_global_stats: true
- 32 moving_average_fraction: 0.9
- 33 eps: 0.001
- 34 }
- 35 }
- 36 layer {
- 37 bottom: "conv_1_batchnorm"
- 38 top: "conv_1_batchnorm"
- 39 name: "conv_1_batchnorm_scale"
- 40 type: "Scale"
- 41 scale_param { bias_term: true }
- 42 }
- 43
- 44 layer {
- 45 bottom: "conv_1_batchnorm"
- 46 top: "conv_1_relu"
- 47 name: "conv_1_relu"
- 48 type: "PReLU"
- 49 }
最后debug或者直接点击运行即可看结果,后续推出详细的操作流程。