在开始API开发工作之前,您需要完成必要的开发准备工作,同时请确保您的工程中已经配置HMS Core SDK的maven仓地址,并且完成了本服务的SDK集成。
1. 创建图片分类分析器。可以通过图像分类自定义类MLLocalClassificationAnalyzerSetting创建分析器。
- // 方式一:端侧识别使用自定义参数配置。
- MLLocalClassificationAnalyzerSetting setting =
- new MLLocalClassificationAnalyzerSetting.Factory()
- .setMinAcceptablePossibility(0.8f)
- .create();
- MLImageClassificationAnalyzer analyzer = MLAnalyzerFactory.getInstance().getLocalImageClassificationAnalyzer(setting);
- // 方式二:端侧识别使用默认参数配置。
- MLImageClassificationAnalyzer analyzer = MLAnalyzerFactory.getInstance().getLocalImageClassificationAnalyzer();
- // 方式三:云侧识别使用自定义参数配置。
- MLRemoteClassificationAnalyzerSetting setting =
- new MLRemoteClassificationAnalyzerSetting.Factory()
- .setMinAcceptablePossibility(0.8f)
- .create();
- MLImageClassificationAnalyzer analyzer = MLAnalyzerFactory.getInstance().getRemoteImageClassificationAnalyzer(setting);
- // 方式四:云侧识别使用默认参数配置。
- MLImageClassificationAnalyzer analyzer = MLAnalyzerFactory.getInstance().getRemoteImageClassificationAnalyzer();
2. 通过android.graphics.Bitmap创建MLFrame,支持的图片格式包括:jpg/jpeg/png/bmp,建议图片尺寸不小于112*112像素。
- // 通过bitmap创建MLFrame,bitmap为输入的Bitmap格式图片数据。
- MLFrame frame = MLFrame.fromBitmap(bitmap);
3. 调用“asyncAnalyseFrame”方法进行图像分类。
- Task<List<MLImageClassification>> task = analyzer.asyncAnalyseFrame(frame);
- task.addOnSuccessListener(new OnSuccessListener<List<MLImageClassification>>() {
- @Override
- public void onSuccess(List<MLImageClassification> classifications) {
- // 识别成功。
- }
- }).addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- // 识别失败。
- // Recognition failure.
- try {
- MLException mlException = (MLException)e;
- // 获取错误码,开发者可以对错误码进行处理,根据错误码进行差异化的页面提示。错误码信息可参见:机器学习服务错误码。
- int errorCode = mlException.getErrCode();
- // 获取报错信息,开发者可以结合错误码,快速定位问题。
- String errorMessage = mlException.getMessage();
- } catch (Exception error) {
- // 转换错误处理。
- }
- }
- });
4. 识别完成,停止分析器,释放检测资源。
- try {
- if (analyzer != null) {
- analyzer.stop();
- } catch (IOException e) {
- // 异常处理。
- }
以上示例代码中使用了异步调用方式,图片分类还支持同步调用使用analyseFrame函数获取检测结果:
- SparseArray<MLImageClassification> classifications = analyzer.analyseFrame(frame);
开发者可以自行处理视频流,将视频帧转换为MLFrame对象,再按上文中静态图像检测的方法进行对象检测。如果开发者调用的是同步检测接口,也可以使用SDK内置的LensEngine类实现视频流对象检测,示例代码如下:
1. 创建图片分类分析器,只支持创建端侧图片分类分析器。
- MLImageClassificationAnalyzer analyzer = MLAnalyzerFactory.getInstance().getLocalImageClassificationAnalyzer();
2. 开发者创建识别结果处理类ClassificationAnalyzerTransactor,该类实现MLAnalyzer.MLTransactor<T>接口,使用该接口中的transactResult方法获取检测结果并实现具体业务。
- public class ClassificationAnalyzerTransactor implements MLAnalyzer.MLTransactor<MLImageClassification> {
- @Override
- public void transactResult(MLAnalyzer.Result<MLImageClassification> results) {
- SparseArray<MLImageClassification> items = results.getAnalyseList();
- // 开发者根据需要处理识别结,需要注意,这里只对检测结果进行处理,
- // 不可调用ML kit提供的其他检测相关接口。
- }
- @Override
- public void destroy() {
- // 检测结束回调方法,用于释放资源等。
}
}
3. 设置识别结果处理器,实现分析器与结果处理器的绑定。
- analyzer.setTransactor(new ClassificationAnalyzerTransactor());
4. 创建LensEngine,该类由ML SDK提供,用于捕捉相机动态视频流并传入分析器。
- Context context = this.getApplicationContext();
- this.lensEngine = new LensEngine.Creator(context, this.analyzer)
- .setLensType(LensEngine.BACK_LENS)
- .applyDisplayDimension(1440, 1080)
- .applyFps(30.0f)
- .enableAutomaticFocus(true)
- .create();
5. 调用run方法,启动相机,读取视频流,进行识别。
- // 请自行实现SurfaceView控件的其他逻辑。
- SurfaceView mSurfaceView = findViewById(R.id.surface_view);
- try {
- lensEngine.run(mSurfaceView.getHolder());
- } catch (IOException e) {
- // 异常处理逻辑。
- }
6. 检测完成,停止分析器,释放检测资源。
- if (analyzer != null) {
- try {
- analyzer.stop();
- } catch (IOException e) {
- // 异常处理。
- }
- }
- if (lensEngine != null) {
- lensEngine.release();
- }
使用视频流检测,继承MLAnalyzer.MLTransactor<T>完成检测处理结果时,如果需要实现检测到特定结果后停止检测,待特定结果处理完后继续检测的功能,可以参考视频流检测模式多次识别场景开发。