MDL调研

2020-04-03  本文已影响0人  卡路fly

MDL介绍

在移动端应用深度学习技术比较典型的就是 CNN(Convolutional Neural Network)技术,即常被人提起的卷积神经网络。mobile-deep-learning(MDL)是一个基于卷积神经网络实现的移动端框架。

移动端应用深度学习应用

移动端应用深度学习难点

面对各种机型和硬件、手机的指标要求,如何使神经网络技术稳定高效运转是最大的考验,移动端与服务器端进行对比更容易呈现问题和难点。

服务端 移动端
内存 弱限制 内存有限
耗电量 不限制 严格限制
依赖库体积 不限制 强限制
模型体积模型大小 常规模型体积200M起 不宜超过10M
性能 服务器端强大 GPU BOX 移动端 CPU 和 GPU

MDL框架设计

可扩展性

对 layer 层进行了抽象,可以根据模型的需要,自定义实现特定类型的层,通过添加不同类型的层实现对更多网络模型的支持,而不需要改动其他位置的代码;

鲁棒性

MDL 通过反射机制,将 C++ 底层异常抛到应用层,应用层通过捕获异常对异常进行相应处理,如通过日志收集异常信息、保证软件可持续优化等;

兼容性

MDL 不支持模型训练能力。提供 Caffe 模型转 MDL 的工具脚本,可以通过一行命令完成模型的转换及量化过程,会陆续支持 PaddlePaddle、TensorFlow 等模型转 MDL,兼容更多种类的模型。

MDL总体架构

MDL 框架的总体架构设计图

MDL 框架主要包括模型转换模块(MDL Converter)、模型加载模块(Loader)、网络管理模块(Net)、矩阵运算模块(Gemmers)及供 Android 端调用的 JNI 接口层(JNI Interfaces)。

MDL使用

简单地使用和部署神经网络,如果使用基本功能则不需要进行过多配置和修改,只需要关注具体业务实现、如何使用即可。
支持手机平台交叉编译同时,也支持 Linux 和 Mac 的 x86 平台编译,在调整深度学习代码的同时可以直接在工作电脑上编译运行,而不需要部署到 arm 平台。

# mac or linux:
./build.sh mac
 cd build/release/x86/build
./mdlTest

MDL性能及兼容性

同类框架对比

Caffe2 TensorFlown cnn MDL(CPU) MDL(GPU)
硬件 CPU CPU CPU CPU GPU
速度 极快
体积
兼容 Android&iOS Android&iOS Android&iOS Android&iOS iOS

兼容性

MDL 在 iOS 和 Android 平台均可以稳定运行,其中 iOS10 及以上平台有基于 GPU 运算的 API,性能表现非常出色,在 Android 平台则是纯 CPU 运行。高中低端机型运行状态和手机百度及其他 App 上的覆盖都有绝对优势。
MDL 同时也支持 Caffe 模型直接转换为 MDL 模型。

MDL特性


为了让 MDL 体积进一步缩小,MDL 并未使用 protobuf 做为模型配置存储,而是使用了** Json 格式**。目前 MDL 支持 Caffe 模型转换到 MDL 模型,未来会支持全部主流模型转换为 MDL 模型。

随着移动端设备运算性能的提升,GPU 在未来移动端运算领域将会承担非常重要的角色。


应用于HI

以上的一大堆优点,让人对MDL充满了期待,顺利(经过了各种配置,一点也不顺利)运行Demo

然而……

于是我屁颠屁颠的去了PaddlePaddle

新手入门,安装配置各种,追随着指引,来到了Docker

然后……

MDL框架的使用需要根据源码进行修改,需要自己搞模型进行训练等。


image.png

在GitHub上所提供的Demo中,只对物体的识别进行了简单的处理,也就是把物体圈出来。

public class MDL {
    /**
     * load model descrition
     *
     * @param modelPath
     * @param weightsPath
     * @return
     */
    public static native boolean load(String modelPath, String weightsPath) throws MDLException;

    public static native void setThreadNum(int num) throws MDLException;

    /**
     * object detection
     *
     * @param buf
     * @return
     */
    public static native float[] predictImage(float[] buf)  throws MDLException;

    /**
     * clear memory
     * @throws MDLException
     */
    public static native void clear()  throws MDLException;
}

因此将MDL接入HI的难度较大,需要相应的JNI接口,二维码数据集进行识别训练。但是,最大的问题是,并不能看懂深度学习的相关内容……

上一篇 下一篇

猜你喜欢

热点阅读