转载自 张骞晖2 的博客 Android端调用Caffe模型实现CNN分类

本文的主要内容如下。

  • 移动端的深度学习的实现方式
  • tiny-cnn介绍以及移动端移植
  • 总结与改进
  • 应用截图

一.移动端深度学习的几种实现方式

(1)Caffe的移动端编译项目

caffe(命令式框架)算是在国内最流行的深度学习开源框架,使用它进行商业,研究的人很多。对于移动端的实现,也有开源项目对caffe进行了移植。
项目连接如下:

android-lib
android-demo

我认识的很多科研院所的朋友以及百度这种大公司他们,在移动端的本地项目中也使用了caffe-android,证明了该项目有很高的实用性。当然,我认为该项目存在的问题就是模型过大,速度性能很差;当前不支持GPU,无法做到实时;caffe是个通用的框架,调用了很多库,如果只需要做cnn的话,该项目还需要自我定制和瘦身。


(2)mxnet的移动端项目

mxnet(符号式框架)主要也是几个中国人一起发起和维护的深度开源项目,足够灵活,速度足够快,扩展新的功能比较容易,内存复用,很有潜力成为未来优秀的深度项目。最关键的是,mxnet本身提供了对android,ios移动端的的支持。而且最近,mxnet已经 被 Amazon AWS 选为官方深度学习平台。

mxnet实现的简介

项目连接如下:

android-lib

android demo

本人也使用过该项目,其中的感想如下。

1) mxnet明显从本身特点就比caffe更适合移动端,因为依赖少,内存要求少,对于android性能变化大的手机,通用性更高。

2) mxnet需要先使用ndk交叉编译项目中的amalgamation,可以根据自己的需求,修改jni中的接口,然后,编译好的动态链接库替换掉android demo 中的。不过在编译过程中我遇到了很多的问题,编译成功也不是很简单的事情。

3)mxnet 提供了对caffe 模型的支持,那么即使你用caffe训练好的模型,也可以通过提供的工具讲其进行转化json格式,然后就可以在mxnet 上使用,自然也可以在移动端使用,不过我在使用过程中也遇到了一个问题,比如prelu激活函数,mxnet本身支持的,但是转化工具不支持,所以,我训练的caffe模型一直转化不成功,但是最后改了工具的源码,就解决了这个问题。当然,mxnet提供的caffe_converter是很多坑的,很多模型都转化不成功,这个如果对caffe模型很熟悉的话,这些问题也许很容易解决。

caffe_converter


(3)tensorflow的移动端项目

tensorflow是google开源的,是最有竞争力成为未来深度框架的主流。而且,对android端的支持也是官方提供的,毕竟google公司自己的os。

android build

简单总结
除了以上介绍的深度框架,还有torch

torch android

以上框架都是很流行,很通用的,自然带来的问题就是,过于庞大对于android系统来说,所以,如果要实现一个相对单一的深度算法,那么,我们必须需要对其进行瘦身。移动端,在不需要实时的项目中,对gpu的要求不高,但是如果能提供对gpu的支持,那么项目的性能自然可以提高很多,但是,大部分android端手机,gpu不支持cuda,所以以上介绍的深度框架,只能使用cpu-only模型进行前向传播,不过为了能利用到gpu,有一个解决方案是使用opencl进行gpu加速。我这个没有尝试过,有兴趣的人可以看下这个开源项目。

Opencl libdnn

当然,最新的nvidia 提供了android端的gpu开发接口。

Andorid-works

而且支持非Nvidia的Tegra处理器的Android设备和支持各个版本的Android系统。


二.tiny-cnn的移动端移植

tiny-cnn相对于上述的开源深度框架来说就小的多,而且是完全的c++11版本的卷积神经网络的实现,这个开源项目维护的人也很多,本人也参与到其中。

tiny-cnn

本人对tiny-cnn进行了android端的移植,做了开源项目,而且,本身tiny-cnn支持caffe模型的转化,所以,最新的android版本也支持了caffe模型。

开源项目地址和详细介绍如下。

cnnforandroid

tinycnn for android 的优缺点。

