从 Mobile Vision 迁移到 Android 上的机器学习套件

本文档介绍了将项目从 Google Mobile Vision (GMV) 迁移到 Android 版机器学习套件所需执行的步骤。

整体 API 变更

这些更改适用于所有 API:

  • GMV API 会同步返回 SparseArray<T> 结果。机器学习套件 API 使用 Google Play Services Task API 异步返回结果。
  • GMV 使用 API Surface 中的 isOperational() 调用来指示模块是否已成功下载并准备好使用。机器学习套件没有这种方法。如果尚未下载模块,机器学习套件会抛出 MlKitException.UNAVAILABLE 异常。您可以捕获此异常并处理下一帧,也可以设置超时并使用当前帧重试。
  • GMV 方法使用 Frame 进行输入。机器学习套件使用 InputImage
  • GMV 提供了 MultiDetectorMultiProcessorFocusingProcessor 框架,用于执行多种检测和结果过滤。机器学习套件不提供此类机制,但开发者可以根据需要实现相同的功能。

更新 Gradle 导入

根据下表,更新模块(应用级)Gradle 文件中的机器学习套件 Android 库的依赖项,该文件通常为 app/build.gradle

API GMV 工件 机器学习套件工件
FaceDetector com.google.android.gms:play-services-vision:x.x.x com.google.android.gms:play-services-mlkit-face-detection:17.1.0
BarcodeDetector com.google.android.gms:play-services-vision:x.x.x com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.0
TextRecognition com.google.android.gms:play-services-vision:x.x.x com.google.android.gms:play-services-mlkit-text-recognition:19.0.0
CameraSource com.google.android.gms:play-services-vision:x.x.x com.google.mlkit:camera:16.0.0-beta3

API 更改

本部分介绍了每个 Vision API 对应的 GMV 和机器学习套件类和方法,并展示了如何初始化该 API。

FaceDetector

对初始化进行重新编码,如以下示例所示:

总交易额

detector = new FaceDetector.Builder(context)
    .setMode(FaceDetector.ACCURATE_MODE)
    .setLandmarkType(FaceDetector.ALL_LANDMARKS)
    .setClassificationType(FaceDetector.ALL_CLASSIFICATIONS)
    .build();

机器学习套件

FaceDetectorOptions options = new FaceDetectorOptions.Builder()
    .setPerformanceMode(FaceDetectorOptions.PERFORMANCE_MODE_ACCURATE)
    .setLandmarkMode(FaceDetectorOptions.LANDMARK_MODE_ALL)
    .setClassificationMode(FaceDetectorOptions.CLASSIFICATION_MODE_ALL)
    .build();

detector = FaceDetection.getClient(options);

更改以下类和方法的名称:

android.gms.vision.face mlkit.vision.face
FaceDetector FaceDetector
SparseArray<Face> detect(Frame frame) Task<List<Face>> process(@NonNull InputImage image)
FaceDetector.Builder.setClassificationType(int classificationType) FaceDetectorOptions.Builder.setClassificationMode(int classificationMode)
NO_CLASSIFICATIONS, ALL_CLASSIFICATIONS CLASSIFICATION_MODE_NONE, CLASSIFICATION_MODE_ALL
FaceDetector.Builder.setLandmarkType(int landmarkType) FaceDetectorOptions.Builder.setLandmarkMode(int landmarkMode)
NO_LANDMARKS, ALL_LANDMARKS, CONTOUR_LANDMARKS LANDMARK_MODE_NONE, LANDMARK_MODE_ALL

使用 #setContourMode 替换 GMV CONTOUR_LANDMARKS)

