MindSpore模型推理
生活随笔
收集整理的這篇文章主要介紹了
MindSpore模型推理
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
MindSpore模型推理
如果想在應(yīng)用中使用自定義的MindSpore Lite模型,需要告知推理器模型所在的位置。推理器加載模型的方式有以下三種:
? 加載本地模型。
? 加載遠(yuǎn)程模型。
? 混合加載本地和遠(yuǎn)程模型。
加載模型
方式一:加載并初始化本地模型。
- 加載模型。
? Assets目錄
a. MLCustomLocalModel localModel = new MLCustomLocalModel.Factory(“yourmodelname”)
b. .setAssetPathFile(“assetpathname”)
c. .create();
? 自定義目錄
. MLCustomLocalModel localModel = new MLCustomLocalModel.Factory(“yourmodelname”)
a. .setLocalFullPathFile(“sdfullpathname”)
b. .create(); - 根據(jù)模型創(chuàng)建推理器。
- final MLModelExecutorSettings settings = new MLModelExecutorSettings.Factory(localModel).create();
- final MLModelExecutor modelExecutor = MLModelExecutor.getInstance(settings);
- // 調(diào)用模型推理,實(shí)現(xiàn)細(xì)節(jié)見下節(jié)模型推理;Bitmap待處理的圖片。
- executorImpl(modelExecutor, bitmap);
方式二:加載并初始化遠(yuǎn)程模型。
加載遠(yuǎn)程模型時(shí)需先判斷遠(yuǎn)程模型是否已經(jīng)下載完成: -
final MLCustomRemoteModel remoteModel =new MLCustomRemoteModel.Factory("yourmodelname") -
.create(); -
MLLocalModelManager.getInstance() -
.isModelExist(remoteModel) -
.addOnSuccessListener(new OnSuccessListener<Boolean>() { -
@Override -
public void onSuccess(Boolean isDownload) { -
if (isDownload) { -
final MLModelExecutorSettings settings = -
new MLModelExecutorSettings.Factory(remoteModel).create(); -
final MLModelExecutor modelExecutor = MLModelExecutor.getInstance(settings); -
executorImpl(modelExecutor, bitmap); -
} -
} -
}) -
.addOnFailureListener(new OnFailureListener() { -
@Override -
public void onFailure(Exception e) { -
// 異常處理。 -
} -
});
方式三:混合加載本地和遠(yuǎn)程模型。推薦使用這種方式,此方法可以確保當(dāng)遠(yuǎn)程模型未下載時(shí)加載本地模型。
-
localModel = new MLCustomLocalModel.Factory("localModelName") -
.setAssetPathFile("assetpathname") -
.create(); -
remoteModel =new MLCustomRemoteModel.Factory("yourremotemodelname").create(); -
MLLocalModelManager.getInstance() -
// 判斷遠(yuǎn)程模型是否存在。 -
.isModelExist(remoteModel) -
.addOnSuccessListener(new OnSuccessListener<Boolean>() { -
@Override -
public void onSuccess(Boolean isDownloaded) { -
MLModelExecutorSettings settings; -
// 如果遠(yuǎn)程模型存在,優(yōu)先加載本地已有的遠(yuǎn)程模型,否則加載本地已有的本地模型。 -
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) { -
// 異常處理。 -
} -
});
模型推理器進(jìn)行推理
本章示例中的“executorImpl”方法為模型推理的詳細(xì)流程,聲明如下:
- void executorImpl(final MLModelExecutor modelExecutor, Bitmap bitmap)
以下示例會(huì)借助“executorImpl”方法詳細(xì)演示推理器調(diào)用的自定義模型推理的整個(gè)過程,此方法內(nèi)主要包含如下關(guān)鍵處理流程: - 設(shè)置輸入輸出格式。
需要知道模型的輸入輸出格式。通過MLModelInputOutputSettings.Factory把輸入輸出格式設(shè)置到模型推理器。比如,一個(gè)圖片分類模型的輸入格式為一個(gè)float類型的1x224x224x3數(shù)組(表示只推理一張大小為224x224的三通道 (RGB)圖片),輸出格式為一個(gè)長(zhǎng)度為1001的float型列表(每個(gè)值表示該圖片經(jīng)模型推理后1001個(gè)類別中各類別的可能性)。對(duì)于此模型,請(qǐng)按照以下方式設(shè)置輸入輸出格式: - inOutSettings = new MLModelInputOutputSettings.Factory()
-
.setInputFormat(0, MLModelDataType.FLOAT32, new int[] {1, 224, 224, 3}) -
.setOutputFormat(0, MLModelDataType.FLOAT32, new int[] {1, 1001}) -
.create(); - 把圖片數(shù)據(jù)輸入到推理器。
注意
當(dāng)前版本MindSpore生成的模型使用的數(shù)據(jù)格式與tflite類型的模型使用的數(shù)據(jù)格式相同,均為NHWC,caffe類型的模型使用的數(shù)據(jù)格式為NCHW。若需要將模型由caffe轉(zhuǎn)換到MindSpore,請(qǐng)?jiān)O(shè)置為NHWC格式。如下NHWC示例:1224224*3表示一張(batch N),大小為224(height H)*224(width W),3通道(channels C)的圖片。 - private void executorImpl(final MLModelExecutor modelExecutor, Bitmap bitmap){
-
// 準(zhǔn)備輸入數(shù)據(jù)。 -
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(); -
// 若模型需要多路輸入,需要多次調(diào)用add()以便圖片數(shù)據(jù)能夠一次輸入到推理器。 -
} catch (MLException e) { -
// 處理輸入數(shù)據(jù)格式化異常。 -
} - // 執(zhí)行推理。可以通過“addOnSuccessListener”來(lái)監(jiān)聽推理成功,在“onSuccess”回調(diào)中處理推理成功。同時(shí),可以通過“addOnFailureListener”來(lái)監(jiān)聽推理失敗,在“onFailure”中處理推理失敗。
-
modelExecutor.exec(inputs, inOutSettings).addOnSuccessListener(new OnSuccessListener<MLModelOutputs>() { -
@Override -
public void onSuccess(MLModelOutputs mlModelOutputs) { -
float[][] output = mlModelOutputs.getOutput(0); -
// 這里推理的返回結(jié)果在output數(shù)組里,可以進(jìn)一步處理。 -
} -
}).addOnFailureListener(new OnFailureListener() { -
@Override -
public void onFailure(Exception e) { -
// 推理異常。 -
} -
}); - }
總結(jié)
以上是生活随笔為你收集整理的MindSpore模型推理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MindSpore特性支持类
- 下一篇: MindSpore部署图像分割示例程序