Di chuyển trên Android

Cập nhật dữ liệu nhập gradle

SDK mới chỉ yêu cầu một phần phụ thuộc cho mỗi API ML Kit. Bạn không cần chỉ định các thư viện phổ biến như firebase-ml-vision hoặc firebase-ml-natural-language. ML Kit sử dụng không gian tên com.google.android.gms cho các thư viện phụ thuộc vào Dịch vụ Google Play.

Vision API

Các mô hình theo gói được phân phối trong ứng dụng của bạn. Bạn phải tải các mô hình mỏng xuống. Một số API có ở cả dạng gói và dạng mỏng, còn một số API khác chỉ có ở một trong hai dạng:

APITheo cụmMỏng
Nhận dạng văn bảnx (giai đoạn thử nghiệm)x
Phát hiện khuôn mặtxx
Quét mã vạchxx
Gắn nhãn hình ảnhxx
Phát hiện và theo dõi vật thểx-

Cập nhật các phần phụ thuộc cho thư viện ML Kit Android trong tệp Gradle (cấp ứng dụng) của mô-đun (thường là app/build.gradle) theo các bảng sau:

Mô hình kết hợp

APICấu phần phần mềm cũCấu phần phần mềm mới
Quét mã vạch com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-barcode-model:16.0.1
com.google.mlkit:barcode-scanning:17.3.0
Đường nét khuôn mặt com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-face-model:19.0.0
com.google.mlkit:face-detection:16.1.7
Gắn nhãn hình ảnh com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-image-label-model:19.0.0
com.google.mlkit:image-labeling:17.0.9
Phát hiện vật thể com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-object-detection-model:19.0.3
com.google.mlkit:object-detection:17.0.2

Mô hình mỏng

APICấu phần phần mềm cũCấu phần phần mềm mới
Quét mã vạch com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1
Phát hiện khuôn mặt com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-face-detection:17.1.0
Nhận dạng văn bản com.google.firebase:firebase-ml-vision:24.0.1 com.google.android.gms:play-services-mlkit-text-recognition:19.0.1

AutoMLVision Edge

APICấu phần phần mềm cũCấu phần phần mềm mới
AutoML mà không cần tải xuống com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-automl:18.0.3
com.google.mlkit:image-labeling-custom:17.0.3
AutoML có tính năng tải xuống com.google.firebase:firebase-ml-vision:24.0.1
com.google.firebase:firebase-ml-vision-automl:18.0.3
com.google.mlkit:image-labeling-custom:17.0.3
com.google.mlkit:linkfirebase:17.0.0

Natural Language API

Các mô hình theo gói được phân phối trong ứng dụng của bạn. Bạn phải tải các mô hình mỏng xuống:

APITheo cụmMỏng
Mã ngôn ngữxx
Trả lời thông minhxx (giai đoạn thử nghiệm)

Cập nhật các phần phụ thuộc cho thư viện ML Kit Android trong tệp Gradle (cấp ứng dụng) của mô-đun (thường là app/build.gradle) theo các bảng sau:

Mô hình kết hợp

APICấu phần phần mềm cũCấu phần phần mềm mới
Mã ngôn ngữ com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-language-id-model:20.0.7
com.google.mlkit:language-id:17.0.6
Trả lời thông minh com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-smart-reply-model:20.0.7
com.google.mlkit:smart-reply:17.0.4

Mô hình mỏng

APICấu phần phần mềm cũCấu phần phần mềm mới
Mã ngôn ngữ com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-language-id-model:20.0.7
com.google.android.gms:play-services-mlkit-language-id:17.0.0
Trả lời thông minh com.google.firebase:firebase-ml-natural-language:22.0.0
com.google.firebase:firebase-ml-natural-language-smart-reply-model:20.0.7
com.google.android.gms:play-services-mlkit-smart-reply:16.0.0-beta1

Cập nhật tên lớp

Nếu lớp của bạn xuất hiện trong bảng này, hãy thực hiện thay đổi được chỉ ra:

Lớp học cũLớp học mới
com.google.firebase.ml.common.FirebaseMLException com.google.mlkit.common.MlKitException
com.google.firebase.ml.vision.common.FirebaseVisionImage com.google.mlkit.vision.common.InputImage
com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetector com.google.mlkit.vision.barcode.BarcodeScanner
com.google.firebase.ml.vision.labeler.FirebaseVisionImageLabel com.google.mlkit.vision.label.ImageLabeler
com.google.firebase.ml.vision.barcode.FirebaseVisionBarcodeDetector com.google.mlkit.vision.barcode.BarcodeScanner
com.google.firebase.ml.vision.automl.FirebaseAutoMLLocalModel com.google.mlkit.common.model.LocalModel
com.google.firebase.ml.vision.automl.FirebaseAutoMLRemoteModel com.google.mlkit.common.model.CustomRemoteModel
com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceImageLabelerOptions com.google.mlkit.vision.label.defaults.ImageLabelerOptions
com.google.firebase.ml.vision.label.FirebaseVisionImageLabel com.google.mlkit.vision.label.ImageLabel
com.google.firebase.ml.vision.label.FirebaseVisionOnDeviceAutoMLImageLabelerOptions com.google.mlkit.vision.label.custom.CustomImageLabelerOptions
com.google.firebase.ml.vision.objects.FirebaseVisionObjectDetectorOptions com.google.mlkit.vision.objects.defaults.ObjectDetectorOptions

