[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.09.09
📕 학습 목록
- Horse vs Human 이미지 분류 모델 개발
📗 프로젝트 작업 내역
1) 프로젝트 제목
Horse vs Human 이미지 분류 모델 개발 및 성능 분석
2) 프로젝트 목표
말과 사람의 이미지를 딥러닝 모델을 통해 분류하여, 이진 이미지 분류를 기반으로 한 에듀테크 환경에서의 활용 가능성을 확
3) 사용한 데이터 셋
- 데이터: Laurence Moroney 제공의 말과 사람 컬러 CG 이미지 데이터셋
- 모델 성능 분석을 위해 총 4개의 딥러닝 모델(MobileNetV2, ResNet50, VGGNet16, DenseNet121) 비교
4) 워크플로우
① 패키지 임포트
- 사용한 주요 패키지: pandas, numpy, matplotlib, tensorflow, scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import cv2
from tensorflow.keras.applications import MobileNetV2, ResNet50, VGG16, DenseNet121
from sklearn.metrics import classification_report, confusion_matrix, roc_auc_score
from tensorflow.keras.preprocessing.image import ImageDataGenerator
② 데이터 로드 및 요약
# 데이터 로드 및 기본 정보 출력
train_data_path = "path/to/train"
val_data_path = "path/to/validation"
test_data_path = "path/to/test"
print(f"Train data path: {train_data_path}, Validation data path: {val_data_path}, Test data path: {test_data_path}")
③ 데이터 전처리
- 데이터 증강 및 전처리
- 데이터 왜곡 : 노이즈(컬러, 가우시안, 회색조), 변형(회전, 크기, 명암대비, 찌그러뜨림, 크롭, 회색조)
- 데이터 정규화 : 증강된 데이터들 한데 모아 정규화 진행
# 데이터 증강 및 전처리
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=45,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True
)
val_datagen = ImageDataGenerator(rescale=1./255)
④ 스케일링
- 이미지 크기 조정 & 정규화
# 이미지 크기 조정 및 정규화
target_size = (244, 244)
train_generator = train_datagen.flow_from_directory(
train_data_path,
target_size=target_size,
batch_size=32,
class_mode='binary'
)
validation_generator = val_datagen.flow_from_directory(
val_data_path,
target_size=target_size,
batch_size=32,
class_mode='binary'
)
⑤ 탐색적 데이터 분석(EDA)
# Train 데이터의 클래스 분포 시각화
classes = ['Horse', 'Human']
train_labels = [train_generator.classes.count(c) for c in classes]
plt.bar(classes, train_labels)
plt.title("Class Distribution in Training Data")
plt.show()
⑥ 모델 학습
- MobileNetV2
# MobileNetV2 모델 예시
model = MobileNetV2(weights='imagenet', include_top=False, input_shape=(244, 244, 3))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
history = model.fit(
train_generator,
validation_data=validation_generator,
epochs=21,
callbacks=[EarlyStopping(patience=5)]
)
⑦ 성능 평가 및 시각화
# Confusion Matrix 및 Classification Report 출력
y_pred = model.predict(validation_generator)
y_pred = np.round(y_pred).astype(int)
print(classification_report(validation_generator.classes, y_pred, target_names=classes))
print("ROC AUC Score:", roc_auc_score(validation_generator.classes, y_pred))
5) 프로젝트 결과
- 구현 기능
- 다양한 이미지 증강 기법을 통해 데이터 증강
- MobileNetV2, ResNet50, VGGNet16, DenseNet121 네 가지 모델을 통해 성능 비교
- MobileNetV2가 가장 높은 성능(정확도 96%, F1-Score 0.96, ROC-AUC 0.95)을 기록하여 최적 모델로 선정
6) 트러블 슈팅
- 오류: "ValueError: Input size mismatch. Expected input batch size (None, 224, 224, 3) but got input batch size (None, 256, 256, 3)" - 이미지 크기 설정이 모델 입력 형식과 맞지 않아 발생한 오류
- 해결 방법: 데이터 증강 및 전처리 단계에서 target_size=(224, 224)로 모든 이미지를 모델의 입력 형식에 맞춰 조정하여 오류 해결. 이미지 크기를 모델이 요구하는 입력 크기와 일치하도록 일괄적으로 변환하여 학습이 정상적으로 진행되도록 조정
7) 프로젝트를 통해 얻은 역량
- 딥러닝 모델을 통한 이진 분류 문제 해결 및 모델 성능 최적화
- 이미지 데이터 전처리와 다양한 증강 기법을 통한 데이터 품질 개선
- 모델 성능 평가를 위한 다양한 지표(F1 Score, ROC-AUC 등) 활용
📙 내일 일정
- 딥러닝 실습
'TIL _Today I Learned > 2024.09' 카테고리의 다른 글
[DAY 43] 자연어 처리(NLP) 모델 (0) | 2024.09.11 |
---|---|
[DAY 42] Deep Learning (1) | 2024.09.10 |
[DAY 40] Deep Learning 실습 (0) | 2024.09.06 |
[DAY 39] Deep Learning 실습 (0) | 2024.09.05 |
[DAY 38] 딥러닝 모델의 최적화 및 평가 (0) | 2024.09.04 |