IT学习站-137zw.com

more +资源更新Forums

more +随机图赏Gallery

Java程序员面试笔试真题与解析 完整pdf扫描版Java程序员面试笔试真题与解析 完整pdf扫描版
价值348元 RabbitMQ消息中间件技术精讲2018视频教程 百度云价值348元 RabbitMQ消息中间件技术精讲2018视频教程 百度云
10节课让你成为滚床单高手  强烈推荐 屌丝的福音10节课让你成为滚床单高手 强烈推荐 屌丝的福音
Spring Boot编程思想(核心篇) PDF 电子书 百度云 网盘下载Spring Boot编程思想(核心篇) PDF 电子书 百度云 网盘下载
最新流出的传智博学谷黑马python5.0课程最新流出的传智博学谷黑马python5.0课程
MySQL视频教程价值288元MySQL面试指南视频教程 百度云 百度...MySQL视频教程价值288元MySQL面试指南视频教程 百度云 百度...

AOE工程实践-NCNN组件

AOE工程实践-NCNN组件

[复制链接]
刘冠华 | 显示全部楼层 发表于: 2019-11-14 14:10:02
刘冠华 发表于: 2019-11-14 14:10:02 | 显示全部楼层 |阅读模式
查看: 82|回复: 0
作者:杨科
NCNN是腾讯开源的一个为手机端极致优化的高性能神经网络前向计算框架。在AOE开源工程里,我们提供了NCNN组件,下面我们以SqueezeNet物体识别这个Sample为例,来讲一讲NCNN组件的设计和用法。
直接集成NCNN缺点

为SqueezeNet接入NCNN,把相关的模型文件,NCNN的头文件和库,JNI调用,前处理和后处理相关业务逻辑等。把这些内容都放在SqueezeNet Sample工程里。这样简单直接的集成方法,问题也很明显,和业务耦合比较多,不具有通用性,前处理后处理都和SqueezeNcnn这个Sample有关,不能很方便地提供给其他业务组件使用。深入思考一下,如果我们把AI业务,作为一个一个单独的AI组件提供给业务的同学使用,会发生这样的情况:
AOE工程实践-NCNN组件  技术博客 1779464-20190910105329474-1813675921

每个组件都要依赖和包含NCNN的库,而且每个组件的开发同学,都要去熟悉NCNN的接口,写C的调用代码,写JNI。所以我们很自然地会想到要提取一个NCNN的组件出来,例如这样:
AOE工程实践-NCNN组件  技术博客 1779464-20190910105339218-862161843

AOE SDK里的NCNN组件

在AOE开源SDK里,我们提供了NCNN组件,下面我们从4个方面来讲一讲NCNN组件:

  • NCNN组件的设计
  • 对SqueezeNet Sample的改造
  • 应用如何接入NCNN组件
  • 对NCNN组件的一些思考
NCNN组件的设计

NCNN组件的设计理念是组件里不包含具体的业务逻辑,只包含对NCNN接口的封装和调用。具体的业务逻辑,由业务方在外部实现。在接口定义和设计上,我们参考了TF Lite的源码和接口设计。目前提供的对外调用接口,主要有以下几个:新的代码结构如下:

  • Interpreter,提供给外部调用,提供模型加载,推理这些方法。
  • NativeInterpreterWrapper是具体的实现类,里面对native进行调用。
  • Tensor,主要是一些数据和native层的交互。
AOE NCNN组件有以下几个特点:

  • 支持多输入多输出。
  • 使用ByteBuffer来提升效率。
  • 使用Object作为输入和输出(实际支持了ByteBuffer和多维数组)。
