Atualizar importações do Gradle
O novo SDK exige 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 do Vision
Os modelos agrupados são enviados como parte do seu aplicativo. É necessário fazer o download de modelos finos. Algumas APIs estão disponíveis em formato agrupado e fino, outras apenas em um formato ou outro:
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 Kit de ML para Android no arquivo Gradle do módulo (nível
do app) (geralmente app/build.gradle
) de acordo com as tabelas a seguir:
Modelos agrupados
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.3.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.7 |
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.9 |
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.2 |
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.1 |
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.1 |
AutoMLVision Edge
API | Artefato antigo | Novo artefato |
---|---|---|
AutoML sem 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.3 |
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.3
com.google.mlkit:linkfirebase:17.0.0 |
APIs de linguagem natural
Os modelos agrupados são enviados como parte do seu aplicativo. Os modelos finos precisam ser transferidos por download:
API | Agrupadas | Fina |
---|---|---|
ID 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) (geralmente app/build.gradle
) de acordo com as tabelas a seguir:
Modelos agrupados
API | Artefatos antigos | Novo artefato |
---|---|---|
ID 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.6 |
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.4 |
Modelos finos
API | Artefatos antigos | Novo artefato |
---|---|---|
ID 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 a sua classe aparecer nesta tabela, faça a mudança indicada:
Classe antiga | Nova classe |
---|---|
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, nos nomes de pacotes, substitua o prefixo com.google.firebase.ml
por com.google.mlkit
.
Atualizar nomes de método
Há mudanças mínimas no código:
- A instanciação de detector/scanner/labeler/translator… foi alterada. Agora cada recurso tem seu próprio ponto de entrada. Por exemplo: leitura de código de barras, reconhecimento de texto, rotulagem de imagens, tradução etc. 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 de TextRecognizer foi removida, já que introduzimos outras bibliotecas para reconhecer outros scripts, como chinês e coreano. Para usar as opções padrão com o modelo de reconhecimento de texto em 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 para ImageLabeler e ObjectDetector foi removida, já que introduzimos o suporte a modelos personalizados para esses dois recursos. Por exemplo, para usar as opções padrão com o modelo base no ImageLabeling, declare uma dependência em
com.google.mlkit:image-labeling
e useImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)
no Java. - Todos os identificadores (detector/scanner/labeler/translator…) podem ser fechados. Verifique se o método
close()
é chamado quando esses objetos não forem mais usados. Se você estiver usando em um Fragment ou AppCompatActivity, uma maneira fácil de fazer isso é chamar LifecycleOwner.getLifecycle() no Fragment ou AppCompatActivity e, em seguida, chamar Lifecycle.addObserver. processImage()
edetectInImage()
nas APIs Vision foram renomeados comoprocess()
para consistência.- As APIs Natural Language agora usam o termo "código de idioma" em vez de "código de idioma", conforme definido pelo padrão BCP 47.
- 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
no exemplo de início rápido do Kit de ML para converter bitmaps de várias entradas. - O FirebaseVisionImageMetadata foi removido. Você pode transmitir metadados de imagem, como largura, altura, graus de rotação e formato, para os métodos de construção do InputImages.
Confira alguns exemplos de métodos antigos e novos do Kotlin:
Antigo
// 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())
Confira alguns exemplos de métodos Java antigos e novos:
Antigo
// 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 da API
Leitura de código de barras
Para a API de leitura de código de barras, agora há duas maneiras de entregar os modelos:
- Pelo Google Play Services, também conhecido como "thin" (recomendado): isso reduz o tamanho do app, e o modelo é compartilhado entre os aplicativos. No entanto, os desenvolvedores precisam garantir que o modelo seja baixado antes de usá-lo pela primeira vez.
- Com o APK do app, também conhecido como "empacotado", o tamanho do app aumenta, mas o modelo fica imediatamente utilizável.
As duas implementações são um pouco diferentes, e a versão "em pacote" tem várias melhorias em relação à versão "simples". Confira detalhes sobre essas diferenças nas diretrizes da API de leitura de código de barras.
Detecção facial
Para a API Face Detection, há duas maneiras de enviar os modelos:
- Pelo Google Play Services, também conhecido como "thin" (recomendado): isso reduz o tamanho do app, e o modelo é compartilhado entre os aplicativos. No entanto, os desenvolvedores precisam garantir que o modelo seja baixado antes de usá-lo pela primeira vez.
- Com o APK do app, também conhecido como "empacotado": isso aumenta o tamanho de 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
). Elas também são agora @StringDef, em vez de @IntDef, e o valor da constante é a tag de idioma BCP 47 correspondente.Se o app usa a opção de condição de download "dispositivo inativo", saiba que ela foi removida e não pode ser usada mais. Ainda é possível usar a opção "Carregamento do dispositivo". Se você quiser um comportamento mais complexo, pode atrasar a chamada de
RemoteModelManager.download
atrás da 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. Ainda é possível usar a opção "Carregamento do dispositivo".
Se você quiser um comportamento mais complexo, a chamada
RemoteModelManager.download
pode ser adiada para depois da sua própria lógica.
Detecção e rastreamento de objetos
Se o app usa a detecção de objetos com classificação grosseira, saiba que o novo SDK mudou a maneira como ele 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 grosseiro estão incluídas na classe PredefinedCategory
.
Confira um exemplo do código antigo e do novo Kotlin:
Antigo
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) { ... }
Confira um exemplo do código Java antigo e do novo:
Antigo
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 "desconhecida" foi removida. Quando a confiança da classificação de um objeto é baixa, 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 Kit de ML para Firebase é o único componente do Firebase que você usa.
- Você só usa APIs no dispositivo.
- Você não usa a veiculação de modelos.
Se esse for o caso, você poderá remover as dependências do Firebase após a migração. Siga estas etapas:
- Remova o arquivo de configuração do Firebase excluindo o arquivo google-services.json no diretório de módulos (nível do app) do seu app.
- Substitua o plug-in do Gradle para Serviços do Google no arquivo do Gradle do módulo (nível do app) (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 classpath do plug-in do Google Services no arquivo do Gradle (build.gradle) do projeto (nível raiz) pelo 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 instruções no site de suporte do Firebase.
Como receber ajuda
Se você tiver algum problema, confira nossa página da comunidade, onde descrevemos os canais disponíveis para entrar em contato com nossa equipe.