一、前言
如何以最低成本开发自定义深度学习模型?可以使用华为机器学习最近推出的自定义模型服务,该服务制作的模型大小可控,能够以最小成本运行到端侧。仅需要简单的接口调用就可以进行推断,主要支持图片分类和文本分类处理自己定义的特定场景分类。下面以图片分类为例让我们来看看自定义模型的训练和使用方法。
二、训练和使用
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应用。
作者:timer