Reconhecer pontos de referência com Firebase ML no iOS

Você pode usar o Firebase ML para reconhecer pontos de referência conhecidos em uma imagem.

Antes de você começar

    Se você ainda não adicionou o Firebase ao seu aplicativo, faça isso 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 o projeto do seu aplicativo aberto, navegue até File > Add Packages .
    2. Quando solicitado, adicione o repositório SDK das plataformas Apple do Firebase:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Escolha a biblioteca Firebase ML.
    5. Adicione o sinalizador -ObjC à seção Outros sinalizadores de vinculador das configurações de compilação do seu destino.
    6. 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. No seu aplicativo, importe o Firebase:

      Rápido

      import FirebaseMLModelDownloader

      Objetivo-C

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

    1. Abra a página APIs do Firebase ML do console do Firebase.
    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 somente se o seu projeto não estiver no plano Blaze.)

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

    3. Se as APIs baseadas em nuvem ainda não estiverem habilitadas, clique em Habilitar APIs baseadas em nuvem .

Configurar o detector de pontos de referência

Por padrão, o detector de nuvem usa a versão estável do modelo e retorna até 10 resultados. Se desejar alterar qualquer uma dessas configurações, especifique-as com um objeto VisionCloudDetectorOptions como no exemplo a seguir:

Rápido

let options = VisionCloudDetectorOptions()
options.modelType = .latest
options.maxResults = 20

Objetivo-C

  FIRVisionCloudDetectorOptions *options =
      [[FIRVisionCloudDetectorOptions alloc] init];
  options.modelType = FIRVisionCloudModelTypeLatest;
  options.maxResults = 20;
  

Na próxima etapa, passe o objeto VisionCloudDetectorOptions ao criar o objeto Detector de nuvem.

Execute o detector de pontos de referência

Para reconhecer pontos de referência em uma imagem, passe a imagem como UIImage ou CMSampleBufferRef para o método detect(in:) do VisionCloudLandmarkDetector :

  1. Obtenha uma instância do VisionCloudLandmarkDetector :

    Rápido

    lazy var vision = Vision.vision()
    
    let cloudDetector = vision.cloudLandmarkDetector(options: options)
    // Or, to use the default settings:
    // let cloudDetector = vision.cloudLandmarkDetector()
    

    Objetivo-C

    FIRVision *vision = [FIRVision vision];
    FIRVisionCloudLandmarkDetector *landmarkDetector = [vision cloudLandmarkDetector];
    // Or, to change the default settings:
    // FIRVisionCloudLandmarkDetector *landmarkDetector =
    //     [vision cloudLandmarkDetectorWithOptions:options];
    
  2. Para chamar o Cloud Vision, a imagem deve ser formatada como uma string codificada em base64. Para processar um UIImage :

    Rápido

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

    Objetivo-C

    NSData *imageData = UIImageJPEGRepresentation(uiImage, 1.0f);
    NSString *base64encodedImage =
      [imageData base64EncodedStringWithOptions:NSDataBase64Encoding76CharacterLineLength];
  3. Em seguida, passe a imagem para o método detect(in:) :

    Rápido

    cloudDetector.detect(in: visionImage) { landmarks, error in
      guard error == nil, let landmarks = landmarks, !landmarks.isEmpty else {
        // ...
        return
      }
    
      // Recognized landmarks
      // ...
    }
    

    Objetivo-C

    [landmarkDetector detectInImage:image
                         completion:^(NSArray<FIRVisionCloudLandmark *> *landmarks,
                                      NSError *error) {
      if (error != nil) {
        return;
      } else if (landmarks != nil) {
        // Got landmarks
      }
    }];
    

Obtenha informações sobre os pontos de referência reconhecidos

Se o reconhecimento de pontos de referência for bem-sucedido, uma matriz de objetos VisionCloudLandmark será passada para o manipulador de conclusão. De cada objeto você pode obter informações sobre um ponto de referência reconhecido na imagem.

Por exemplo:

Rápido

for landmark in landmarks {
  let landmarkDesc = landmark.landmark
  let boundingPoly = landmark.frame
  let entityId = landmark.entityId

  // A landmark can have multiple locations: for example, the location the image
  // was taken, and the location of the landmark depicted.
  for location in landmark.locations {
    let latitude = location.latitude
    let longitude = location.longitude
  }

  let confidence = landmark.confidence
}

Objetivo-C

for (FIRVisionCloudLandmark *landmark in landmarks) {
   NSString *landmarkDesc = landmark.landmark;
   CGRect frame = landmark.frame;
   NSString *entityId = landmark.entityId;

   // A landmark can have multiple locations: for example, the location the image
   // was taken, and the location of the landmark depicted.
   for (FIRVisionLatitudeLongitude *location in landmark.locations) {
     double latitude = [location.latitude doubleValue];
     double longitude = [location.longitude doubleValue];
   }

   float confidence = [landmark.confidence floatValue];
}

Próximos passos