使用包含文件名的.txt文件读取图像数据

时间:2017-12-26 11:41:53

标签: python tensorflow conv-neural-network pillow

我正在使用Tensorflow制作可以对图像进行分类的CNN。我有一个images.txt文件,其中包含.jpg个文件的列表及其相应的标签,格式如下:

image1.jpg,4
image2.jpg,3
image3.jpg,2

我编写了一个打开.txt文件的函数,并使用Pillow迭代读取图像数据:

data = []
labels = []

def preprocess():
    with open('images.txt') as f:
        for line in f:
            // Did some string processing to get path of the image

            img = Image.open(path)
            arr = np.array(img.getdata(), dtype=np.int8)
            data.append(arr)

我不确定这个程序的自然速度,但似乎很慢。我需要阅读大约5000张图片(即images.txt包含大约5000行),这需要大约60秒才能完成此功能的运行。

有人可能会对此有所了解并让我知道如何改善其表现吗?感谢。

2 个答案:

答案 0 :(得分:1)

这样做的优化方法是使用Tensorflow来完成所有工作。

这是一种直截了当的方法:

# load csv content
csv_path = tf.train.string_input_producer(['images.txt'])
textReader = tf.TextLineReader()
_, csv_content = textReader.read(csv_path)
im_name, label = tf.decode_csv(csv_content, record_defaults=[[""], [0]])

# load images
im_content = tf.read_file(im_name)
image = tf.image.decode_jpeg(im_content, channels=3)
# preprocess your input image (scale, subtract mean, resize, ...)

# make batches
bs = 32
im_batch, lb_batch = tf.train.batch([image, label], batch_size=bs)

通过这种方式,您可以使用Tensorflow读取CSV,图像和标签,并创建大小为32的批次。

您可以使用im_batchlb_batch作为输入,并定位到您的网络。

答案 1 :(得分:0)

使用新的数据集API(作为TF 1.4版本的一部分发布)来加速整个过程

从CSV文件中读取的步骤:

1)读取CSV文件名
2)通过提供CSV文件名来创建TextLineDataset 3)创建解码的Parse函数,并在输入数据中进行任何预处理工作 4)使用先前步骤中创建的数据集创建批处理,重复(没有纪元)和改组 5)创建迭代器以批量获取所需的输入(即小批量)

例如代码:

from matplotlib.image import imread
def input_model_function():
    csv_filename =['images.txt']
    dataset = tf.data.TextLineDataset(csv_filename)
    dataset = dataset.map(_parse_function)
    dataset = dataset.batch(20)# you can use any number of batching
    iterator = dataset.make_one_shot_iterator()
    sess = tf.Session()
    batch_images, batch_labels = sess.run(iterator.get_next())
return {'x':batch_images}, batch_labels

def _parse_function(line):
    image, labels= tf.decode_csv(line,record_defaults=[[""], [0]])
    # Decode the raw bytes so it becomes a tensor with type.
    image = imread(image)# give full path name of image
return image, labels

最后将批量数据集输入模型(使用任何预制估算器或自定义估算器API创建)