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 Bộ công cụ học máy. 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ụ học máy sử dụng không gian tên com.google.android.gms cho những thư viện phụ thuộc vào Dịch vụ Google Play.

API Vision

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

APIGộp chungMỏng
Nhận dạng văn bảnx (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 đối tượngx-

Cập nhật các phần phụ thuộc cho thư viện Android Bộ công cụ học máy trong tệp Gradle mô-đun (cấp ứng dụng) của bạn (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.2.0
Đường viền 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.6
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.8
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.1

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.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:19.0.0

Cạnh 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:17.0.2
AutoML cho phép 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.2
com.google.mlkit:linkfirebase:17.0.0

API ngôn ngữ tự nhiên

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

APIGộp chungMỏng
Mã ngôn ngữxx
Trả lời thông minhxx (thử nghiệm)

Cập nhật các phần phụ thuộc cho thư viện Android Bộ công cụ học máy trong tệp Gradle mô-đun (cấp ứng dụng) của bạn (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
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.5
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.3

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 nêu:

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.objects.defaults.ObjectDetectorOptions

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

  • Hãy 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ã:

  • Trình phát hiện/máy quét/trình gắn nhãn/trình dịch... đã thay đổi bản sao. Giờ đây, mỗi tính năng đề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() sẽ đượ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.
  • Chúng tôi đã loại bỏ bản sao mặc định cho TextRecognitionr, vì chúng tôi đã ra mắt các thư viện bổ sung để nhận dạng các chữ viết khác như tiếng Trung và tiếng Hàn. Để sử dụng các tuỳ chọn mặc định với mô hình nhận dạng văn bản dạng chữ 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).
  • Tính năng tạo bản sao mặc định cho ImageLabeler và ObjectDetector đã bị xoá vì chúng tôi đã ra mắt tính năng hỗ trợ mô hình tuỳ chỉnh cho 2 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 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 tay cầm (trình phát hiện/máy quét/trình gắn nhãn/trình dịch...) đều có thể đóng được. Đảm bảo phương thức close() được gọi khi các đối tượng đó không còn được dùng nữa. Nếu bạn đang sử dụng chúng trong Fragment hoặc AppCompatActivity, một cách dễ dàng để thực hiện việc đó là gọi LifecycleOwner.getLifecycle() trên Fragment hoặc AppCompatActivity, sau đó gọi Lifecycle.addObserver
  • processImage()detectInImage() trong API Tầm nhìn đã được đổi tên thành process() để đảm bảo tính nhất quán.
  • Giờ đây, API ngôn ngữ tự nhiên sử dụng thuật ngữ "thẻ ngôn ngữ" (như xác định theo tiêu chuẩn BCP 47) thay vì "mã ngôn ngữ".
  • Xoá phương thức getter trong các lớp xxxOptions.
  • Phương thức getBitmap() trong lớp InputImage(thay thế FirebaseVisionImage) không còn được hỗ trợ như một phần của giao diện công khai. Vui lòng tham khảo BitmapUtils.java trong mẫu bắt đầu 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ó thể truyền siêu dữ liệu hình ảnh như chiều rộng, chiều cao, xoá, định dạng vào phương thức xây dựng 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())
  

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());
  

Các thay đổi theo API cụ thể

Quét mã vạch

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

  • Thông qua Dịch vụ Google Play còn được gọi là “mỏng” (nên dùng) – điều này giúp giảm kích thước ứng dụng và mô hình này được chia sẻ giữa các ứng dụng. Tuy nhiên, nhà phát triển cần đảm bảo rằng mô hình đó được tải xuống trước khi sử dụng lần đầu tiên.
  • Với APK của ứng dụng còn được gọi là “bundled” (theo gói) – điều này sẽ 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 "theo 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 về Mã 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, bạn có thể phân phối mô hình theo hai cách:

  • Thông qua Dịch vụ Google Play còn được gọi là “mỏng” (nên dùng) – điều này giúp giảm kích thước ứng dụng và mô hình này được chia sẻ giữa các ứng dụng. Tuy nhiên, nhà phát triển cần đảm bảo rằng mô hình đó được tải xuống trước khi sử dụng lần đầu tiên.
  • Với APK của ứng dụng còn được gọi là “bundled” (theo gói) – điều này sẽ 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 đều giống nhau.

Bản dịch

  • TranslateLanguage hiện sử dụng tên dễ đọc cho các hằng số của nó (ví dụ: ENGLISH) thay vì thẻ ngôn ngữ (EN). Giờ đây, chúng 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 "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ể dùng 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 theo 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 "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ể dùng 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 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 bằng phương pháp 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 đã 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. Mọi 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ị xoá. Khi độ tin cậy của việc phân loại đối tượng thấp, chúng tôi chỉ không trả về bất kỳ 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 các điều kiện sau được đáp ứng:

  • Bộ công cụ học máy của Firebase là thành phần Firebase duy nhất 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.

Trong trường hợp nà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 cho Dịch vụ của Google trong tệp Gradle của mô-đun (cấp ứng dụng) (thường là app/build.gradle) bằng trình bổ trợ Strict Version Matcher:

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 trình bổ trợ Gradle cho Dịch vụ của Google trong tệp Gradle (build.gradle) của dự án (cấp gốc) bằng một đường dẫn dành cho trình bổ trợ Strict Version Matcher:

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 tại bảng điều khiển của Firebase theo instructions trên trang web hỗ trợ của Firebase.

Nhận trợ giúp

Nếu bạn gặp bất kỳ vấn đề nào, vui lòng xem trang Cộng đồng của chúng tôi để trình bày thông tin về các kênh mà bạn có thể liên hệ với chúng tôi.