一、前言
如何以最低成本開發自定義深度學習模型?可以使用華為機器學習最近推出的自定義模型服務,該服務制作的模型大小可控,能夠以最小成本運行到端側。僅需要簡單的接口調用就可以進行推斷,主要支持圖片分類和文本分類處理自己定義的特定場景分類。下面以圖片分類為例讓我們來看看自定義模型的訓練和使用方法。
二、訓練和使用
1、首先通過Android Studio的Marketplace安裝HMS Toolkit,安裝完成后需重啟Android Studio。
2、通過AI Create功能完成遷移
(1)基礎配置
AI Create訓練框架采用MindSpore,推理框架采用MindSpore Lite。在Coding Assistant中,選擇“AI > AI Create”。使用遷移學習則選擇“Image”或“Text”,點擊“Confirm”。需提前安裝python環境,然后重啟IDE。再次選擇“Image”或“Text”,點擊“Confirm”,會自動安裝MindSpore工具。HMS Toolkit還提供一鍵生成模型調用的API文件和模型調用Demo示例工程的功能,方便開發者在應用程序中快速驗證和調用圖像分類AI模型。使用圖像分類遷移學習能力前,需要按照要求准備用於訓練的圖像資源。訓練圖像需要按照圖像進行分類,在每個分類的目錄下,放入合適的清晰圖像。
(2)模型訓練
圖像分類針對特定領域(如汽車、動物等)百張級數據進行分鍾級的學習訓練,自動生成圖像分類識別的新模型,該生成的新模型可以自動識別圖像所屬的類別。在Coding Assistant中,選擇“AI > AI Create > Image”,設置圖像訓練模型的操作類型和模型部署位置,然后點擊“Confirm”。Operation type(操作類型)部分固定選擇“New Model”。Model Deployment Location(模型部署位置)固定選擇“Deployment Cloud”。將分類好的圖像文件夾拖入或添加到“Please select train image folder”,並設置生成的模型的存儲路徑(Output model file path)和訓練參數(Train parameter)。訓練參數保持默認值即可。Iteration count:迭代次數,默認值為100。Learning rate:學習速率,默認值為0.01。點擊“Create Model”開始進行訓練,生成圖像分類識別模型。等待模型生成后,查看模型學習的結果(訓練精度和驗證精度)、對應的學習參數和訓練數據等信息。
(3)模型驗證
模型訓練完成后,在“Add test image”的“Please select test image folder”加入需要測試的圖像文件夾進行模型驗證。工具會自動利用訓練好的模型進行測試,並顯示測試結果。在模型訓練結果中點擊“Generate Demo”,HMS Toolkit會自動生成Demo工程,該工程自動集成了該訓練后的圖像分類識別模型,可以直接運行和編譯該Demo工程,生成APK文件在模擬器或者真實設備上運行,查看圖像分類識別的應用效果。
3、使用模型
(1)上傳模型
通過對圖片中的實體對象進行分類和添加標注信息,如:人、物、環境、活動、藝術形式等信息,幫助定義圖片題材和適用場景等。圖片分類支持端側識別和雲側識別。同時,該服務提供了預置模型能力。在華為開發者聯盟網站上,進入“我的項目”,選擇“機器學習服務 > Custom ML”進入模型上傳界面,把模型上傳到雲側。另外也可以通過該界面對已有模型進行更新。
(2)加載遠程模型
先判斷遠程模型是否已經下載完成,然后加載模型,當遠程模型未下載時加載本地模型。
localModel = new MLCustomLocalModel.Factory("localModelName")
.setAssetPathFile("assetpathname")
.create();
remoteModel =new MLCustomRemoteModel.Factory("yourremotemodelname").create();
MLLocalModelManager.getInstance()
// 判斷遠程模型是否存在。
.isModelExist(remoteModel)
.addOnSuccessListener(new OnSuccessListener<Boolean>() {
@Override
public void onSuccess(Boolean isDownloaded) {
MLModelExecutorSettings settings;
// 如果遠程模型存在,優先加載本地已有的遠程模型,否則加載本地已有的本地模型。
if (isDownloaded) {
settings = new MLModelExecutorSettings.Factory(remoteModel).create();
} else {
settings = new MLModelExecutorSettings.Factory(localModel).create();
}
final MLModelExecutor modelExecutor = MLModelExecutor.getInstance(settings);
executorImpl(modelExecutor, bitmap);
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
// 異常處理。
}
});
(3)使用模型推理器推理
設置輸入輸出格式,把圖片數據輸入到推理器,然后使用加載好的modelExecutor(MLModelExecutor) 進行推理。
private void executorImpl(final MLModelExecutor modelExecutor, Bitmap bitmap){
// 准備輸入數據。
final Bitmap inputBitmap = Bitmap.createScaledBitmap(srcBitmap, 224, 224, true);
final float[][][][] input = new float[1][224][224][3];
for (int i = 0; i < 224; i++) {
for (int j = 0; j < 224; j++) {
int pixel = inputBitmap.getPixel(i, j);
input[batchNum][j][i][0] = (Color.red(pixel) - 127) / 128.0f;
input[batchNum][j][i][1] = (Color.green(pixel) - 127) / 128.0f;
input[batchNum][j][i][2] = (Color.blue(pixel) - 127) / 128.0f;
}
}
MLModelInputs inputs = null;
try {
inputs = new MLModelInputs.Factory().add(input).create();
// 若模型需要多路輸入,您需要多次調用add()以便圖片數據能夠一次輸入到推理器。
} catch (MLException e) {
// 處理輸入數據格式化異常。
}
// 執行推理。您可以通過“addOnSuccessListener”來監聽推理成功,在“onSuccess”回調中處理推理成功。同時,可以通過“addOnFailureListener”來監聽推理失敗,在“onFailure”中處理推理失敗。
modelExecutor.exec(inputs, inOutSettings).addOnSuccessListener(new OnSuccessListener<MLModelOutputs>() {
@Override
public void onSuccess(MLModelOutputs mlModelOutputs) {
float[][] output = mlModelOutputs.getOutput(0);
// 這里推理的返回結果在output數組里,可以進一步處理。
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(Exception e) {
// 推理異常。
}
});
}
三、總結
綜上所述,利用華為的深度學習框架,通過簡單幾個步驟就可以創建和使用屬於自己業務的深度學習模型,是不是十分高效?同時,華為機器學習服務自定義模型支持包括MindSpore、TensorFlow Lite、Caffe、Onnx在內的全部主流的模型推理,轉換成MS格式后可以在端側推理框架運行。另外通過量化壓縮,可以采用更小的體積在端側部署,如果想進一步降低APK體積,也可以直接托管到雲端,通過這種方式即使不了解深度學習,也能夠快速構建特定領域的AI應用。
原文鏈接:
https://developer.huawei.com/consumer/cn/forum/topic/0204424578775070680?fid=18
作者:timer