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

Mobile-deep-learning(MDL)

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.tpcf.cn/news/226001.html

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

相关文章

联想王传东:AI PC迈入AI Ready 即将开启AI On

“AI PC已经正式迈入AI Ready 阶段,接下来会逐渐进入到AI On阶段。”12月16日,英特尔人工智能创新应用大赛启动仪式在深圳举办。作为独家AI PC合作伙伴,联想集团副总裁、中国区首席市场官王传东代表公司出席仪式并致辞。 王传东认为AI PC的发…

MySQL查询,条件查询、模糊查询、限制查询...

## 检索限制 SELECT DISTINCT event_id FROM sign_guest; # distinct作用于它后面写的所有列 SELECT * FROM sign_guest LIMIT 5; # 返回数据不多余5条 SELECT * FROM sign_guest LIMIT 2,4; # 第一个数是开始的位置,第二个数是要返回的数据条数#### 排序检索## o…

《哥德尔证明》阅读笔记——一致性问题

前言 从第一次了解到哥德尔不确定性原理时,我就被此定理的内涵和意义所吸引,也对这个定理的证明过程充满兴趣,最近闲暇时,买了这本《哥德尔证明》的书,希望理解这个意义重大的数学定理的核心,在此做一个阅…

大模型Transformer 推理 :kvCache原理浅析

大模型Transformer 推理 :kvCache原理浅析 kvCache 原理 在采样时,Transformer模型会以给定的提示/上下文作为初始输入进行推理(可以并行处理),然后逐一生成额外的标记来继续完善生成的序列(体现了模型的自回归性质)。在采样过程中,Transformer会执行自注意力操作,为…

27系列DGUS智能屏发布:可实时播放高清模拟信号摄像头视频

针对高清晰度的模拟信号摄像头视频画面的显示需求,迪文特推出27系列DGUS智能屏。该系列智能屏可适配常见的AHD摄像头、CVBS摄像头,支持单路1080P高清显示、两路720P同屏显示(同一类型摄像头)。用户通过DGUS简单开发即可实现摄像头…

【送书活动】智能汽车、自动驾驶、车联网的发展趋势和关键技术

文章目录 前言01 《智能汽车》推荐语 02 《SoC底层软件低功耗系统设计与实现》推荐语 03 《SoC设计指南》推荐语 05 《智能汽车网络安全权威指南(上册)》推荐语 06 《智能汽车网络安全权威指南(下册)》推荐语 后记赠书活动 前言 …

mac安装pnpm与使用

1、什么是pnpm? pnpm 全称 performant npm,意思是高性能的 npm。pnpm 由 npm/yarn 衍生而来,解决了 npm/yarn 内部潜在的 bug,极大的优化了性能,扩展了使用场景。被誉为 “最先进的包管理工具”。 2、pnpm特点 速度…

虚拟机启动 I/O error in “xfs_read_agi+0x95“

1.在选择系统界面按e 进入维护模式 2.找到ro把ro改成 rw init/sysroot/bin/sh 然后按Ctrlx 3.找到坏掉的分区,以nvme0n1p3为例进行修复 xfs_repair -d /dev/nvme0n1p3 4.init 6 重新启动 以下情况 先umount 再修复 则修复成功

接口测试 — 4.Requests库GET、Post请求

Requests库GET请求是使用HTTP协议中的GET请求方式对目标网站发起请求。 (不带参数的GET请求请看上一篇文章的练习) 1、Requests库待参数的GET请求 使用Get方法带参数请求时,是params参数字典,而不是data参数字典。data参数字典…

dcoker-compose一键部署EFAK —— 筑梦之路

简介 EFAK(Eagle For Apache Kafka,以前称为 Kafka Eagle)是一款由国内公司开源的Kafka集群监控系统,可以用来监视kafka集群的broker状态、Topic信息、IO、内存、consumer线程、偏移量等信息,并进行可视化图表展示。独…

Lambda 表达式的常见用法

文章目录 Lambda 表达式的常见用法使用Lambda表达式集合遍历使用Lambda表达式排序使用Lambda表达式过滤使用Lambda表达式映射使用Lambda表达式归约使用Lambda表达式分组使用Lambda表达式函数式接口的实现使用Lambda表达式线程的创建使用Lambda表达式进行Optional 操作使用Lambd…

Arduino中以太网Udp通信

目录 1、测试硬件 2、程序 (0)头文件添加 (1)变量定义 (2)初始化程序 (3)循环执行程序 3、程序下载 (1)开发板控制器和端口号选择 (2&am…

pycharm某个xxx.sh文件显示问号,无法编辑

文章目录 pycharm某个xxx.sh文件显示问号,无法编辑其他参考 pycharm某个xxx.sh文件显示问号,无法编辑 问题描述:pycharm某个xxx.sh文件显示问号,无法编辑 问题分析: pycharm无法识别文件类型。 问题解决: 在pycharm中选中该文件&#xff0…

BugKu-Web-滑稽

题目环境 持续的动态图片 F12审查元素 拿下flag:flag{595d994a34342417bfc3a3c3a23e0a48}

synchronized关键字的使用和原理

synchronized关键字的使用和原理 synchronized:对象锁,保证了临界区内代码的原子性,采用互斥的方式让同一时刻至多只有一个线程能持有对象锁,其它线程获取这个对象锁时会阻塞,保证拥有锁的线程可以安全的执行临界区内…

【Android】MVC与MVP的区别,MVP网络请求实践

一、MVC模式 目录 一、MVC模式二、MVP模式 1、MVP的简单应用 1.1 导入相关依赖包并设置权限1.2 实现Model1.2 实现Presenter1.3 实现View1.4分析项目结构和绑定过程1.5效果展示 2、MVP结合RxJava 一、MVC模式 MVC(Model(模型)——View(视图)——Controller(控制…

设计模式-状态(State)模式

目录 开发过程中的一些场景 状态模式的简单介绍 状态模式UML类图 类图讲解 适用场景 Java中的例子 案例讲解 什么是状态机 如何实现状态机 SpringBoot状态自动机 优点 缺点 与其他模式的区别 小结 开发过程中的一些场景 我们在平时的开发过程中,经常会…

【Android】在Android上使用mlKit构建人脸检测程序

在Android上构建人脸检测程序 目录 1、导入mlKit依赖包2、配置人脸检测器并且获取人脸检测器3、加载图片资源4、调用人脸检测器5、绘制矩形边框6、完整代码7、效果展示 1、导入mlKit依赖包 dependencies {// ...// Use this dependency to bundle the model with your appi…

清除某条会话的未读消息用engine.clearUnreadCount清除成功 code 是0 的情况下,重新拉取会话,还是未被清除的状态

确认调用清除未读数是否有传入时间戳 确认时间戳是否为 0 ,传入时间不可为 0 确认清除时间是否大于最新时间, 不可传入大于当前时间的时间戳 确认传入的时间是否大于要被清除的时间的 senttime 确认传入的时间是否是毫秒单位 如果需要传入最新时间可以获…

SQL连续

SQL连续 1、连续概述2、SQL连续及应用2.1、静态连续2.2、动态连续1、连续概述 连续问题是实际数据开发中比较常见的场景。例如,统计用户连续活跃天数等 SQL如何解决连续问题?本文主要介绍连续性问题,重点以常见的连续活跃场景为例,抽象出通用的连续问题解决方案。连续问题…