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

本文档介绍了将项目从 Google Mobile Vision (GMV) 迁移到 Android 版 ML Kit 所需的步骤。

总体 API 变更

这些更改适用于所有 API:

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

更新 Gradle 导入

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

API GMV 制品 ML Kit 制品
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 和 ML Kit 类及方法,并展示了如何初始化 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 库,则可以轻松迁移到 ML Kit 的 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 已弃用

获取帮助

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