1、介绍

总览

机器学习服务(ML Kit)为开发者提供简单易用、服务多样、技术领先的机器学习能力,助力开发者更快更好地开发各类AI应用。同时,搜索服务(Search Kit)通过端侧SDK和云侧API方式,全面开放花瓣搜索能力,使能生态合作伙伴快速构建更好的移动应用搜索体验。

您将建立什么

在本次Codelab中,您将建立一个示例项目并集成ML Kit和Search Kit。在该项目中,您可以:

1、上传您的植物图片

2、通过ML Kit识别它是那种类型的植物

3、通过Search Kit向我们展示与此类植物相关的网站

您需要什么

在本codelab中,你需要学习:

1、如何在AppGallery Connect中创建项目和应用程序

2、如何集成ML Kit和Search Kit

3、如何通过ML Kit创建自定义训练模型

4、了解如何使用图像分类服务

5、如何通过Search Kit创建搜索请求

2、您需要什么

硬件需求

  • 一台笔记本或台式电脑。

  • 一部装有EMUI 5.0或以上版本的华为手机,或一部装有安卓4.4以上版本的非华为手机(部分能力仅华为手机支持)。

  • 手机用于运行和调试demo

软件需求

  • JDK版本:1.8.211或以上

  • Android Studio版本:3.X或以上

  • minSdkVersion:19或以上(必选)

  • targetSdkVersion:31(推荐)

  • compileSdkVersion:31(推荐)

  • Gradle版本:4.6或以上

必备知识

安卓应用开发基础知识

3、能力接入准备

集成前,需要完成以下准备工作:

说明:

在进行准备前,请先注册开发者帐号

  • 在AppGallery Connect中创建项目和应用。

  • 创建Android Studio项目。

  • 生成签名证书。

  • 生成签名证书指纹。

  • 在AppGallery Connect中将签名指纹添加到应用中。

  • 添加必要配置。

  • 配置项目签名。

  • 同步项目。

详情请参见HUAWEI HMS Core集成准备

4、集成HMS Core SDK

添加您应用的AppGallery Connect配置文件

  1. 登录AppGallery Connect,点击“我的项目”,在项目列表中找到并点击您的项目。

  2. 在“项目设置”页面选择“常规”页签。

  3. 在“项目”区域下点击“数据处理位置”后的“启用”。

  4. 点击“应用”区域的“agconnect-services.json”下载配置文件。

  5. 将配置文件"agconnect-services.json"复制到应用级根目录下。

添加编译依赖

  1. 打开应用级的“build.gradle”文件。

  2. 在dependencies中添加如下编译依赖。

    1. dependencies {
    2. // 导入基础ML Kit SDK
    3. Implementation 'com.huawei.hms:ml-computer-vision-classification:{version}'
    4. // 导入图片分类模型包
    5. implementation
    6. 'com.huawei.hms:ml-computer-vision-image-classification-model:{version}'
    7. //自定义模型公共SDK
    8. implementation 'com.huawei.hms:ml-computer-model-executor:{version}'
    9. //MindSpore Lite推理框架
    10. implementation 'mindspore:mindspore-lite:{version}'
    11. //Search Kit
    12. implementation 'com.huawei.hms:searchkit:{version}'
    13. }

    具体说明如下:

    1)将{version}替换为基础ML Kit SDK的最新版本号,例如com.huawei.hms:ml-computer-vision-classification:3.7.0.301。有关最新版本号的详细信息,请参见文档

    2)将{version}替换为图片分类模型包的最新版本号,例如com.huawei.hms:ml-computer-vision-image-classification-model:3.7.0.301。有关最新版本号的详细信息,请参见文档

    3)将{version}替换为自定义模型公共SDK的最新版本号,例如com.huawei.hms:ml-computer-model-executor:3.5.0.301。有关最新版本号的详细信息,请参见文档

    4)将{version}替换为Mindspore Lite的最新版本号,例如mindspore:mindspore-lite:5.0.5.300。有关最新版本号的详细信息,请参见文档

    5)将{version}替换为Search Kit的最新版本号,例如com.huawei.hms:searchkit:5.0.4.303。有关最新版本号的详细信息,请参见文档

  3. 在build.gradle文件中,设置Java源代码的兼容性模式。

    1. compileOptions {
    2. sourceCompatibility = 1.8
    3. targetCompatibility = 1.8}

  4. 在应用级build.gradle文件中设置minSdkVersion。

    1. android {
    2. ...
    3. defaultConfig {
    4. ...
    5. minSdkVersion 26
    6. ...
    7. }
    8. ...
    9. }

  5. 检查是否已添加AppGallery Connect插件。如没有,在应用级build.gradle文件中添加该插件。

    1. apply plugin: 'com.huawei.agconnect'

  6. 自动更新机器学习模型。

    在AndroidManifest.xml文件中添加以下代码。用户从华为应用市场安装应用后,机器学习模型会自动更新到用户的设备上。

    1. <manifest
    2. ...
    3. <meta-data
    4. android:name="com.huawei.hms.ml.DEPENDENCY"
    5. android:value= "label"/>
    6. ...
    7. </manifest>

  7. 配置网络权限。

    为了实现targetSdkVersion 28或更高版本的设备上支持允许HTTP网络请求,需在AndroidManifest.xml文件中配置以下信息:

    1. <application
    2. ...
    3. android:usesCleartextTraffic="true"
    4. >
    5. ...
    6. </application>

