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中添加如下编译依赖。

    dependencies {
    // 导入基础ML Kit SDK
    Implementation 'com.huawei.hms:ml-computer-vision-classification:{version}'
    // 导入图片分类模型包
    implementation
    'com.huawei.hms:ml-computer-vision-image-classification-model:{version}'
    //自定义模型公共SDK
    implementation 'com.huawei.hms:ml-computer-model-executor:{version}'
    //MindSpore Lite推理框架
    implementation 'mindspore:mindspore-lite:{version}'
    //Search Kit
    implementation 'com.huawei.hms:searchkit:{version}' }

    具体说明如下:

    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源代码的兼容性模式。

    compileOptions {
    sourceCompatibility = 1.8
    targetCompatibility = 1.8}

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

    android {
    ...
    defaultConfig {
    ...
    minSdkVersion 26
    ...
    }
    ...
    }

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

    apply plugin: 'com.huawei.agconnect'

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

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

    <manifest
    ...
    <meta-data
    android:name="com.huawei.hms.ml.DEPENDENCY"
    android:value= "label"/>
    ...
    </manifest>

  7. 配置网络权限。

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

    <application
    ...
    android:usesCleartextTraffic="true"
    >
    ...
    </application>

配置混淆脚本

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

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

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

-ignorewarnings
-keepattributes *Annotation*
-keepattributes Exceptions
-keepattributes InnerClasses
-keepattributes Signature
-keepattributes SourceFile,LineNumberTable
-keep class com.huawei.hianalytics.**{*;}
-keep class com.huawei.updatesdk.**{*;}
-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在构建应用时不会压缩算法模型:

android {
// ...
aaptOptions {
noCompress "ms" // Your model's file extension: "ms".
}
}

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

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

var modelExecutor: MLModelExecutor? = null
private val mModelName = "flowers"
private val mModelFullName = "train.ms" private fun isLoadOk(): Boolean {
return loadOk
} fun loadModelFromAssets() {
val localModel: MLCustomLocalModel =
MLCustomLocalModel.Factory(mModelName).setAssetPathFile(mModelFullName).create()
val settings: MLModelExecutorSettings = MLModelExecutorSettings.Factory(localModel).create()
try {
modelExecutor = MLModelExecutor.getInstance(settings)
loadOk = true
} catch (error: MLException) {
error.printStackTrace()
Log.i(TAG, "executor cannot be performed" + error.toString())
} }

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

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

fun predict(
bitmap: Bitmap?,
successCallback: OnSuccessListener<MLModelOutputs?>?,
failureCallback: OnFailureListener?
) {
if (!isLoadOk()) {
Toast.makeText(mContext, "the model does not init", Toast.LENGTH_LONG).show()
return
}
if (bitmap == null) {
Toast.makeText(mContext, "please select an image to process!", Toast.LENGTH_LONG).show()
return
}
val inputBitmap: Bitmap = resizeBitMap(bitmap)
val input = preprocess(inputBitmap)
Log.d(TAG, "interpret pre process")
var inputs: MLModelInputs? = null
try {
inputs = MLModelInputs.Factory().add(input).create()
} catch (e: MLException) {
Log.e(TAG, "add inputs failed! " + e.message)
}
var inOutSettings: MLModelInputOutputSettings? = null
try {
val settingsFactory: MLModelInputOutputSettings.Factory =
MLModelInputOutputSettings.Factory()
settingsFactory.setInputFormat(
0,
MLModelDataType.FLOAT32,
intArrayOf(1, BITMAP_SIZE, BITMAP_SIZE, 3)
)
val outputSettingsList = ArrayList<IntArray>()
val outputShape = intArrayOf(1, labelList!!.size)
outputSettingsList.add(outputShape)
for (i in outputSettingsList.indices) {
settingsFactory.setOutputFormat(i, MLModelDataType.FLOAT32, outputSettingsList[i])
}
inOutSettings = settingsFactory.create()
} catch (e: MLException) {
Log.e(TAG, "set input output format failed! " + e.message)
}
Log.d(TAG, "interpret start")
modelExecutor?.exec(inputs, inOutSettings)?.addOnSuccessListener(successCallback)
?.addOnFailureListener(failureCallback)
}

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

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

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

