全民互联时代,即使足不出户,我们也能在朋友圈以及各大社交媒体平台纵览世界各地的风景。
你有没有过这样的尴尬。在朋友圈瞬间种草的美景、却不知道具体位置在哪里;想跟好友就分享的出游照打开话题,奈何地标知识储备不足,自行检索的操作损耗太大,转而悄悄点赞作罢……
这一切,华为机器学习服务地标识别能力都能轻松handle,开发一款地标识别应用,17000+著名地标,教你变身世界地标小百科。
地标识别服务简介
集成地标识别服务,可以获得输入图片的地标名称、经纬度、可信度等信息,可信度越高代表输入图片中的地标越有可能是识别出的地标。基于获得的信息,可以为用户创造更加个性化应用体验。目前已经支持分布在全球超过17,000处地标的识别。
地标识别服务是端侧调用云侧API进行检测,检测算法模型在云侧运行。因此,调测和使用时需保证设备可正常访问互联网。
集成准备
开发环境配置
1. 需要在华为开发者联盟上创建应用:
2. 打开机器学习服务:
3. 创建完应用之后,会自动生成agconnect-services.json文件, 需要手动将agconnect-services.json文件拷贝到应用级根目录下
4. 配置HMS Core SDK的Maven仓地址。
关于Maven仓的配置可以查看此链接:https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/config-maven-0000001050040031?ha_source=hms1
5. 集成地标识别服务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"));
}
3. 创建地标分析器,有两种方式,一种是使用默认的方式,一种是可以通过地标识别自定义参数类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);
}
4. 通过拍照或者选择相册的图片,将获取的图片转为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);
}
}
5. 获取到图片的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) {
// 转换错误处理。
}
}
});
}
运行结果
以识别上海东方明珠塔和字塔为例,可正确识别地标并返回地标名称。
其他
1. 行地标检测之前,必须设置ApiKey,进行云端的鉴权,否则,应用会报错。
2. 标检测是在云端进行的,会有一定的耗时,所以在进行地标检测的时候,最好开启遮罩层。
3. 读者对ML Kit其他模块感兴趣的话,可以查看华为ML Kit提供的相关集成文档
>>访问华为机器学习服务官网,了解更多相关内容
>>获取华为机器学习服务开发指导文档
>>华为机器学习服务开源仓库地址:GitHub、Gitee
点击右上角头像右方的关注,第一时间了解华为移动服务最新技术~