Analisador do Kit de ML

O Kit de ML do Google fornece APIs Vision de aprendizado de máquina no dispositivo para detectar rostos, ler códigos de barras, rotular imagens e muito mais. O Analisador do Kit de ML facilita a integração do Kit de ML ao seu app do CameraX.

Ele é uma implementação da interface ImageAnalysis.Analyzer e substitui a resolução desejada padrão (se necessário) para otimizar o uso do Kit de ML, processa as transformações de coordenadas e transmite os frames ao Kit de ML, que retorna os resultados agregados de análise.

Implementar o Analisador do Kit de ML

Para implementar o Analisador do Kit de ML, recomendamos usar a classe CameraController, que funciona com PreviewView para mostrar elementos da interface. Quando implementado usando CameraController, o Analisador do Kit de ML processa as transformações de coordenadas entre o stream ImageAnalysis original e o PreviewView para você. Ele recebe o sistema de coordenadas de destino do CameraX, calcula a transformação das coordenadas e as encaminha para a classe Detector do Kit de ML para análise.

Para usar o Analisador do Kit de ML com CameraController, chame setImageAnalysisAnalyzer() e transmita um novo objeto do Kit de ML com o seguinte no construtor:

  • Uma lista de Detectors do Kit de ML que o CameraX invoca sequencialmente em ordem.
  • O sistema de coordenadas de destino que determina as coordenadas da saída do kit de ML:

  • Um Executor que invoca o callback do consumidor e envia o MlKitAnalyzer.Result, ou o resultado do kit de ML agregado de um frame da câmera, para o app.

  • Um Consumer, que o CameraX invoca quando há uma nova saída do kit de ML.

O código abaixo implementa o Analisador do Kit de ML usando o CameraController para configurar um BarcodeScanner para detectar códigos QR:

Kotlin

// create BarcodeScanner object
val options = BarcodeScannerOptions.Builder()
  .setBarcodeFormats(Barcode.FORMAT_QR_CODE)
  .build()
val barcodeScanner = BarcodeScanning.getClient(options)

cameraController.setImageAnalysisAnalyzer(
            ContextCompat.getMainExecutor(this),
            MlKitAnalyzer(
                listOf(barcodeScanner),
                COORDINATE_SYSTEM_VIEW_REFERENCED,
                ContextCompat.getMainExecutor(this)
            ) { result: MlKitAnalyzer.Result? ->
    // The value of result.getResult(barcodeScanner) can be used directly for drawing UI overlay.
    }
)

Java

// create BarcodeScanner object
BarcodeScannerOptions options = new BarcodeScannerOptions.Builder()
   .setBarcodeFormats(Barcode.FORMAT_QR_CODE)
   .build();
BarcodeScanner barcodeScanner = BarcodeScanning.getClient(options);

cameraController.setImageAnalysisAnalyzer(executor,
    new MlKitAnalyzer(List.of(barcodeScanner), COORDINATE_SYSTEM_VIEW_REFERENCED,
    executor, result -> {
   // The value of result.getResult(barcodeScanner) can be used directly for drawing UI overlay.
 });

No exemplo de código acima, o Kit de ML analisa o seguinte para a classe Detector de BarcodeScanner:

  • A matriz de transformação baseada em COORDINATE_SYSTEM_VIEW_REFERENCED que representa o sistema de coordenadas de destino.
  • Os frames da câmera.

Se o BarcodeScanner encontrar algum problema, o Detector gera um erro, e o Kit de ML o propaga para o app. Se bem-sucedido, o Kit de ML retorna MLKitAnalyzer.Result#getValue(), que, nesse caso, é o objeto Barcode.

Também é possível implementar o Analisador do Kit de ML usando a classe ImageAnalysis que faz parte de camera-core. No entanto, como ImageAnalysis não está integrado com PreviewView, é necessário processar manualmente as transformações de coordenadas. Para mais informações, consulte a documentação de referência do Analisador do Kit de ML.

Outros recursos

Para um app de câmera funcional que usa o Analisador do Kit de ML, consulte o exemplo CameraX-MLKit (link em inglês).