为tf.Image.decode\u jpeg和tf.train.shuffle\u批处理归一化的图像像素值?

为tf.Image.decode\u jpeg和tf.train.shuffle\u批处理归一化的图像像素值?,image,tensorflow,tensorflow-gpu,Image,Tensorflow,Tensorflow Gpu,我试图使用tensorflow中的tf.train.shuffle_批处理函数,然后我需要首先使用tf.image.decode_jpeg(或其他类似函数来加载png和jpg)加载图像。但我刚刚发现图像是以概率图的形式加载的,这意味着像素值的最大值是1,像素值的最小值是0。下面是我从github repo更新的代码。我不知道为什么像素值被标准化为[0,1],我也没有找到关于tensorflow的相关文档。有人能帮我吗?谢谢 def load_examples(self, input_dir,

我试图使用tensorflow中的tf.train.shuffle_批处理函数,然后我需要首先使用tf.image.decode_jpeg(或其他类似函数来加载png和jpg)加载图像。但我刚刚发现图像是以概率图的形式加载的,这意味着像素值的最大值是1,像素值的最小值是0。下面是我从github repo更新的代码。我不知道为什么像素值被标准化为[0,1],我也没有找到关于tensorflow的相关文档。有人能帮我吗?谢谢

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

值被放入[0,1],因为这是
tf.image.decode.*
方法所做的

通常,当方法返回浮点张量时,其值应在[0,1]范围内,而如果返回的张量为uint8,则其值应在[0255]范围内

另外,当您使用
tf.image.convert\u image\u dtype
方法转换输入图像的数据类型时,您正在应用该转换规则


如果输入图像是uint8图像,并将其转换为浮点32,则值将在[0,1]范围内缩放。如果你的图像已经是一个浮点数,那么它的值应该在这个范围内,并且什么都不做。

值进入[0,1],因为这是
tf.image.decode.*
方法所做的

通常,当方法返回浮点张量时,其值应在[0,1]范围内,而如果返回的张量为uint8,则其值应在[0255]范围内

另外,当您使用
tf.image.convert\u image\u dtype
方法转换输入图像的数据类型时,您正在应用该转换规则


如果输入图像是uint8图像,并将其转换为浮点32,则值将在[0,1]范围内缩放。如果你的图像已经是一个浮点数,那么它的值应该在这个范围内,什么也不做。

嗨,我还有一个问题,我为输入数据添加了图像摘要,就像这样:tf.summary.image('training_truth',self.targets,4)在我看来,在张力板中,图像显示在[0255]范围内。那么,这是否意味着我的模型的图像批被规范化,而tensorboard可视化仍然是[0255]?谢谢是的,图像摘要检查输入类型。如果它是float,那么它会将值缩放到0.255的范围内,以便可视化,它会声明,一个float张量的值应该在[0,1]而不是[0,1]中。这有区别吗?好的,没有区别。嗨,我还有一个问题,我为输入数据添加了图像摘要,就像这样:tf.summary.image('training_truth',self.targets,4)在我看来,在tensorboard中,图像显示在[0255]范围内。这是否意味着我的模型的图像批被规范化,而tensorboard可视化仍然是[0,255]?谢谢。是的,图像摘要会检查输入类型。如果它是浮点型,则会将值缩放到0.255范围内,以便可视化。它表示,浮点张量的值应该在[0,1]而不是[0,1]中。这会有区别吗?答:否,没有区别