Di chuyển cho Android

Cập nhật các mục nhập gradle

SDK mới chỉ yêu cầu một phần phụ thuộc cho mỗi API Bộ công cụ máy học. 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. Bộ công cụ máy học 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.

API Vision

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

APIGộp chungMỏng
Nhận dạng văn bảnx (phiên bản thử nghiệm) lần
Phát hiện khuôn mặt lần lần
Quét mã vạch lần lần
Nhãn hình ảnh lần lần
Phát hiện và theo dõi đối tượng lần-

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

Mô hình theo gói

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.0.2
Đườ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.5
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.7
Phát hiện đối tượng 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.0

Kiểu máy 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.1.0
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:18.0.2

Edge AutoMLVision

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:16.0.0-beta4
AutoML khi 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:16.0.0-beta4
com.google.mlkit:linkfirebase:17.0.0

API ngôn ngữ tự nhiên

Các mô hình trong gói được phân phối trong ứng dụng của bạn. Tất cả các API ngôn ngữ đều có ở dạng mô hình đi kèm. Dưới đây là tên cấu phần phần mềm mới:

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.4
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.2

Cập nhật tên lớp học

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 đã chỉ định:

Lớp 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.object..defaults.ObjectDetectorOptions

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

  • Hãy xoá tiền tố FirebaseVision khỏi tên lớp.
  • Hãy xóa 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ã:

  • Trình phát hiện/trình quét/nhãn/trình dịch... bản sao đã được thay đổi. Mỗi tính năng hiện đều có điểm truy cập riêng. Ví dụ: Quét mã vạch, Nhận dạng văn bản, Gắn nhãn hình ảnh, Dịch.... 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ứcgetClient() của điểm truy cập tính năng.
  • Bản sao mặc định cho TextRecognizer đã bị xoá, vì chúng tôi đã ra mắt các thư viện bổ sung để nhận dạng các tập lệnh khác như tiếng Trung và tiếng Hàn. Để sử dụng tuỳ chọn mặc định với mô hình nhận dạng văn bản tập lệnh Latinh, vui lòng khai báo phần phụ thuộc trên com.google.android.gms:play-services-mlkit-text-recognition và sử dụng TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS).
  • Bản sao mặc định cho ImageLabeler và ObjectDetector đã bị xoá, 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 tuỳ 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 tên người dùng (trình phát hiện/trình quét/nhãn/trình dịch...) đều có thể đóng được. Đảm bảo rằng phương thức close() được gọi khi các đối tượng đó không còn được sử dụng nữa. Nếu bạn đang dùng các mảnh này trong một mảnh (Fragment) hoặc AppCompatActivity, thì một cách dễ dàng để thực hiện việc này là gọi LifecycleOwner.getLifecycle() trên Fragment hoặc AppCompatActivity, sau đó gọi Lifecycle.addObserver
  • processImage()detectInImage() trong API Vision đã được đổi tên thành process() để đảm bảo tính nhất quán.
  • API Ngôn ngữ tự nhiên hiện sử dụng thuật ngữ “thẻ ngôn ngữ” (theo định nghĩa trong 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ụ máy học để chuyển đổi bitmap từ nhiều giá trị nhập vào khác nhau.
  • FirebaseVisionImageMetadata đã bị xóa, bạn chỉ cần chuyển siêu dữ liệu hình ảnh như chiều rộng, chiều cao, Xoay bằng, định dạng vào các phương thức tạo của InputImage.

Sau đâ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())
  

Dưới đâ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());
  

Thay đổi dành riêng cho API

Quét mã vạch

Đối với API Quét mã vạch, giờ đây có hai cách để có thể phân phối mô hình:

  • Thông qua Dịch vụ Google Play, còn được gọi là “mỏng” (khuyên dùng) – thông tin 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 cần phải đảm bảo rằng mô hình đã được tải xuống trước khi sử dụng lần đầu.
  • Với APK a.k.a. "được nhóm" của ứng dụng – điều này làm tăng kích thước ứng dụng nhưng có nghĩa là mô hình đó có thể sử dụng được ngay lập tức.

Hai cách triển khai hơi khác nhau, trong đó phiên bản "bundled" có một số điểm cải tiến so với phiên bản "thin". Bạn có thể xem thông tin chi tiết về các điểm khác biệt này trong nguyên tắc về API quét mã vạch.

Nhận diện khuôn mặt

Đối với API Phát hiện khuôn mặt, có 2 cách để bạn có thể phân phối các mẫu:

  • Thông qua Dịch vụ Google Play, còn được gọi là “mỏng” (khuyên dùng) – thông tin 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 cần phải đảm bảo rằng mô hình đã được tải xuống trước khi sử dụng lần đầu.
  • Với APK a.k.a. "được nhóm" của ứng dụng – đ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 đó có thể sử dụng được ngay lập tức.

Hành vi triển khai giống nhau.

Bản dịch

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

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

Gắn nhãn hình ảnh AutoML

Nếu ứng dụng của bạn sử dụng tuỳ chọn điều kiện tải xuống là "thiết bị ở trạng thái rảnh", hãy lưu ý rằng tuỳ chọn này đã bị xoá và không thể sử dụng được nữa. Bạn vẫn có thể sử dụng tuỳ 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 phía sau 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 chức 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 bản sao của DetectedObject.Label thay vì số nguyên. Tất cả các danh mục có thể có cho thuật toán phân loại thô đều được đưa vào lớp PredefinedCategory.

Dưới đâ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) {
    ...
}

Dưới đâ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ị xóa. Khi độ tin cậy của phân loại đối tượng thấp, chúng tôi sẽ không trả về bất kỳ nhãn nào.

Xoá phần phụ thuộc của 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ụ máy học Firebase là thành phần Firebase duy nhất bạn sử dụng.
  • Bạn chỉ sử dụng API trên thiết bị.
  • Bạn không dùng mô hình phân phát.

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

  • Xóa tệp cấu hình Firebase bằng cách xóa tệp cấu hình google-services.json ở thư mục mô-đun (cấp ứng dụng) của ứng dụng.
  • Thay thế trình bổ trợ Gradle của Google Services trong tệp Gradle mô-đun (cấp ứng dụng) (thường là app/build.gradle) bằng trình bổ trợ Trình 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ợ Gradle trong các dịch vụ của Google trong tệp Gradle (cấp cơ sở) (build.gradle) bằng dự án cho trình bổ trợ Trình 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'
  }
}

Xóa ứng dụng Firebase của bạn tại 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 bất kỳ sự cố nào, vui lòng xem trang Cộng đồng của chúng tôi, trong đó chúng tôi trình bày các kênh có sẵn để liên hệ với chúng tôi.