如何在张量流中随机旋转不同角度的图像

Posted

技术标签:

【中文标题】如何在张量流中随机旋转不同角度的图像【英文标题】:How to rotate images at different angles randomly in tensorflow 【发布时间】:2019-04-15 19:51:00 【问题描述】:

我知道我可以使用 tf.contrib.image.rotate 在 tensorflow 中旋转图像。但是假设我想以弧度 -0.3 到 0.3 之间的角度随机应用旋转,如下所示:

images = tf.contrib.image.rotate(images, tf.random_uniform(shape=[batch_size], minval=-0.3, maxval=0.3, seed=mseed), interpolation='BILINEAR')

到目前为止,这可以正常工作。但是当最后一次迭代中批量大小发生变化并且出现错误时,问题就出现了。那么如何修复此代码并使其在所有情况下都能正常工作呢?请注意,输入图像是使用tf.data.Dataset api 提供的。

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

你不能用角度张量喂tf.contrib.image.rotate

但如果你检查source code,你会发现它只是做了一堆参数验证,然后:

image_height = math_ops.cast(array_ops.shape(images)[1],
                             dtypes.float32)[None]
image_width = math_ops.cast(array_ops.shape(images)[2],
                            dtypes.float32)[None]
output = transform(
    images,
    angles_to_projective_transforms(angles, image_height, image_width),
                                    interpolation=interpolation)

tf.contrib.image.transform() 接收一个投影变换矩阵。 tf.contrib.image.angles_to_projective_transforms() 从旋转角度生成投影变换。

两者都接受张量作为参数,因此您可以只调用底层函数。


这是一个使用 MNIST 的示例

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

# load mnist
from tensorflow.examples.tutorials.mnist
import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot = True)

# Tensorflow random angle rotation
input_size = mnist.train.images.shape[1]
side_size = int(np.sqrt(input_size))

dataset = tf.placeholder(tf.float32, [None, input_size])
images = tf.reshape(dataset, (-1, side_size, side_size, 1))
random_angles = tf.random.uniform(shape = (tf.shape(images)[0], ), minval = -np
    .pi / 4, maxval = np.pi / 4)

rotated_images = tf.contrib.image.transform(
    images,
    tf.contrib.image.angles_to_projective_transforms(
        random_angles, tf.cast(tf.shape(images)[1], tf.float32), tf.cast(tf
            .shape(images)[2], tf.float32)
    ))

# Run and Print
sess = tf.Session()
result = sess.run(rotated_images, feed_dict = 
    dataset: mnist.train.images,
)

original = np.reshape(mnist.train.images * 255, (-1, side_size, side_size)).astype(
    np.uint8)
rotated = np.reshape(result * 255, (-1, side_size, side_size)).astype(np.uint8)


# Print 10 random samples
fig, axes = plt.subplots(2, 10, figsize = (15, 4.5))
choice = np.random.choice(range(len(mnist.test.labels)), 10)
for k in range(10):
    axes[0][k].set_axis_off()
axes[0][k].imshow(original[choice[k, ]], interpolation = 'nearest', \
    cmap = 'gray')
axes[1][k].set_axis_off()
axes[1][k].imshow(rotated[choice[k, ]], interpolation = 'nearest', \
    cmap = 'gray')

【讨论】:

以上是关于如何在张量流中随机旋转不同角度的图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在张量流中为非分类对象创建一个类?

ARCore Sceneform ViewRenderable 以随机角度旋转图像

张量流中的ocr实现

在张量流中,如何迭代存储在张量中的输入序列?

如何在张量流中对张量进行子集化?

如何在张量流中张量的某些索引处插入某些值?