본문 바로가기
Python/AI

Crested Gecko 성별 구분 AI 개발 - 정확도 91%로 도약

by 크레노트 2025. 3. 5.
반응형

안녕하세요! 지난 블로그 글에서 Crested Gecko(크레스티드 게코)의 성별을 구분하는 딥러닝 모델 개발 과정을 소개하며, CNN을 활용한 초기 모델 설계와 데이터 증강, L2 정규화를 통해 손실을 줄이는 과정을 다뤘습니다. 당시 모델의 정확도는 약 70%에 근접했고, 손실은 L2 정규화로 2.0대까지 낮췄지만, 학습 데이터 부족으로 인해 과소적합(underfitting)이 의심되는 상황이었습니다. 이번 글에서는 데이터 추가와 모델 세부 조정, 그리고 몇 가지 개선 방법을 통해 정확도를 91%까지 끌어올린 과정을 공유하려고 합니다.

1. 개선 과정 개요

이전 모델의 한계를 극복하기 위해 다음과 같은 접근법을 적용했습니다:

  • 학습 데이터 증가: 데이터 부족 문제를 해결하기 위해 더 많은 사진 데이터를 수집했습니다.
  • 모델 아키텍처 조정: CNN 구조를 더 깊고 효율적으로 설계하여 특징 추출 능력을 강화했습니다.
  • 하이퍼파라미터 튜닝: 학습률과 배치 크기를 조정하여 모델의 학습 안정성을 높였습니다.
  • 드롭아웃(Dropout) 추가: 과적합을 방지하고 일반화 성능을 개선했습니다.
  • 전이 학습(Transfer Learning) 도입: 사전 학습된 모델을 활용해 성능을 극대화했습니다.

이제 각 단계를 자세히 살펴보겠습니다.

2. 학습 데이터 증가

가장 먼저着手한 것은 데이터셋의 양을 늘리는 작업이었습니다. 기존 디렉토리에 저장된 데이터는 약 80장 정도로, 모델이 다양한 패턴을 학습하기에는 부족했습니다. 크레스티드 게코의 성별 특성이 포함된 사진을 추가로 수집하여 총 200장까지 확보했습니다. 데이터 증강은 여전히 적용하되, 실제 데이터의 양을 늘린 것이 모델 성능에 큰 영향을 미쳤습니다.

 

 

3. 모델 아키텍처 조정

기존 모델은 세 개의 합성곱층(Conv2D)과 풀링층(MaxPooling2D)으로 구성되어 있었지만, 데이터가 늘어난 만큼 더 깊은 네트워크를 통해 복잡한 특징을 추출할 수 있도록 설계를 변경했습니다. 추가로 BatchNormalization을 삽입하여 학습 과정의 안정성을 높였습니다.

 
model = models.Sequential([
    layers.InputLayer(input_shape=(224, 224, 3)),
    
    # 첫 번째 블록
    layers.Conv2D(32, (3, 3), activation='relu', kernel_regularizer=regularizers.L2(0.001)),
    layers.BatchNormalization(),
    layers.MaxPooling2D((2, 2)),
    
    # 두 번째 블록
    layers.Conv2D(64, (3, 3), activation='relu', kernel_regularizer=regularizers.L2(0.001)),
    layers.BatchNormalization(),
    layers.MaxPooling2D((2, 2)),
    
    # 세 번째 블록
    layers.Conv2D(128, (3, 3), activation='relu', kernel_regularizer=regularizers.L2(0.001)),
    layers.BatchNormalization(),
    layers.MaxPooling2D((2, 2)),
    
    # 네 번째 블록 추가
    layers.Conv2D(256, (3, 3), activation='relu', kernel_regularizer=regularizers.L2(0.001)),
    layers.BatchNormalization(),
    layers.MaxPooling2D((2, 2)),
    
    # 평탄화 및 완전 연결층
    layers.Flatten(),
    layers.Dense(256, activation='relu', kernel_regularizer=regularizers.L2(0.001)),
    layers.Dropout(0.5),  # 드롭아웃 추가
    layers.Dense(1, activation='sigmoid', kernel_regularizer=regularizers.L2(0.001))
], name="GeckoGenderAI_v2")

4. 드롭아웃 추가

과적합 방지를 위해 완전 연결층(Dense) 직전에 드롭아웃(Dropout)을 추가했습니다. 드롭아웃은 학습 중 일부 뉴런을 무작위로 비활성화하여 모델이 특정 패턴에 지나치게 의존하지 않도록 합니다. Dropout(0.5)는 50%의 뉴런을 비활성화한다는 뜻으로, 실험 결과 이 값이 적절한 균형을 유지했습니다.

5. 하이퍼파라미터 튜닝

Adam 옵티마이저의 학습률을 기본값(0.001)에서 0.0001로 낮춰 모델이 더 천천히, 안정적으로 수렴하도록 했습니다. 또한, 배치 크기를 32에서 64로 늘려 GPU 활용 효율성을 높였습니다.

 
model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),
    loss='binary_crossentropy',
    metrics=['accuracy']
)

6. 전이 학습 도입

마지막으로, 데이터와 시간이 제한된 상황에서 성능을 극대화하기 위해 전이 학습을 도입했습니다. 사전 학습된 MobileNetV2 모델을 기반으로, 게코 성별 분류에 맞게 출력층만 재설계했습니다.
 

base_model = tf.keras.applications.MobileNetV2(input_shape=(224, 224, 3),
                                               include_top=False,
                                               weights='imagenet')
base_model.trainable = False  # 사전 학습된 가중치 고정

model = models.Sequential([
    base_model,
    layers.GlobalAveragePooling2D(),
    layers.Dense(128, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(1, activation='sigmoid')
])

model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),
    loss='binary_crossentropy',
    metrics=['accuracy']
)

7. 학습 및 결과

위 과정을 적용한 후, 20 에포크 동안 학습을 진행했습니다. 결과는 다음과 같습니다:

  • 정확도: 검증 데이터셋에서 91% 달성
  • 손실: 약 0.8
 

8. 학습 결과 시각화

정확도와 손실 그래프를 통해 모델의 개선을 확인했습니다. 초기 에포크에서 검증 정확도가 빠르게 상승하며, 10 에포크 이후 안정적으로 90% 이상을 유지했습니다.

 

결론

이번 프로젝트를 통해 학습 데이터 증가, 모델 구조 조정, 드롭아웃 추가, 하이퍼파라미터 튜닝, 그리고 전이 학습이라는 다섯 가지 개선 방법을 적용하여 정확도를 70%에서 91%까지 끌어올렸습니다. 특히 데이터 부족 문제를 해결한 것이 큰 전환점이 되었으며, 전이 학습은 적은 데이터로도 높은 성능을 낼 수 있는 효율적인 방법임을 다시금 확인했습니다. 앞으로는 더 다양한 각도와 조명 조건의 데이터를 추가해 모델을 더욱 견고하게 만들 계획입니다.

이 글이 딥러닝 모델 개선에 관심 있는 분들에게 도움이 되었길 바랍니다. 질문이나 피드백이 있다면 언제든 댓글로 남겨주세요!

반응형

댓글