Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tensorflow在进行批处理时会混淆图像和标签_Python_Image Processing_Machine Learning_Tensorflow_Batch Processing - Fatal编程技术网

Python Tensorflow在进行批处理时会混淆图像和标签

Python Tensorflow在进行批处理时会混淆图像和标签,python,image-processing,machine-learning,tensorflow,batch-processing,Python,Image Processing,Machine Learning,Tensorflow,Batch Processing,所以我已经被这个问题困扰了好几个星期了。我想从图像文件名列表中创建一个图像批处理。我将文件名列表插入队列,并使用读取器获取文件。然后读取器返回文件名和读取的图像文件 我的问题是,当我使用解码的jpg和读卡器中的标签进行批处理时,tf.train.shuffle_batch()会将图像和文件名混合在一起,因此现在标签对图像文件的顺序是错误的。“队列/洗牌”批处理是否有问题,如何修复它,使该批处理为正确的文件提供正确的标签 非常感谢 将tensorflow导入为tf 从tensorflow.pyt

所以我已经被这个问题困扰了好几个星期了。我想从图像文件名列表中创建一个图像批处理。我将文件名列表插入队列,并使用读取器获取文件。然后读取器返回文件名和读取的图像文件

我的问题是,当我使用解码的jpg和读卡器中的标签进行批处理时,tf.train.shuffle_batch()会将图像和文件名混合在一起,因此现在标签对图像文件的顺序是错误的。“队列/洗牌”批处理是否有问题,如何修复它,使该批处理为正确的文件提供正确的标签

非常感谢

将tensorflow导入为tf
从tensorflow.python.framework导入ops
def预处理图像张量(图像tf):
image=tf.image.convert\u image\u dtype(image\u tf,dtype=tf.float32)
image=tf.image.使用裁剪或焊盘调整图片大小(图片,300300)
image=tf.image.per\u image\u标准化(image)
返回图像
#原始图像名称和标签
image_path=[“image_0.jpg”、“image_1.jpg”、“image_2.jpg”、“image_3.jpg”、“image_4.jpg”、“image_5.jpg”、“image_6.jpg”、“image_7.jpg”、“image_8.jpg”]
标签=[0,1,2,3,4,5,6,7,8]
#将数组转换为张量
image\u paths\u tf=ops.convert\u to\u tensor(image\u paths,dtype=tf.string,name=“image\u paths\u tf”)
labels\u tf=ops.convert\u to_tensor(labels,dtype=tf.int32,name=“labels\u tf”)
#获取张量切片
image\u path\u tf,label\u tf=tf.train.slice\u input\u producer([image\u path\u tf,label\u tf],shuffle=False)
#从jpeg中获取图像张量并执行预处理
image\u buffer\u tf=tf.read\u文件(image\u path\u tf,name=“image\u buffer”)
image\u tf=tf.image.decode\u jpeg(image\u buffer\u tf,channels=3,name=“image”)
image\u tf=预处理图像张量(image\u tf)
#创建一批图像和标签
批量大小=5
线程数=4
图像批处理,标签批处理=tf.train.batch([image\u tf,label\u tf],批处理大小=批处理大小,num\u threads=num\u threads)
#运行测试会话以检查图像和标签的顺序
init=tf.global_variables_initializer()
使用tf.Session()作为sess:
sess.run(初始化)
coord=tf.train.Coordinator()
线程=tf.train.start\u queue\u runner(coord=coord)
打印图像\u路径\u tf.eval()
打印标签_tf.eval()
协调请求停止()

coord.join(threads)
从您的代码中,我不确定您的标签是如何从jpeg图像中编码/提取的。我曾经在同一个文件中对所有内容进行编码,但后来发现了一个更优雅的解决方案。假设您可以获得一个文件名列表、
image\u路径
和一个标签数组
labels
,您可以将它们绑定在一起,并使用
tf.train.slice\u input\u producer
对单个示例进行操作,然后使用
tf.train.batch
将它们批处理在一起

import tensorflow as tf
from tensorflow.python.framework import ops

shuffle = True
batch_size = 128
num_threads = 8

def get_data():
    """
    Return image_paths, labels such that label[i] corresponds to image_paths[i].

    image_paths: list of strings
    labels: list/np array of labels
    """
    raise NotImplementedError()

def preprocess_image_tensor(image_tf):
    """Preprocess a single image."""
    image = tf.image.convert_image_dtype(image_tf, dtype=tf.float32)
    image = tf.image.resize_image_with_crop_or_pad(image, 300, 300)
    image = tf.image.per_image_standardization(image)
    return image

image_paths, labels = get_data()

image_paths_tf = ops.convert_to_tensor(image_paths, dtype=tf.string, name='image_paths')
labels_tf = ops.convert_to_tensor(image_paths, dtype=tf.int32, name='labels')
image_path_tf, label_tf = tf.train.slice_input_producer([image_paths_tf, labels_tf], shuffle=shuffle)

# preprocess single image paths
image_buffer_tf = tf.read_file(image_path_tf, name='image_buffer')
image_tf = tf.image.decode_jpeg(image_buffer_tf, channels=3, name='image')
image_tf = preprocess_image_tensor(image_tf)

# batch the results
image_batch_tf, labels_batch_tf = tf.train.batch([image_tf, label_tf], batch_size=batch_size, num_threads=num_threads)

等等。。。。你的tf使用不是有点奇怪吗

通过调用以下命令,您基本上运行了两次图形:

  print image_path_tf.eval()
  print label_tf.eval()
由于您只需要
image\u path\u tf
label\u tf
,因此此行下面的任何内容都不会运行:

image_path_tf, label_tf = tf.train.slice_input_producer([image_paths_tf, labels_tf], shuffle=False)
也许试试这个

image_paths, labels = sess.run([images_batch_tf, labels_batch_tf])
print(image_paths)
print(labels)

好吧,我试过这种方法,我得到了完全相同的问题。我现在不确定这是我的批处理实现还是与我初始化队列的方式有关。具体地说,我的问题是,我使用与image_路径相同的图像路径列表和一个编号为0-8的标签列表对其进行了测试。我打印出了图像和标签的第一个片段,得到了
image\u path\u tf=test\u output/image\u 1.jpg
label=4
(我本来希望标签是1)。我在
start\u queue\u runner
request\u stop
之间执行了
print image\u path\u tf.eval()
print label\u tf.eval()
,我将上面的代码编辑为我现在拥有的代码。您能告诉我您将如何使用队列运行器/等从0-8打印切片吗。?谢谢噢,你说得对!这正是问题所在。非常感谢你!