본문 바로가기
Experience/- KT AIVLE School

KT AIVLE School 7주차 정리 - 상황별 Data Augmentation

by Yoojacha 2023. 3. 15.

미니프로젝트 때 꼭 사용되는 ImageDataGenerator에 대해서 정확하게 알지 못하다보니, 팀원간에 이미지 데이터를 전처리하는 방식에 따라서 Data Augmentation하는 방식이 달라 헤맸던 기억이 있어서 후에 상황별로 정리를 합니다!


x_train, y_train 데이터가 이미 있을 때 합치는 방법

train_datagen = ImageDataGenerator(rotation_range=20,
                                     width_shift_range=0.1,
                                     height_shift_range=0.1,
                                     zoom_range=0.1,
                                     shear_range=0.1,
                                     horizontal_flip=True,
                                     vertical_flip=True)

# 데이터 증강한 훈련용 이미지 데이터 셋 생성
train_datagen.fit(x_train)
train_generator = train_datagen.flow(x_train, y_train)

"""
모델 생성 생략
"""

history = model.fit(train_generator, validation_data=(x_val, y_val),
                    epochs=10000, verbose=1, callbacks=[es])

 

train, valid, test 폴더로 이미 파일구분이 되어있을 때

train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

valid_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
                                                    'images/train',
                                                    target_size=(150, 150),
                                                    batch_size=32,
                                                    class_mode='binary'
                                                    )

valid_generator = valid_datagen.flow_from_directory(
                                                    'images/valid',
                                                    target_size=(150, 150),
                                                    batch_size=32,
                                                    class_mode='binary'
                                                    )

model.fit_generator(
        train_generator,
        steps_per_epoch=2000,
        epochs=50,
        validation_data=valid_generator,
        validation_steps=800)

# 참고 - https://keras.io/ko/preprocessing/image/

 

train, test 로 파일이 분리되어 있을 때 Dataframe으로 데이터 증강하기

IMAGE_SIZE = 224

train_datagen = ImageDataGenerator(rescale = 1./255,     # 스케일링 설정
                                   validation_split=0.2) # valid_img 분리를 위한 설정

train_generator = train_datagen.flow_from_dataframe(
                                              train_df,
                                              x_col='Filepath',
                                              y_col='Label',
                                              class_mode='binary', # 다중분류는 'categorical'
                                              target_size = (IMAGE_SIZE, IMAGE_SIZE),
                                              batch_size = 16,
                                              subset='training'
                                             )
valid_generator = train_datagen.flow_from_dataframe(
                                                     train_df,
                                                     x_col='Filepath',
                                                     y_col='Label',
                                                     class_mode='binary',
                                                     target_size = (IMAGE_SIZE, IMAGE_SIZE),
                                                     batch_size = 16,
                                                     subset='validation'
                                                    )

test_datagen = ImageDataGenerator(rescale = 1./255)

test_generator = test_datagen.flow_from_dataframe(
                                                  test_df,
                                                  x_col='Filepath',
                                                  y_col='Label',
                                                  class_mode='binary', # 다중분류는 'categorical'
                                                  target_size = (IMAGE_SIZE, IMAGE_SIZE),
                                                  batch_size = 16,
                                                 )

"""
모델 생성 생략
"""

# 모델 학습
history = model.fit(x=train_generator, 
                    validation_data=valid_generator,
                    epochs=10000, 
                    callbacks=[es],
                    batch_size=16,
                    verbose=1)

 

평가하는 방법

# ImageDataGenerator 로 만든 test_generator로 모델 평가
scores = model.evaluate_generator(test_generator, steps=5) # 성능 평가
print(scores)

print(test_generator.class_indices) # 분류 클래스 출력
y_pred = model.predict_generator(test_generator, steps=5) # 이미지의 분류 결과를 예측

single_y_pred = y_pred.argmax(axis=1)
single_y_test = y_test.argmax(axis=1)

test_acc = accuracy_score(single_y_test, single_y_pred)
print(f'정확도 : {test_acc*100:.2f}%' ) # 정확도 퍼센트 출력

# test_df 로 모델 평가
y_test = pd.get_dummies(test_df['Label'])
scores = model.evaluate(x_test, y_test)
print(f'{model.metrics_names[1]}')
print('Test Loss : {:.6f},  Test Accuracy : {:.3f}%'.format(scores[0], scores[1]*100))

 

train_df로 만들었을 때 라벨과 함께 시각화

fig, axes = plt.subplots(nrows=4, ncols=10, figsize=(15, 7),
                        subplot_kw={'xticks': [], 'yticks': []})

for i, ax in enumerate(axes.flat):
    ax.imshow(plt.imread(train_df.Filepath[i]))
    ax.set_title(train_df.Label[i], fontsize = 15)
plt.tight_layout(pad=0.5)
plt.show()

 

라벨별 이미지 데이터 분포 확인

vc = train_df['Label'].value_counts()
plt.figure(figsize=(9,5))
sns.barplot(x = vc.index, y = vc, palette = "rocket")
plt.title("Number of pictures of each category", fontsize = 15)
plt.show()

이미지 이진 분류 문제의 이미지 분포

댓글