Atualizar importações do Gradle
O novo SDK requer apenas uma dependência para cada API do Kit de ML. Não é necessário especificar
bibliotecas comuns, como firebase-ml-vision
ou firebase-ml-natural-language
.
O Kit de ML usa o namespace com.google.android.gms
para bibliotecas que dependem do Google Play Services.
APIs Vision
Os modelos em pacote são enviados como parte do seu aplicativo. É necessário fazer o download de modelos finos. Algumas APIs estão disponíveis em pacotes ou em formatos finos, e outras somente em um ou outro formato:
API | Agrupadas | Fina |
---|---|---|
Reconhecimento de texto | x (Beta) | x |
Detecção facial | x | x |
Leitura de código de barras | x | x |
Marcação de imagens | x | x |
Detecção e rastreamento de objetos | x | - |
Atualize as dependências das bibliotecas do Android do Kit de ML no arquivo Gradle do módulo (nível do
app), que geralmente é app/build.gradle
, de acordo com as tabelas abaixo:
Pacote de modelos
API | Artefatos antigos | Novo artefato |
---|---|---|
Leitura de código de barras | 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 |
Contorno do rosto | 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 |
Marcação de imagens | 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 |
Detecção de objetos | 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 |
Modelos finos
API | Artefatos antigos | Novo artefato |
---|---|---|
Leitura de código de barras | com.google.firebase:firebase-ml-vision:24.0.1 | com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.0 |
Detecção facial | com.google.firebase:firebase-ml-vision:24.0.1 | com.google.android.gms:play-services-mlkit-face-detection:17.1.0 |
Reconhecimento de texto | com.google.firebase:firebase-ml-vision:24.0.1 | com.google.android.gms:play-services-mlkit-text-recognition:19.0.0 |
AutoMLVision Edge
API | Artefato antigo | Novo artefato |
---|---|---|
AutoML sem fazer o download | 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 com download | 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 |
APIs Natural Language
Os modelos em pacote são enviados como parte do seu aplicativo. É preciso fazer o download de modelos finos:
API | Agrupadas | Fina |
---|---|---|
Código do idioma | x | x |
Resposta inteligente | x | x (Beta) |
Atualize as dependências das bibliotecas do Android do Kit de ML no arquivo Gradle do módulo (nível do
app), que geralmente é app/build.gradle
, de acordo com as tabelas abaixo:
Pacote de modelos
API | Artefatos antigos | Novo artefato |
---|---|---|
Código do idioma | 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 |
Resposta inteligente | 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 |
Modelos finos
API | Artefatos antigos | Novo artefato |
---|---|---|
Código do idioma | 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 |
Resposta inteligente | 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 |
Atualizar nomes de classes
Se sua turma aparecer nesta tabela, faça a alteração indicada:
Classe antiga | Nova turma |
---|---|
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 |
Para outras classes, siga estas regras:
- Remova o prefixo
FirebaseVision
do nome da classe. - Remova outros prefixos que começam com
Firebase
do nome da classe.
Além disso, em nomes de pacotes, substitua o prefixo com.google.firebase.ml
por com.google.mlkit
.
Atualizar nomes de métodos
Há pequenas mudanças no código:
- Detector/scanner/labeler/translator... A instanciação foi alterada. Agora, cada recurso tem o próprio ponto de entrada. Por exemplo: verificação de código de barras, reconhecimento de texto, rotulagem de imagens, tradução... As chamadas para o serviço
getInstance()
do Firebase são substituídas por chamadas para o métodogetClient()
do ponto de entrada do recurso. - A instanciação padrão do TextRecognitionr foi removida, já que introduzimos bibliotecas adicionais para o reconhecimento de outros scripts, como chinês e coreano. Para usar as opções padrão com o modelo de reconhecimento de texto de script latino, declare uma dependência de
com.google.android.gms:play-services-mlkit-text-recognition
e useTextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS)
. - A instanciação padrão de ImageLabeler e ObjectDetector foi removida porque introduzimos suporte a modelos personalizados para esses dois recursos. Por exemplo, para usar as opções padrão com o modelo base em ImageLabeling, declare uma dependência de
com.google.mlkit:image-labeling
e useImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
em Java. - Todos os identificadores (detector/scanner/rotulador/tradutor...) podem ser fechados. Garanta que o método
close()
seja chamado quando esses objetos não forem mais usados. Se você os estiver usando em um Fragment ou AppCompatActivity, uma maneira fácil de fazer isso é chamar LifecycleOwner.getLifecycle() no Fragment ou no AppCompatActivity e depois chamar Lifecycle.addObserver processImage()
edetectInImage()
nas APIs Vision foram renomeados comoprocess()
para manter a consistência- As APIs Natural Language agora usam o termo "tag de idioma" (conforme definido pelo padrão BCP 47) em vez de "código de idioma".
- Os métodos getter nas classes xxxOptions foram removidos.
- O método getBitmap() na classe InputImage(substituindo
FirebaseVisionImage
) não tem mais suporte como parte da interface pública ConsulteBitmapUtils.java
na amostra do guia de início rápido do Kit de ML para receber o bitmap convertido de várias entradas. - O protobufImageMetadata foi removido. Agora, basta transmitir metadados da imagem, como largura, altura, rotationdegrees, formato, nos métodos de construção de InputImages.
Confira alguns exemplos de métodos Kotlin antigos e novos:
Antiga
// 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() )
Novo
// 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())
Aqui estão alguns exemplos de métodos Java novos e antigos:
Antiga
// 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());
Novo
// 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());
Mudanças específicas de APIs
Leitura de código de barras
Para a API Barcode Scanning, agora há duas maneiras de enviar os modelos:
- Pelo Google Play Services, também conhecido como "fino" (recomendado): reduz o tamanho do app, e o modelo é compartilhado entre eles. No entanto, os desenvolvedores precisam garantir que o modelo seja transferido por download antes de usá-lo pela primeira vez.
- Com o APK do seu app, também conhecido como "pacote", isso aumenta o tamanho do app, mas significa que o modelo pode ser usado imediatamente.
As duas implementações são ligeiramente diferentes, e a versão "agregada" tem várias melhorias em relação à versão "thin". Detalhes sobre essas diferenças podem ser encontrados nas diretrizes da API Barcode Scanning.
Detecção facial
Para a API Face Detection, os modelos podem ser enviados de duas maneiras:
- Pelo Google Play Services, também conhecido como "fino" (recomendado): reduz o tamanho do app, e o modelo é compartilhado entre eles. No entanto, os desenvolvedores precisam garantir que o modelo seja transferido por download antes de usá-lo pela primeira vez.
- Com o APK do seu app, também conhecido como "pacote", isso aumenta o tamanho do download do app, mas significa que o modelo pode ser usado imediatamente.
O comportamento das implementações é o mesmo.
Tradução
Agora,
TranslateLanguage
usa nomes legíveis para as constantes (por exemplo,ENGLISH
) em vez de tags de idioma (EN
). Eles também são @StringDef em vez de @IntDef, e o valor da constante é a tag de idioma BCP 47 correspondente.Se seu aplicativo usa a opção de condição de download “dispositivo ocioso”, esteja ciente de que essa opção foi removida e não pode mais ser usada. Ainda será possível usar a opção "carregamento do dispositivo". Se você quiser um comportamento mais complexo, pode atrasar a chamada de
RemoteModelManager.download
por sua própria lógica.
Rotulagem de imagens do AutoML
Se o app usa a opção de condição de download "dispositivo inativo", saiba que ela foi removida e não pode mais ser usada. Você ainda pode usar a opção "carregamento do dispositivo".
Se você quiser um comportamento mais complexo, pode atrasar a chamada de
RemoteModelManager.download
usando sua própria lógica.
Detecção e rastreamento de objetos
Se o app usa detecção de objetos com classificação rudimentar, saiba que o novo SDK mudou a forma como retorna a categoria de classificação para objetos detectados.
A categoria de classificação é retornada como uma instância de DetectedObject.Label
em vez de um número inteiro. Todas as categorias possíveis para o
classificador geral estão incluídas na classe PredefinedCategory
.
Confira um exemplo do código Kotlin antigo e novo:
Antiga
if (object.classificationCategory == FirebaseVisionObject.CATEGORY_FOOD) { ... }
Novo
if (!object.labels.isEmpty() && object.labels[0].text == PredefinedCategory.FOOD) { ... } // or if (!object.labels.isEmpty() && object.labels[0].index == PredefinedCategory.FOOD_INDEX) { ... }
Aqui está um exemplo do código Java antigo e novo:
Antiga
if (object.getClassificationCategory() == FirebaseVisionObject.CATEGORY_FOOD) { ... }
Novo
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) { ... }
A categoria "desconhecido" foi removida. Quando a confiança da classificação de um objeto é baixa, simplesmente não retornamos nenhum rótulo.
Remover dependências do Firebase (opcional)
Esta etapa só se aplica quando estas condições são atendidas:
- O Firebase ML Kit é o único componente do Firebase que você usa.
- Você só usa APIs no dispositivo.
- Você não usa a disponibilização de modelos.
Se esse for o caso, remova as dependências do Firebase após a migração. Siga estas etapas:
- Remova o arquivo de configuração do Firebase excluindo o arquivo de configuração google-services.json no diretório do módulo (nível do app) do seu app.
- Substitua o plug-in do Gradle para serviços do Google no arquivo Gradle do módulo (nível do aplicativo) (geralmente app/build.gradle) pelo plug-in Strict Version Matcher:
Antes
apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' // Google Services plugin android { // … }
Depois
apply plugin: 'com.android.application' apply plugin: 'com.google.android.gms.strict-version-matcher-plugin' android { // … }
- Substitua o caminho de classe do plug-in do Gradle para serviços do Google no arquivo Gradle (build.gradle) do seu projeto (nível raiz) pelo caminho do plug-in Strict Version Matcher:
Antes
buildscript { dependencies { // ... classpath 'com.google.gms:google-services:4.3.3' // Google Services plugin } }
Depois
buildscript { dependencies { // ... classpath 'com.google.android.gms:strict-version-matcher-plugin:1.2.1' } }
Exclua o app do Firebase no Console do Firebase de acordo com as instructions no site de suporte do Firebase.
Como buscar ajuda
Se você tiver algum problema, confira nossa página da comunidade, em que descrevemos os canais disponíveis para entrar em contato conosco.