17000+著名地标轻松认,机器学习助你变身世界名胜小百科

全民互联时代,即使足不出户,我们也能在朋友圈以及各大社交媒体平台纵览世界各地的风景。
你有没有过这样的尴尬。在朋友圈瞬间种草的美景、却不知道具体位置在哪里;想跟好友就分享的出游照打开话题,奈何地标知识储备不足,自行检索的操作损耗太大,转而悄悄点赞作罢……
这一切,华为机器学习服务地标识别能力都能轻松handle,开发一款地标识别应用,17000+著名地标,教你变身世界地标小百科。

地标识别服务简介

集成地标识别服务,可以获得输入图片的地标名称、经纬度、可信度等信息,可信度越高代表输入图片中的地标越有可能是识别出的地标。基于获得的信息,可以为用户创造更加个性化应用体验。目前已经支持分布在全球超过17,000处地标的识别。
地标识别服务是端侧调用云侧API进行检测,检测算法模型在云侧运行。因此,调测和使用时需保证设备可正常访问互联网。

image

集成准备

开发环境配置

  1. 需要在华为开发者联盟上创建应用:
    image

此步骤具体可以参考链接:https://developer.huawei.com/consumer/cn/doc/development/AppGallery-connect-Guides/agc-get-started#createproject?ha_source=hms1

  1. 打开机器学习服务:
    image

具体开启步骤可以参考链接:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/enable-service-0000001050038078-V5?ha_source=hms1

  1. 创建完应用之后,会自动生成agconnect-services.json文件, 需要手动将agconnect-services.json文件拷贝到应用级根目录下
    image
    image

  2. 配置HMS Core SDK的Maven仓地址。
    关于Maven仓的配置可以查看此链接:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/config-maven-0000001050040031?ha_source=hms1

  3. 集成地标识别服务SDK
    在app目录下的build.gradle文件中配置相应的sdk
    // 引入地标识别服务SDK implementation 'com.huawei.hms:ml-computer-vision-cloud:2.0.5.304'

根据实际情况声明AGC插件配置,有两种方式
apply plugin: 'com.android.application' apply plugin: 'com.huawei.agconnect'
或者
plugins { id 'com.android.application' id 'com.huawei.agconnect' }

应用开发编码阶段

  1. 取得 相机 权限,便于拍照和选择照片
    设置静态权限(必须)
    <uses-permission android:name="android.permission.CAMERA" />
    动态权限获取(必须)
    ActivityCompat.requestPermissions( this, new String[]{Manifest.permission. CAMERA }, 1);
  2. 设置ApiKey,因为此服务需要在云端进行检测,所以需要通过APIKey设置云端鉴权信息,此处必须设置,否则程序运行时会报错。
//设置应用访问云服务的ApiKey。
private void setApiKey() {
//解析agconnect-services.json文件,以便获取此文件中的信息
AGConnectServicesConfig config = AGConnectServicesConfig.fromContext(getApplication());
//设置ApiKey
MLApplication.getInstance().setApiKey(config.getString("client/api_key"));

    }
  1. 创建地标分析器,有两种方式,一种是使用默认的方式,一种是可以通过地标识别自定义参数类MLRemoteLandmarkAnalyzerSetting创建分析器。
// 方式1:使用默认的参数配置。
MLRemoteLandmarkAnalyzer analyzer = MLAnalyzerFactory.getInstance().getRemoteLandmarkAnalyzer();
// 方式2:使用自定义的参数配置。

/**
 * 使用自定义的参数配置。
 * setLargestNumOfReturns 识别结果的最大数量。
 * setPatternType  分析器使用的模式。
 * MLRemoteLandmarkAnalyzerSetting.STEADY_PATTERN:值为1,即稳定模式。
 * MLRemoteLandmarkAnalyzerSetting.NEWEST_PATTERN:值为2,即最新模式。
 */