Đối với các lớp khác, hãy tuân theo những quy tắc sau:

  • Xoá tiền tố FirebaseVision khỏi tên lớp.
  • Xoá các tiền tố khác bắt đầu bằng tiền tố Firebase khỏi tên lớp.

Ngoài ra, trong tên gói, hãy thay thế tiền tố com.google.firebase.ml bằng com.google.mlkit.

Cập nhật tên phương thức

Có rất ít thay đổi về mã:

  • Đã thay đổi việc khởi tạo trình phát hiện/trình quét/trình gắn nhãn/trình dịch. Mỗi tính năng hiện có một điểm truy cập riêng. Ví dụ: BarcodeScanning, TextRecognition, ImageLabeling, Translation…. Các lệnh gọi đến dịch vụ Firebase getInstance() được thay thế bằng các lệnh gọi đến phương thức getClient() của điểm truy cập tính năng.
  • Đã xoá quá trình khởi tạo mặc định cho TextRecognizer vì chúng tôi đã giới thiệu thêm các thư viện để nhận dạng các tập lệnh khác như tiếng Trung và tiếng Hàn. Để sử dụng các lựa chọn mặc định với mô hình nhận dạng văn bản bằng chữ Latinh, vui lòng khai báo một phần phụ thuộc vào com.google.android.gms:play-services-mlkit-text-recognition và sử dụng TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS).
  • Đã xoá quá trình khởi tạo mặc định cho ImageLabeler và ObjectDetector vì chúng tôi đã giới thiệu tính năng hỗ trợ mô hình tuỳ chỉnh cho hai tính năng này. Ví dụ: để sử dụng các lựa chọn mặc định với mô hình cơ sở trong ImageLabeling, vui lòng khai báo một phần phụ thuộc trên com.google.mlkit:image-labeling và sử dụng ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS) trong Java.
  • Tất cả các đối tượng (detector/scanner/labeler/translator…) đều có thể đóng. Đảm bảo rằng phương thức close() được gọi khi những đối tượng đó không còn được dùng nữa. Nếu bạn đang sử dụng các đối tượng này trong một Fragment hoặc AppCompatActivity, thì một cách dễ dàng để thực hiện việc đó là gọi LifecycleOwner.getLifecycle() trên Fragment hoặc AppCompatActivity, rồi gọi Lifecycle.addObserver
  • processImage()detectInImage() trong Vision API đã được đổi tên thành process() để đảm bảo tính nhất quán.
  • Giờ đây, Natural Language API sử dụng thuật ngữ "thẻ ngôn ngữ" (theo định nghĩa của tiêu chuẩn BCP 47) thay vì "mã ngôn ngữ".
  • Các phương thức getter trong các lớp xxxOptions đã bị xoá.
  • Phương thức getBitmap() trong lớp InputImage(thay thế FirebaseVisionImage) không còn được hỗ trợ trong giao diện công khai. Vui lòng tham khảo BitmapUtils.java trong mẫu khởi động nhanh Bộ công cụ học máy để chuyển đổi bitmap từ nhiều dữ liệu đầu vào.
  • FirebaseVisionImageMetadata đã bị xoá, bạn chỉ cần truyền siêu dữ liệu hình ảnh như chiều rộng, chiều cao, rotationDegrees, định dạng vào các phương thức tạo của InputImages.

Dưới đây là một số ví dụ về các phương thức Kotlin cũ và mới:

// Construct image labeler with base model and default options.
val imageLabeler = FirebaseVision.getInstance().onDeviceImageLabeler

// Construct object detector with base model and default options.
val objectDetector = FirebaseVision.getInstance().onDeviceObjectDetector

// Construct face detector with given options
val faceDetector = FirebaseVision.getInstance().getVisionFaceDetector(options)

// Construct image labeler with local AutoML model
val localModel =
    FirebaseAutoMLLocalModel.Builder()
      .setAssetFilePath("automl/manifest.json")
      .build()
