在之后的hi3559AV100板载开发中,除了走通V4L2->VDEC->VPSS->VO(HDMI)输出,还有需要进行神经网络的开发学习,进行如face detection的开发等等,满足后期功能的需求,这一篇随笔大体说明了SVP(NNIE)的开发流程。

1、SVP

  SVP(Smart Vision Platform)是海思媒体处理芯片智能视觉异构加速平台。该平台包含了CPU、DSP、NNIE(Neural Network Inference Engine)等多个硬件处理单元和运行在这些硬件上 SDK 开发环境,以及配套的工具链开发环境,对于Hi3559AV100芯片来说,CPU资源有 双核 A73+双核A53 ,DSP4 个,NNIE 2 个,资源相对来说还是充足的。

1.1、SVP开发框架

  SVP 开发框架如图 1所示。目前 SVP 中包含的硬件处理单元 CPU、vision DSP、NNIE,其中某些硬件可能多核。不同的硬件不同的配套工具链,用户的应用程序需要结合这些工具的使用来开发。

图1 SVP开发框架

  其中,我大体是开发Hardware层的NNIE硬件模块、u-boot、Kernel driver及MPI的开发,可能等基本框图实现后,会开发上层的APP系列等等,不过目前的工作还是偏底层,之后会多多更新项目开发的过程。

1.2、SVP开发文档

  SVP NNIE的开发过程主要是参考如下技术文档,海思还是开发了相当多的接口,大家只要熟练了之后,代码还是容易实现的。

  《Hi35xx Vxxx ultra-HD Mobile Camera SoC 用户指南》
  《HiSVP API 参考》
  《HiMPP V4.0 媒体处理软件开发参考》
  《多核 使用指南》
  在SVP下,项目开发的核心是NNIE,NNIE 是 Neural Network Inference Engine 的简称,是海思媒体 SoC 中专门针对神经网络特别是深度学习卷积神经网络进行加速处理的硬件单元,支持现 大部分的公开网络,如 Alexnet、VGG16、Googlenet、Resnet18、Resnet50 等分类网络,Faster RCNN、YOLO、SSD、RFCN 等检测网络,以及 SegNet、FCN 等场景分割网络。

2、NNIE开发

  目前 NNIE 配套软件及工具链仅支持以 Caffe 框架,使用其他框架的网络模型需要转化为 Caffe 框架下的模型,而且目前NNIE 工具链目前只支持 Caffe 框架,且以 Caffe1.0 版本为基础。
  以 Caffe 框架上训练的模型为例,NNIE 的开发流程如图 2 所示。在 Caffe 上训练、使用 NNIE 的 mapper 工具转化都是离线的。通过设置不同的模式,mapper 将*.caffemodel 转化成在仿真器、仿真库或板端上可加载执行的数据指令文件。一般在开发前期,用户可使用仿真器对训练出来的模型进行精度、性能、带宽进行初步评估,符合用户预期后再使用仿真库进行完整功能的仿真,最后将程序移植到板端。 

图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或者直接点击运行即可看结果,后续推出详细的操作流程。

最新文章

  1. Oracle CDC配置案例
  2. hadoop 分布式缓存
  3. iOS逆传值的三种方式
  4. YOU KNOW NOTHING , SNOW
  5. 设计师必备!免费下载 PSD 素材的32个网站
  6. SQL Server case when 日期字符串转换 多表查询 嵌套子查询
  7. CSS笔记(十五)CSS3之用户界面
  8. 九度OJ 1131 合唱队形 -- 动态规划(最长递增子序列)
  9. JAVA: 接入YSDK遇到的问题
  10. 全球主流8位MCU芯片详细解剖No.2:英飞凌 XC866 - 全文
  11. SSO-单点统一登录系统的设计与实现
  12. DataReader的使用
  13. SQLite 线程安全和并发
  14. Django+Vue打造购物网站(一)
  15. acm--博弈入门2(P/N分析)--(HDU 1847 HDU 2188 HDU 3863)
  16. 20、collections模块和re模块(正则表达式详解)
  17. 解决Windows10或者其他版本Windows Update报错的问题
  18. 1-4-bootloader架构学习
  19. Linux文件系统命令 ln
  20. drf 分页

热门文章

  1. 【noi 2.6_8786】方格取数(DP)
  2. hdu3706 Second My Problem First
  3. Codeforces Round #307 (Div. 2) B. ZgukistringZ
  4. MiniSMB 网络性能测试 免费版本安装指南
  5. MYSQL基础常见常用语句200条
  6. element-ui &amp; babel-plugin-component config bug
  7. 中文域名 &amp; 原理剖析
  8. pull down/pull up refresh &amp; UI Components
  9. linux bash which
  10. React SSR in Action