private void initLandMarkAnalyzer() {
    settings = new MLRemoteLandmarkAnalyzerSetting.Factory()
            .setLargestNumOfReturns(1)
            .setPatternType(MLRemoteLandmarkAnalyzerSetting.STEADY_PATTERN)
            .create();
    analyzer = MLAnalyzerFactory.getInstance().getRemoteLandmarkAnalyzer(settings);
}
  1. 通过拍照或者选择相册的图片,将获取的图片转为Bitmap类型,此步骤需要接入方自己实现,地标识别SDK没有提供此能力。
//选择图片
private void selectLocalImage() {
    Intent intent = new Intent(Intent.ACTION_PICK, null);
    intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
    startActivityForResult(intent, REQUEST_SELECT_IMAGE);
}

在回调方法中开启检测地标的服务

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //图片选择成功
    if (requestCode == REQUEST_SELECT_IMAGE && resultCode == RESULT_OK) {
        if (data != null) {
            //通过getData()方法 拿到imageUri
            imageUri = data.getData();
//BitmapUtils类需要接入方自己实现,可以通过uri得到Bitmap对象 bitmap = BitmapUtils.loadFromPath(this, imageUri, getMaxWidthOfImage(), getMaxHeightOfImage());
        }
        //开始地标的检测
        startAnalyzerImg(bitmap);
    }
}
  1. 获取到图片的bitmap对象之后,就可以进行地标的检测了, 因为地标的检测是在云测进行的,如果网络不好的情况下,数据传输比较慢,所以建议在检测之前,开启遮罩层。
//开始检测地标
private void startAnalyzerImg(Bitmap bitmap) {
    if (imageUri == null) {
        return;
    }
    //开启遮罩层
    progressBar.setVisibility(View.VISIBLE);
    img_analyzer_landmark.setImageBitmap(bitmap);

    //通过android.graphics.Bitmap构造MLFrame,支持的图片格式包括:jpg/jpeg/png/bmp,建议图片尺寸不小于640*640像素。
    MLFrame mlFrame = new MLFrame.Creator().setBitmap(bitmap).create();
    Task<List<MLRemoteLandmark>> task = analyzer.asyncAnalyseFrame(mlFrame);
    task.addOnSuccessListener(new OnSuccessListener<List<MLRemoteLandmark>>() {
        public void onSuccess(List<MLRemoteLandmark> landmarkResults) {
            progressBar.setVisibility(View.GONE);
            // 识别成功的处理逻辑。
            Log.d("BitMapUtils", landmarkResults.get(0).getLandmark());
        }
    }).addOnFailureListener(new OnFailureListener() {
        public void onFailure(Exception e) {
            progressBar.setVisibility(View.GONE);
            // 识别失败的处理逻辑。
            // Recognition failure.
            try {
                MLException mlException = (MLException) e;
                // 获取错误码,开发者可以对错误码进行处理,根据错误码进行差异化的页面提示。
                int errorCode = mlException.getErrCode();
                // 获取报错信息,开发者可以结合错误码,快速定位问题。
                String errorMessage = mlException.getMessage();
                //将错误码和错误信息 以日志的形式打印出来
                Log.d("BitMapUtils", "errorCode: " + errorCode + "; errorMessage: " + errorMessage);
            } catch (Exception error) {
                // 转换错误处理。
            }
        }
    });
}

运行结果

以识别上海东方明珠塔和字塔为例,可正确识别地标并返回地标名称。
image

其他

  1. 行地标检测之前,必须设置ApiKey,进行云端的鉴权,否则,应用会报错。
  2. 标检测是在云端进行的,会有一定的耗时,所以在进行地标检测的时候,最好开启遮罩层。
  3. 读者对ML Kit其他模块感兴趣的话,可以查看华为ML Kit提供的相关集成文档

访问华为机器学习服务官网,了解更多相关内容
获取华为机器学习服务开发指导文档
华为机器学习服务开源仓库地址:GitHubGitee

posted @ 2021-06-22 19:09  HarmonyOS_SDK  阅读(176)  评论(0编辑  收藏  举报