我正在使用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秒才能完成此功能的运行。
有人可能会对此有所了解并让我知道如何改善其表现吗?感谢。
答案 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_batch
和lb_batch
作为输入,并定位到您的网络。
答案 1 :(得分:0)
从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创建)