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 imagem 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 recursos de imagem é um tensor 1-D denso que representa uma imagem inteira, normalmente para classificação pelo modelo do consumidor. (Ao contrário das ativações intermediárias das CNNs, ela não oferece uma divisão espacial. Ao contrário da classificação de imagens , ela descarta a classificação aprendida pelo modelo do editor.)

Um módulo para extração de feição de imagem tem uma assinatura padrão que mapeia um lote de imagens para um lote de vetores de feição. 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].

Ele 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 usados ​​para classificação com um classificador feed-forward simples (como os recursos agrupados da camada convolucional superior 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 próprio módulo não deve realizar dropout nas saídas reais (mesmo que utilize 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 são dependentes 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 imagem

Resumo de uso

A classificação de imagem 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 tem 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].

Ele 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), sigmoid (para classes ortogonais) ou outra coisa. A documentação do módulo deve descrever isso e se referir 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 são dependentes 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 uma principal) entrada de imagens usa o nome "images" para essa entrada.

O módulo aceita qualquer batch_size e, correspondentemente, define a primeira dimensão de TensorInfo.tensor_shape como "unknown". A última dimensão é fixada no número 3 dos canais RGB. As dimensões de 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 Tensors e deixam para o otimizador de gráficos do TensorFlow reescrever para channels_first (ou NCHW ), se necessário. Ele vem fazendo isso por padrão desde a versão 1.7 do TensorFlow.