张量流中的剪切图像

时间:2018-10-22 23:04:29

标签: python tensorflow keras

我正在使用tf.keras建立我的网络。自从tfrecords文件中的数据以来,我就在tensor_wise级别上进行了所有扩充。然后,我需要进行剪切 zca 进行增强,但是在张量流中找不到合适的实现。而且我无法使用完成了我所需的两项操作的DataImageGenerator,因为正如我所说的,我的数据不适合存储在内存中,而是采用tfrecord格式。因此,我所有的扩充过程都应该是向北移动的。

@fchollet here建议对大型数据集使用ImgaeDataGenerator的方法。

我的第一个questino是 如果我使用@fchollet方法(基本上是使用大数据的X-sample运行ImageDataGenerator,然后使用train_on_batch来训练网络,如何将验证数据馈送到网络)

我的第二个问题是剪切 zca 操作是否有任何张量实施。像here这样的人建议使用tf.contrib.image.transform,但不知道如何使用。如果有人对如何实现有想法,我将不胜感激。

更新

这是我尝试通过ski_image构造转换矩阵的尝试

from skimage import io
from skimage import transform as trans
import tensor flow as tf 

def augment()
  afine_tf = trans.AffineTransform(shear=0.2)
  transform = tf.contrib.image.matrices_to_flat_transforms(tf.linalg.inv(afine_tf.params))
  transform= tf.cast(transform, tf.float32)
  image = tf.contrib.image.transform(image, transform)  # Image here is a tensor 
  return image


dataset_train = tf.data.TFRecordDataset(training_files, num_parallel_reads=calls)

dataset_train = dataset_train.apply(tf.contrib.data.shuffle_and_repeat(buffer_size=1000+ 4 * batch_size))
dataset_train = dataset_train.map(decode_train, num_parallel_calls= calls)  
dataset_train = dataset_train.map(augment,num_parallel_calls=calls )  
dataset_train = dataset_train.batch(batch_size)    
dataset_train = dataset_train.prefetch(tf.contrib.data.AUTOTUNE)

1 个答案:

答案 0 :(得分:1)

我将回答第二个问题。

今天,我的一个老问题被用户评论,但是当我添加有关如何使用tf.contrib.image.transform的更多详细信息时,这些评论已被删除。我想是你吧?

因此,我已经编辑了问题,并添加了一个示例,请检查here

TL; DR:

def transformImg(imgIn,forward_transform):
    t = tf.contrib.image.matrices_to_flat_transforms(tf.linalg.inv(forward_transform))
    # please notice that forward_transform must be a float matrix,
    # e.g. [[2.0,0,0],[0,1.0,0],[0,0,1]] will work
    # but [[2,0,0],[0,1,0],[0,0,1]] will not
    imgOut = tf.contrib.image.transform(imgIn, t, interpolation="BILINEAR",name=None)
    return imgOut
def shear_transform_example(filename,shear_lambda):
    image_string = tf.read_file(filename)
    image_decoded = tf.image.decode_jpeg(image_string, channels=3)
    img = transformImg(image_decoded, [[1.0,shear_lambda,0],[0,1.0,0],[0,0,1.0]])
    # Notice that this is a shear transformation parallel to the x axis
    # If you want a y axis version, use this:
    # img = transformImg(image_decoded, [[1.0,0,0],[shear_lambda,1.0,0],[0,0,1.0]])
    return img
img = shear_transform_example("white_square.jpg",0.1)