配置混淆脚本

编译APK前需要配置混淆脚本,避免混淆HMS Core SDK。如果出现混淆,HMS Core SDK可能无法正常工作。

Android Studio开发环境里的混淆脚本是“proguard-rules.pro”。

加入排除HMS SDK的混淆配置。

  1. -ignorewarnings
  2. -keepattributes *Annotation*
  3. -keepattributes Exceptions
  4. -keepattributes InnerClasses
  5. -keepattributes Signature
  6. -keepattributes SourceFile,LineNumberTable
  7. -keep class com.huawei.hianalytics.**{*;}
  8. -keep class com.huawei.updatesdk.**{*;}
  9. -keep class com.huawei.hms.**{*;}

5、设计UI

6、集成机器学习服务&创建自定义模型

步骤一:查看权限

您的应用需要获得以下权限:

步骤二:同步项目。

在Android Studio窗口中,选择“File > Sync Project with Gradle Files”,进行同步项目。

步骤三:使用MindSpore Lite创建自定义模型

机器学习服务推出的自定义模型端侧推理框架便于集成开发运行到端侧设备,通过引入此推理框架,您能够最小成本的定义自己的模型并实现模型推理。

现在,我们将使用HMS Toolkit的AI Create功能,创建我们自己的训练自定义模型。

3.1环境准备

  1. 在Coding Assistant中,选择“AI > AI Create”。迁移学习的能力,选择“Image”、“Text”或“Object”,点击“Confirm”。

    HMS Toolkit会自动下载资源,检测到有更新会有如下弹窗。

  2. 点击上图中的“Confirm”,如果没有配置Python环境,就会有如下弹窗提示下载Python。

  3. 点击上图中的链接下载并安装Python 3.7.5。

  4. Python安装完成后,请在path路径下添加Python环境变量。

  5. 打开命令行工具,输入python命令。如果查询结果为3.7.5版本,则说明设置成功。

  6. 重启IDE,再次选择“Image”、“Text”或“Object”,点击“Confirm”,会自动安装MindSpore工具。若安装失败,会有如下弹窗提示用户选择是否手动安装。点击“OK”,提示保存MindSpore安装文件。然后打开命令行工具,用pip install +”MindSpore安装文件” 进行手动安装。

3.2资源准备

使用图像分类迁移学习能力前,您需要按照要求准备用于训练的图像资源。

图像资源具体要求如下:

  • 训练图像需要按照图像进行分类,在每个分类的目录下,放入合适的清晰图像。(图像存储路径和分类名称只能包含:字母、数字、下划线和中文,不能包括空格、特殊字符等符号。)

  • 图像分类数量约束:至少需要有2个以上的图像类别,上限为1000类。

  • 每一分类图像至少包含10张图片。

  • 图像格式只能是:bmp、jpg、jpeg、png或gif。

