目录

在开始API开发工作之前,您需要完成必要的开发准备工作,同时请确保您的工程中已经配置HMS Core SDK的maven仓地址,并且完成了本服务的SDK集成。

静态图片检测

1. 创建人脸分析器。可以通过提供的人脸检测自定义参数MLFaceAnalyzerSetting创建分析器。

  1. // 方式一:使用自定义参数配置。
  2. // 如使用Full SDK方式集成,需要根据集成的模型包设置对应参数。
  3. MLFaceAnalyzerSetting setting = new MLFaceAnalyzerSetting.Factory()
  4.    // 设置是否检测人脸关键点。
  5.    .setKeyPointType(MLFaceAnalyzerSetting.TYPE_KEYPOINTS)
  6.    // 设置是否检测人脸特征点。
  7.    .setFeatureType(MLFaceAnalyzerSetting.TYPE_FEATURES)
  8.    // 设置是否检测人脸轮廓点。
  9.    .setShapeType(MLFaceAnalyzerSetting.TYPE_SHAPES)
  10.    // 设置是否开启人脸追踪。
  11.    .setTracingAllowed(true)
  12.    // 设置检测器速度/精度模式。
  13.    .setPerformanceType(MLFaceAnalyzerSetting.TYPE_SPEED)
  14.    .create();
  15. MLFaceAnalyzer analyzer = MLAnalyzerFactory.getInstance().getFaceAnalyzer(setting);
  16. // 方式二:使用默认参数配置,集成Lite SDK时可以使用此配置方式。默认参数为:检测关键点、检测人脸轮廓、检测特征点、精度偏好模式、不开启人脸追踪。
  17. MLFaceAnalyzer analyzer = MLAnalyzerFactory.getInstance().getFaceAnalyzer();

2. 通过android.graphics.Bitmap创建MLFrame对象用于分析器检测图片,支持的图片格式包括:jpg/jpeg/png,建议图片尺寸不小于320*320像素,不大于1920*1920像素。

  1. //通过bitmap创建MLFrame。
  2. MLFrame frame = MLFrame.fromBitmap(bitmap);

3. 调用 “asyncAnalyseFrame”方法进行人脸检测。

  1. Task<List<MLFace>> task = analyzer.asyncAnalyseFrame(frame);
  2. task.addOnSuccessListener(new OnSuccessListener<List<MLFace>>() {
  3.     @Override
  4.     public void onSuccess(List<MLFace> faces) {
  5.         // 检测成功。
  6.     }
  7. }).addOnFailureListener(new OnFailureListener() {
  8.     @Override
  9.     public void onFailure(Exception e) {
  10.         // 检测失败。
  11.         // Recognition failure.
  12.         try {
  13.             MLException mlException = (MLException)e;
  14.             // 获取错误码,开发者可以对错误码进行处理,根据错误码进行差异化的页面提示。错误码信息可参见:机器学习服务错误码。
  15.             int errorCode = mlException.getErrCode();
  16.             // 获取报错信息,开发者可以结合错误码,快速定位问题。
  17.             String errorMessage = mlException.getMessage();
  18.         } catch (Exception error) {
  19.             // 转换错误处理。
  20.         }
  21.    }
  22. });

4. 检测完成,停止分析器,释放检测资源。

  1. try {
  2.    if (analyzer != null) {
  3.        ananlzer.stop();
  4.    }
  5. } catch (IOException e) {
  6.    // 异常处理。
  7. }

以上示例代码中使用了异步调用方式,人脸检测还支持同步调用使用analyseFrame函数获取检测结果:

  1. SparseArray<MLFace> faces = analyzer.analyseFrame(frame);

视频流检测

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

1. 创建人脸分析器。

  1. MLFaceAnalyzer analyzer = MLAnalyzerFactory.getInstance().getFaceAnalyzer();

开发者创建识别结果处理类“FaceAnalyzerTransactor”,该类实现MLAnalyzer.MLTransactor<T>接口,使用此类中的“transactResult”方法获取检测结果并实现具体业务。

  1. public class FaceAnalyzerTransactor implements MLAnalyzer.MLTransactor<MLFace> {
  2.    @Override
  3.    public void transactResult(MLAnalyzer.Result<MLFace> results) {
  4.        SparseArray<MLFace> items = results.getAnalyseList();
  5.        // 开发者根据需要处理识别结,需要注意,这里只对检测结果进行处理,
  6.        // 不可调用ML kit提供的其他检测相关接口。
  7.    }
  8.    @Override
  9.    public void destroy() {
  10.        // 检测结束回调方法,用于释放资源等。
  11.    }
  12. }

2. 设置识别结果处理器,实现分析器与结果处理器的绑定。

  1. analyzer.setTransactor(new FaceAnalyzerTransactor());

3. 创建LensEngine,该类由ML SDK提供,用于捕捉相机动态视频流并传入分析器。建议设置的相机显示尺寸不小于320*320像素,不大于1920*1920像素。

  1. LensEngine lensEngine = new LensEngine.Creator(getApplicationContext(), analyzer)
  2.    .setLensType(LensEngine.BACK_LENS)
  3.    .applyDisplayDimension(1440, 1080)
  4.    .applyFps(30.0f)
  5.    .enableAutomaticFocus(true)
  6.    .create();

4. 调用run方法,启动相机,读取视频流,进行识别。

  1. // 请自行实现SurfaceView控件的其他逻辑。
  2. SurfaceView mSurfaceView = findViewById(R.id.surface_view);
  3. try {
  4.    lensEngine.run(mSurfaceView.getHolder());
  5. } catch (IOException e) {
  6.    // 异常处理逻辑。
  7. }

5. 检测完成,停止分析器,释放检测资源。

  1. if (analyzer != null) {  
  2.    try {
  3.        analyzer.stop();    
  4.    } catch (IOException e) {    
  5.         // 异常处理。
  6.    }
  7. }
  8. if (lensEngine != null) {
  9.    lensEngine.release();    
  10. }

使用视频流检测,继承MLAnalyzer.MLTransactor<T>完成检测处理结果时,如果需要实现检测到特定结果后停止检测,待特定结果处理完后继续检测的功能,可以参考视频流检测模式多次识别场景开发。