Integrar detectores de objetos

Os detectores de objetos podem identificar quais objetos de um conjunto conhecido podem estar presentes e fornecer informações sobre suas posições na imagem ou fluxo de vídeo fornecido. Um detector de objetos é treinado para detectar a presença e localização de várias classes de objetos. Por exemplo, um modelo pode ser treinado com imagens que contêm vários pedaços de fruta, junto com um rótulo que especifica a classe de fruta que eles representam (por exemplo, uma maçã, uma banana ou um morango) e dados especificando onde cada objeto aparece em a imagem. Consulte a introdução da detecção de objetos para obter mais informações sobre detectores de objetos.

Use a API ObjectDetector Biblioteca de Tarefas para implantar seus detectores de objetos personalizados ou pré-treinados em seus aplicativos móveis.

Principais recursos da API ObjectDetector

  • Processamento de imagem de entrada, incluindo rotação, redimensionamento e conversão de espaço de cores.

  • Rotular a localidade do mapa.

  • Limite de pontuação para filtrar os resultados.

  • Resultados de detecção Top-k.

  • Lista de permissões de etiqueta e denylist.

Modelos de detectores de objetos suportados

Os modelos a seguir têm garantia de compatibilidade com a API ObjectDetector .

Executar inferência em Java

Consulte o aplicativo de referência Detecção de objetos para obter um exemplo de como usar ObjectDetector em um aplicativo Android.

Etapa 1: importar dependência do Gradle e outras configurações

Copie o arquivo de modelo .tflite para o diretório de ativos do módulo Android onde o modelo será executado. Especifique que o arquivo não deve ser compactado e adicione a biblioteca TensorFlow Lite ao arquivo build.gradle do módulo:

android {
    // Other settings

    // Specify tflite file should not be compressed for the app apk
    aaptOptions {
        noCompress "tflite"
    }

}

dependencies {
    // Other dependencies

    // Import the Task Vision Library dependency
    implementation 'org.tensorflow:tensorflow-lite-task-vision:0.2.0'
}

Etapa 2: usando o modelo

// Initialization
ObjectDetectorOptions options = ObjectDetectorOptions.builder().setMaxResults(1).build();
ObjectDetector objectDetector = ObjectDetector.createFromFileAndOptions(context, modelFile, options);

// Run inference
List<Detection> results = objectDetector.detect(image);

Consulte o código-fonte e o javadoc para obter mais opções para configurar o ObjectDetector .

Executar inferência em C ++

// Initialization
ObjectDetectorOptions options;
options.mutable_base_options()->mutable_model_file()->set_file_name(model_file);
std::unique_ptr<ObjectDetector> object_detector = ObjectDetector::CreateFromOptions(options).value();

// Run inference
const DetectionResult result = object_detector->Detect(*frame_buffer).value();

Consulte o código-fonte para obter mais opções de configuração do ObjectDetector .

Resultados de exemplo

Aqui está um exemplo dos resultados da detecção de ssd mobilenet v1 do TensorFlow Hub.

cachorros

Results:
 Detection #0 (red):
  Box: (x: 355, y: 133, w: 190, h: 206)
  Top-1 class:
   index       : 17
   score       : 0.73828
   class name  : dog
 Detection #1 (green):
  Box: (x: 103, y: 15, w: 138, h: 369)
  Top-1 class:
   index       : 17
   score       : 0.73047
   class name  : dog

Renderize as caixas delimitadoras na imagem de entrada:

saída de detecção

Experimente a ferramenta de demonstração CLI simples para ObjectDetector com seu próprio modelo e dados de teste.

Requisitos de compatibilidade de modelo

A API ObjectDetector espera um modelo TFLite com metadados de modelo TFLite obrigatórios. Veja exemplos de criação de metadados para detectores de objetos usando a API TensorFlow Lite Metadata Writer .

Os modelos de detectores de objetos compatíveis devem atender aos seguintes requisitos:

  • Tensor de imagem de entrada: (kTfLiteUInt8 / kTfLiteFloat32)

    • entrada de imagem de tamanho [batch x height x width x channels] .
    • a inferência de lote não é suportada ( batch deve ser 1).
    • apenas entradas RGB são suportadas (os channels precisam ser 3).
    • se o tipo for kTfLiteFloat32, NormalizationOptions deve ser anexado aos metadados para normalização de entrada.
  • Os tensores de saída devem ser as 4 saídas de uma DetectionPostProcess , ou seja:

    • Tensor de localizações (kTfLiteFloat32)

      • tensor de tamanho [1 x num_results x 4] , a matriz interna que representa as caixas delimitadoras no formato [superior, esquerdo, direito, inferior].

      • BoundingBoxProperties devem ser anexados aos metadados e devem especificar type=BOUNDARIES e `coordinate_type = RATIO.

    • Tensor de classes (kTfLiteFloat32)

      • tensor de tamanho [1 x num_results] , cada valor representando o índice inteiro de uma classe.

      • mapa (s) de rótulo opcional (mas recomendado) podem ser anexados como AssociatedFile-s com tipo TENSOR_VALUE_LABELS, contendo um rótulo por linha. O primeiro, AssociatedFile (se houver) é usado para preencher o campo class_name dos resultados. O campo display_name é preenchido a partir do AssociatedFile (se houver) cujo locale corresponde ao campo display_names_locale do ObjectDetectorOptions usado no momento da criação ("en" por padrão, ou seja, inglês). Se nenhum deles estiver disponível, apenas o campo de index dos resultados será preenchido.

    • Tensor de pontuação (kTfLiteFloat32)

      • tensor de tamanho [1 x num_results] , cada valor representando a pontuação do objeto detectado.
    • Número de tensor de detecção (kTfLiteFloat32)

      • inteiro num_results como um tensor de tamanho [1] .