Значение пикселя изображения, нормализованное для tf.image.decode_jpeg и tf.train.shuffle_batch?

Я пытаюсь использовать функцию tf.train.shuffle_batch из tenorflow, затем мне нужно сначала загрузить изображения, используя tf.image.decode_jpeg(или другие подобные функции для загрузки png и jpg). Но я только что узнал, что изображения загружаются как карта вероятности, что означает, что максимальное значение пикселя равно 1, а минимальное значение пикселя равно 0. Ниже мой код обновлен из репозитория github. Я не знаю, почему значения пикселей нормализованы до [0,1], и я не могу найти соответствующую документацию по тензорному потоку. Кто-нибудь может мне помочь? Благодарю.

def load_examples(self, input_dir,  flip, scale_size, batch_size, min_queue_examples):
    input_paths = get_image_paths(input_dir)
    with tf.name_scope("load_images"):
        path_queue = tf.train.string_input_producer(input_paths)
        reader = tf.WholeFileReader()
        paths, contents = reader.read(path_queue)
        # note this is important for truncated images
        raw_input = tf.image.decode_jpeg(contents,try_recover_truncated = True, acceptable_fraction=0.5)
        raw_input = tf.image.convert_image_dtype(raw_input, dtype=tf.float32)
        raw_input.set_shape([None, None, 3])

        # break apart image pair and move to range [-1, 1]
        width = tf.shape(raw_input)[1]  # [height, width, channels]
        a_images = preprocess(raw_input[:, :width // 2, :])
        b_images = raw_input[:, width // 2:, :]

    inputs, targets = [a_images, b_images]

    def transform(image):
        r = image

        r = tf.image.resize_images(r, [self.image_height, self.image_width], method=tf.image.ResizeMethod.AREA)
        return r
    def transform_gaze(image):
        r = image
        r = tf.image.resize_images(r, [self.gaze_height, self.gaze_width], method=tf.image.ResizeMethod.AREA)
        return r
    with tf.name_scope("input_images"):
        input_images = transform(inputs)

    with tf.name_scope("target_images"):
        target_images = transform(targets)
    total_image_count = len(input_paths)
    # target_images = tf.image.per_image_standardization(target_images)
    target_images = target_images[:,:,0]
    target_images = tf.expand_dims(target_images, 2)
    inputs_batch, targets_batch = tf.train.shuffle_batch([input_images, target_images],
                                         batch_size=batch_size,
                                         num_threads=1,
                                         capacity=min_queue_examples + 3 * batch_size,
                                         min_after_dequeue=min_queue_examples)
    # inputs_batch, targets_batch = tf.train.batch([input_images, target_images],batch_size=batch_size)
    return inputs_batch, targets_batch, total_image_count

1 ответ

Решение

Значения в [0,1], потому что это то, что tf.image.decode_* методы делают.

В общем случае, когда метод возвращает тензор с плавающей точкой, его значения должны находиться в диапазоне [0,1], тогда как если возвращаемый тензор является значением uint8, значения должны находиться в диапазоне [0,255].

Кроме того, когда вы используете tf.image.convert_image_dtype Для преобразования dtype входного изображения вы применяете правила преобразования.

Если ваше входное изображение является изображением uint8 и вы конвертируете его в float32, значения масштабируются в диапазоне [0,1]. Если ваше изображение уже является плавающим, его значения должны находиться в этом диапазоне, и ничего не делается.

Другие вопросы по тегам