Python 用于图像增强的TF数据集API
我使用tf数据集API读取图像及其标签。我喜欢在图像上进行多个图像增强,并增加我的训练数据大小。我现在所做的如下Python 用于图像增强的TF数据集API,python,tensorflow,tensorflow-datasets,Python,Tensorflow,Tensorflow Datasets,我使用tf数据集API读取图像及其标签。我喜欢在图像上进行多个图像增强,并增加我的训练数据大小。我现在所做的如下 def flip(self, img, lbl): image = tf.image.flip_left_right(img) return image, lbl def transpose(self, img, lbl): image = tf.image.transpose_image(img) return image, lbl # just read an
def flip(self, img, lbl):
image = tf.image.flip_left_right(img)
return image, lbl
def transpose(self, img, lbl):
image = tf.image.transpose_image(img)
return image, lbl
# just read and resize the image.
process_fn = lambda img, lbl: self.read_convert_image(img, lbl, self.args)
flip_fn = lambda img, lbl: self.flip(img,lbl)
transpose_fn = lambda img, lbl: self.transpose(img,lbl)
train_set = self.train_set.repeat()
train_set = train_set.shuffle(args.batch_size)
train_set = train_set.map(process_fn)
fliped_data = train_set.map(flip_fn)
transpose_data = train_set.map(transpose_fn)
train_set = train_set.concatenate(fliped_data)
train_set = train_set.concatenate(transpose_data)
train_set = train_set.batch(args.batch_size)
iterator = train_set.make_one_shot_iterator()
images, labels = iterator.get_next()
有没有更好的方法来进行多重增强。上述方法的问题是,如果我添加更多的增广函数,则需要许多映射和连接
谢谢图像增强的一个简单替代方法是使用 其中包含易于使用的 看起来像这样
ImageDataGenerator(rescale=1./255,
rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range = 0.2,
horizontal_flip = True)
您已经准备好尽可能多地使用增强图像
下面是一个正在运行的github代码示例如果您想自己进行扩充,而不必依赖Keras的
ImageDataGenerator
,您可以创建一个类似img_aug
的函数,然后在您的模型或数据集API管道中使用它。下面的代码只是一个伪代码,但它显示了这个想法。您定义了所有转换,然后有了一些通用阈值,在该阈值之上应用转换,并尝试应用它们最多X次(在下面的代码中为4次)
def img_aug(图像):
图像=扭曲的图像
def h_flip():
返回tf.image.flip\u left\u right(扭曲的图像)
def v_flip():
返回tf.image.flip\u up\u down(扭曲的图像)
threshold=tf.constant(0.9,dtype=tf.float32)
def主体(i,扭曲的_图像):
p_顺序=tf.random_uniform(shape=[2],minval=0,maxval=1,dtype=tf.float32)
扭曲的_图像=tf.case({
tf.更大(p_顺序[0],阈值):h_翻转,
tf.更大(p_顺序[1],阈值):v_翻转,
}
,默认值=标识,独占值=False)
返回(i+1,扭曲的图像)
def cond(i,*参数):
返回i<4#最大转换次数
并行迭代=1
tf.while_循环(cond,body,[0,扭曲的_图像],
并行迭代=并行迭代)
返回失真的图像
您可以在一个函数中堆叠所有增强,然后调用tf.map。这对你有帮助吗?而且你不必连接。如果您不想堆叠,您可以扩充您的扩充或执行随机选择器,以决定使用哪一个扩充。@Lau如果我将所有扩充堆叠在一个函数中,如何在每个步骤中保留每个扩充结果?我喜欢为输入图像保留翻转图像和转置图像。如果我堆叠,那么映射中只剩下最后一个输出,对吗?请帮助我理解。你想对图像进行视觉保护,还是只想随机使用一个增强?@Lau我想保留翻转和转置的图像。谢谢。我想使用tf.data.Dataset。正在寻找与tf.data.Dataset操作类似的功能。您找到解决方案了吗?我正在寻找一种将ImageDataGenerator与tf.data一起使用的方法。Dataset@DrkStr,您不能将ImageDataGenerator
与tf.data.Dataset
一起使用。即使可以,也会非常慢,因为ImageDataGenerator
不使用GPU进行数据增强。请参阅直接使用tf.data.Dataset
API。@RicardoCruz您提供的链接告诉我们如何为1个历元进行扩充。但是我们必须编写手动训练循环?我想在Dataset api中使用keras fit api,并且也这样做。因此,dataset api应该表现为生成器。有可能吗?谢谢。但是我认为这对我的情况没有帮助。例如:我的tf.data中有100张图片。我应用了翻转,数据集变成200,然后我应用了转置,数据集应该是300。翻转和转置是两个独立的函数,分别应用于输入数据集中的相同图像。问题中列出了我的代码,这是可能的,但不是一个完美的解决方案。因为我必须明确地执行每一步。我想了解一个具有in tf.data的内部迭代器是否将多个函数应用于同一个图像,并将每个函数的状态保持为输出图像?您可以将历元号传递给该函数,并使第一个历元具有原始图像,第二个历元仅具有垂直翻转,第三次水平翻转,等等。但是你会有洗牌的问题。在这种情况下,您可以在上面的我的函数中的tf.cond
中放置某种epoch\u number%number\u变换。
def img_aug(image):
image = distorted_image
def h_flip():
return tf.image.flip_left_right(distorted_image)
def v_flip():
return tf.image.flip_up_down(distorted_image)
threshold = tf.constant(0.9, dtype=tf.float32)
def body(i, distorted_image):
p_order = tf.random_uniform(shape=[2], minval=0., maxval=1., dtype=tf.float32)
distorted_image = tf.case({
tf.greater(p_order[0], threshold): h_flip,
tf.greater(p_order[1], threshold): v_flip,
}
,default=identity, exclusive=False)
return (i+1, distorted_image)
def cond(i, *args):
return i < 4 # max number of transformations
parallel_iterations = 1
tf.while_loop(cond, body, [0,distorted_image],
parallel_iterations=parallel_iterations)
return distorted_image