Spec-Zone.ru › TensorFlow 2.9

tf.image.convert_image_dtype

Просмотреть исходный код на GitHub

Преобразовать image в dtype, масштабируя его значения при необходимости.

Просмотр псевдонимов

Псевдонимы для миграции

См. Руководство по миграции для получения более подробной информации.

tf.compat.v1.image.convert_image_dtype

tf.image.convert_image_dtype(
    image, dtype, saturate=False, name=None
)

Операция поддерживает типы данных (для image и dtype) uint8, uint16, uint32, uint64, int8, int16, int32, int64, float16, float32, float64, bfloat16.

Изображения, представленные с помощью чисел с плавающей точкой, должны иметь значения в диапазоне [0,1). Данные изображения, хранящиеся в целочисленных типах данных, должны иметь значения в диапазоне [0,MAX], где MAX - это наибольшее положительное представимое число для типа данных.

Данная операция выполняет преобразование между типами данных, масштабируя значения соответствующим образом перед приведением типа.

Пример использования:

x = [[[1, 2, 3], [4, 5, 6]],
     [[7, 8, 9], [10, 11, 12]]]
x_int8 = tf.convert_to_tensor(x, dtype=tf.int8)
tf.image.convert_image_dtype(x_int8, dtype=tf.float16, saturate=False)
<tf.Tensor: shape=(2, 2, 3), dtype=float16, numpy=
array([[[0.00787, 0.01575, 0.02362],
        [0.0315 , 0.03937, 0.04724]],
       [[0.0551 , 0.063  , 0.07086],
        [0.07874, 0.0866 , 0.0945 ]]], dtype=float16)>

Преобразование целочисленных типов в типы с плавающей точкой возвращает нормализованные значения с плавающей точкой в диапазоне [0, 1); значения нормализуются по значению MAX входного типа данных. Рассмотрим следующие два примера:

a = [[[1], [2]], [[3], [4]]]
a_int8 = tf.convert_to_tensor(a, dtype=tf.int8)
tf.image.convert_image_dtype(a_int8, dtype=tf.float32)
<tf.Tensor: shape=(2, 2, 1), dtype=float32, numpy=
array([[[0.00787402],
        [0.01574803]],
       [[0.02362205],
        [0.03149606]]], dtype=float32)>
a_int32 = tf.convert_to_tensor(a, dtype=tf.int32)
tf.image.convert_image_dtype(a_int32, dtype=tf.float32)
<tf.Tensor: shape=(2, 2, 1), dtype=float32, numpy=
array([[[4.6566129e-10],
        [9.3132257e-10]],
       [[1.3969839e-09],
        [1.8626451e-09]]], dtype=float32)>

Несмотря на идентичные значения a и тип выходных данных float32, результаты отличаются из-за различных входных типов данных (int8 против int32). Это снова связано с тем, что значения нормализуются по значению MAX входного типа данных.

Обратите внимание, что преобразование значений с плавающей точкой в целочисленный тип может привести к потере точности. В примере ниже тензор изображения b типа float32 преобразуется в int8 и обратно в float32. Однако окончательный результат отличается от исходного входного b из-за потери точности.

b = [[[0.12], [0.34]], [[0.56], [0.78]]]
b_float32 = tf.convert_to_tensor(b, dtype=tf.float32)
b_int8 = tf.image.convert_image_dtype(b_float32, dtype=tf.int8)
tf.image.convert_image_dtype(b_int8, dtype=tf.float32)
<tf.Tensor: shape=(2, 2, 1), dtype=float32, numpy=
array([[[0.11811024],
        [0.33858266]],
       [[0.5590551 ],
        [0.77952754]]], dtype=float32)>

Масштабирование от целочисленного типа (входной тип данных) к другому целочисленному типу (выходной тип данных) не будет отображать MAX входного типа данных на MAX выходного типа данных, но преобразования туда и обратно должны привести к отсутствию изменений. Например, как показано ниже, значение MAX int8 (=127) не отображается на значение MAX int16 (=32 767), но при масштабировании обратно мы получим те же исходные значения c.

c = [[[1], [2]], [[127], [127]]]
c_int8 = tf.convert_to_tensor(c, dtype=tf.int8)
c_int16 = tf.image.convert_image_dtype(c_int8, dtype=tf.int16)
print(c_int16)
tf.Tensor(
[[[  256]
  [  512]]
 [[32512]
  [32512]]], shape=(2, 2, 1), dtype=int16)
c_int8_back = tf.image.convert_image_dtype(c_int16, dtype=tf.int8)
print(c_int8_back)
tf.Tensor(
[[[  1]
  [  2]]
 [[127]
  [127]]], shape=(2, 2, 1), dtype=int8)

Масштабирование вниз от целочисленного типа к другому целочисленному типу может быть преобразованием с потерей точности. Заметьте в примере ниже, что преобразование int16 в uint8 и обратно в int16 привело к потере точности.

d = [[[1000], [2000]], [[3000], [4000]]]
d_int16 = tf.convert_to_tensor(d, dtype=tf.int16)
d_uint8 = tf.image.convert_image_dtype(d_int16, dtype=tf.uint8)
d_int16_back = tf.image.convert_image_dtype(d_uint8, dtype=tf.int16)
print(d_int16_back)
tf.Tensor(
[[[ 896]
  [1920]]
 [[2944]
  [3968]]], shape=(2, 2, 1), dtype=int16)

Обратите внимание, что преобразование от входных данных с плавающей точкой к целочисленным типам может привести к проблемам переполнения/потерь точности. Установите параметр saturate в True чтобы избежать таких проблем при проблемных преобразованиях. При включении насыщения выходной результат будет ограничен допустимым диапазоном перед потенциально опасным приведением типа (и только перед таким приведением, т. е. при приведении из с плавающей точкой к целочисленному типу и при приведении от знакового к беззнаковому типу; saturate не влияет на преобразования между числами с плавающей точкой или на преобразования, увеличивающие диапазон типа).

Аргументы
image Изображение.
dtype Тип DType для преобразования image в.
saturate Если True, обрезать входные данные перед приведением типа (при необходимости).
name Имя данной операции (необязательно).
Возвращает
image, преобразованный в dtype.
Возможные ошибки
AttributeError Вызывает ошибку атрибута, когда тип данных не является ни float, ни integer.

© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.9/api_docs/python/tf/image/convert_image_dtype

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API