Общие API-интерфейсы SavedModel для задач обработки изображений

На этой странице описывается, как TF2 SavedModels для задач, связанных с изображениями, должен реализовывать Reusable SavedModel API . (Это заменяет общие подписи для изображений для устаревшего формата TF1 Hub .)

Вектор функции изображения

Сводка по использованию

Вектор признаков изображения — это плотный одномерный тензор, который представляет все изображение, обычно для использования простым классификатором прямого распространения в потребительской модели. (С точки зрения классических CNN, это значение узкого места после того, как пространственный экстент был объединен или сглажен, но до того, как будет выполнена классификация; для этого см. классификацию изображений ниже.)

Многоразовая сохраненная модель для извлечения признаков изображения имеет метод __call__ в корневом объекте, который сопоставляет пакет изображений с пакетом векторов признаков. Его можно использовать так:

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].

В Керасе эквивалентом является

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

Ввод соответствует общему соглашению по вводу изображений . В документации модели указан допустимый диапазон height и width ввода.

Выходные данные представляют собой один тензор dtype float32 и формы [batch_size, num_features] . batch_size такой же, как и во входных данных. num_features — это константа, специфичная для модуля, независимая от размера входных данных.

Детали API

API Reusable SavedModel также предоставляет список obj.variables (например, для инициализации, когда загрузка неактивна).

Модель, поддерживающая тонкую настройку, предоставляет список obj.trainable_variables . Для выполнения в режиме обучения может потребоваться передать training=True (например, при выходе из игры). Некоторые модели позволяют использовать дополнительные аргументы для переопределения гиперпараметров (например, коэффициент отсева; будет описан в документации модели). Модель также может предоставлять список obj.regularization_losses . Подробности см. в разделе Reusable SavedModel API .

В Keras об этом заботится hub.KerasLayer : инициализируйте его с помощью trainable=True , чтобы включить точную настройку, и (в том редком случае, когда применяются переопределения hparam) с arguments=dict(some_hparam=some_value, ...)) .

Примечания

Применение исключения к выходным функциям (или нет) должно быть оставлено на усмотрение потребителя модели. Сама SavedModel не должна выполнять исключение на фактических выходных данных (даже если оно использует исключение внутри в других местах).

Примеры

Многоразовые сохраненные модели для векторов признаков изображений используются в

Классификация изображений

Сводка по использованию

Классификация изображений сопоставляет пиксели изображения с линейными показателями (логитами) принадлежности к классам таксономии , выбранным издателем модуля . Это позволяет потребителям модели делать выводы на основе конкретной классификации, полученной модулем издателя. (Для классификации изображений с помощью нового набора классов обычно вместо этого повторно используется модель вектора признаков изображения с новым классификатором.)

Многоразовая сохраненная модель для классификации изображений имеет метод __call__ в корневом объекте, который сопоставляет пакет изображений с пакетом логитов. Его можно использовать так:

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].

В Керасе эквивалентом является

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

Ввод соответствует общему соглашению по вводу изображений . В документации модели указан допустимый диапазон height и width ввода.

Выходные logits представляют собой один тензор dtype float32 и формы [batch_size, num_classes] . batch_size такой же, как и во входных данных. num_classes — это количество классов в классификации, которое является константой, зависящей от модели.

Значение logits[i, c] — это оценка, предсказывающая принадлежность примера i к классу с индексом c .

От базовой классификации зависит, будут ли эти оценки использоваться с softmax (для взаимоисключающих классов), сигмоидой (для ортогональных классов) или с чем-то еще. Это должно быть описано в документации модуля и содержать ссылку на определение индексов классов.

Детали API

API Reusable SavedModel также предоставляет список obj.variables (например, для инициализации, когда загрузка неактивна).

Модель, поддерживающая тонкую настройку, предоставляет список obj.trainable_variables . Для выполнения в режиме обучения может потребоваться передать training=True (например, при выходе из игры). Некоторые модели позволяют использовать дополнительные аргументы для переопределения гиперпараметров (например, коэффициент отсева; будет описан в документации модели). Модель также может предоставлять список obj.regularization_losses . Подробности см. в разделе Reusable SavedModel API .

В Keras об этом заботится hub.KerasLayer : инициализируйте его с помощью trainable=True , чтобы включить точную настройку, и (в том редком случае, когда применяются переопределения hparam) с arguments=dict(some_hparam=some_value, ...)) .

Ввод изображения

Это характерно для всех типов моделей изображений.

Модель, которая принимает пакет изображений в качестве входных данных, принимает их как плотный 4-D тензор dtype float32 и форму [batch_size, height, width, 3] , элементами которой являются значения цвета RGB пикселей, нормализованные к диапазону [0, 1] . Это то, что вы получаете от tf.image.decode_*() , за которым следует tf.image.convert_image_dtype(..., tf.float32) .

Модель принимает любой batch_size . В документации модели указан допустимый диапазон height и width . Последнее измерение фиксировано для 3 каналов RGB.

Рекомендуется, чтобы модели использовали макет channels_last (или NHWC ) Tensors повсюду и оставляли его на усмотрение оптимизатора графов TensorFlow, чтобы он при необходимости перезаписал его на channels_first (или NCHW ).