이미지 보강은 말 그대로 원본 이미지를 대상으로 일정한 변형을 가해서 새롭게 이미지를 생성하는 방법이다.
이미지 보강은 훈련 데이터셋이 부족할 경우 가져다 쓴다.
아래는 패션 MNIST의 신발 데이터를 활용하여 100개의 이미지로 뻥튀기 하는 과정이다.
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import numpy as np
# 이 ImageDataGenerator 코드 부분은 다음 링크에서 참조했습니다.
# https://github.com/franneck94/MNIST-Data-Augmentation/blob/master/mnist.py
# rotation, zoom, shift, flip 등을 지정합니다.
image_generator = ImageDataGenerator(
rotation_range=10,
zoom_range=0.10,
shear_range=0.5,
width_shift_range=0.10,
height_shift_range=0.10,
horizontal_flip=True,
vertical_flip=False)
augment_size = 100
x_augmented = image_generator.flow(np.tile(train_input[0].reshape(28*28),100).reshape(-1,28,28,1), np.zeros(augment_size), batch_size=augment_size, shuffle=False).next()[0]
# 새롭게 생성된 이미지 표시
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 10))
for c in range(100):
plt.subplot(10,10,c+1)
plt.axis('off')
plt.imshow(x_augmented[c].reshape(28,28), cmap='gray')
plt.show()
import tensorflow
model = keras.Sequential()
model.add(keras.layers.Conv2D(32, kernel_size=3, activation='relu', padding='same',
input_shape=(28,28,1)))
model.add(keras.layers.MaxPooling2D(2))
model.add(keras.layers.Conv2D(64, kernel_size=(3,3), activation='relu', padding='same'))
model.add(keras.layers.MaxPooling2D(2))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(100, activation='relu'))
model.add(keras.layers.Dropout(0.4))
model.add(keras.layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics='accuracy')
checkpoint_cb = keras.callbacks.ModelCheckpoint('best-cnn-model.h5')
early_stopping_cb = keras.callbacks.EarlyStopping(patience=2,
restore_best_weights=True)
history = model.fit(train_X, train_Y, epochs=5,
validation_data=(val_scaled, val_target),
callbacks=[checkpoint_cb, early_stopping_cb])
loss: 0.0545 - accuracy: 0.9814