加入收藏 | 设为首页 | 会员中心 | 我要投稿 鞍山站长网 (https://www.0412zz.cn/)- 智能营销、数据计算、数据可视化、负载均衡、研发安全!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

那个天天12点到岗的程序员,又准点下班陪女友了?!

发布时间:2021-03-12 11:29:26 所属栏目:外闻 来源:互联网
导读:集成NCNN的缺点 直接集成NCNN熬老少男颜哇,想当年我一边泪流满面地集成,一边想用女友的SK2给自己的脸补补( 不,你没有,both SK2和女友 ),咋回事儿呢,为SqueezeNet接入NCNN,把相关的模型文件,NCNN的头文件和库,JNI调用,前处理和后处理相关业务逻辑等

集成NCNN的缺点

直接集成NCNN熬老少男颜哇,想当年我一边泪流满面地集成,一边想用女友的SK2给自己的脸补补(不,你没有,both SK2和女友),咋回事儿呢,为SqueezeNet接入NCNN,把相关的模型文件,NCNN的头文件和库,JNI调用,前处理和后处理相关业务逻辑等。把这些内容都放在SqueezeNet Sample工程里。这样简单直接的集成方法,问题也很明显,和业务耦合比较多,不具有通用性,前处理后处理都和SqueezeNcnn这个Sample有关,不能很方便地提供给其他业务组件使用。深入思考一下,如果我们把AI业务,作为一个一个单独的AI组件提供给业务的同学使用,会发生这样的情况:
 

OE SDK里的NCNN组件

有了AOE SDK,我也可以一顿操作猛如虎了!在AOE开源SDK里,我们提供了NCNN组件,下面我们从4个方面来讲一讲NCNN组件:

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

NCNN组件的设计

不懂NCNN的组件设计,即使一顿操作猛如虎,你可能最后也只有两块五。那它的组件是什么嘞?NCNN组件的设计理念是组件里不包含具体的业务逻辑,只包含对NCNN接口的封装和调用。具体的业务逻辑,由业务方在外部实现。在接口定义和设计上,我们参考了TF Lite的源码和接口设计。目前提供的对外调用接口,长这个样子:


 

  • terpreter,提供给外部调用,提供模型加载,推理这些方法。
  • NativeInterpreterWrapper是具体的实现类,里面对native进行调用。
  • Tensor,主要是一些数据和native层的交互。

AOE NCNN用的好,任务完成早,奥秘在此。

  • 支持多输入多输出。
  • 使用ByteBuffer来提升效率。
  • 使用Object作为输入和输出(实际支持了ByteBuffer和多维数组)。

光说不练假把式,AOE NCNN的实现过程,且听我细细道来。

★ 如何支持多输入多输出

为了支持多输入和多输出,我们在Native层创建了一个Tensor对象的列表,每个Tensor对象里保存了相关的输入和输出数据。Native层的Tensor对象,通过tensor_jni提供给java层调用,java层维护这个指向native层tensor的“指针”地址。这样在有多输入和多输出的时候,只要拿到这个列表里的对应的Tensor,就可以就行数据的操作了。

★ ByteBuffer的使用

ByteBuffer,字节缓存区处理子节的,比传统的数组的效率要高。

DirectByteBuffer,使用的是堆外内存,省去了数据到内核的拷贝,因此效率比用ByteBuffer要高。

当然ByteBuffer的使用方法不是我们要说的重点,我们说说使用了By

(编辑:鞍山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读