超简单集成HMS Core ML Kit场景识别,构建相册管理新模式

前言

“给你看下我之前去景区玩拍的照片,可好看了”
“嗯嗯,快分享下”
……(时间分割线)
“照片呢,还没找到吗”
“等会啊,手机太多照片了,给我点时间找找”
这是不是很多人的常态?
看着手机里上百张甚至上千张照片,想要找到某张特定的照片,简直堪比海底捞针,费时又费力。难道只能在相册里从头到尾浏览一遍,不能按照照片中物品类别查找吗?
当然可以了,华为机器学习服务场景识别功能就可以通过识别、标签图片中的物品,将照片精准分类,建立智能相册。有了这个功能,我们就可以快速定位、查找目标照片。

功能特性

华为场景识别服务支持对图片的场景内容进行分类并添加标注信息,如美食、花朵、绿植、猫、狗、厨房、山峰、洗衣机等102种场景,并基于识别到的信息,构建更智能的相册应用体验。
场景识别具有以下功能特性:
多类场景识别
支持102种场景的识别,并持续增加。
识别准确率高
可识别多种物品、场景,识别准确率高。
识别响应速度快
毫秒级响应速度,并不断优化性能表现。
集成简单高效
提供API接口和SDK包,方便客户集成,操作简单,减少开发成本。

应用场景

场景识别除了应用于建立智能相册、照片检索和分类外,还可以识别拍摄场景自动选择相应的场景滤镜和相机参数,帮助用户拍摄出更好看的照片。

开发代码

1 开发准备工作

1.1 配置AppGallery Connect。

在开发应用前,需要在AppGallery Connect中配置相关信息。
具体操作步骤,请参考下方链接:
https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides-V5/config-agc-0000001050990353-V5

1.2 配置HMS Core SDK的Maven仓地址,并完成本服务的SDK集成。

(1)打开Android Studio****项目级“build.gradle”文件。

1.png

(2)添加HUAWEI agcp插件以及Maven代码库。
在“allprojects > repositories”中配置HMS Core SDK的Maven仓地址。
在“buildscript > repositories”中配置HMS Core SDK的Maven仓地址。
如果App中添加了“agconnect-services.json”文件则需要在“buildscript > dependencies”中增加agcp配置。

buildscript {
    repositories {
        google()
        jcenter()
        maven {url 'https://developer.huawei.com/repo/'}
    }
    dependencies {
        ...
        classpath 'com.huawei.agconnect:agcp:1.4.1.300'
    }
}
 
allprojects {
    repositories {
        google()
        jcenter()
        maven {url 'https://developer.huawei.com/repo/'}
    }
} 

2 开发代码

静态图片检测

2.1 创建场景识别检测器实例。
// 方式1:使用默认的参数配置。
MLSceneDetectionAnalyzer analyzer = MLSceneDetectionAnalyzerFactory.getInstance().getSceneDetectionAnalyzer();
// 方式2:按自定义配置创建场景识别分析器实例。
MLSceneDetectionAnalyzerSetting setting = new MLSceneDetectionAnalyzerSetting.Factory()
     // 设置场景识别可信度阈值。
     .setConfidence(confidence)
     .create();
MLSceneDetectionAnalyzer analyzer = MLSceneDetectionAnalyzerFactory.getInstance().getSceneDetectionAnalyzer(setting);
2.2 通过android.graphics.Bitmap构造MLFrame,支持的图片格式包括:jpg/jpeg/png/bmp。
MLFrame frame = new MLFrame.Creator().setBitmap(bitmap).create();
2.3 进行场景识别。
// 方式1:同步识别。
SparseArray results = analyzer.analyseFrame(frame);
// 方式2:异步识别。
Task> task = analyzer.asyncAnalyseFrame(frame);
task.addOnSuccessListener(new OnSuccessListener>() {
    public void onSuccess(List result) {
        // 场景识别成功的处理逻辑。
    }})
    .addOnFailureListener(new OnFailureListener() {
        public void onFailure(Exception e) {
            // 场景识别识别失败的处理逻辑。
            // failure.
            if (e instanceof MLException) {
                MLException mlException = (MLException)e;
                // 获取错误码,开发者可以对错误码进行处理,根据错误码进行差异化的页面提示。
                int errorCode = mlException.getErrCode();
                // 获取报错信息,开发者可以结合错误码,快速定位问题。
                String errorMessage = mlException.getMessage();
            } else {
                // 其他异常。
        }
    }
});
2.4 检测完成,停止分析器,释放检测资源。
if (analyzer != null) {
    analyzer.stop();
}

视频流检测

开发者可以自行处理视频流,将视频流转化为MLFrame对象,再按静态图像检测的方法进行场景识别。
如果开发者调用的是同步检测接口,也可以使用SDK内置的LensEngine类实现视频流场景识别。示例代码如下:

3.1 创建场景识别分析器,只支持创建端侧场景识别分析器。
MLSceneDetectionAnalyzer analyzer = MLSceneDetectionAnalyzerFactory.getInstance().getSceneDetectionAnalyzer();
3.2 开发者创建识别结果处理类“SceneDetectionAnalyzerTransactor”,该类实现MLAnalyzer.MLTransactor接口,使用该接口中的transactResult方法获取检测结果并实现具体业务。
public class SceneDetectionAnalyzerTransactor implements MLAnalyzer.MLTransactor {
    @Override
    public void transactResult(MLAnalyzer.Result results) {
        SparseArray items = results.getAnalyseList();
        // 开发者根据需要处理识别结果,需要注意,这里只对检测结果进行处理。
        // 不可调用ML Kit提供的其他检测相关接口。
    }
    @Override
    public void destroy() {
        // 检测结束回调方法,用于释放资源等。
    }
}
3.3 设置识别结果处理器,实现分析器与结果处理器的绑定。
analyzer.setTransactor(new SceneDetectionAnalyzerTransactor());
// 创建LensEngine,该类由ML Kit SDK提供,用于捕捉相机动态视频流并传入分析器。
Context context = this.getApplicationContext();
LensEngine lensEngine = new LensEngine.Creator(context, this.analyzer)
    .setLensType(LensEngine.BACK_LENS)
    .applyDisplayDimension(1440, 1080)
    .applyFps(30.0f)
    .enableAutomaticFocus(true)
    .create();
3.4 调用run方法,启动相机,读取视频流,进行识别。
// 请自行实现SurfaceView控件的其他逻辑。
SurfaceView mSurfaceView = findViewById(R.id.surface_view);
try {
    lensEngine.run(mSurfaceView.getHolder());
} catch (IOException e) {
    // 异常处理逻辑。
}
3.5 检测完成,停止分析器,释放检测资源。
if (analyzer != null) {
    analyzer.stop();
}
if (lensEngine != null) {
    lensEngine.release();
}

DEMO展示

图片描述

毫秒级识别图片中的绿植、蓝天、山峰等场景,识别高效快速准确。大家有兴趣也可以集成体验下。


更详细的开发指南和服务信息,请参考华为开发者联盟网站:
https://developer.huawei.com/consumer/cn/hms/huawei-mlkit

你可能感兴趣的:(超简单集成HMS Core ML Kit场景识别,构建相册管理新模式)