APIs SavedModel comuns para tarefas de imagem

Esta página descreve como TF2 SavedModels para tarefas relacionadas a imagens devem implementar a API Reusable SavedModel . (Isso substitui as assinaturas comuns para imagens para o formato TF1 Hub agora obsoleto.)

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 uso por um classificador feed-forward simples no modelo de consumidor. (Em termos de CNNs clássicas, este é o valor do gargalo após a extensão espacial ter sido agrupada ou nivelada, mas antes da classificação ser feita; para isso, consulte a classificação da imagem abaixo.)

Um SavedModel reutilizável para extração de recursos de imagem possui um método __call__ no objeto raiz que mapeia um lote de imagens para um lote de vetores de recursos. Pode ser usado assim:

obj = hub.load("path/to/model")  # That's tf.saved_model.load() after download.
images = ...  # A batch of images with shape [batch_size, height, width, 3].
features = obj(images)   # A batch with shape [batch_size, num_features].

Em Keras, o equivalente é

features = hub.KerasLayer("path/to/model")(images)

A entrada segue a convenção geral para entrada de imagens . A documentação do modelo especifica o intervalo permitido para height e width da entrada.

A saída é um único tensor de dtype float32 e shape [batch_size, num_features] . O batch_size é o mesmo da entrada. num_features é uma constante específica do módulo independente do tamanho da entrada.

Detalhes da API

A API Reusable SavedModel também fornece uma lista de obj.variables (por exemplo, para inicialização quando não está sendo carregado com entusiasmo).

Um modelo que suporta ajuste fino fornece uma lista de obj.trainable_variables . Pode ser necessário que você passe training=True para executar no modo de treinamento (por exemplo, para abandono). Alguns modelos permitem argumentos opcionais para substituir hiperparâmetros (por exemplo, taxa de abandono; a ser descrito na documentação do modelo). O modelo também pode fornecer uma lista de obj.regularization_losses . Para obter detalhes, consulte API SavedModel reutilizável .

Em Keras, isso é resolvido por hub.KerasLayer : inicialize-o com trainable=True para permitir o ajuste fino e (no caso raro em que as substituições de hparam se aplicam) com arguments=dict(some_hparam=some_value, ...)) .

Notas

A aplicação de dropout aos recursos de saída (ou não) deve ser deixada para o consumidor do modelo. O próprio SavedModel não deve executar dropout nas saídas reais (mesmo que use dropout internamente em outros locais).

Exemplos

SavedModels reutilizáveis ​​para vetores de recursos de imagem são usados ​​em

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 do modelo tirem conclusões da classificação específica aprendida pelo módulo editor. (Para classificação de imagens com um novo conjunto de classes, é comum reutilizar um modelo Image Feature Vector com um novo classificador.)

Um SavedModel reutilizável para classificação de imagens possui um método __call__ no objeto raiz que mapeia um lote de imagens para um lote de logits. Pode ser usado assim:

obj = hub.load("path/to/model")  # That's tf.saved_model.load() after download.
images = ...  # A batch of images with shape [batch_size, height, width, 3].
logits = obj(images)   # A batch with shape [batch_size, num_classes].

Em Keras, o equivalente é

logits = hub.KerasLayer("path/to/model")(images)

A entrada segue a convenção geral para entrada de imagens . A documentação do modelo especifica o intervalo permitido para height e width da entrada.

Os logits de saída são um único tensor de dtype float32 e shape [batch_size, num_classes] . O batch_size é o mesmo da entrada. num_classes é o número de classes na classificação, que é uma constante específica do modelo.

O valor logits[i, c] é uma pontuação que prevê a adesão do exemplo i à 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.

Detalhes da API

A API Reusable SavedModel também fornece uma lista de obj.variables (por exemplo, para inicialização quando não está sendo carregado com entusiasmo).

Um modelo que suporta ajuste fino fornece uma lista de obj.trainable_variables . Pode ser necessário que você passe training=True para executar no modo de treinamento (por exemplo, para abandono). Alguns modelos permitem argumentos opcionais para substituir hiperparâmetros (por exemplo, taxa de abandono; a ser descrito na documentação do modelo). O modelo também pode fornecer uma lista de obj.regularization_losses . Para obter detalhes, consulte API SavedModel reutilizável .

Em Keras, isso é resolvido por hub.KerasLayer : inicialize-o com trainable=True para permitir o ajuste fino e (no caso raro em que as substituições de hparam se aplicam) com arguments=dict(some_hparam=some_value, ...)) .

Entrada de imagem

Isso é comum a todos os tipos de modelos de imagem.

Um modelo 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) .

O modelo aceita qualquer batch_size . A documentação do modelo especifica o intervalo permitido para height e width . A última dimensão é fixada em 3 canais RGB.

É recomendado que os modelos usem o layout channels_last (ou NHWC ) dos tensores e deixem para o otimizador de gráfico do TensorFlow reescrever para channels_first (ou NCHW ), se necessário.