미니프로젝트 때 꼭 사용되는 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()
'Experience > - KT AIVLE School' 카테고리의 다른 글
KT AIVLE School 7주차 정리 - Object Detection (0) | 2023.03.15 |
---|---|
KT AIVLE School 7주차 정리 - 전이 학습과 파인 튜닝 (0) | 2023.03.15 |
KT AIVLE School 7주차 정리 - Colab에서 이미지 파일 정리 (0) | 2023.03.15 |
KT AIVLE School 7주차 정리 - CNN 모델 만들고 사용하기 (0) | 2023.03.15 |
KT AIVLE School 7주차 정리 - Keras callbacks (0) | 2023.03.15 |
KT AIVLE School 7주차 정리 - CNN's Layers 정리 (0) | 2023.03.13 |
댓글