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

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

整体 API 变更

以下更改适用于所有 API:

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

更新 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 和 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 已弃用

获取帮助

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