FaceDetector.Builder.setTrackingEnabled(boolean trackingEnabled) FaceDetectorOptions.Builder.enableTracking()
FaceDetector.Builder.setMinFaceSize(float proportionalMinFaceSize) FaceDetectorOptions.Builder.setMinFaceSize(float minFaceSize)
FaceDetector.Builder.setMode(int mode) FaceDetectorOptions.Builder.setPerformanceMode(int performanceMode)
FAST_MODE, ACCURATE_MODE PERFORMANCE_MODE_FAST, PERFORMANCE_MODE_ACCURATE
FaceDetector.Builder.setProminentFaceOnly(boolean prominentFaceOnly) 人脸轮廓模式覆盖此地图项。
Face Face
Contour FaceContour
Landmark FaceLandmark
Face.getContours() Face.getAllContours()
Face.getEulerY() Face.getHeadEulerAngleY()
Face.getEulerZ() Face.getHeadEulerAngleZ()
Face.getId() Face.getTrackingId()
Face.getIsLeftEyeOpenProbability() Face.getLeftEyeOpenProbability()
Face.getIsRightEyeOpenProbability() Face.getRightEyeOpenProbability()
Face.getIsSmilingProbability() Face.getSmilingProbability()
Face.getLandmarks() Face.getLandmark(int landmarkType)
Face.getPosition()
Face.getHeight()
Face.getWidth()
Face.getBoundingBox()

BarcodeDetector

对初始化进行重新编码,如以下示例所示:

总交易额

barcodeDetector = new BarcodeDetector.Builder(context).build());

机器学习套件

barcodeScanner = BarcodeScanning.getClient();

更改以下类和方法的名称:

android.gms.vision.barcode mlkit.vision.barcode
BarcodeDetector BarcodeScanner
SparseArray<Barcode> detect(Frame frame) Task<List<Barcode>> process(@NonNull InputImage image)
Barcode Barcode

TextRecognition

对初始化进行重新编码,如以下示例所示:

总交易额

textRecognizer = new TextRecognizer.Builder(context).build();

机器学习套件

textRecognizer = TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS);

更改以下类和方法的名称:

android.gms.vision.text mlkit.vision.text
TextRecognizer TextRecognizer
SparseArray<TextBlock> detect(Frame frame) Task<Text> process(@NonNull InputImage image)
SparseArray<TextBlock> Text
Line Line
TextBlock TextBlock
Element Element
getLanguage() getRecognizedLanguage()
getBoundingBox() getBoundingBox()
getCornerPoints() getCornerPoints()
TextBlock.getComponents() TextBlock.getLines()
TextBlock.getValue() TextBlock.getText()
Element.getValue() Element.getText()

CameraSource

如果您使用 Google Mobile Vision 提供的 CameraSource 库,可以轻松迁移到机器学习套件的 CameraXSource 库,前提是您的应用在最低 SDK 版本不低于 21 上运行。

更改以下类和方法的名称:

android.gms.vision mlkit.vision.camera
CameraSource CameraSourceConfig
CameraSource.Builder CameraSourceConfig.Builder
CameraSource.Builder.setAutoFocusEnabled 使用 CameraX 时,默认提供自动对焦功能。
CameraSource.Builder.setFacing CameraSourceConfig.Builder.setCameraFacing
CameraSource.Builder.setFocusMode 使用 CameraX 时,默认提供自动对焦功能。
CameraSource.Builder.setRequestedFps 已弃用。
CameraSource.Builder.setRequestedPreviewSize CameraSourceConfig.Builder.setRequestedPreviewSize
CameraSource CameraXSource
new CameraSource.Builder(mContext, detector)....build(); CameraXSource(CameraSourceConfig, PreviewView)
getCameraFacing() getCameraFacing()
getPreviewSize() getPreviewSize()
release() close()
start(SurfaceHolder surfaceHolder) start() // The previewview is set in the CameraSourceConfig
start() start()
stop() stop()
Detector.Processor DetectionTaskCallback
receiveDetections(Detections<T> detections) void onDetectionTaskReceived(@NonNull Task<ResultT> detectionTask);
release() 内部处理
CameraSource.PictureCallback 已弃用
CameraSource.ShutterCallback 已弃用

获取帮助

如果您遇到任何问题,请访问我们的社区页面,其中列出了可用于与我们联系的渠道。