移动端机器学习框架 MDL 简介与实践

Mobile-deep-learningMDL

MDL 是百度研发的可以部署在移动端的基于卷积神经网络实现的移动端框架,可以应用在图像识别领域。

具体应用:在手机百度 App 中,用户只需要点击自动拍开关,将手机对准物体,当手稳的时候,它会自动找到物体并进行框选,无需拍照就可以发起图像的搜索功能。

初识 MDL

运行示例程序

  1. clone 项目代码,GitHub - PaddlePaddle/Paddle-Lite: PaddlePaddle High Performance Deep Learning Inference Engine for Mobile and Edge (飞桨高性能深度学习端侧推理引擎) 
  2.  IDE 中导入 example 

  1. 运行

开发要求

  1. 安装 NDK
  2. 安装 Cmake
  3. 安装 protocol buffers

使用 MDL 库

  1. 在 mac/linux 上执行测试

# mac or linux:

./build.sh mac

cd build/release/x86/build

./mdlTest

  1. 在项目中使用mdl

开发

  1. 编译MDL源码(Android

# android:

# prerequisite: install ndk from google

./build.sh android

 cd build/release/armv-v7a/build

./deploy_android.sh

adb shell

cd /data/local/tmp

./mdlTest

  1. iOS

# ios:

# prerequisite: install xcode from apple

./build.sh ios

copy ./build/release/ios/build/libmdl-static.a to your iOS project

模型转换

MDL 需要与之兼容的模型才能使用,可以使用 MDL 提供的脚本将其他深度学习工具训练的模型转换为 MDL 模型。推荐使用 PaddlePaddle 模型。

  1. 将 PaddlePaddle 模型转换成 MDL 模式

# Environmental requirements

# paddlepaddle

cd tools/python

python paddle2mdl.py

  1. 将 caffemodel 模型转换成 MDL 模式

#Convert model.prototxt and model.caffemodel to model.min.json and data.min.bin that mdl use

./build.sh mac

cd ./build/release/x86/tools/build

# copy your model.prototxt and model.caffemodel to this path

./caffe2mdl model.prototxt model.caffemodel

# the third para is optional, if you want to test the model produced by this script, provide color value array of an image as the third parameter ,like this:

./caffe2mdl model.prototxt model.caffemodel data

# the color value should in order of rgb,and transformed according to the model.

# then you will get a new data.min.bin with test data inside

# after this command, model.min.json data.min.bin will be created in current

# some difference step you need to do if you convert caffe model to iOS GPU format

# see this:

open iOS/convert/iOSConvertREADME.md

Android Sample 分析

下面以 Android 平台为例分析 MDL 在移动端平台上面的工作

  1. 在项目中导入 libmdl.so 
  2. 初始化 mdl,加载 so 库,设置线程数量

private void initMDL() {

     String assetPath = "mdl_demo";

     String sdcardPath = Environment.getExternalStorageDirectory()

             + File.separator + assetPath;

     copyFilesFromAssets(this, assetPath, sdcardPath);

     mdlSolver = new MDL();

     try {

         String jsonPath = sdcardPath + File.separator + type.name()

                 + File.separator + "model.min.json";

         String weightsPath = sdcardPath + File.separator + type.name()

                 + File.separator + "data.min.bin";

         Log.d("mdl","mdl load "+ jsonPath + "weightpath ="+weightsPath);

         mdlSolver.load(jsonPath, weightsPath);

         if (type == mobilenet) {

             mdlSolver.setThreadNum(1);

         } else {

             mdlSolver.setThreadNum(3);

         }

     } catch (MDLException e) {

         e.printStackTrace();

     }

 }

  1. 拍摄照片

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

// save pic in sdcard 

Uri imageUri = Uri.fromFile(getTempImage());

intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);

startActivityForResult(intent, TAKE_PHOTO_REQUEST_CODE);

  1. 图像处理,包括设置采样率图像缩放
  2. 图像预测

mdlSolver.predictImage(inputData);

  1. 在MDL库中,predictImage 方法是进行图像预测的 JNI 方法。方法声明如下:

JNIEXPORT jfloatArray JNICALL Java_com_baidu_mdl_demo_MDL_predictImage(JNIEnv *env, jclass thiz, jfloatArray buf)

这里需要传入图像的3维数组结构,真正执行预测的是 Net#predict(data) 方法,Net 模块是 MDL 网络管理模块,主要负责网络中各层 Layer 的初始化及管理工作。开发者在调用预测方法的时候,只需要调用对应 java  predictImage 方法,传入图像数据即可。

  1. 预测完成,在 demo 的界面中返回预测耗时和结果。

性能和兼容性