3.3模型训练

  1. 在Coding Assistant中,选择“AI > AI Create > Image”。

  2. 设置图像训练模型的操作类型和模型部署位置,然后点击“Confirm”。

  3. 将分类好的图像文件夹拖入或添加到“Please select train image folder”,并设置生成的模型的存储路径(Output model file path)和训练参数(Train parameter)。

  4. 点击“Create Model”开始进行训练,生成图像分类识别模型。

  5. 等待模型生成后,可以查看模型学习的结果(训练精度和验证精度)、对应的学习参数和训练数据等信息。

  6. 模型训练完成后,您还可以对模型进行验证,您只需要在“Add test image”的“Please select test image folder”区域加入需要测试的图像文件夹即可。工具会自动利用训练好的模型进行测试,并显示测试结果。

  7. 现在,我们将在项目中使用的自定义训练模型已经就绪。现在,我们将学习如何将此“.ms”文件添加到我们的项目中。

步骤四:为自定义模型创建本地集成文件夹

1、将模型保存在assets目录中。

2、模型文件是不可以被压缩的,在工程的build.gradle添加如下配置来保证Gradle在构建应用时不会压缩算法模型:

  1. android {
  2. // ...
  3. aaptOptions {
  4. noCompress "ms" // Your model's file extension: "ms".
  5. }
  6. }

步骤五:将自定义模型集成到项目中

首先加载我们的自定义模型

  1. var modelExecutor: MLModelExecutor? = null
  2. private val mModelName = "flowers"
  3. private val mModelFullName = "train.ms"
  4. private fun isLoadOk(): Boolean {
  5. return loadOk
  6. }
  7. fun loadModelFromAssets() {
  8. val localModel: MLCustomLocalModel =
  9. MLCustomLocalModel.Factory(mModelName).setAssetPathFile(mModelFullName).create()
  10. val settings: MLModelExecutorSettings = MLModelExecutorSettings.Factory(localModel).create()
  11. try {
  12. modelExecutor = MLModelExecutor.getInstance(settings)
  13. loadOk = true
  14. } catch (error: MLException) {
  15. error.printStackTrace()
  16. Log.i(TAG, "executor cannot be performed" + error.toString())
  17. } }

步骤六:使用图片分类服务

让我们创建预置图片分类模型的函数。

  1. fun predict(
  2. bitmap: Bitmap?,
  3. successCallback: OnSuccessListener<MLModelOutputs?>?,
  4. failureCallback: OnFailureListener?
  5. ) {
  6. if (!isLoadOk()) {
  7. Toast.makeText(mContext, "the model does not init", Toast.LENGTH_LONG).show()
  8. return
  9. }
  10. if (bitmap == null) {
  11. Toast.makeText(mContext, "please select an image to process!", Toast.LENGTH_LONG).show()
  12. return
  13. }
  14. val inputBitmap: Bitmap = resizeBitMap(bitmap)
  15. val input = preprocess(inputBitmap)
  16. Log.d(TAG, "interpret pre process")
  17. var inputs: MLModelInputs? = null
  18. try {
  19. inputs = MLModelInputs.Factory().add(input).create()
  20. } catch (e: MLException) {
  21. Log.e(TAG, "add inputs failed! " + e.message)
  22. }
  23. var inOutSettings: MLModelInputOutputSettings? = null
  24. try {
  25. val settingsFactory: MLModelInputOutputSettings.Factory =
  26. MLModelInputOutputSettings.Factory()
  27. settingsFactory.setInputFormat(
  28. 0,
  29. MLModelDataType.FLOAT32,
  30. intArrayOf(1, BITMAP_SIZE, BITMAP_SIZE, 3)
  31. )
  32. val outputSettingsList = ArrayList<IntArray>()
  33. val outputShape = intArrayOf(1, labelList!!.size)
  34. outputSettingsList.add(outputShape)
  35. for (i in outputSettingsList.indices) {
  36. settingsFactory.setOutputFormat(i, MLModelDataType.FLOAT32, outputSettingsList[i])
  37. }
  38. inOutSettings = settingsFactory.create()
  39. } catch (e: MLException) {
  40. Log.e(TAG, "set input output format failed! " + e.message)
  41. }
  42. Log.d(TAG, "interpret start")
  43. modelExecutor?.exec(inputs, inOutSettings)?.addOnSuccessListener(successCallback)
  44. ?.addOnFailureListener(failureCallback)
  45. }

