在开始API开发工作之前,您需要完成必要的开发准备工作,同时请确保您的工程中已经配置HMS Core SDK的maven仓地址,并且完成了本服务的SDK集成。
1. 创建图像分割器。
集成人像分割模型包
- // 方式一:使用默认参数配置图像分割检测器。
- // 默认模式为:人像分割模式 + 精度模式,返回人像分割的所有分割结果(像素级标记信息、背景透明的人像图、人像为白色,背景为黑色的灰度图以及被分割的原图)。
- MLImageSegmentationAnalyzer analyzer = MLAnalyzerFactory.getInstance().getImageSegmentationAnalyzer();
- // 方式二:使用自定义参数MLImageSegmentationSetting配置图像分割检测器。
- MLImageSegmentationSetting setting = new MLImageSegmentationSetting.Factory()
- // 设置分割精细模式,true为精细分割模式,false为速度优先分割模式。
- .setExact(false)
- // 设置分割模式为人像分割。
- .setAnalyzerType(MLImageSegmentationSetting.BODY_SEG)
- // 设置返回结果种类,
- // MLImageSegmentationScene.ALL: 返回所有分割结果,包括:像素级标记信息、背景透明的人像图和人像为白色,背景为黑色的灰度图以及被分割的原图。
- // MLImageSegmentationScene.MASK_ONLY: 只返回像素级标记信息。
- // MLImageSegmentationScene.FOREGROUND_ONLY: 只返回背景透明的人像图。
- // MLImageSegmentationScene.GRAYSCALE_ONLY: 只返回人像为白色,背景为黑色的灰度图。
- .setScene(MLImageSegmentationScene.FOREGROUND_ONLY)
- .create();
- MLImageSegmentationAnalyzer analyzer = MLAnalyzerFactory.getInstance().getImageSegmentationAnalyzer(setting);
集成多类型分割模型包
使用多类型分割模型包对图像进行多类别分割时,只支持通过图像分割检测配置器MLImageSegmentationSetting创建图像分割检测器。
- MLImageSegmentationSetting setting = new MLImageSegmentationSetting
- .Factory()
- // 设置分割精细模式,true为精细分割模式,false为速度优先分割模式。
- .setExact(true)
- // 设置分割模式为图像分割。
- .setAnalyzerType(MLImageSegmentationSetting.IMAGE_SEG)
- .create();
- MLImageSegmentationAnalyzer analyzer = MLAnalyzerFactory.getInstance().getImageSegmentationAnalyzer(setting);
2. 通过android.graphics.Bitmap创建MLFrame对象用于分析器检测图片,支持的图片格式包括:jpg/jpeg/png,建议图片尺寸不小于224*224像素。
- // 通过bitmap创建MLFrame,bitmap为输入的Bitmap格式图片数据。
- MLFrame frame = MLFrame.fromBitmap(bitmap);
3. 调用“asyncAnalyseFrame ”方法进行图像分割。
- // 创建一个task,处理图像分割检测器返回的结果。
- Task<MLImageSegmentation> task = analyzer.asyncAnalyseFrame(frame);
- // 异步处理图像分割检测器返回结果。
- task.addOnSuccessListener(new
- OnSuccessListener<MLImageSegmentation>() {
- @Override
- public void onSuccess(MLImageSegmentation segmentation) {
- // 检测成功处理。
- }})
- .addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- // 检测失败处理。
- }
- });
4. 检测完成,停止分析器,释放检测资源。
- if (analyzer != null) {
- try {
- analyzer.stop();
- } catch (IOException e) {
- // 异常处理。
- }
- }
以上示例代码中使用了异步调用方式,图像分割还支持同步调用使用analyseFrame函数获取检测结果:
- SparseArray<MLImageSegmentation> segmentations = analyzer.analyseFrame(frame);
开发者可以自行处理视频流,将视频帧转换为MLFrame对象,再按上文中静态图像检测的方法进行对象检测。开发者也可以使用SDK内置的LensEngine类实现视频流图像分割,无需自己处理视频流,示例代码如下:
1. 创建图像分割检测器。
- // 使用自定义参数MLImageSegmentationSetting配置图像分割检测器。
- MLImageSegmentationSetting setting = new MLImageSegmentationSetting
- .Factory()
- // 设置分割精细模式,true为精细分割模式,false为速度优先分割模式。
- .setExact(false)
- // 设置返回结果种类,
- // MLImageSegmentationScene.ALL: 返回所有分割结果,包括:像素级标记信息、背景透明的人像图和人像为白色,背景为黑色的灰度图以及被分割的原图。
- // MLImageSegmentationScene.MASK_ONLY: 只返回像素级标记信息和被分割的原图。
- // MLImageSegmentationScene.FOREGROUND_ONLY: 只返回背景透明的人像图和被分割的原图。
- // MLImageSegmentationScene.GRAYSCALE_ONLY: 只返回人像为白色,背景为黑色的灰度图和被分割的原图。
- .setScene(MLImageSegmentationScene.FOREGROUND_ONLY)
- // 设置分割模式,视频流分割时,仅支持设置MLImageSegmentationSetting.BODY_SEG(只分割人体和背景)。
- .setAnalyzerType(MLImageSegmentationSetting.BODY_SEG)
- .create();
- MLImageSegmentationAnalyzer analyzer = MLAnalyzerFactory.getInstance().getImageSegmentationAnalyzer(setting);
2. 开发者创建识别结果处理类“ImageSegmentAnalyzerTransactor”,该类实现MLAnalyzer.MLTransactor<T>接口,使用该接口中的transactResult方法获取检测结果并实现具体业务。
- public class ImageSegmentAnalyzerTransactor implements MLAnalyzer.MLTransactor<MLImageSegmentation> {
- @Override
- public void transactResult(MLAnalyzer.Result<MLImageSegmentation> results) {
- SparseArray<MLImageSegmentation> items = results.getAnalyseList();
- // 开发者根据需要处理识别结果,需要注意,这里只对检测结果进行处理
- // 不可调用ML Kit提供的其他检测相关接口。
- }
- @Override
- public void destroy() {
- // 检测结束回调方法,用于释放资源等。
- }
- }
3. 设置识别结果处理器,实现分析器与结果处理器的绑定。
- analyzer.setTransactor(new ImageSegmentAnalyzerTransactor());
4. 创建LensEngine,该类由ML SDK提供,用于捕捉相机动态视频流并传入分析器。
- Context context = this.getApplicationContext();
- LensEngine lensEngine = new LensEngine.Creator(context,analyzer)
- // 设置摄像头前后置模式,LensEngine.BACK_LENS为后置,LensEngine.FRONT_LENS为前置。
- .setLensType(LensEngine.FRONT_LENS)
- .applyDisplayDimension(1280, 720)
- .applyFps(20.0f)
- .enableAutomaticFocus(true)
- .create();
5. 调用run方法,启动相机,读取视频流,进行识别。
- // 请自行实现SurfaceView控件的其他逻辑。
- SurfaceView mSurfaceView = new SurfaceView(this);
- 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>完成检测处理结果时,如果需要实现检测到特定结果后停止检测,待特定结果处理完后继续检测的功能,可以参考视频流检测模式多次识别场景开发。