Di chuyển trên Android

Cập nhật 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ụ 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 các thư viện phụ thuộc vào Dịch vụ Google Play.

Vision API (API Tầm nhìn)

Các mô hình theo gói sẽ đượ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. Một số API được cung cấp ở cả dạng gói và dạng mỏng, những API khác chỉ ở dạng này hoặc dạng kia:

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 của 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

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.2
AutoML có thể 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 sẽ đượ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:

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 của 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 học của bạn xuất hiện trong bảng này, hãy thực hiện thay đổi như sau:

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 tuân theo các quy tắc sau:

  • Hãy xoá tiền tố FirebaseVision khỏi tên lớp.
  • Xoá những 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

Mã có một số thay đổi nhỏ:

  • Tính năng tạo bản sao của trình phát hiện/máy quét/trình gắn nhãn/trình biên dịch... đã thay đổi. Giờ đây, mỗi tính năng đều 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() sẽ được thay thế bằng các lệnh gọi đến phương thứcgetClient()của điểm truy cập đối tượng.
  • Tính năng tạo bản sao mặc định cho TextRecognizer đã bị xoá vì chúng tôi giới thiệu thêm 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 lựa 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).
  • Tính năng tạo bản sao mặc định cho ImageLabeler và ObjectDetector đã bị xoá vì chúng tôi đã triển khai 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ả tên người dùng (trình phát hiện/máy quét/công cụ gắn nhãn/trình biên dịch...) đều có thể đóng. Đả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ếu đang dùng các lớp này trong Fragment hoặc AppCompatActivity, bạn có thể thực hiện việc này bằng cách gọi LifecycleOwner.getLifecycle() trên Fragment hoặc AppCompatActivity, sau đó 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.
  • API Ngôn ngữ tự nhiên hiện sử dụng thuật ngữ "thẻ ngôn ngữ" (như định nghĩa theo tiêu chuẩn BCP 47) thay vì "mã ngôn ngữ".
  • Xoá các phương thức getter trong lớp xxxOptions.
  • 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 chuyển siêu dữ liệu hình ảnh như chiều rộng, chiều cao, rotationdegrees, đị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ề 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ề 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 Scanner API, hiện có hai cách phân phối mô hình:

  • Thông qua Dịch vụ Google Play còn gọi là "mỏng" (được đề xuất) - điều 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 đó đượ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 gọi là “theo 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 có thể sử dụng được ngay lập tức.

Hai cách triển khai này 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 chi tiết về những 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, có hai cách có thể phân phối mô hình:

  • Thông qua Dịch vụ Google Play còn gọi là "mỏng" (được đề xuất) - điều 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 đó đượ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 gọi là “theo 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 có thể sử dụng được ngay lập tức.

Hành vi của các phương thức triển khai giống nhau.

Bản dịch

  • TranslateLanguage nay sử dụng tên có thể đọc được cho các hằng số (ví dụ: ENGLISH) thay vì thẻ ngôn ngữ (EN). Các thẻ 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 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ể 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 thực hiện hành vi phức tạp hơn, bạn có thể trì hoãn gọi RemoteModelManager.download phía 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ể 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 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 dùng tính năng phát hiện đối tượng với tính năng 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. Tất cả các danh mục có thể có cho thuật toán phân loại thô đều có trong 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 một đối tượng thấp, chúng tôi sẽ 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 mô hình phân phát.

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:

  • Xóa tệp cấu hình Firebase bằng cách xóa 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ấp ứng dụng) của mô-đun (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ế classpath của trình bổ trợ Gradle cho Dịch vụ của Google trong tệp Gradle (ở cấp gốc) của dự án (build.gradle) bằng một mã 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. Tại đây, chúng tôi liệt kê những kênh hiện có để bạn liên hệ.