본문 바로가기
TIL _Today I Learned/2024.09

[DAY 40] Deep Learning 실습

by gamdong2 2024. 9. 6.
[천재교육] 프로젝트 기반 빅데이터 서비스 개발자 양성 과정 9기
학습일 : 2024.09.06

📕 학습 목록

  • 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 42] Deep Learning  (1) 2024.09.10
[DAY 41] Deep Learning 실습  (0) 2024.09.09
[DAY 39] Deep Learning 실습  (0) 2024.09.05
[DAY 38] 딥러닝 모델의 최적화 및 평가  (0) 2024.09.04
[DAY 37] 딥러닝 프레임워크  (5) 2024.09.03