private fun runOnClick() {
detector!!.predict(bitmap,
{ mlModelOutputs ->
Log.i(TAG, "interpret get result")
val result = detector!!.resultPostProcess(mlModelOutputs!!)
showResult(result)
}) { e ->
e.printStackTrace()
Log.e(TAG, "interpret failed, because " + e.message)
Toast.makeText(
this@MainActivity,
"interpret failed, because" + e.message,
Toast.LENGTH_SHORT
).show()
}

7、集成搜索服务

步骤一:初始化Search Kit

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

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

步骤二:创建网页搜索

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

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

步骤三:设置token

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

SearchKitInstance.getInstance().setInstanceCredential(token)

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

fun postVolley() {
val queue = Volley.newRequestQueue(this)
val url = "https://oauth-login.cloud.huawei.com/oauth2/v3/token" val stringReq: StringRequest =
object : StringRequest(Method.POST, url,
Response.Listener { response ->
// response
var strResp = response.toString() val gson = Gson()
val mapType = object : TypeToken<Map<String, Any>>() {}.type var tutorialMap: Map<String, Any> =
gson.fromJson(strResp, object : TypeToken<Map<String, Any>>() {}.type)
tutorialMap.forEach { println(it) }
var access_token = tutorialMap.getValue("access_token").toString()
token = access_token
Log.d("API1", access_token)
Log.d("API1", strResp) },
Response.ErrorListener { error ->
Log.d("API", "error => $error")
}
) {
override fun getParams(): MutableMap<String, String> {
var params: MutableMap<String, String> = HashMap<String, String>()
params.put("grant_type", "client_credentials")
params.put("client_id", "YOUR_CLIENT_ID")
params.put(
"client_secret",
"YOUR_CLIENT_SECRET"
)
return params
}
}
queue.add(stringReq)
}

步骤四:开始网页搜索

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

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

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

for (i in webSearchResponse.getData()) {
Log.i(
TAG, "site_name : " + i.site_name + "\n"
+ "getSnippet : " + i.getSnippet() + "\n"
+ "siteName : " + i.siteName + "\n"
+ "title : " + i.title + "\n"
+ "clickUrl : " + i.clickUrl + "\n"
+ "click_url : " + i.click_url + "\n"
+ "getTitle : " + i.getTitle()
) }

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. 深入理解Golang 闭包,直通面试

    大家好 今天为大家讲解的面试专题是: 闭包. 定义 闭包在计算机科学中的定义是:在函数内部引用了函数内部变量的函数. 看完定义后,我陷入了沉思...确实,如果之前没有接触过闭包或者对闭包不理解的话,这 ...

  2. Python: 对程序做性能分析及计时统计

    1.对整个程序的性能分析 如果只是想简单地对整个程序做计算统计,通常使用UNIX下的time命令就足够了. (base) ➜ Learn-Python time python someprogram. ...

  3. java 运用jxl 读取和输出Excel

    文章结尾源码以及jxl包 1.输出excel: package JmExcel; import java.io.File; import java.io.FileOutputStream; impor ...

  4. jmeter 从多个数中随机取一个值的方法

    问题描述:使用jmeter进行接口测试时,遇到枚举值(如:10代表闲置.15代表使用中.20代表维修等)我们需要随机取一个类型传到接口中. 解决思路:通过函数助手查找随机函数,找到__chooseRa ...

  5. 【vue3】element-plus,Checkbox-Group多选框之绑定选中数据不选中问题

    今天记录一下在新项目vue3中,使用的element-plus组价库遇到的一个问题!场景如下:有一个表格的column绑定的数组对象,我需要对表格的头部实现动态可配置显示表格列,由于绑定的column ...

  6. 数据结构学习——BST删除特定节点

    BST删除特定节点 前言 一个平常的星期三晚上,一节通选课中,在老师放的视频和极寒空调的折磨之下,想着做点别的什么的我,打开了博客园.想起来做题下午数据结构课中老师最后在讲BST删除节点的操作,并且以 ...

  7. 使用PyLint分析评估代码质量

    什么是PyLint PyLint是一款用于评估Python代码质量的分析工具,它诞生于2003年,其最初十年的主要作者和维护者是Sylvain Thénault.PyLint可以用来检查代码是否错误. ...

  8. jmeter 之性能分布式压测

    背景: 当并发量达到一定数量时,单台测试设备不足以支撑,甚至会出现内存溢出等情况,解决这个问题就可用分布式测试,使用多台测试设备来达到更大的用户并发数. 原理: 1.一台设备作为调度机(master) ...

  9. sha1_b64_scrape

    过无限debugger:https://www.cnblogs.com/hkwJsxl/p/16702143.html 网站 aHR0cHM6Ly9hbnRpc3BpZGVyOC5zY3JhcGUuY ...

  10. 用 while 生成猜数字

    import java.util.Random; import java.util.Scanner; public class zy2 { public static void main(String ...