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:
API | Gộp chung | 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 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
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.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
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.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
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.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:
API | Gộp chung | 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 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
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.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
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 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ụngTextRecognition.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ụngImageLabeling.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()
vàdetectInImage()
trong Vision API được đổi tên thànhprocess()
để đả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ảoBitmapUtils.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:
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 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:
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) { ... }
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ệ.