ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TensorFlow 기초 28 - 이미지 보강 - 이미지가 부족한 경우 기존 이미지를 변형시켜 이미지 수를 늘림
    TensorFlow 2022. 12. 7. 16:37

     

     

     

    # 이미지 보강 - 이미지가 부족한 경우 기존 이미지를 변형시켜 이미지 수를 늘림
    
    import tensorflow as tf
    from keras.datasets import fashion_mnist
    from keras.utils import to_categorical
    from keras.callbacks import ModelCheckpoint, EarlyStopping
    import matplotlib.pyplot as plt
    import numpy as np
    
    (x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
    
    x_train = x_train.reshape(-1, 28, 28, 1).astype('float32') / 255
    x_test = x_test.reshape(-1, 28, 28, 1).astype('float32') / 255
    
    # print(y_train[:3])
    y_train = to_categorical(y_train)
    # print(y_train[:3])
    y_test = to_categorical(y_test)
    
    # plt.figure(figsize=(10, 10))
    # for c in range(100):
    #     plt.subplot(10, 10, c + 1)
    #     plt.imshow(x_train[c].reshape(28, 28), cmap='gray')
    #
    # plt.show()
    
    # 이미지 보강 연습 : x_train[0] Ankle boot
    from keras.preprocessing.image import ImageDataGenerator
    
    img_generator = ImageDataGenerator(
        rotation_range = 50,      # 이미지 회전 값
        zoom_range = 0.5,         # 이미지 일부 확대/축소
        shear_range = 0.5,        # 이미지 기울기로 회전
        width_shift_range = 0.5,  # 좌우(수평) 이동
        height_shift_range = 0.1, # 상하(수직) 이동
        horizontal_flip = True,   # 이미지 가로 뒤집기
        vertical_flip = True      # 이미지 세로 뒤집기 
    )
    
    augument_size = 100
    x_augument = img_generator.flow(np.tile(x_train[0].reshape(28 * 28), 100).reshape(-1, 28, 28, 1),
                                    np.zeros(augument_size), batch_size=augument_size,
                                    shuffle=False).next()[0]
    
    print(x_augument.shape) # (100, 28, 28, 1)
    # print(x_augument)
    
    plt.figure(figsize=(10, 10))
    for c in range(100):
        plt.subplot(10, 10, c + 1)
        plt.axis('off')
        plt.imshow(x_augument[c].reshape(28, 28), cmap='gray')
    
    plt.show()
    
    # model
    model = tf.keras.models.Sequential([
        # 이미지 데이터 특징 추출로 용량을 줄인다.
        tf.keras.layers.Conv2D(filters=32, kernel_size=3, input_shape=(28, 28, 1),
                               padding='same', activation='relu'),
        tf.keras.layers.MaxPool2D(pool_size=2),
        tf.keras.layers.Dropout(0.3),
        
        tf.keras.layers.Conv2D(filters=64, kernel_size=3, padding='same', activation='relu'),
        tf.keras.layers.MaxPool2D(pool_size=2),
        tf.keras.layers.Dropout(0.3),
        
        tf.keras.layers.Flatten(), # 백터로 데이터 한 줄로 세우기
        
        # 이미지 분류기
        tf.keras.layers.Dense(128, activation='relu'),
        tf.keras.layers.Dropout(0.3),
        tf.keras.layers.Dense(64, activation='relu'),
        tf.keras.layers.Dropout(0.3),
        tf.keras.layers.Dense(10, activation='softmax'),
    ])
    
    print(model.summary())
    
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
    
    import os
    model_dir = './mymnist'
    if not os.path.exists(model_dir):
        os.mkdir(model_dir)
        
    modelpath = './mymnist/{epoch:02d}-{val_loss:.3f}.hdf5'
    chkpoint = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=0, sabe_best_only=True)
    es = EarlyStopping(monitor='val_loss', patience=5)
    
    history = model.fit(x_train, y_train, validation_split=0.2, epochs=100, batch_size=64, verbose=0,
                        callbacks=[es, chkpoint])
    
    print('evaluate acc : %.4f'%(model.evaluate(x_test, y_test, batch_size=64, verbose=0)[0]))
    
    history = history.history
    plt.subplot(1, 2, 1)
    plt.plot(history['acc'], marker='o', c='red', label='accuracy')
    plt.plot(history['val_acc'], marker='s', c='blue', label='val_accuracy')
    plt.xlabel('epochs')
    plt.legend()
    
    plt.subplot(1, 2, 2)
    plt.plot(history['loss'], marker='o', c='red', label='loss')
    plt.plot(history['val_loss'], marker='s', c='blue', label='val_loss')
    plt.xlabel('epochs')
    plt.legend()
    
    plt.show()

     

        rotation_range = 이미지 회전 값
        zoom_range = 이미지 일부 확대/축소
        shear_range = 이미지 기울기로 회전
        width_shift_range = 좌우(수평) 이동
        height_shift_range =  # 상하(수직) 이동
        horizontal_flip = 이미지 가로 뒤집기
        vertical_flip = 이미지 세로 뒤집기 

     

     

     

    기존 이미지를 변형

     

    댓글

Designed by Tistory.