优缺点 内容
优点 易于理解和修改,对于小模型的支持更好。android端是完全的一个eclispe 工程,依赖库除了opencv其他基本配置好。提供了完全的jni源码;提供了对caffe模型的支持
缺点 不能很好支持大模型(需要的内存过大,例如vgg当前是跑不起来的);有些类型的层不支持,例如prelu;当前只支持cnn模型

三.专注移动端的Caffe2go项目

在手机端一直深度学习的算法,估计很多实验室和科技公司早就做了,不过很多估计是不开源的。
11月9号,贾扬清在facebook上发布了一篇文章,关于手机深度学习项目caffe2go的详细介绍和应用。项目是专门为手机定制的深度框架,是在caffe2 的基础上进行迁移的,目的就是让最普遍的智能设备——手机也能广泛高效地应用深度学习算法。

关于caffe2的,介绍:

Caffe2 is a deep learning framework made with expression, speed, and modularity in mind. It is an experimental refactoring of Caffe, and allows a more flexible way to organize computation.

Github链接:

https://github.com/caffe2/caffe2

当然,caffe2go有一下几个特点:

(1)专注手机端
之前说了,真正做到手机端是很简单的事情,关键就是技术优化。
caffe2go的给的测试是风格化转换的实时处理。关于优化,文章说明了几点。

  • 模型压缩
  • 通过使用移动 CPU 中被称为 NEON 的功能,可以显著提高运算速度
  • 模型中,优化了卷积层的数量
  • 调整了处理过程中的空间分辨率(spatial resolution),更早地使用pooling层。

有几点是很难理解的。只能等待caffe2go尽快发布。

(2)CPU而非GPU
我们都知道印象中的深度学习是离不开GPU的,及时只是运行模型,而且是实时的情况下。caffe2go在手机端,是运行在cpu下的,这就能保证了框架的普遍适用性。毕竟对于Android手机来说,并没有统一的硬件标准,也没有统一的GPU型号,所以就很难做到一个框架支持所有手机。这应该是facebook选择使用cpu而非GPU的一个原因。
关于当前主流手机的GPU型号。看一下列表。

值得注意的是,当前,嵌入式设备(Android手机等)的GPU,实际上要比CPU要慢得多。所以,估计贾应该也做了GPU的,但是效果不好,因此并没有强调。

(3)强调本地,而非云。

我们都知道,关于深度学习的处理,完全可以不通过本地调用,而是远程获取,但是通过caffe2go的目标,则与此相反。他们认为随着硬件的发展,本地的运算消耗是要比远程请求更节约时间,更方便的。


四.总结与未来改进

  • 总结

    以上提到的方式都有优缺点,可以根据自己的项目定位和需求进行选择。如果模型不大,tiny-cnn 的 android版本还是很适合的。当然,如果论未来的话,我个人比较推崇tensorflow,毕竟google是干爹。还有就是关注caffe2go开源情况。总的来说,移动平台必然是以后深度学习算法的一个广泛的应用平台。

  • 项目改进

    本人对tiny-cnn移植的工作,未来的改进,大概就是提供对更多的层的支持,以及使用opencl来进行gpu加速。整个项目,将改成makefile编译的形式。

四.应用截图

我的开源项目,提供了两个分类的例子,一个是使用tiny-cnn自己训练的模型——车标识别;一个是使用caffe训练的模型——性别识别。具体看github链接。


项目地址: cnnforandroid


