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 các thư viện phụ thuộc vào Dịch vụ Google Play.
API thị giác
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, một số khác chỉ có một trong hai dạng:
API | Theo cụm | Mỏng |
---|---|---|
Nhận dạng văn bản | x (thử nghiệm) | x |
Phát hiện khuôn mặt | x | x |
Quét mã vạch | x | x |
Gắn nhãn hình ảnh | x | x |
Phát hiện và theo dõi đối tượng | x | - |
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 của mô-đun (cấp ứng dụng) (thường là app/build.gradle
) theo các bảng sau:
Mô hình đi kèm
API | Cấ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
API | Cấ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
API | Cấ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 |
API ngôn ngữ tự nhiên
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 mô hình mỏng xuống:
API | Theo cụm | Mỏng |
---|---|---|
Mã ngôn ngữ | x | x |
Trả lời thông minh | x | x (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 của mô-đun (cấp ứng dụng) (thường là app/build.gradle
) theo các bảng sau:
Mô hình đi kèm
API | Cấ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
API | Cấ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ỉ định:
Lớp cũ | Lớp 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:
- 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
Bạn chỉ cần thay đổi mã ở mức tối thiểu:
- Đã thay đổi hoạt động tạo bản sao của trình phát hiện/máy quét/máy gắn nhãn/bộ dịch. Giờ đây, mỗi tính năng đều có điểm truy cập riêng. Ví dụ: BarcodeScanning (Quét mã vạch), TextRecognition (Nhận dạng văn bản), ImageLabeling (Gắn nhãn hình ảnh), Translation (Bản 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. - Chúng tôi đã xoá bản sao mặc định cho TextRecognizer vì đã giới thiệu các thư viện bổ sung để nhận dạng các phông chữ 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 chữ viết 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ụngTextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
. - Chúng tôi đã xoá bản sao mặc định cho ImageLabeler và ObjectDetector vì đã 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 phần phụ thuộc trên
com.google.mlkit:image-labeling
và sử dụngImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
trong Java. - Tất cả các handle (trình phát hiện/máy quét/máy gắn nhãn/trình 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ữa. Nếu bạn đang sử dụng các lớp này trong một 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()
vàdetectInImage()
trong API Vision đã được đổi tên thànhprocess()
để đảm bảo tính nhất quán.- Các API Ngôn ngữ tự nhiên hiện 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ữ".
- 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ợ nữa trong giao diện công khai. Vui lòng tham khảoBitmapUtils.java
trong mẫu nhanh về 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, độ xoay, đị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ề phương thức Kotlin cũ và mới:
Cũ
// 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:
Cũ
// 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 API Quét mã vạch, 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" (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 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.
- Khi APK của ứng dụng được "gói" – việc này làm tăng kích thước ứng dụng nhưng đồng thời cũng có nghĩa là bạn có thể sử dụng mô hình ngay lập tức.
Hai phương thức triển khai này có một 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 về 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ó 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" (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 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.
- Khi tệp APK của ứng dụng được "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 đồng thời cũng có nghĩa là bạn có thể sử dụng mô hình ngay lập tức.
Hành vi của các phương thức triển khai này giống nhau.
Bản dịch
TranslateLanguage
hiện sử dụng tên dễ đọc cho các hằng số (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 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ể sử dụng được nữa. Bạn vẫn có thể sử dụng tuỳ chọn "đang 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
theo logic của riêng mình.
AutoML Image Labeling
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ể sử dụng được nữa. Bạn vẫn có thể sử dụng tuỳ chọn "đang 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
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 có 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ả các danh mục có thể có của
trình phân loại thô đều có trong lớp PredefinedCategory
.
Dưới đây là ví dụ về mã Kotlin cũ và mới:
Cũ
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:
Cũ
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) { ... }
Đã xoá danh mục "không xác định". Khi độ tin cậy của việc phân loại đối tượng thấp, chúng ta 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ụ máy học 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ợ Dịch vụ Google cho Gradle 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ợ 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ợ Dịch vụ của Google cho Gradle trong tệp Gradle (build.gradle) của dự án (cấp gốc) bằng đường dẫn lớp của 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' } }
Xoá ứng dụng Firebase của bạn trong bảng điều khiển Firebase theo hướng dẫn trên trang web hỗ trợ Firebase.
Nhận Trợ giúp
Nếu bạn gặp vấn đề, vui lòng tham khảo trang Cộng đồng của chúng tôi để biết các kênh liên hệ với chúng tôi.