Assinaturas comuns para imagens

Esta página descreve assinaturas comuns que devem ser implementadas por módulos no formato TF1 Hub para tarefas relacionadas a imagens. (Para o formato TF2 SavedModel , consulte a API SavedModel análoga.)

Alguns módulos podem ser usados ​​para mais de uma tarefa (por exemplo, módulos de classificação de imagens tendem a fazer alguma extração de recursos no caminho). Portanto, cada módulo fornece (1) assinaturas nomeadas para todas as tarefas previstas pelo editor e (2) uma output = m(images) para sua tarefa primária designada.

Vetor de recurso de imagem

Resumo de uso

Um vetor de características de imagem é um tensor 1-D denso que representa uma imagem inteira, normalmente para classificação pelo modelo de consumidor. (Ao contrário das ativações intermediárias das CNNs, não oferece uma divisão espacial. Ao contrário da classificação de imagens , descarta a classificação aprendida pelo modelo do editor.)

Um módulo para extração de recursos de imagem possui uma assinatura padrão que mapeia um lote de imagens para um lote de vetores de recursos. Pode ser usado assim:

  module_spec = hub.load_module_spec("path/to/module")
  height, width = hub.get_expected_image_size(module_spec)
  images = ...  # A batch of images with shape [batch_size, height, width, 3].
  module = hub.Module(module_spec)
  features = module(images)   # A batch with shape [batch_size, num_features].

Também define a assinatura nomeada correspondente.

Especificação de assinatura

A assinatura nomeada para extrair vetores de recursos de imagem é invocada como

  outputs = module(dict(images=images), signature="image_feature_vector",
                   as_dict=True)
  features = outputs["default"]

A entrada segue a convenção geral para entrada de imagens .

O dicionário de saídas contém uma saída "default" de dtype float32 e shape [batch_size, num_features] . O batch_size é o mesmo da entrada, mas não é conhecido no momento da construção do gráfico. num_features é uma constante conhecida específica do módulo, independente do tamanho da entrada.

Esses vetores de recursos devem ser utilizáveis ​​para classificação com um classificador feed-forward simples (como os recursos agrupados da camada convolucional mais alta em uma CNN típica para classificação de imagens).

A aplicação de dropout aos recursos de saída (ou não) deve ser deixada para o consumidor do módulo. O módulo em si não deve realizar dropout nas saídas reais (mesmo que use dropout internamente em outros locais).

O dicionário de saídas pode fornecer outras saídas, por exemplo, as ativações de camadas ocultas dentro do módulo. Suas chaves e valores dependem do módulo. Recomenda-se prefixar as chaves dependentes da arquitetura com um nome de arquitetura (por exemplo, para evitar confundir a camada intermediária "InceptionV3/Mixed_5c" com a camada convolucional superior "InceptionV2/Mixed_5c" ).

Classificação de imagens

Resumo de uso

A classificação de imagens mapeia os pixels de uma imagem para pontuações lineares (logits) para participação nas classes de uma taxonomia selecionada pelo editor do módulo . Isso permite que os consumidores tirem conclusões da classificação específica aprendida pelo módulo do editor, e não apenas de seus recursos subjacentes (cf. Image Feature Vector ).

Um módulo para extração de recursos de imagem possui uma assinatura padrão que mapeia um lote de imagens para um lote de logits. Pode ser usado assim:

  module_spec = hub.load_module_spec("path/to/module")
  height, width = hub.get_expected_image_size(module_spec)
  images = ...  # A batch of images with shape [batch_size, height, width, 3].
  module = hub.Module(module_spec)
  logits = module(images)   # A batch with shape [batch_size, num_classes].

Também define a assinatura nomeada correspondente.

Especificação de assinatura

A assinatura nomeada para extrair vetores de recursos de imagem é invocada como

  outputs = module(dict(images=images), signature="image_classification",
                   as_dict=True)
  logits = outputs["default"]

A entrada segue a convenção geral para entrada de imagens .

O dicionário de saídas contém uma saída "default" de dtype float32 e shape [batch_size, num_classes] . O batch_size é o mesmo da entrada, mas não é conhecido no momento da construção do gráfico. num_classes é o número de classes na classificação, que é uma constante conhecida independente do tamanho da entrada.

Avaliar outputs["default"][i, c] produz uma pontuação que prevê a associação do exemplo i na classe com índice c .

Depende da classificação subjacente se essas pontuações devem ser usadas com softmax (para classes mutuamente exclusivas), sigmóide (para classes ortogonais) ou qualquer outra coisa. A documentação do módulo deve descrever isso e fazer referência a uma definição dos índices de classe.

O dicionário de saídas pode fornecer outras saídas, por exemplo, as ativações de camadas ocultas dentro do módulo. Suas chaves e valores dependem do módulo. Recomenda-se prefixar as chaves dependentes da arquitetura com um nome de arquitetura (por exemplo, para evitar confundir a camada intermediária "InceptionV3/Mixed_5c" com a camada convolucional superior "InceptionV2/Mixed_5c" ).

Entrada de imagem

Isso é comum a todos os tipos de módulos de imagem e assinaturas de imagem.

Uma assinatura que recebe um lote de imagens como entrada as aceita como um tensor 4-D denso de dtype float32 e forma [batch_size, height, width, 3] cujos elementos são valores de cores RGB de pixels normalizados para o intervalo [0, 1] . Isso é o que você obtém de tf.image.decode_*() seguido por tf.image.convert_image_dtype(..., tf.float32) .

Um módulo com exatamente uma (ou principal) entrada de imagens usa o nome "images" para esta entrada.

O módulo aceita qualquer batch_size e define correspondentemente a primeira dimensão de TensorInfo.tensor_shape como "desconhecido". A última dimensão é fixada no número 3 dos canais RGB. As dimensões height e width são fixadas no tamanho esperado das imagens de entrada. (Trabalhos futuros podem remover essa restrição para módulos totalmente convolucionais.)

Os consumidores do módulo não devem inspecionar a forma diretamente, mas obter as informações de tamanho chamando hub.get_expected_image_size() no módulo ou na especificação do módulo, e espera-se que redimensionem as imagens de entrada de acordo (normalmente antes/durante o lote).

Para simplificar, os módulos TF-Hub usam o layout channels_last (ou NHWC ) dos Tensores e deixam para o otimizador de gráfico do TensorFlow reescrever para channels_first (ou NCHW ), se necessário. Isso é feito por padrão desde a versão 1.7 do TensorFlow.