Data Augmentation¶
Data augmentation | TensorFlow Core
下の画像を元にデータを拡張。
全体のコードは augmentation.py
に記載。
Import libraries¶
import tensorflow as tf
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rcParams['figure.figsize'] = (12, 5)
Read an image¶
image_dir_path = "images/"
image_name = "squirrel.jpg"
image_string=tf.io.read_file(image_dir_path + image_name)
image=tf.image.decode_jpeg(image_string,channels=3)
show images¶
オリジナル画像と拡張後の画像を見比べるための関数。
def visualize(original, augmented, filename):
fig = plt.figure()
plt.subplot(1,2,1)
plt.title('Original image')
plt.imshow(original )
plt.subplot(1,2,2)
plt.title('Augmented image')
plt.imshow(augmented)
plt.savefig(image_dir_path + filename)
Flip Horizontally¶
画像を左右反転させる。
# tf.image.flip_left_right(image)
flipped = tf.image.flip_left_right(image)
visualize(image, flipped, "flipped.jpg")
Flip Vertically¶
画像を上下反転させる。
# tf.image.flip_up_down(image)
flipped = tf.image.flip_up_down(image)
visualize(image, flipped, "flipped_up_down.jpg")
grayscale¶
画像をグレイスケールにする。
# tf.image.rgb_to_grayscale(images, name=None)
grayscaled = tf.image.rgb_to_grayscale(image)
visualize(image, tf.squeeze(grayscaled), "grayscaled.jpg")
print(image.shape)
print(grayscaled.shape)
# (1066, 1600, 3)
# (1066, 1600, 1)
saturation¶
画像の彩度を調整する。
画像を HSV に変換した後、彩度(S) に saturation_factor
を乗算してまた RGB に戻す。
# tf.image.adjust_saturation(image, saturation_factor, name=None)
saturated = tf.image.adjust_saturation(image, 3)
visualize(image, saturated, "saturated.jpg")
brightness¶
画像の輝度を調整する。
画像を [0,1] の浮動小数型に変換した後、delta
を各画素に加算する。加算が終了したら元のデータ型に戻す。
#tf.image.adjust_brightness(image, delta)
bright = tf.image.adjust_brightness(image, 0.4)
visualize(image, bright, "bright.jpg")
Rotation¶
画像を k
* 90° 回転させる。
# tf.image.rot90(image, k=1, name=None)
rotated = tf.image.rot90(image, k=1)
visualize(image, rotated, "rotated.jpg")
Crop the central region¶
画像を中央から central_fraction
* 100% 切り抜く。
# tf.image.central_crop(image, central_fraction)
cropped = tf.image.central_crop(image, central_fraction=0.5)
visualize(image,cropped,"cropped.jpg")
Apply a data augmentation randomly¶
ランダムにデータ拡張を適用する。
拡張の方法を関数にしておき、毎回ランダムにそれらの関数を選ぶような処理。
def flip(image):
return tf.image.flip_left_right(image)
def grayscale(image):
return tf.image.rgb_to_grayscale(image)
def saturate(image):
return tf.image.adjust_saturation(image, 3)
def bright(image):
return tf.image.adjust_brightness(image, 0.4)
def rotate(image):
return tf.image.rot90(image,k=1)
def crop(image):
return tf.image.central_crop(image, central_fraction=0.5)
funcs = [flip, grayscale, saturate, bright, rotate, crop]
num = list(range(len(funcs)))
for i in range(random.randrange(1,3)):
chosen = random.choice(num)
image = random.choice[funcs](image)
num.remove(chosen)
cifar10.py
で水増しあり・なしの比較をしてみるとよい。
python cifar10.py
Others¶
Image augmentation library の albumentations というものもある。