TensorFlow in Android

首先說(shuō)明以下异旧,這只是把實(shí)踐的過(guò)程敘述以下。
參考文章:在Android中借助TensorFlow使用機(jī)器學(xué)習(xí)(譯)
Android TensorFlow Machine Learning Example科學(xué)上網(wǎng)你懂的

0禾锤、前言

環(huán)境

  • 系統(tǒng):Deepin1.4 Beta
  • java版本:open jdk 1.8
  • python版本:2.7
    上述環(huán)境用于構(gòu)建bazel,bazel是tensorflow的構(gòu)建系統(tǒng)。
  • Android SDK:api 15~api 25
  • Android NDK:android-ndk-r13b-linux-x86_64
    而下面的sdk和ndk是生成安卓下的so文件和java的必須的滥搭。
    我們有so文件和java接口的文件就可以了,有興趣當(dāng)然可以去編譯以下捣鲸,感受一下瑟匆,期間會(huì)有很多wram,不過(guò)不是error就沒(méi)事啦栽惶。當(dāng)然編譯期間也很占內(nèi)存愁溜,我的8g內(nèi)存,飆到97%過(guò)了很久才下來(lái)外厂。

如果你有興趣冕象,可以下載:

SDK中的NDK在ndk-bundle文件夾下就是了,不知道的話汁蝶,在SDK下找找看吧渐扮。
bazel源碼編譯不要直接從github直接clone而是去release頁(yè)面下載论悴,直接clone會(huì)提示你去release下載編譯。源碼編譯bazel我并沒(méi)試過(guò)墓律,因?yàn)槲矣胐eb安裝成功了膀估,就沒(méi)去折騰了。bazel網(wǎng)盤中有幾個(gè)從release頁(yè)面下載的文件耻讽。

編寫app前你要如下文件:

  • 編譯出來(lái)的tensorflow的so庫(kù)
  • 編譯出來(lái)的java的jar包
  • tensorflow訓(xùn)練出來(lái)的文件
    沒(méi)有自己編譯的察纯,可以從這下載so和jar包:鏈接:https://pan.baidu.com/s/1VSxnHYyUbbFUszvSbTJokA
    官方訓(xùn)練完的文件:鏈接:http://pan.baidu.com/s/1mhPGigg 密碼:w4bx
  • so文件大小:10m左右
  • jar包大姓敕省:10k+
  • 訓(xùn)練完的文件大斜恰:50m+

所以最后安卓demo App的大小是60m+,運(yùn)行內(nèi)存是75m+(當(dāng)然不同手機(jī)可能不一樣)
總的感受是太大了慰枕。但是本地的東西也算可以了具则,一般的模式都是去服務(wù)器訪問(wèn),再把結(jié)果返回的吧捺僻。

原作者Example

點(diǎn)Detech Object進(jìn)行識(shí)別乡洼,這個(gè)模型的原理大概就是從把拍下的圖片分類到已知的類別里面去,因?yàn)樨芭鳎螺d下來(lái)的訓(xùn)練文件有個(gè)txt文件就是放這些名詞束昵。

1、安裝bazel

bazel官網(wǎng):bazel
python和jdk8自己安裝葛峻,這里不多講述锹雏。
從我上面給出的deb下載下來(lái)

sudo dpkg -i '/home/hui/Downloads/bazel_0.4.4-linux-x86_64.deb'

路徑直接把文件拉進(jìn)去。
輸入bazel有顯示bazel參數(shù)選項(xiàng)就安裝成功了术奖。

2礁遵、編譯so和jar包

首先下載tensorflow源碼,以供編譯:

git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git

修改clone 下來(lái)的TensorFlow中的WROKSPACE文件:

# Uncomment and update the paths in these entries to build the Android demo.
#android_sdk_repository(
#    name = "androidsdk",
#    api_level = 23,
#    build_tools_version = "25.0.1",
#    # Replace with path to Android SDK on your system
#    path = "<PATH_TO_SDK>",
#)
#
#android_ndk_repository(
#    name="androidndk",
#    path="<PATH_TO_NDK>",
#    api_level=14)

修改后:

# Uncomment and update the paths in these entries to build the Android demo.
android_sdk_repository(
    name = "androidsdk",
    api_level = 23,
    build_tools_version = "25.0.1",
    # Replace with path to Android SDK on your system
    path = "/home/hui/Desktop/Android/android-sdk-linux",
)

android_ndk_repository(
    name="androidndk",
    path="/home/hui/Desktop/Android/android-sdk-linux/ndk-bundle",
    api_level=15)

這個(gè)sdk沒(méi)有api 14采记,所以寫了最小的15
以下編譯命令在tensorflow根目錄執(zhí)行佣耐,文件路徑是相對(duì)于tensorflow根目錄而言
編譯so:

bazel build -c opt //tensorflow/contrib/android:libtensorflow_inference.so \
   --crosstool_top=//external:android/crosstool \
   --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
   --cpu=armeabi-v7a

編譯后文件位置:

bazel-bin/tensorflow/contrib/android/libtensorflow_inference.so

編譯jar文件:

bazel build //tensorflow/contrib/android:android_tensorflow_inference_java

編譯后文件位置:

bazel-bin/tensorflow/contrib/android/libandroid_tensorflow_inference_java.jar

我編譯jar的時(shí)候,第一失敗了唧龄,再用多一次命令就搞定了兼砖。
這樣就編譯出so和jar包了。
當(dāng)然你也可以從百度云直接下載既棺,跳過(guò)2讽挟。
windows下試了很多次的安裝bazel都是敗了,果然有些東西要在linux才是最好的丸冕。

3耽梅、下載訓(xùn)練模型和標(biāo)簽文件

這里我們用google的數(shù)據(jù)就可以,下載地址胖烛,下載后解壓可以得到imagenet_comp_graph_label_strings.txt(label for objects) and tensorflow_inception_graph.pb (pre-trained model) 兩個(gè)文件眼姐,這兩個(gè)文件放置在Android工程的Assets中即可诅迷。

4、Android demo的構(gòu)建

其實(shí)這里已經(jīng)有一個(gè)完整的demo地址妥凳,所以如果僅僅想體驗(yàn)一下機(jī)器學(xué)習(xí)竟贯,可以直接clone代碼運(yùn)行即可答捕,代碼地址逝钥。
如果要自己構(gòu)建demo,則需要引用之前生成的jar文件和so文件:

  • 引用jar:
compile files('libs/libandroid_tensorflow_inference_java.jar')

jar包放在安卓項(xiàng)目的libs文件夾下拱镐。

  • 引用so:
    新建jniLibs文件艘款,并把libtensorflow_inference.so 文件放置在jniLibs/armeabi-v7a/ 中。

在安卓項(xiàng)目的main文件夾下創(chuàng)建jniLibs/armeabi-v7a/ 沃琅,so放進(jìn)去哗咆。
同時(shí)創(chuàng)建不要包含including c++的項(xiàng)目,因?yàn)闀?huì)找不到so路徑益眉。所以普通的項(xiàng)目就行了晌柬,因?yàn)閟o是通過(guò)ndk生成的,直接放進(jìn)項(xiàng)目就可以用了郭脂,不用動(dòng)態(tài)的編譯什么的年碘。

5、自己寫項(xiàng)目(其實(shí)是復(fù)制而已)

https://github.com/MindorksOpenSource/AndroidTensorFlowMachineLearningExample
這是原作者的demo
我們也從demo靜靜的復(fù)制就行了展鸡。
放入自己編譯jar包:

放入jar包

放入自己編譯so庫(kù)文件:

放入so庫(kù)文件

放入下載訓(xùn)練文件:

導(dǎo)入訓(xùn)練文件

從demo復(fù)制兩行到String.xml:

    <string name="toggle_camera">Toggle Camera</string>
    <string name="detect_object">Detect Object</string>
復(fù)制string標(biāo)簽

復(fù)制layout和實(shí)現(xiàn)類:

主要代碼文件

將框框的4個(gè)文件直接從那個(gè)AndroidTensorFlowMachineLearningExample復(fù)制過(guò)來(lái)

build.gradle添加:

    compile files('libs/libandroid_tensorflow_inference_java.jar')
    compile 'com.flurgle:camerakit:0.9.13'
添加依賴

layout.xml會(huì)報(bào)錯(cuò)屿衅,刪除如下:

    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"

以上4行是設(shè)置外邊距而已。
編譯運(yùn)行吧莹弊。
結(jié)果是這樣的:

效果如下

的確有點(diǎn)違和感涤久。就這樣了。
寫了很拖沓忍弛,你可以去第一個(gè)參考博客看比較清晰明了响迂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市细疚,隨后出現(xiàn)的幾起案子蔗彤,更是在濱河造成了極大的恐慌,老刑警劉巖惠昔,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件幕与,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡镇防,警方通過(guò)查閱死者的電腦和手機(jī)啦鸣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)来氧,“玉大人诫给,你說(shuō)我怎么就攤上這事香拉。” “怎么了中狂?”我有些...
    開(kāi)封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵凫碌,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我胃榕,道長(zhǎng)盛险,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任勋又,我火速辦了婚禮苦掘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘楔壤。我一直安慰自己鹤啡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布蹲嚣。 她就那樣靜靜地躺著递瑰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪隙畜。 梳的紋絲不亂的頭發(fā)上抖部,一...
    開(kāi)封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音禾蚕,去河邊找鬼您朽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛换淆,可吹牛的內(nèi)容都是我干的哗总。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼倍试,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼讯屈!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起县习,我...
    開(kāi)封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤涮母,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后躁愿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體叛本,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年彤钟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了来候。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逸雹,死狀恐怖营搅,靈堂內(nèi)的尸體忽然破棺而出云挟,到底是詐尸還是另有隱情,我是刑警寧澤转质,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布园欣,位于F島的核電站,受9級(jí)特大地震影響休蟹,放射性物質(zhì)發(fā)生泄漏沸枯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一鸡挠、第九天 我趴在偏房一處隱蔽的房頂上張望辉饱。 院中可真熱鬧,春花似錦拣展、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)禽笑。三九已至陕见,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間栈拖,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留辅搬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓脖旱,卻偏偏與公主長(zhǎng)得像堪遂,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萌庆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容