val autoMLImageLabeler =
    FirebaseVision.getInstance()
      .getOnDeviceAutoMLImageLabeler(
          FirebaseVisionOnDeviceAutoMLImageLabelerOptions.Builder(localModel)
            .setConfidenceThreshold(0.3F)
            .build()
    )

Mới

// Construct image labeler with base model and default options.
val imageLabeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
// Optional: add life cycle observer
lifecycle.addObserver(imageLabeler)

// Construct object detector with base model and default options.
val objectDetector = ObjectDetection.getClient(ObjectDetectorOptions.DEFAULT_OPTIONS)

// Construct face detector with given options
val faceDetector = FaceDetection.getClient(options)

// Construct image labeler with local AutoML model
val localModel =
  LocalModel.Builder()
    .setAssetManifestFilePath("automl/manifest.json")
    .build()
val autoMLImageLabeler =
  ImageLabeling.getClient(
    CustomImageLabelerOptions.Builder(localModel)
    .setConfidenceThreshold(0.3F).build())
  

Sau đây là một số ví dụ về các phương thức Java cũ và mới:

// Construct image labeler with base model and default options.
FirebaseVisionImageLabeler imagelLabeler =
     FirebaseVision.getInstance().getOnDeviceImageLabeler();

// Construct object detector with base model and default options.
FirebaseVisionObjectDetector objectDetector =
     FirebaseVision.getInstance().getOnDeviceObjectDetector();

// Construct face detector with given options
FirebaseVisionFaceDetector faceDetector =
     FirebaseVision.getInstance().getVisionFaceDetector(options);

// Construct image labeler with local AutoML model
FirebaseAutoMLLocalModel localModel =
    new FirebaseAutoMLLocalModel.Builder()
      .setAssetFilePath("automl/manifest.json")
      .build();
FirebaseVisionImageLabeler autoMLImageLabeler =
    FirebaseVision.getInstance()
      .getOnDeviceAutoMLImageLabeler(
          FirebaseVisionOnDeviceAutoMLImageLabelerOptions.Builder(localModel)
            .setConfidenceThreshold(0.3F)
            .build());

Mới

// Construct image labeler with base model and default options.
ImageLabeler imageLabeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS);
// Optional: add life cycle observer
getLifecycle().addObserver(imageLabeler);

// Construct object detector with base model and default options.
ObjectDetector objectDetector = ObjectDetection.getClient(ObjectDetectorOptions.DEFAULT_OPTIONS);

// Construct face detector with given options
FaceDetector faceDetector = FaceDetection.getClient(options);

// Construct image labeler with local AutoML model
LocalModel localModel =
  new LocalModel.Builder()
    .setAssetManifestFilePath("automl/manifest.json")
    .build();
ImageLabeler autoMLImageLabeler =
  ImageLabeling.getClient(
    new CustomImageLabelerOptions.Builder(localModel)
    .setConfidenceThreshold(0.3F).build());
  

Các thay đổi dành riêng cho API

Quét mã vạch

Đối với Barcode Scanning API, hiện có 2 cách để phân phối các mô hình:

  • Thông qua Dịch vụ Google Play, còn gọi là "mỏng" (nên dùng) – cách này giúp giảm kích thước ứng dụng và mô hình được chia sẻ giữa các ứng dụng. Tuy nhiên, nhà phát triển sẽ cần đảm bảo rằng mô hình này được tải xuống trước khi sử dụng lần đầu.
  • Với APK của ứng dụng, còn gọi là "được đóng gói" – điều này làm tăng kích thước ứng dụng nhưng có nghĩa là mô hình này có thể sử dụng ngay.

Hai phương thức triển khai này có chút khác biệt, trong đó phiên bản "gói" có một số điểm cải tiến so với phiên bản "mỏng". Bạn có thể xem thông tin chi tiết về những điểm khác biệt này trong nguyên tắc của API Quét mã vạch.

Phát hiện khuôn mặt

Đối với API Phát hiện khuôn mặt, có 2 cách để phân phối các mô hình:

  • Thông qua Dịch vụ Google Play, còn gọi là "mỏng" (nên dùng) – cách này giúp giảm kích thước ứng dụng và mô hình được chia sẻ giữa các ứng dụng. Tuy nhiên, nhà phát triển sẽ cần đảm bảo rằng mô hình này được tải xuống trước khi sử dụng lần đầu.
  • Với APK của ứng dụng, còn gọi là "được đóng gói" – điều này làm tăng kích thước tải xuống của ứng dụng nhưng có nghĩa là mô hình này có thể sử dụng ngay.

Hành vi của các hoạt động triển khai này là như nhau.

