0
本文作者: AI研習(xí)社-譯站 | 2018-07-12 18:18 |
雷鋒網(wǎng)按:本文為雷鋒字幕組編譯的技術(shù)博客,原標(biāo)題 Deploying PyTorch and Keras Models to Android with TensorFlow Mobile ,作者為 John Olafenwa 。
翻譯 | 于志鵬 整理 | MY
截止到今年,已經(jīng)有超過(guò) 20 億活躍的安卓設(shè)備。安卓手機(jī)的迅速普及很大程度上是因?yàn)楦魇礁鳂拥闹悄?app,從地圖到圖片編輯器應(yīng)有盡有。隨著深度學(xué)習(xí)的出現(xiàn),我們的手機(jī) app 將變得更加智能。下一代由深度學(xué)習(xí)驅(qū)動(dòng)的手機(jī) app 將可以學(xué)習(xí)并為你定制功能。一個(gè)很顯著的例子是「Microsoft Swiftkey」,這是一個(gè)鍵盤(pán) app, 能通過(guò)學(xué)習(xí)你常用的單詞和詞組來(lái)幫助你快速打字。
計(jì)算機(jī)視覺(jué),自然語(yǔ)言處理,語(yǔ)音識(shí)別和語(yǔ)音合成等技術(shù)能夠大大改善用戶(hù)在移動(dòng)應(yīng)用方面的體驗(yàn)。幸運(yùn)的是,在移動(dòng)應(yīng)用方面,有很多工具開(kāi)發(fā)成可以簡(jiǎn)化深度學(xué)習(xí)模型的部署和管理。在這篇文章中,我將闡釋如何用 TensorFlow mobile 將 PyTorch 和 Keras 部署到移動(dòng)設(shè)備。
用 TensorFlow mobile 部署模型到安卓設(shè)備分為三個(gè)步驟:
將你的訓(xùn)練模式轉(zhuǎn)換到 TensorFlow
在安卓應(yīng)用中添加 TensorFlow mobile 作為附加功能
在你的應(yīng)用中使用 TensorFlow 模式寫(xiě) Java 代碼執(zhí)行推理。
在這篇文章中,我將介紹整個(gè)過(guò)程,最后完成一個(gè)植入圖像識(shí)別功能的安卓應(yīng)用
安裝
本教程會(huì)用到 PyTorch 和 Keras 兩個(gè)框架-遵循下列指導(dǎo)安裝你想使用的機(jī)器學(xué)習(xí)框架。安裝哪個(gè)由你選擇。
首先,安裝 TensorFlow:
如果你是 PyTorch 的開(kāi)發(fā)者,確保你安裝的是 PyTorch 的最新版本。關(guān)于安裝 PyTorch 的指導(dǎo)文件,請(qǐng)查閱我之前的文章。
如果你是 Keras 的開(kāi)發(fā)者,使用以下命令安裝:
Android Studio(至少3.0 的版本)
https://developer.android.com/studio
將 PyTorch 模式轉(zhuǎn)成 Keras 模式
這部分僅適用于 PyTorch 開(kāi)發(fā)者。如果你使用的是 Keras,你可以跳到 “將 Keras 模式轉(zhuǎn)成 TensorFlow 模式”章節(jié)。
首先我們要做的是將我們的 PyTorch 模式參數(shù)轉(zhuǎn)成 Keras 中的同等參數(shù)。
為了簡(jiǎn)化這個(gè)過(guò)程,我創(chuàng)建了一個(gè)腳本來(lái)自動(dòng)運(yùn)行轉(zhuǎn)化。在此教程中,我們將使用 Squeezenet 。這是一種很小但具備合理精確度的移動(dòng)架構(gòu)。在這兒下載預(yù)訓(xùn)練模式(只有5M!)。
在轉(zhuǎn)權(quán)值之前,我們需要在 PyTorch 和 Keras 中定義 Squeezenet 模型。
如下圖所示,在這兩種框架下定義 Squeezenet,然后將 PyTorch 權(quán)值 轉(zhuǎn)成 Keras。
創(chuàng)建文件 convert.py,包括下面的代碼并運(yùn)行腳本。
上面是已經(jīng)轉(zhuǎn)好權(quán)值的,你所需要做的是將 Keras 模型保存為 squeezenet.h5。到這一步,我們可以?huà)仐?PyTorch 模型,繼續(xù)下一步了。
將 Keras 轉(zhuǎn)成 TensorFlow 模式
到這一步,你已經(jīng)有了 Keras 模式,無(wú)論是從 PyTorch 轉(zhuǎn)化而來(lái)的還是直接用 Keras 訓(xùn)練而獲得的。你可以在這兒下載預(yù)訓(xùn)練的 Keras Squeezenet 模式。下一步是將我們整個(gè)的模型架構(gòu)和權(quán)值轉(zhuǎn)成可運(yùn)行的 TensorFlow 模型。
創(chuàng)建一個(gè)新文件 ConvertToTensorflow.py 并添加以下代碼。
上面的代碼將我們的 squeezenet.pb 保存到了 output_dir 中。并在同一文件夾中創(chuàng)建 了 TensorBoard 事件。
為了更加清晰地理解你的模型,你可以用 TensorBoard 將它可視化。
打開(kāi)命令行并輸入
tensorboard –logdir=output_dir_path
output_dir_path 是你的 output_dir 路徑。
一旦 TensorBoard 成功啟動(dòng),你將看到提示讓你打開(kāi)如下 url COMPUTER_NAME:6006
將 URL 地址輸入到瀏覽器中,將顯示以下界面。
為了可視化你的模式,雙擊 IMPORT.
仔細(xì)看下該模型并記下輸入和輸出節(jié)點(diǎn)的名字(框架中的第一個(gè)和最后一個(gè))。
如果你的命名和我之前代碼一樣的話(huà),他們就應(yīng)該是 input_1 和output_1 。
到這一步, 我們的模型就可以調(diào)用了。
將TensorFlow Mobile 添加到你的項(xiàng)目中
TensorFlow 有 2 個(gè)針對(duì)移動(dòng)設(shè)備的庫(kù),分別是「TensorFlow Mobile」和「TensorFlow Lite.」Lite 版本設(shè)計(jì)得非常小,所有的依賴(lài)庫(kù)大約只有 1M。它的模型也更優(yōu)化。另外,在安卓 8 以上的設(shè)備中,還可以用神經(jīng)網(wǎng)絡(luò) API 加速。與「TensorFlow Mobile」不同,「TensorFlow Lite.」目前還不太完善,有些層并不能實(shí)現(xiàn)預(yù)期的效果。此外,windows 系統(tǒng)還不支持編譯庫(kù)和將模式轉(zhuǎn)成原生格式的操作。因此,在這個(gè)教程里,我堅(jiān)持用 TensorFlow Mobile.
如果沒(méi)有現(xiàn)存項(xiàng)目的話(huà),使用 Android Studio,創(chuàng)建一個(gè)新的安卓項(xiàng)目。然后添加TensorFlow Mobile 依賴(lài)庫(kù)到你的build.gradle 文件。
implementation ‘org.tensorflow:tensorflow-android:+’
Android studio 將提示你同步 gradle,點(diǎn)擊 Sync Now 等待同步完成。
到這一步項(xiàng)目就創(chuàng)建完成了。
在你的移動(dòng) App 上執(zhí)行推理
在用代碼執(zhí)行推理前,你需要將轉(zhuǎn)化的模式 (squeezenet.pb) 添加到你的應(yīng)用的資源文件夾里。
在 Android Studio 中右擊你的項(xiàng)目,鼠標(biāo)移到「添加文件夾」選項(xiàng),然后選擇「資源文件夾」。這時(shí)會(huì)在你的 app 目錄下創(chuàng)建一個(gè)資源文件夾。然后,拷貝你的模式到此目錄下。
點(diǎn)擊 here 下載標(biāo)簽類(lèi),并拷貝文件到資源目錄。
現(xiàn)在你的項(xiàng)目包含了分類(lèi)圖像的所有工具。
添加一個(gè)新的 Java 類(lèi)到你的項(xiàng)目的主包中,取名為 ImageUtils , 然后將以下代碼拷貝到其中。
如果不理解上面的代碼也沒(méi)關(guān)系,這是一些未在核心 TensorFlow-Mobile 庫(kù)中實(shí)現(xiàn)的功能。因此,在參考了一些官方樣例后,我寫(xiě)了這些代碼以方便后續(xù)工作。
在你的主活動(dòng)中,創(chuàng)建一個(gè) ImageView 和一個(gè) TextView ,這將被用來(lái)顯示圖像和其預(yù)測(cè)結(jié)果。
在你的主活動(dòng)中,你需要加載 TensorFlow-inference 庫(kù)和初始化一些類(lèi)變量。在你的 onCreate 方法前添加以下內(nèi)容:
添加一個(gè)計(jì)算預(yù)測(cè)類(lèi)的函數(shù):
添加函數(shù)來(lái)接收Image Bitmap并在其上執(zhí)行推理:
以上代碼在后臺(tái)線(xiàn)程中運(yùn)行預(yù)測(cè),并將預(yù)測(cè)的類(lèi)和它的評(píng)估得分寫(xiě)到我們之前定義的 TextView 中。
注意在主 UI 線(xiàn)程運(yùn)行推理時(shí)可能會(huì)掛起。記住一個(gè)原則 :“永遠(yuǎn)在你的后臺(tái)線(xiàn)程運(yùn)行推理!”
本教程的重點(diǎn)是圖像識(shí)別,為此我在資源文件夾中添加了一只小鳥(niǎo)的圖像。在標(biāo)準(zhǔn)應(yīng)用程序中,你要用代碼從文件系統(tǒng)加載圖像。
添加任何你想做預(yù)測(cè)的圖像到資源文件夾中。為了方便的運(yùn)行算法,在下列的代碼中,我們?cè)谝粋€(gè)按鈕上添加了一個(gè)點(diǎn)擊監(jiān)聽(tīng)。該監(jiān)聽(tīng)可以加載該圖像并調(diào)用預(yù)測(cè)功能。
很好!所有步驟都已完成!雙擊檢驗(yàn)一下,如果都沒(méi)有問(wèn)題。點(diǎn)擊「Bulid APK.」按鈕
APK很快就創(chuàng)建完成了,之后在設(shè)備上安裝并運(yùn)行App.
結(jié)果如下圖所示:
為了得到更新奇的體驗(yàn),你的 App 應(yīng)當(dāng)從安卓文件系統(tǒng)加載圖像或用攝像頭抓取圖像,而不是從資源文件夾加載。
總結(jié)
移動(dòng)端的深度學(xué)習(xí)框架將最終轉(zhuǎn)變我們開(kāi)發(fā)和使用 app 的方式。使用上述代碼,你能輕松導(dǎo)出你訓(xùn)練的 PyTorch 和 Keras 模型到 TensorFlow。運(yùn)用 TensorFlow Mobile 和這篇文章中介紹的步驟,你可以將卓越的 AI 功能完美的植入到你的移動(dòng)端應(yīng)用中。
安卓項(xiàng)目的完整代碼和模型轉(zhuǎn)換工具在我的 GitHub 上可以找到。
雷鋒網(wǎng)雷鋒網(wǎng)
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。