经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
基于Hi3559AV100的SVP(NNIE)开发整体流程
来源:cnblogs  作者:流星斩月  时间:2021/2/18 15:29:15  对本文有异议
  在之后的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 RCNNSSDRFCN SegNet 等网络都包含了些原始 Caffe 中没定义的层结构,如 ROIPoolingNormalizePSROI 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. 1 int main(int argc, char* argv[])
  2. 2 {
  3. 3 if (argc < 2)
  4. 4 {
  5. 5 SAMPLE_RUNTIME_Usage(argv[0]);
  6. 6 return HI_FAILURE;
  7. 7 }
  8. 8
  9. 9 #ifdef ON_BOARD
  10. 10 SAMPLE_COMM_SVP_SysInit();
  11. 11 #endif
  12. 12
  13. 13 switch (*argv[1])
  14. 14 {
  15. 15 case '0':
  16. 16 SAMPLE_AlexNet();
  17. 17 break;
  18. 18 case '1':
  19. 19 SAMPLE_RFCN();
  20. 20 break;
  21. 21 case '2':
  22. 22 SAMPLE_Model_Group_RFCNAlexNet();
  23. 23 break;
  24. 24 case '3':
  25. 25 SAMPLE_SSD();
  26. 26 break;
  27. 27 case '4':
  28. 28 SAMPLE_Model_Group_RFCN_GOTURN_ALEXNET(1, 5);
  29. 29 break;
  30. 30 default:
  31. 31 printf("index[%s] error !!!!!!!!!!\n", argv[1]);
  32. 32 SAMPLE_RUNTIME_Usage(argv[0]);
  33. 33 break;
  34. 34 }
  35. 35
  36. 36 #ifdef ON_BOARD
  37. 37 SAMPLE_COMM_SVP_SysExit();
  38. 38 #endif
  39. 39 return HI_SUCCESS;
  40. 40 }

图4 示例main()代码  

其中非常重要的是xxx.cfg文件,其中有自己训练好的.caffemodel模型及对应prototxt(需要时NNIE所支持的网络层)

图5 xxx.cfg文件重要内容

  部分prototxt代码如下所示:

  1. 1 name: "mxnet-mdoel"
  2. 2 input:"data"
  3. 3 input_shape {
  4. 4 dim:1
  5. 5 dim:3
  6. 6 dim:112
  7. 7 dim:112
  8. 8 }
  9. 9
  10. 10
  11. 11 layer {
  12. 12 bottom: "data"
  13. 13 top: "conv_1_conv2d"
  14. 14 name: "conv_1_conv2d"
  15. 15 type: "Convolution"
  16. 16 convolution_param {
  17. 17 num_output: 64
  18. 18 kernel_size: 3
  19. 19 pad: 1
  20. 20 stride: 2
  21. 21 bias_term: false
  22. 22 }
  23. 23 }
  24. 24
  25. 25 layer {
  26. 26 bottom: "conv_1_conv2d"
  27. 27 top: "conv_1_batchnorm"
  28. 28 name: "conv_1_batchnorm"
  29. 29 type: "BatchNorm"
  30. 30 batch_norm_param {
  31. 31 use_global_stats: true
  32. 32 moving_average_fraction: 0.9
  33. 33 eps: 0.001
  34. 34 }
  35. 35 }
  36. 36 layer {
  37. 37 bottom: "conv_1_batchnorm"
  38. 38 top: "conv_1_batchnorm"
  39. 39 name: "conv_1_batchnorm_scale"
  40. 40 type: "Scale"
  41. 41 scale_param { bias_term: true }
  42. 42 }
  43. 43
  44. 44 layer {
  45. 45 bottom: "conv_1_batchnorm"
  46. 46 top: "conv_1_relu"
  47. 47 name: "conv_1_relu"
  48. 48 type: "PReLU"
  49. 49 }

  最后debug或者直接点击运行即可看结果,后续推出详细的操作流程。

 

 

 

原文链接:http://www.cnblogs.com/iFrank/p/14377668.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号