图像张量与文件名和标签不匹配

2024-10-02 02:37:49 发布

您现在位置:Python中文网/ 问答频道 /正文

training_set_name, training_set_class, training_set_image = sess.run([fR.training_set_name, fR.training_set_class, fR.training_set_image])

fileReader类的相关代码。在

^{pr2}$

labelFileBatchProcessor读取csv、无序处理并返回包含名称和标签的批处理。Filenamelister()将这些名称转换为路径,并返回一个队列。这个队列被传递给imageloader()函数,该函数返回图像张量。在

问题是加载的图像张量和image_tra_name_batch不匹配。我认为问题是当build_images(files_training)被执行时,另一个浴缸被加载。有解决办法吗?在

我希望避免将所有内容存储在一个文件中,而更喜欢从csv中读取图像名称,然后对其进行无序处理,然后再读取图像。在


编辑1:一些相关功能

labelFileBatchProcessor函数:

 def labelFileBatchProcessor(batch_size, num_epochs=None, what_set="training"):
        if what_set == "training":
            inputCsv = ["./data/BDRW_train/BDRW_train_1/labels.csv"]
        elif what_set == "validation":
            inputCsv = ["./data/BDRW_train/BDRW_train_2/labels.csv"]
        labelFile_queue = tf.train.string_input_producer(inputCsv, num_epochs=1, shuffle=False)
        image_name, image_class = labelFileInit(labelFile_queue)
        min_after_dequeue = 50
        capacity = min_after_dequeue + 3 * batch_size
        image_name_batch, image_class_batch = tf.train.shuffle_batch(
            [image_name, image_class], batch_size=batch_size, capacity=capacity,
            min_after_dequeue=min_after_dequeue)
        return image_name_batch, image_class_batch

filenameLister2函数:

def filenameLister2(imageNameBatch):
    FILES_TRAINING = TRAINING_DIR + imageNameBatch + ".jpg"
    FILES_TRAINING = tf.train.string_input_producer(FILES_TRAINING, name="CSVFilenames")
    return FILES_TRAINING

构建图像功能:

def build_images(files_training):
image_reader = tf.WholeFileReader()
_, image_file = image_reader.read(files_training)
image_orig = tf.image.decode_jpeg(image_file)
image = tf.image.resize_images(image_orig, [48, 48])
image.set_shape((48, 48, 3))
num_preprocess_threads = 1
min_queue_examples = 256
images = tf.train.batch([image], batch_size=BATCH_SIZE, num_threads=NUM_PREPROCESS_THREADS, capacity=BATCH_SIZE)
return images

编辑2

我更新了labelFileBatchProcessor()函数,并从^{中删除了tf.train_batch()。这可能是由另一个问题引起的。我把张量放在同一批图像仍然不匹配。在

def labelFileBatchProcessor(batch_size, num_epochs=None, what_set="training"):
if what_set == "training":
    inputCsv = ["./data/BDRW_train/BDRW_train_1/labels.csv"]
elif what_set == "validation":
    inputCsv = ["./data/BDRW_train/BDRW_train_2/labels.csv"]
labelFile_queue = tf.train.string_input_producer(inputCsv, num_epochs=1, shuffle=False)

image_name, image_class = labelFileInit(labelFile_queue)
min_after_dequeue = 50
capacity = min_after_dequeue + 3 * batch_size

filenames = [TRAINING_DIR + image_name + ".jpg"]

files_training = tf.train.string_input_producer(filenames, name="CSVFilenames",  shuffle=False)
images = build_images(files_training)

image_name_batch, image_class_batch, images, filenames2 = tf.train.shuffle_batch(
    [image_name, image_class, images, filenames], batch_size=batch_size, capacity=capacity,
    min_after_dequeue=min_after_dequeue, allow_smaller_final_batch=True)

return image_name_batch, image_class_batch, images, filenames2

Tags: nameimagesizetfbatchtrainingtrainmin
1条回答
网友
1楼 · 发布于 2024-10-02 02:37:49

据我所知,问题的出现是因为您的输入管道中有两个独立的批处理阶段:

  • image_tra_name_batch和{}由labelFileBatchProcessor()中的^{}进行批处理。

  • imagesbuild_images()中的^{}进行批处理。

因此,每个文件名和类以及每个图像之间的关联都会丢失。这样的问题的一般解决方案是确保训练示例的所有属性(在本例中,image_nameimage_class,和image)传递给同一个tf.train.batch()(或tf.train.shuffle_batch())调用。这将确保它们作为不可分割的张量元组进行预处理,并保持关联。在

相关问题 更多 >

    热门问题