仅在特定角度使用 tf keras 旋转图像以进行数据增强
Rotate image for data augmentation using tf keras only in specific angles
在 tf keras 中,可以有一个数据增强层在训练期间对每个给定图像执行旋转,按照 docs 所说的以下方式:
tf.keras.layers.RandomRotation(
factor, fill_mode='reflect', interpolation='bilinear',
seed=None, fill_value=0.0, **kwargs
)
factor 参数在给定浮点数的情况下指示最大旋转值,在给定元组的情况下指示下限和上限。
对于我的特定应用,只允许特定的旋转,比如 0°、90°、180° 和 270°。
有什么方法可以使用 RandomRotation class 或一个很好的替代方法来实现这一点,还是我应该在训练前 augment 整个数据集?
您可以通过创建自定义 PreprocessingLayer。
import tensorflow as tf
class Rotate90Randomly(tf.keras.layers.experimental.preprocessing.PreprocessingLayer):
def __init__(self):
super(Rotate90Randomly, self).__init__()
def call(self, x, training=False):
def random_rotate():
rotation_factor = tf.random.uniform([], minval=0,
maxval=4, dtype=tf.int32)
return tf.image.rot90(x, k=rotation_factor)
training = tf.constant(training, dtype=tf.bool)
rotated = tf.cond(training, random_rotate, lambda: x)
rotated.set_shape(rotated.shape)
return rotated
需要考虑的一件事是,如果输入的高度和宽度不相同,换句话说,它们不是正方形,您需要在创建模型时将 input_shape
定义为 (None, None, channels)
。
示例:
model = tf.keras.Sequential([
tf.keras.Input((180,180,3)),
Rotate90Randomly()])
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 10))
for images, labels in train_ds.take(1):
for i in range(9):
ax = plt.subplot(3, 3, i + 1)
images = model(images, training = True)
plt.imshow(images[i].numpy().astype("uint8"))
plt.title(class_names[labels[i]])
plt.axis("off")
对于 training = False
,它们保持不变,因此该层在推理期间不活动。
在 tf keras 中,可以有一个数据增强层在训练期间对每个给定图像执行旋转,按照 docs 所说的以下方式:
tf.keras.layers.RandomRotation(
factor, fill_mode='reflect', interpolation='bilinear',
seed=None, fill_value=0.0, **kwargs
)
factor 参数在给定浮点数的情况下指示最大旋转值,在给定元组的情况下指示下限和上限。
对于我的特定应用,只允许特定的旋转,比如 0°、90°、180° 和 270°。
有什么方法可以使用 RandomRotation class 或一个很好的替代方法来实现这一点,还是我应该在训练前 augment 整个数据集?
您可以通过创建自定义 PreprocessingLayer。
import tensorflow as tf
class Rotate90Randomly(tf.keras.layers.experimental.preprocessing.PreprocessingLayer):
def __init__(self):
super(Rotate90Randomly, self).__init__()
def call(self, x, training=False):
def random_rotate():
rotation_factor = tf.random.uniform([], minval=0,
maxval=4, dtype=tf.int32)
return tf.image.rot90(x, k=rotation_factor)
training = tf.constant(training, dtype=tf.bool)
rotated = tf.cond(training, random_rotate, lambda: x)
rotated.set_shape(rotated.shape)
return rotated
需要考虑的一件事是,如果输入的高度和宽度不相同,换句话说,它们不是正方形,您需要在创建模型时将 input_shape
定义为 (None, None, channels)
。
示例:
model = tf.keras.Sequential([
tf.keras.Input((180,180,3)),
Rotate90Randomly()])
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 10))
for images, labels in train_ds.take(1):
for i in range(9):
ax = plt.subplot(3, 3, i + 1)
images = model(images, training = True)
plt.imshow(images[i].numpy().astype("uint8"))
plt.title(class_names[labels[i]])
plt.axis("off")
对于 training = False
,它们保持不变,因此该层在推理期间不活动。