Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

Rotule imagens com segurança com o Cloud Vision usando o Firebase Auth and Functions nas plataformas da Apple

Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

Para chamar uma API do Google Cloud a partir de seu aplicativo, você precisa criar uma API REST intermediária que lide com a autorização e proteja valores secretos, como chaves de API. Em seguida, você precisa escrever o código em seu aplicativo móvel para autenticar e se comunicar com esse serviço intermediário.

Uma maneira de criar essa API REST é usar o Firebase Authentication and Functions, que fornece um gateway gerenciado e sem servidor para as APIs do Google Cloud que lidam com a autenticação e podem ser chamadas de seu aplicativo para dispositivos móveis com SDKs pré-criados.

Este guia demonstra como usar essa técnica para chamar a API Cloud Vision do seu aplicativo. Este método permitirá que todos os usuários autenticados acessem os serviços faturados do Cloud Vision por meio de seu projeto de nuvem, portanto, considere se esse mecanismo de autenticação é suficiente para seu caso de uso antes de prosseguir.

Antes de você começar

Configure seu projeto

Se você ainda não adicionou o Firebase ao seu aplicativo, faça-o seguindo as etapas do guia de primeiros passos.

Use o Swift Package Manager para instalar e gerenciar dependências do Firebase.

  1. No Xcode, com seu projeto de aplicativo aberto, navegue até File > Add Packages .
  2. Quando solicitado, adicione o repositório Firebase Apple Platform SDK:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. Escolha a biblioteca Firebase ML.
  5. Quando terminar, o Xcode começará automaticamente a resolver e baixar suas dependências em segundo plano.

Em seguida, execute algumas configurações no aplicativo:

  1. Em seu aplicativo, importe o Firebase:

    Rápido

    import FirebaseMLModelDownloader

    Objective-C

    @import FirebaseMLModelDownloader;

Mais algumas etapas de configuração e estamos prontos para começar:

  1. Se você ainda não habilitou APIs baseadas em nuvem para seu projeto, faça-o agora:

    1. Abra a página Firebase ML APIs do Firebase console.
    2. Se você ainda não atualizou seu projeto para o plano de preços Blaze, clique em Atualizar para fazer isso. (Você será solicitado a atualizar apenas se seu projeto não estiver no plano Blaze.)

      Somente projetos de nível Blaze podem usar APIs baseadas em nuvem.

    3. Se as APIs baseadas em nuvem ainda não estiverem ativadas, clique em Ativar APIs baseadas em nuvem .
  2. Configure suas chaves de API Firebase existentes para impedir o acesso à API Cloud Vision:
    1. Abra a página Credenciais do console do Cloud.
    2. Para cada chave de API na lista, abra a visualização de edição e, na seção Key Restrictions, adicione todas as APIs disponíveis, exceto a Cloud Vision API, à lista.

Implantar a função chamável

Em seguida, implante o Cloud Function que você usará para conectar seu aplicativo e a API Cloud Vision. O repositório functions-samples contém um exemplo que você pode usar.

Por padrão, acessar a API Cloud Vision por meio dessa função permitirá que apenas usuários autenticados de seu aplicativo acessem a API Cloud Vision. Você pode modificar a função para diferentes requisitos.

Para implantar a função:

  1. Clone ou baixe o repositório functions-samples e mude para o diretório vision-annotate-image :
    git clone https://github.com/firebase/functions-samples
    cd vision-annotate-image
    
  2. Instalar dependências:
    cd functions
    npm install
    cd ..
    
  3. Se você não tiver o Firebase CLI, instale-o .
  4. Inicialize um projeto do Firebase no diretório vision-annotate-image . Quando solicitado, selecione seu projeto na lista.
    firebase init
  5. Implante a função:
    firebase deploy --only functions:annotateImage

Adicione o Firebase Auth ao seu aplicativo

A função chamável implantada acima rejeitará qualquer solicitação de usuários não autenticados do seu aplicativo. Caso ainda não tenha feito isso, você precisará adicionar o Firebase Auth ao seu aplicativo.

Adicione as dependências necessárias ao seu aplicativo

Use o Swift Package Manager para instalar a biblioteca Cloud Functions for Firebase.

Agora você está pronto para rotular as imagens.

1. Prepare a imagem de entrada

Para chamar o Cloud Vision, a imagem deve ser formatada como uma string codificada em base64. Para processar uma UIImage :

Rápido

guard let imageData = uiImage.jpegData(compressionQuality: 1.0f) else { return }
let base64encodedImage = imageData.base64EncodedString()

Objective-C

NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
NSString *base64encodedImage =
  [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];

2. Invoque a função chamável para rotular a imagem

Para rotular objetos em uma imagem, invoque a função chamável passando uma solicitação JSON Cloud Vision .

  1. Primeiro, inicialize uma instância do Cloud Functions:

    Rápido

    lazy var functions = Functions.functions()
    

    Objective-C

    @property(strong, nonatomic) FIRFunctions *functions;
    
  2. Crie uma solicitação com Tipo definido como LABEL_DETECTION :

    Rápido

    let requestData = [
      "image": ["content": base64encodedImage],
      "features": ["maxResults": 5, "type": "LABEL_DETECTION"]
    ]
    

    Objective-C

    NSDictionary *requestData = @{
      @"image": @{@"content": base64encodedImage},
      @"features": @{@"maxResults": @5, @"type": @"LABEL_DETECTION"}
    };
    
  3. Por fim, invoque a função:

    Rápido

    functions.httpsCallable("annotateImage").call(requestData) { (result, error) in
      if let error = error as NSError? {
        if error.domain == FunctionsErrorDomain {
          let code = FunctionsErrorCode(rawValue: error.code)
          let message = error.localizedDescription
          let details = error.userInfo[FunctionsErrorDetailsKey]
        }
        // ...
      }
      // Function completed succesfully
    }
    

    Objective-C

    [[_functions HTTPSCallableWithName:@"annotateImage"]
                              callWithObject:requestData
                                  completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) {
            if (error) {
              if (error.domain == FIRFunctionsErrorDomain) {
                FIRFunctionsErrorCode code = error.code;
                NSString *message = error.localizedDescription;
                NSObject *details = error.userInfo[FIRFunctionsErrorDetailsKey];
              }
              // ...
            }
            // Function completed succesfully
            // Get information about labeled objects
    
          }];
    

3. Obtenha informações sobre objetos rotulados

Se a operação de rotulagem da imagem for bem-sucedida, uma resposta JSON de BatchAnnotateImagesResponse será retornada no resultado da tarefa. Cada objeto no array labelAnnotations representa algo que foi rotulado na imagem. Para cada rótulo, você pode obter a descrição do texto do rótulo, seu ID de entidade do Gráfico de conhecimento (se disponível) e a pontuação de confiança da correspondência. Por exemplo:

Rápido

if let labelArray = (result?.data as? [String: Any])?["labelAnnotations"] as? [[String:Any]] {
  for labelObj in labelArray {
    let text = labelObj["description"]
    let entityId = labelObj["mid"]
    let confidence = labelObj["score"]
  }
}

Objective-C

NSArray *labelArray = result.data[@"labelAnnotations"];
for (NSDictionary *labelObj in labelArray) {
  NSString *text = labelObj[@"description"];
  NSString *entityId = labelObj[@"mid"];
  NSNumber *confidence = labelObj[@"score"];
}