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


這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章