下面我们来说说具体是如何做的。
如何支持多输入多输出
为了支持多输入和多输出,我们在Native层创建了一个Tensor对象的列表,每个Tensor对象里保存了相关的输入和输出数据。Native层的Tensor对象,通过tensor_jni提供给java层调用,java层维护这个指向native层tensor的“指针”地址。这样在有多输入和多输出的时候,只要拿到这个列表里的对应的Tensor,就可以就行数据的操作了。
ByteBuffer的使用
ByteBuffer,字节缓存区处理子节的,比传统的数组的效率要高。
DirectByteBuffer,使用的是堆外内存,省去了数据到内核的拷贝,因此效率比用ByteBuffer要高。
当然ByteBuffer的使用方法不是我们要说的重点,我们说说使用了ByteBuffer以后,给我们带来的好处:
1,接口里的字节操作更加便捷,例如里面的putInt,getInt,putFloat,getFloat,flip等一系列接口,可以很方便的对数据进行操作。
2,和native层做交互,使用DirectByteBuffer,提升了效率。我们可以简单理解为java层和native层可以直接对一块“共享”内存进行操作,减少了中间的字节的拷贝过程。
如何使用Object作为输入和输出
目前我们只支持了ByteBuffer和MultiDimensionalArray。在实际的操作过程中,如果是ByteBuffer,我们会判断是否是direct buffer,来进行不同的读写操作。如果是MultiDimensionalArray,我们会根据不同的数据类型(例如int, float等),维度等,来对数据进行读写操作。
对SqueezeNet Sample的改造

集成AOE NCNN组件以后,让SqueezeNet依赖NCNN Module,SqueezeNet Sample里面只包含了模型文件,前处理和后处理相关的业务逻辑,前处理和后处理可以用java,也可以用c来实现,由具体的业务实现来决定。新的代码结构变得非常简洁,目录如下:其他的AI业务组件对NCNN组件的调用,都可以参考SqueezeNet这个Sample。
应用如何接入NCNN组件

对NCNN组件的接入,有两种方式

  • 直接接入
    AOE工程实践-NCNN组件  技术博客 1779464-20190910105357684-1020672900

  • 通过AOE SDK接入
    AOE工程实践-NCNN组件  技术博客 1779464-20190910105406545-884551562

两种接入方式比较:
功能特性直接接入通过AOE SDK接入易用性容易容易稳定性不能确定,依赖实现方的实现高,安卓有独立进程机制,更加稳定,推理过程不影响主进程模型配置无有模型下载和动态升级无有模型配置无有模型准确率,性能等数据分析无有提供图像处理工具包无AOE SDK提供了Vision组件支持模型加密要看具体的模型和框架AOE SDK提供了模型加密解密组件通过比较,我们更建议是通过AOE SDK来对我们的NCNN组件进行接入。
对NCNN组件的总结和思考

通过对NCNN组件的封装,现在业务集成NCNN更加快捷方便了。之前我们一个新的业务集成NCNN,可能需要半天到一天的时间。使用AOE NCNN组件以后,可能只需要1-2小时的时间。
当然NCNN组件目前还存在很多不完善的地方,我们对NCNN还需要去加深学习和理解。后面会通过不断的学习,持续的对NCNN组件进行改造和优化。
欢迎大家来使用和提建议

AoE (AI on Edge,终端智能,边缘计算) 是一个终端侧AI集成运行时环境 (IRE),帮助开发者提升效率。 https://github.com/didi/aoe
Github地址:
AOE工程实践-NCNN组件  技术博客 1779464-20190910105420010-1359511892

欢迎star~

来源:http://www.137zw.com
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
137zw.com IT学习站致力于免费提供精品的java技术教程和python技术教程,CCNA书籍/资料/CCNP书籍/资料教程/CCIE书籍/资料/H3C学习/认证/一级建造师考试/微软学习/认证/包括基础教程和高级实战教程,同时也提供分享网站源码下载和互联网相关一系列的技术教程,我们想做的就是让知识分享更有价值!(IT学习站官方唯一域名地址:www.137zw.com 请谨防假冒网站!)本站所有资源全部收集于互联网或网友自行分享,分享目的仅供大家学习与参考,如无意中侵犯您的合法权益,请联系本站管理员进行删除处理!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

浙ICP备19022368号-1|Archiver|手机版|IT学习站-137zw.com

GMT+8, 2020-7-11 00:21 , Processed in 8.192540 second(s), 34 queries .

快速回复 返回顶部 返回列表