[ML] 이미지 보강

이정연·2023년 4월 25일
0

Machine Learning

목록 보기
8/8

Why???

이미지 보강은 말 그대로 원본 이미지를 대상으로 일정한 변형을 가해서 새롭게 이미지를 생성하는 방법이다.

이미지 보강은 훈련 데이터셋이 부족할 경우 가져다 쓴다.

Example

아래는 패션 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()

  • keras의 ImageDataGenerator 패키지 사용
  • ImageDataGenerator의 flow() 메서드는 보강된 이미지를 생성한다.
  • 이 메서드는 Iterator 객체를 만드는데 여기서 값을 순차적으로 꺼낼 수 있다.

Test

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

profile
0x68656C6C6F21

0개의 댓글