总结

MDL 在 Android  iOS 系统上性能表现十分出色,并且 API 设计也很简单易用,也支持其他的框架模型转换。总体来讲是一个非常优秀的移动端深度学习框架。

参考:

https://github.com/baidu/mobile-deep-learning

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/279308.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机组成原理-选择语句和循环语句的汇编表示

文章目录 选择语句jmpjxx示例:选择语句的机器级表示扩展:cmp指令的底层原理 循环语句使用条件转移指令实现循环用loop指令实现循环 选择语句 不一定知道指令的位置,所以jmp直接跳转到指令的位置很难办 jmp 标号相当于位置,名字…

点燃温暖时光:探索酒精壁炉的独特历史与现代化魅力

酒精壁炉的历史可以追溯到18世纪末。最初,人们用酒精在暖炉或炉子中燃烧,以获得热量。19世纪初,法国发明家提出了利用酒精燃烧来供暖的概念。这一概念被逐渐应用于家庭取暖装置,酒精壁炉也开始在欧洲兴起。 随着科技的发展&#x…

MQTT 介绍与学习 —— 筑梦之路

之前写过的相关文章: MQTT协议(转载)——筑梦之路_mqtt url-CSDN博客 k8s 部署mqtt —— 筑梦之路-CSDN博客 CentOS 7 搭建mqtt服务——筑梦之路_腾讯云宝塔搭 centos 7.9.2009 x86_64 建标准mqtt服务器-CSDN博客 mqtt简介 MQTT&#xff…

NLP项目实战02:英文文本识别

简介: 欢迎来到本篇文章!今天我们将讨论一个新的自然语言处理任务——英文短文识别。具体而言,即通过分析输入的英文文本来判断其是比较消极的还是比较积极的。 展示: 1、项目界面 如下所示是项目启动后用户使用使用界面 2、布…

重新理解一下F.cross_entropy()的细节

最初疑问:为什么F.cross_entropy (logits,labels)里的labels为212,213,这样的标签

CSS学习

CSS学习 1. 什么是css?2.css引入方式2.1 内嵌式2.2 外联式2.3 行内式2.4 引入方式特点 3. 基础选择器3.1 标签选择器3.2 类选择器3.3 id选择器3.4 通配符选择器 4. 文字基本样式4.1 字体样式4.1.1 字体大小4.1.2 字体粗细4.1.3 倾斜4.1.4 字体4.1.5 字体font相关属性连写 4.2 …

【从零开始学习--设计模式--装饰者模式】

返回首页 前言 感谢各位同学的关注与支持,我会一直更新此专题,竭尽所能整理出更为详细的内容分享给大家,但碍于时间及精力有限,代码分享较少,后续会把所有代码示例整理到github,敬请期待。 此章节介绍装…

免费下载6G全国90米高程DEM

这里为大家分享全国90米高程原始数据。 全国90米高程DEM 90米高程数据的经纬度跨度有按30度进行分块和按5度进行分块两种,下载完成后的文件如下图所示。 30度分块与5度分块 当经纬度跨度按30度进行分块时,全国范围共分成6块,由于分块的跨度…

使用 Kubeadm 部署 Kubernetes 集群详细指南

本文中,介绍了使用 Kubeadm 部署具有一个主节点和两个工作节点的 kubernetes 集群的分步指南。 Kubeadm 是一个优秀的工具,可以在更短的时间内建立一个有效的 kubernetes 集群。它在设置所有 kubernetes 集群组件方面完成了所有繁重的工作。此外&#xf…

可回收资源的环保螺旋盖葡萄酒

在酿酒师中,选择哪种瓶盖来保存一瓶葡萄酒主要取决于葡萄酒的种类和酿酒师自己的偏好。在20世纪70年代,澳洲朋友引进并推广了一种保存葡萄酒的新方法,这种新方法螺旋盖并在70年代获得专利,投入商业使用,澳大利亚的酿酒…

linux 文本信息查询grep;控制命令执行和管道操作符号

1、grep grep "keyword" /path/to/logfile获取查询结果最后一行 grep "runs/detect/train" test4.log | tail -n 12、linux控制命令执行和管道操作符号 &、|、; 和 &&、》、>、< ##例子&#xff1b;wandb disabled && yolo …

Android Studio 软件如何将系统自带的标题栏隐藏

目录 一、实现效果 二、开发环境 三、实现方法 ①首先创建一个新的项目 ②打开你需要隐藏标题栏的Activity ③我们看下正常的显示效果 ④然后在onCreate中进行代码编写 ⑤点击运行查询看效果 三、Android Studio 模板 一、实现效果 二、开发环境 三、实现方法 在Andro…