Bản dịch

  • TranslateLanguage hiện sử dụng tên dễ đọc cho các hằng số của mình (ví dụ: ENGLISH) thay vì thẻ ngôn ngữ (EN). Các hằng số này hiện cũng là @StringDef thay vì @IntDef và giá trị của hằng số là thẻ ngôn ngữ BCP 47 phù hợp.

  • Nếu ứng dụng của bạn sử dụng lựa chọn điều kiện tải xuống "thiết bị ở trạng thái không hoạt động", hãy lưu ý rằng lựa chọn này đã bị xoá và không dùng được nữa. Bạn vẫn có thể sử dụng lựa chọn "sạc thiết bị". Nếu muốn có hành vi phức tạp hơn, bạn có thể trì hoãn việc gọi RemoteModelManager.download theo logic của riêng mình.

AutoML Image Labeling

Nếu ứng dụng của bạn sử dụng lựa chọn điều kiện tải xuống "thiết bị ở trạng thái rảnh", hãy lưu ý rằng lựa chọn này đã bị xoá và không dùng được nữa. Bạn vẫn có thể sử dụng lựa chọn "sạc thiết bị".

Nếu muốn có hành vi phức tạp hơn, bạn có thể trì hoãn việc gọi RemoteModelManager.download theo logic của riêng mình.

Phát hiện và theo dõi đối tượng

Nếu ứng dụng của bạn sử dụng tính năng phát hiện đối tượng với phân loại thô, hãy lưu ý rằng SDK mới đã thay đổi cách trả về danh mục phân loại cho các đối tượng được phát hiện.

Danh mục phân loại được trả về dưới dạng một thực thể của DetectedObject.Label thay vì một số nguyên. Tất cả danh mục có thể có cho bộ phân loại thô đều có trong lớp PredefinedCategory.

Sau đây là ví dụ về mã Kotlin cũ và mới:

if (object.classificationCategory == FirebaseVisionObject.CATEGORY_FOOD) {
    ...
}

Mới

if (!object.labels.isEmpty() && object.labels[0].text == PredefinedCategory.FOOD) {
    ...
}
// or
if (!object.labels.isEmpty() && object.labels[0].index == PredefinedCategory.FOOD_INDEX) {
    ...
}

Sau đây là ví dụ về mã Java cũ và mới:

if (object.getClassificationCategory() == FirebaseVisionObject.CATEGORY_FOOD) {
    ...
}

Mới

if (!object.getLabels().isEmpty()
    && object.getLabels().get(0).getText().equals(PredefinedCategory.FOOD)) {
    ...
}
// or
if (!object.getLabels().isEmpty()
    && object.getLabels().get(0).getIndex() == PredefinedCategory.FOOD_INDEX) {
    ...
}

Danh mục "không xác định" đã bị xoá. Khi độ tin cậy của việc phân loại một đối tượng ở mức thấp, chúng tôi sẽ không trả về nhãn nào.

Xoá các phần phụ thuộc Firebase (Không bắt buộc)

Bước này chỉ áp dụng khi đáp ứng các điều kiện sau:

  • Bộ công cụ học máy Firebase là thành phần duy nhất của Firebase mà bạn sử dụng.
  • Bạn chỉ sử dụng các API trên thiết bị.
  • Bạn không sử dụng tính năng phân phát mô hình.

Nếu vậy, bạn có thể xoá các phần phụ thuộc Firebase sau khi di chuyển. Hãy làm theo các bước sau:

  • Xoá tệp cấu hình Firebase bằng cách xoá tệp cấu hình google-services.json tại thư mục mô-đun (cấp ứng dụng) của ứng dụng.
  • Thay thế trình bổ trợ Gradle của Dịch vụ Google trong tệp Gradle (ở cấp ứng dụng) trong mô-đun của bạn (thường là app/build.gradle) bằng trình bổ trợ So khớp phiên bản nghiêm ngặt:

Trước

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'  // Google Services plugin

android {
  // …
}

Sau

apply plugin: 'com.android.application'
apply plugin: 'com.google.android.gms.strict-version-matcher-plugin'

android {
  // …
}
  • Thay thế đường dẫn lớp của trình bổ trợ Google Services Gradle trong tệp Gradle (cấp gốc) của dự án (build.gradle) bằng đường dẫn lớp của trình bổ trợ So khớp phiên bản nghiêm ngặt:

Trước

buildscript {
  dependencies {
    // ...

    classpath 'com.google.gms:google-services:4.3.3'  // Google Services plugin
  }
}

Sau

buildscript {
  dependencies {
    // ...

    classpath 'com.google.android.gms:strict-version-matcher-plugin:1.2.1'
  }
}

Xoá ứng dụng Firebase của bạn trong bảng điều khiển của Firebase theo hướng dẫn trên trang web hỗ trợ của Firebase.

Nhận Trợ giúp

Nếu bạn gặp phải vấn đề, vui lòng truy cập trang Cộng đồng của chúng tôi để xem các kênh liên hệ với chúng tôi.