根据图片初始化输入数据。

  1. private fun preprocess(inputBitmap: Bitmap): Any {
  2. val input = Array(1) { Array(BITMAP_SIZE) { Array(BITMAP_SIZE) { FloatArray(3) } } }
  3. for (h in 0 until BITMAP_SIZE) {
  4. for (w in 0 until BITMAP_SIZE) {
  5. val pixel: Int = inputBitmap.getPixel(w, h)
  6. input[0][h][w][0] = (Color.red(pixel) - IMAGE_MEAN[0]) / IMAGE_STD[0]
  7. input[0][h][w][1] = (Color.green(pixel) - IMAGE_MEAN[1]) / IMAGE_STD[1]
  8. input[0][h][w][2] = (Color.blue(pixel) - IMAGE_MEAN[2]) / IMAGE_STD[2]
  9. }
  10. }
  11. return input
  12. }

在我们的activity中调用的预置方法。

  1. private fun runOnClick() {
  2. detector!!.predict(bitmap,
  3. { mlModelOutputs ->
  4. Log.i(TAG, "interpret get result")
  5. val result = detector!!.resultPostProcess(mlModelOutputs!!)
  6. showResult(result)
  7. }) { e ->
  8. e.printStackTrace()
  9. Log.e(TAG, "interpret failed, because " + e.message)
  10. Toast.makeText(
  11. this@MainActivity,
  12. "interpret failed, because" + e.message,
  13. Toast.LENGTH_SHORT
  14. ).show()
  15. }

7、集成搜索服务

步骤一:初始化Search Kit

在Activity中调用SearchKitInstance.init(),请参阅文档

  1. // Initialize Search Kit.
  2. // appID is obtained after your app is created in AppGallery Connect. Its value is of the String type.
  3. SearchKitInstance.init(this, appID);

步骤二:创建网页搜索

进行网页搜索前先使用WebSearchRequest构建请求对象,请参阅文档

  1. val webSearchRequest = WebSearchRequest()
  2. // Set the search keyword. (The following uses test as an example. You can set other keywords as required.)
  3. webSearchRequest.setQ(word)
  4. // Set the language for search.
  5. webSearchRequest.setLang(Language.ENGLISH)
  6. // Set the region for search.
  7. webSearchRequest.setSregion(Region.UNITEDKINGDOM)
  8. // Set the number of search results returned on a page.
  9. webSearchRequest.setPs(10)
  10. // Set the page number.
  11. webSearchRequest.setPn(1)

步骤三:设置token

Search Kit提供setInstanceCredential和setCredential两种方式(请选择一种来使用)设置token。

  1. SearchKitInstance.getInstance().setInstanceCredential(token)

创建POST请求以接收token,请参阅文档

  1. fun postVolley() {
  2. val queue = Volley.newRequestQueue(this)
  3. val url = "https://oauth-login.cloud.huawei.com/oauth2/v3/token"
  4. val stringReq: StringRequest =
  5. object : StringRequest(Method.POST, url,
  6. Response.Listener { response ->
  7. // response
  8. var strResp = response.toString()
  9. val gson = Gson()
  10. val mapType = object : TypeToken<Map<String, Any>>() {}.type
  11. var tutorialMap: Map<String, Any> =
  12. gson.fromJson(strResp, object : TypeToken<Map<String, Any>>() {}.type)
  13. tutorialMap.forEach { println(it) }
  14. var access_token = tutorialMap.getValue("access_token").toString()
  15. token = access_token
  16. Log.d("API1", access_token)
  17. Log.d("API1", strResp)
  18. },
  19. Response.ErrorListener { error ->
  20. Log.d("API", "error => $error")
  21. }
  22. ) {
  23. override fun getParams(): MutableMap<String, String> {
  24. var params: MutableMap<String, String> = HashMap<String, String>()
  25. params.put("grant_type", "client_credentials")
  26. params.put("client_id", "YOUR_CLIENT_ID")
  27. params.put(
  28. "client_secret",
  29. "YOUR_CLIENT_SECRET"
  30. )
  31. return params
  32. }
  33. }
  34. queue.add(stringReq)
  35. }

步骤四:开始网页搜索

将之前构造的webSearchRequest作为参数传递给search方法。

  1. val webSearchResponse =
  2. SearchKitInstance.getInstance().webSearcher.search(webSearchRequest)

步骤五:查看Web搜索后返回的结果

  1. for (i in webSearchResponse.getData()) {
  2. Log.i(
  3. TAG, "site_name : " + i.site_name + "\n"
  4. + "getSnippet : " + i.getSnippet() + "\n"
  5. + "siteName : " + i.siteName + "\n"
  6. + "title : " + i.title + "\n"
  7. + "clickUrl : " + i.clickUrl + "\n"
  8. + "click_url : " + i.click_url + "\n"
  9. + "getTitle : " + i.getTitle()
  10. )
  11. }

8、恭喜您

祝贺您,您已经成功完成本Codelab并学到了:

如何集成机器学习服务和搜索服务

如何创建自定义模型

9、参考文件

点击如下链接下载源码:源码下载

​欲了解更多更全技术文章,欢迎访问https://developer.huawei.com/consumer/cn/forum/?ha_source=zzh

【HMS Core】使用机器学习服务和搜索服务识别植物的更多相关文章

  1. 亚马逊云推出基于机器学习的企业搜索服务Kendra,剑指微软

    近日,在AWS re:Invent全球大会上,亚马逊发布了五项新的基于机器学习的人工智能 (AI) 服务. 这五项服务包括机器学习驱动的企业搜索.代码审核与分析.欺诈检测.医疗转录和 AI 预测的人工 ...

  2. solr服务(搜索服务)

    1   Solr实现全文搜索 1.1   Solr是什么? Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr提供了比Lucene更为丰富的 ...

  3. 华为开发者大会2022:HMS Core 3D建模服务再升级,万物皆可驱动

    11月4日,HDC2022华为开发者大会在东莞松山湖举办.在本次大会的HMS Core创新图形能力分论坛中,HMS Core重点介绍了其在3D技术领域的创新应用方向,其中3D建模服务展示了创新的自动骨 ...

  4. HMS Core机器学习服务助力Zaful用户便捷购物

    Zaful是近年来发展良好的出海电商平台,主打快时尚.在洞察其用户有购买街头海报.生活中同款衣物的需求后,Zaful联合HMS Core机器学习服务打造拍照购物服务.用户拍照后可在预设的商品图片库中搜 ...

  5. HMS Core机器学习服务图像超分能力,基于深度学习提升新闻阅读体验

    在移动端阅读资讯时,人们对高分辨率.高质量的图像要求越来越高.但受限于网络流量.存储.图片源等诸多因素,用户无法便捷获得高质量图片.移动端显示设备的高分辨率图片获得问题亟待解决.不久前,HMS Cor ...

  6. HMS Core 机器学习服务6.4.0版本更新啦,文本翻译功能增加10种小语种语言类型!

    近日,HMS Core机器学习服务(ML Kit)文本翻译功能在6.4.0版本更新中增加了10种小语种语言类型,分别是马其他语.马其顿.冰岛.乌尔都语.波斯尼亚语.乌克兰语.加泰罗尼亚语.斯洛文尼亚语 ...

  7. HMS Core 机器学习服务打造同传翻译新“声”态,AI让国际交流更顺畅

    2022年6月,HMS Core机器学习服务面向开发者提供一项全新的开放能力--同声传译,通过AI语音技术减少资源成本,加强沟通交流,旨在帮助开发者制作丰富多样的同声传译应用. HMS Core同声传 ...

  8. 从菜鸟到高手, HMS Core图像分割服务教你如何在复杂背景里精细抠图

    2021年以来,自动驾驶赛道进入爆发期,该行业成为大厂以及初创企业的必争之地.其中众多公司都采用了计算机视觉作为自动驾驶的技术底座,通过图像分割技术,汽车才能够有效理解道路场景,分清楚哪里是路,哪里是 ...

  9. 图片杂乱无章、分享麻烦?HMS Core图片分类服务教你快速筛选、分类、整合相册

    如今手机摄影越来越方便,随手一拍就能记录美好生活.但照片越多,整理越麻烦,有的时候我们想对照片进行二次加工.分享,需要不停翻找相册.HMS Core机器学习服务(ML Kit)提供了图片分类服务,方便 ...

  10. 全场景AI推理引擎MindSpore Lite, 助力HMS Core视频编辑服务打造更智能的剪辑体验

    移动互联网的发展给人们的社交和娱乐方式带来了很大的改变,以vlog.短视频等为代表的新兴文化样态正受到越来越多人的青睐.同时,随着AI智能.美颜修图等功能在图像视频编辑App中的应用,促使视频编辑效率 ...

随机推荐

  1. Windows操作系统搭建Lsky Pro

    写在前面 本文主要介绍在Windows下部署兰空图床,以及安装过程, 非Windows系统可以参考本文章的安装流程,结合自己系统版本进行部署 图床用处 图床在日常的用处非常广泛,尤其对于经常写博客的人 ...

  2. Java安全之动态加载字节码

    Java字节码 简单说,Java字节码就是.class后缀的文件,里面存放Java虚拟机执行的指令. 由于Java是一门跨平台的编译型语言,所以可以适用于不同平台,不同CPU的计算机,开发者只需要将自 ...

  3. Thinkphp6使用腾讯云发送短信步骤

    1.前提条件国内短信地址:https://console.cloud.tencent.com/smsv2 已开通短信服务,具体操作请参见 国内短信快速入门.如需发送国内短信,需要先 购买国内短信套餐包 ...

  4. [linux]非root账户 sudo cd 无法切换目录解决办法

    在Centos上有个账户A(非root),有sudo权限(权限比较大),想要用 cd 命令切换到 B账号的 /home/B 下的目录,结果没作用 [liuzz ~]$ sudo cd /home/xi ...

  5. 基于python的数学建模---分支定界算法

    zip函数 a = [1,2,3,4]b = [5,6,7,8]i = sum(x * y for x, y in zip(a, b))print(i)70 floor and ceil 函数 imp ...

  6. 单例模式实现的多种方式、pickle序列化模块、选课系统需求分析等

    目录 单例模式实现的多种方式 方式一: 方式二: 方式三 方式四 pickle序列化模块 选课系统需求分析 功能提炼 选课系统架构设计 三层架构 选课系统目录搭建 选课系统功能搭建 单例模式实现的多种 ...

  7. MySQL JDBC驱动版本与数据库版本的对应关系及注意事项

    MySQL JDBC驱动版本与数据库版本的对应关系及注意事项 事情发生 学了三遍的servlet,经典老师又教的第一万遍登陆注册,并且让实现,并且让演示,我们老师可能和之前的小学期公司老师 完全没有沟 ...

  8. Docker 工作原理分析

    docker 容器原理分析 docker 的工作方式 Namespace 容器对比虚拟机 Cgroups 容器看到的文件 Mount namespace chroot rootfs Volume(数据 ...

  9. GitOps实践之kubernetes安装argocd

    1. 什么是argocd 1.Argo CD是Kubernetes的一个声明性GitOps持续交付工具. 2.应用程序定义.配置和环境应该是声明性的和版本控制的.应用程序部署和生命周期管理应自动化.可 ...

  10. Django测试脚本-单表操作(增删改查)-必知必会13条-神奇的双下划线

    目录 一:Django测试脚本 1.测试环境准备 2.tests.py 3.models.py 4.切换MySQL数据库 二:单表操作 1.pk关键字与get关键字 2.增 3.删 4.修 三:必知必 ...