Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.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 用于图像增强的TF数据集API_Python_Tensorflow_Tensorflow Datasets - Fatal编程技术网

Python 用于图像增强的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

我使用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 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