首页 > 其他分享 >【HMS Core】使用机器学习服务和搜索服务识别植物

【HMS Core】使用机器学习服务和搜索服务识别植物

时间:2023-02-09 12:01:02浏览次数:63  
标签:Core 服务 自定义 val 模型 Kit huawei HMS com

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. 在“项目”区域下点击“数据处理位置”后的“启用”。

    cke_23502.png

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

    cke_30791.png

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

    cke_57185.png

     

添加编译依赖

  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

cke_3547.png

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”。

    cke_20885.png

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

    cke_29710.png

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

    cke_38133.png

  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安装文件” 进行手动安装。

    cke_69158.png

3.2资源准备

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

cke_87404.png

图像资源具体要求如下:

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

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

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

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

3.3模型训练

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

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

    cke_156532.png

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

    cke_166451.png

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

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

    cke_176543.png

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

    cke_187228.png

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

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

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

      cke_267402.png

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

标签:Core,服务,自定义,val,模型,Kit,huawei,HMS,com
From: https://www.cnblogs.com/developer-huawei/p/17104776.html

相关文章

  • 云服务器搭建
        ​ 首先申请一个云服务器,连接放在下方 安装ubantu16.04系统之后,用xshell登录​编辑 启动nginxservicenginxstart用命令vi/etc/nginx/nginx.con......
  • 使用nssm注册系统服务的详细方法
    对于Windows平台来说,很多软件或系统的后台服务是基于windows服务的方式运行的,它的优势是稳定可靠,有进程保护,但对于一些普通exe程序(控制台程序或带界面的windows程序)或bat文......
  • 服务网关ZUUL过滤器
    过滤器两个功能:1、其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础;2、过滤器功能则负责对请求的处理过程进行预干预,是实现请求校验、......
  • 【评测】三feng云免费云服务器
     1.服务器访问速度确实不错2.可以一直免费使用,比较适合平时开发测试使用3.客服对于问题解决及时,体验不错4.三feng云免费服务器运行稳定,性价比是同类型行服务器中较高......
  • 如何调控服务器CPU利用率的合理范围?10分钟快速掌握通用办法
     01“妄言”10分钟内调优CPU利用率绝大部分开发在面试时都会被面试官问到一个问题:“请举一个在以前工作过程中你觉得自己做的非常不错的事例”换言之:“请吹一个牛”一般人......
  • 真正“搞”懂HTTP协议11之代理服务
    代理,其实全称应该叫做代理服务器,它是客户端与服务器之间得中间层,本质上来说代理就是一个服务器,在HTTP的链路中插入的一个中间环节,就是代理服务器啦。所谓的代理服务就......
  • 高并发服务的几条优化经验 转载
    如何优化高并发服务,这里指的是qps在20万以上的在线服务,注意不是离线服务,在线服务会存哪些挑战呢?无法做离线缓存,所有的数据都是实时读的大量的请求会打到线上服务......
  • ORA-12514:TNS:监听程序当前无法识别连接描述符中请求的服务
    使用plsql13连接oracle数据库,报如下错误:   初步判断是监听程序配置出现了问题,解决方法如下:1、检查oracle的监听服务是否运行正常;1)点击键盘的win+r,输入services.ms......
  • 关于netcore webapi 前后端分离跨域配置
    最近做一个后台管理系统,但是期间遇到了跨域的问题,所以在此记录一下。这些问题都是很初级的基础知识。后台配置需要先配置指定域名跨域,这也是为了防止安全。一、关于netco......
  • 解决ie接收服务请求后,存储至本地缓存,再次接收时,直接拿取缓存非最新服务器数据,如何解决
    <!DOCTYPEhtml><html> <head> <metacharset="utf-8"> <title></title> <styletype="text/css"> #result{ width:300px; height:100px; border......