コンテンツにスキップ

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 というものもある。