tf.contrib.image.rotate
を使用してテンソルフローで画像を回転できることを知っています。しかし、次のようにラジアンで-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を使用して供給されることに注意してください。
どんな助けでも大歓迎です!!
角度テンソルで_tf.contrib.image.rotate
_をフィードすることはできません。
しかし ソースコード を調べると、一連の引数の検証が行われていることがわかります。
_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')
_