一、前言

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

二、训练和使用

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


华为开发者论坛
352 声望56 粉丝

华为开发者论坛是一个为开发者提供信息传播、开发交流、技术分享的交流空间。开发者可以在此获取技术干货、华为源码开放、HMS最新活动等信息,欢迎大家来交流分享!