转载 Android端调用Caffe模型实现CNN分类相关推荐

  1. Android端调用Caffe模型实现CNN分类

    本文的主要内容如下. 移动端的深度学习的实现方式 tiny-cnn介绍以及移动端移植 总结与改进 应用截图 一.移动端深度学习的几种实现方式 (1)Caffe的移动端编译项目 caffe(命令式框架) ...

  2. 随笔记录2、Android端调用系统分享文件记录

    Android端调用系统发送文件 效果如如下: Android 7.0以上需要适配 第一步: 1. AndroidManifest.xml中注册.provider 2. android:resourc ...

  3. android端调用芝麻信用认证相关

    芝麻信用认证的方式有两种: 芝麻信用认证官方网站 本篇文章使用的第二种方案,jar下载地址 芝麻认证逻辑大致分为三步: 1.调用芝麻验证WebAPI,获取bizNO(业务串号) 以及 merchant ...

  4. 【opencv】调用caffe、tensorflow、darknet模型

    本文参考自:opencv调用cCaffe.TensorFlow.Torch.PyTorch训练好的模型 往往,当我们训练好一个模型后,就可以通过OpenCV加载模型使用该模型,完成分类和实时预测的任务 ...

  5. 在Android中使用Android Ksoap2调用WebService

    一.WebService介绍 WebService是基于SOAP协议可实现web服务器与web服务器之间的通信,因采用SOAP协议传送XML数据具有平台无关性,也是成为解决异构平台之间通信的重要解决方 ...

  6. Android端实现深度学习

    这里截取了本人毕业设计关于移动端实现深度学习的章节.本章节将详细介绍如何实现移动端调用深度学习模型进行使用,简单来说就是两个步骤,生成可供调用的模型和调用模型.这里我们用到的人脸检测模型为第三章节训练 ...

  7. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | Android 端实现 EventChannel 通信 )

    文章目录 前言 一.Android 端 EventChannel 构造函数 二.Android 端 setStreamHandler 方法 三.Android 端实现 EventChannel 通信步 ...

  8. 【错误记录】Flutter 混合开发报错 ( Android 端与 Flutter 端 EventChannel 初始化顺序错误导致无法通信 | EventChannel 通信流程 )

    文章目录 一. 报错信息 二. Android 端与 Flutter 端 EventChannel 注册与监听流程 三. 解决方案 一. 报错信息 在 Android 端初始化 EventChanne ...

  9. android之调用webservice实现图片上传

    http://www.cnblogs.com/top5/archive/2012/02/16/2354517.html 最近boss要求做android客户端的图片上传和下载,就是调用服务器的webs ...

  10. 怎么将tflite部署在安卓上_tensorflow从训练自定义CNN网络模型到Android端部署tflite...

    网上有很多关于tensorflow lite在安卓端部署的教程,但是大多只讲如何把训练好的模型部署到安卓端,不讲如何训练,而实际上在部署的时候,需要知道训练模型时预处理的细节,这就导致了自己训练的模型 ...

最新文章

  1. VTK:可视化算法之FlyingHeadSlice
  2. linux进程互斥要点,linux进程之间互斥
  3. 用GDAL/OGR去读shapefile
  4. C++类的前向声明的学习
  5. 逗号后面统一加空格_十分钟搞定字幕,教你做加字幕的“快手菜”
  6. Halcon PDF文档(hdevelop_users_guide)学习总结之二——创建新算子
  7. Cracking The Coding Interview5.3 暂存
  8. 2014最新开源微信源码 支持二次开发,微信对接公众平台多用户程序 全面体验
  9. 每个人都应该了解的金融小知识 -- 利率计算
  10. 内网渗透-WindowsLinux痕迹清除
  11. 第二章:minio单机版,使用客户端备份文件
  12. OpenCascade Primitives BRep-Torus
  13. Facebok的动画框架pop
  14. 椭圆形印章核心算法浅析及使用GDI+绘制椭圆印章的方法
  15. 全国12315平台网上投诉与举报提示“含有不规范用语”的应对方法
  16. 零知识证明学习(三)—— 非交互式零知识证明(zkSNARKs)
  17. 手机在下载文件时乱码问题
  18. 向微信公众号文章中添加mp4、rar、zip等文件给用户下载
  19. hyper-v虚拟机常用命令
  20. Android闪闪发光字体效果

热门文章

  1. 安徽理工大学计算机设计大赛,安徽理工大学学子在2020年中国大学生计算机设计大赛中喜获佳绩...
  2. 解决Linux系统不能上网问题
  3. 学习笔记4--自动驾驶汽车感知系统
  4. 运算放大器使用注意事项
  5. 红米note5刷android,红米Note5 安卓9.0 解锁Bootloader-刷入第三方TWRP_Recovery 获取完整ROOT教程...
  6. win10升级后VMware不能使用,更新升级失败
  7. S3C2440C语言点灯
  8. Xcode真机调试 could not lunch failed to get reply to handshake packet
  9. excel 自动生成目录
  10. 机器学习 主成分分析(Principal Component Analysis)