快速构建ML Kit自定义模型,实现特定领域图像/文本分类

一、前言

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

二、训练和使用

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 =newMLCustomRemoteModel.Factory("yourremotemodelname").create();

   MLLocalModelManager.getInstance()

        //判断远程模型是否存在。

        .isModelExist(remoteModel)

       .addOnSuccessListener(new OnSuccessListener() {

            @Override

            public voidonSuccess(Boolean isDownloaded) {

               MLModelExecutorSettings settings;

                //如果远程模型存在,优先加载本地已有的远程模型,否则加载本地已有的本地模型。

                if(isDownloaded) {

                    settings =new MLModelExecutorSettings.Factory(remoteModel).create();

                } else {

                    settings =new MLModelExecutorSettings.Factory(localModel).create();

                }

                finalMLModelExecutor modelExecutor = MLModelExecutor.getInstance(settings);

               executorImpl(modelExecutor, bitmap);

            }

        })

       .addOnFailureListener(new OnFailureListener() {

            @Override

            public voidonFailure(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 = newMLModelInputs.Factory().add(input).create();

        //若模型需要多路输入,您需要多次调用add()以便图片数据能够一次输入到推理器。

    } catch (MLException e) {

        //处理输入数据格式化异常。

    }


// 执行推理。您可以通过“addOnSuccessListener”来监听推理成功,在“onSuccess”回调中处理推理成功。同时,可以通过“addOnFailureListener”来监听推理失败,在“onFailure”中处理推理失败。

    modelExecutor.exec(inputs,inOutSettings).addOnSuccessListener(newOnSuccessListener() {

        @Override

        public voidonSuccess(MLModelOutputs mlModelOutputs) {

            float[][] output =mlModelOutputs.getOutput(0);

                //这里推理的返回结果在output数组里,可以进一步处理。

                }

       }).addOnFailureListener(new OnFailureListener() {

        @Override

        public voidonFailure(Exception e) {

            //推理异常。

        }

    });

}

三、总结

综上所述,利用华为的深度学习框架,通过简单几个步骤就可以创建和使用属于自己业务的深度学习模型,是不是十分高效?同时,华为机器学习服务自定义模型支持包括MindSpore、TensorFlow Lite、Caffe、Onnx在内的全部主流的模型推理,转换成MS格式后可以在端侧推理框架运行。另外通过量化压缩,可以采用更小的体积在端侧部署,如果想进一步降低APK体积,也可以直接托管到云端,通过这种方式即使不了解深度学习,也能够快速构建特定领域的AI应用。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容