Reconhecer pontos de referência com o Firebase ML no iOS

É possível usar Firebase ML para reconhecer pontos de referência conhecidos em uma imagem.

Antes de começar

    If you have not already added Firebase to your app, do so by following the steps in the getting started guide.

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

    1. No Xcode, com seu projeto do app aberto, navegue até File > Add Packages.
    2. Quando solicitado, adicione o repositório do SDK do Firebase para as plataformas Apple:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. Escolha a biblioteca Firebase ML.
    5. Adicione a sinalização -ObjC à seção Outras sinalizações do vinculador das configurações de compilação do destino.
    6. Quando terminar, o Xcode começará a resolver e fazer o download das dependências em segundo plano automaticamente.

    Em seguida, faça algumas configurações no app:

    1. Importe o Firebase para seu app:

      Swift

      import FirebaseMLModelDownloader

      Objective-C

      @import FirebaseMLModelDownloader;
  1. Se você ainda não ativou APIs baseadas em nuvem para seu projeto, siga estas etapas:

    1. Abra a página de APIs do Firebase ML do console do Firebase.
    2. Se você ainda não fez o upgrade do seu projeto para o plano de preços Blaze, clique em Fazer upgrade. Você só vai receber uma mensagem para fazer upgrade se o projeto não estiver no plano Blaze.

      Apenas projetos no nível Blaze podem usar APIs baseadas na nuvem.

    3. Caso as APIs baseadas na nuvem ainda não estejam ativadas, clique em Ativar APIs baseadas na nuvem.

Configurar o detector de pontos de referência

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

Swift

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

Objective-C

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

Na próxima etapa, transmita o objeto VisionCloudDetectorOptions ao criar o objeto detector do Cloud.

Executar o detector de ponto de referência

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

  1. Receba uma instância de VisionCloudLandmarkDetector:

    Swift

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

    Objective-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 precisa ser formatada como uma string codificada em base64. Para processar um UIImage:

    Swift

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

    Objective-C

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

    Swift

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

    Objective-C

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

Ver 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á transmitida ao gerenciador de conclusão. Você pode receber informações sobre um ponto de referência reconhecido na imagem em cada objeto.

Por exemplo:

Swift

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
}

Objective-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óximas etapas