Você pode usar o Kit de ML para rotular objetos reconhecidos em uma imagem, usando um modelo no dispositivo ou um modelo na nuvem. Consulte a visão geral para saber mais sobre os benefícios de cada abordagem.
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 .
- Inclua as bibliotecas do ML Kit em seu Podfile:
pod 'Firebase/MLVision', '6.25.0'
Depois de instalar ou atualizar os pods do seu projeto, certifique-se de abrir seu projeto Xcode usando seu# If using the on-device API: pod 'Firebase/MLVisionLabelModel', '6.25.0'
.xcworkspace
. - No seu aplicativo, importe o Firebase:
Rápido
import Firebase
Objetivo-C
@import Firebase;
Se você quiser usar o modelo baseado em nuvem e ainda não tiver habilitado as APIs baseadas em nuvem para o seu projeto, faça-o agora:
- Abra a página APIs do kit de ML do console do Firebase.
Se você ainda não atualizou seu projeto para um 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.
- Se as APIs baseadas em nuvem ainda não estiverem habilitadas, clique em Habilitar APIs baseadas em nuvem .
Se quiser usar apenas o modelo no dispositivo, você pode pular esta etapa.
Agora você está pronto para rotular imagens usando um modelo no dispositivo ou um modelo baseado em nuvem.
1. Prepare a imagem de entrada
Crie um objeto VisionImage
usando UIImage
ou CMSampleBufferRef
.
Para usar uma UIImage
:
- Se necessário, gire a imagem para que sua propriedade
imageOrientation
seja.up
. - Crie um objeto
VisionImage
usando oUIImage
girado corretamente. Não especifique nenhum metadado de rotação — o valor padrão,.topLeft
, deve ser usado.Rápido
let image = VisionImage(image: uiImage)
Objetivo-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithImage:uiImage];
Para usar um CMSampleBufferRef
:
Crie um objeto
VisionImageMetadata
que especifique a orientação dos dados de imagem contidos no bufferCMSampleBufferRef
.Para obter a orientação da imagem:
Rápido
func imageOrientation( deviceOrientation: UIDeviceOrientation, cameraPosition: AVCaptureDevice.Position ) -> VisionDetectorImageOrientation { switch deviceOrientation { case .portrait: return cameraPosition == .front ? .leftTop : .rightTop case .landscapeLeft: return cameraPosition == .front ? .bottomLeft : .topLeft case .portraitUpsideDown: return cameraPosition == .front ? .rightBottom : .leftBottom case .landscapeRight: return cameraPosition == .front ? .topRight : .bottomRight case .faceDown, .faceUp, .unknown: return .leftTop } }
Objetivo-C
- (FIRVisionDetectorImageOrientation) imageOrientationFromDeviceOrientation:(UIDeviceOrientation)deviceOrientation cameraPosition:(AVCaptureDevicePosition)cameraPosition { switch (deviceOrientation) { case UIDeviceOrientationPortrait: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationLeftTop; } else { return FIRVisionDetectorImageOrientationRightTop; } case UIDeviceOrientationLandscapeLeft: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationBottomLeft; } else { return FIRVisionDetectorImageOrientationTopLeft; } case UIDeviceOrientationPortraitUpsideDown: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationRightBottom; } else { return FIRVisionDetectorImageOrientationLeftBottom; } case UIDeviceOrientationLandscapeRight: if (cameraPosition == AVCaptureDevicePositionFront) { return FIRVisionDetectorImageOrientationTopRight; } else { return FIRVisionDetectorImageOrientationBottomRight; } default: return FIRVisionDetectorImageOrientationTopLeft; } }
Em seguida, crie o objeto de metadados:
Rápido
let cameraPosition = AVCaptureDevice.Position.back // Set to the capture device you used. let metadata = VisionImageMetadata() metadata.orientation = imageOrientation( deviceOrientation: UIDevice.current.orientation, cameraPosition: cameraPosition )
Objetivo-C
FIRVisionImageMetadata *metadata = [[FIRVisionImageMetadata alloc] init]; AVCaptureDevicePosition cameraPosition = AVCaptureDevicePositionBack; // Set to the capture device you used. metadata.orientation = [self imageOrientationFromDeviceOrientation:UIDevice.currentDevice.orientation cameraPosition:cameraPosition];
- Crie um objeto
VisionImage
usando o objetoCMSampleBufferRef
e os metadados de rotação:Rápido
let image = VisionImage(buffer: sampleBuffer) image.metadata = metadata
Objetivo-C
FIRVisionImage *image = [[FIRVisionImage alloc] initWithBuffer:sampleBuffer]; image.metadata = metadata;
2. Configure e execute o rotulador de imagens
Para rotular objetos em uma imagem, passe o objetoVisionImage
para o método processImage()
do VisionImageLabeler
.Primeiro, obtenha uma instância de
VisionImageLabeler
.Se você quiser usar o rotulador de imagens no dispositivo:
Rápido
let labeler = Vision.vision().onDeviceImageLabeler() // Or, to set the minimum confidence required: // let options = VisionOnDeviceImageLabelerOptions() // options.confidenceThreshold = 0.7 // let labeler = Vision.vision().onDeviceImageLabeler(options: options)
Objetivo-C
FIRVisionImageLabeler *labeler = [[FIRVision vision] onDeviceImageLabeler]; // Or, to set the minimum confidence required: // FIRVisionOnDeviceImageLabelerOptions *options = // [[FIRVisionOnDeviceImageLabelerOptions alloc] init]; // options.confidenceThreshold = 0.7; // FIRVisionImageLabeler *labeler = // [[FIRVision vision] onDeviceImageLabelerWithOptions:options];
Se você quiser usar o rotulador de imagens em nuvem:
Rápido
let labeler = Vision.vision().cloudImageLabeler() // Or, to set the minimum confidence required: // let options = VisionCloudImageLabelerOptions() // options.confidenceThreshold = 0.7 // let labeler = Vision.vision().cloudImageLabeler(options: options)
Objetivo-C
FIRVisionImageLabeler *labeler = [[FIRVision vision] cloudImageLabeler]; // Or, to set the minimum confidence required: // FIRVisionCloudImageLabelerOptions *options = // [[FIRVisionCloudImageLabelerOptions alloc] init]; // options.confidenceThreshold = 0.7; // FIRVisionImageLabeler *labeler = // [[FIRVision vision] cloudImageLabelerWithOptions:options];
Em seguida, passe a imagem para o método
processImage()
:Rápido
labeler.process(image) { labels, error in guard error == nil, let labels = labels else { return } // Task succeeded. // ... }
Objetivo-C
[labeler processImage:image completion:^(NSArray<FIRVisionImageLabel *> *_Nullable labels, NSError *_Nullable error) { if (error != nil) { return; } // Task succeeded. // ... }];
3. Obtenha informações sobre objetos rotulados
Se a rotulagem da imagem for bem-sucedida, uma matriz de objetosVisionImageLabel
será passada para o manipulador de conclusão. De cada objeto você pode obter informações sobre uma característica reconhecida na imagem.Por exemplo:
Rápido
for label in labels {
let labelText = label.text
let entityId = label.entityID
let confidence = label.confidence
}
Objetivo-C
for (FIRVisionImageLabel *label in labels) {
NSString *labelText = label.text;
NSString *entityId = label.entityID;
NSNumber *confidence = label.confidence;
}
Dicas para melhorar o desempenho em tempo real
Se você deseja rotular imagens em um aplicativo em tempo real, siga estas diretrizes para obter as melhores taxas de quadros:
- Limite as chamadas para o rotulador de imagens. Se um novo quadro de vídeo ficar disponível enquanto o rotulador de imagens estiver em execução, descarte o quadro.
- Se você estiver usando a saída do rotulador de imagem para sobrepor gráficos na imagem de entrada, primeiro obtenha o resultado do Kit de ML e, em seguida, renderize a imagem e a sobreposição em uma única etapa. Ao fazer isso, você renderiza na superfície de exibição apenas uma vez para cada quadro de entrada. Veja as classes previewOverlayView e FIRDetectionOverlayView no aplicativo de exemplo de demonstração para ver um exemplo.
Próximos passos
- Antes de implantar em produção um aplicativo que usa uma API do Cloud, você deve seguir algumas etapas adicionais para evitar e mitigar o efeito do acesso não autorizado à API .