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

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

总体 API 变更

这些变更适用于所有 API:

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

更新 Gradle 导入

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

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.1
TextRecognition com.google.android.gms:play-services-vision:x.x.x com.google.android.gms:play-services-mlkit-text-recognition:19.0.1
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

按照此示例所示重新编写初始化代码:

GMV

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

按照此示例所示重新编写初始化代码:

GMV

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

按照此示例所示重新编写初始化代码:

GMV

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 已弃用

获取帮助

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