포스트

반려동물 품종 분류기 만들기 (1) 프로젝트 설계

37개 품종 분류라는 문제 정의, Oxford-IIIT Pet을 고른 이유, baseline부터 fine-tuning까지 세 단계 모델 계획과 실험 원칙을 정리했습니다.

반려동물 품종 분류기 만들기 (1) 프로젝트 설계

들어가며

딥러닝 기초 시리즈에서 CNN과 transfer learning을 개념으로 정리했고, PyTorch 기초 시리즈에서 학습 루프를 짜는 법까지 다뤘습니다. 이번에는 그 재료로 실제 프로젝트를 하나 끝까지 만듭니다. 데이터 준비부터 학습, 오류 분석, 예측 API까지가 범위입니다.

무엇을 만드나

사진 한 장이 주어졌을 때 반려동물의 품종을 예측합니다.

  • 입력: RGB 이미지 한 장 (크기 제각각, 전처리에서 224x224로 통일)
  • 출력: 37개 품종에 대한 확률 분포와 top-3 예측
  • 평가 지표: top-1 accuracy를 기본으로, 클래스별 성능 확인을 위해 macro F1을 함께 기록

정확도 수치 하나로 끝내지 않고, 학습 시간과 추론 시간도 모델마다 같이 기록합니다.

데이터: Oxford-IIIT Pet

데이터셋은 Oxford-IIIT Pet을 사용합니다. 고른 이유는 세 가지입니다.

  1. 크기가 적당합니다. 총 7,349장(trainval 3,680장, test 3,669장)이라 Colab 무료 GPU로도 한 번의 실험이 수십 분 안에 끝납니다.
  2. 문제가 적당히 어렵습니다. 개와 고양이를 구분하는 문제가 아니라 37개 품종을 구분하는 fine-grained 분류입니다. 품종 간 생김새가 비슷해서 scratch 학습과 transfer learning의 차이가 뚜렷하게 드러납니다.
  3. torchvision에 내장되어 있습니다. torchvision.datasets.OxfordIIITPet으로 다운로드부터 라벨까지 한 번에 해결됩니다.

클래스당 이미지가 약 200장으로 거의 균등해서, 클래스 불균형 처리 없이 accuracy를 기본 지표로 쓸 수 있습니다.

전체 흐름

flowchart TD
    A[Oxford-IIIT Pet 다운로드] --> B[EDA와 전처리, augmentation]
    B --> C[Baseline: 직접 만든 CNN]
    B --> D[ResNet fine-tuning]
    C --> E[동일 조건 비교 평가]
    D --> E
    E --> F[confusion matrix와 Grad-CAM 오류 분석]
    F --> G[TorchScript export]
    G --> H[FastAPI 예측 API]

모델은 단순한 것부터

처음부터 사전학습 모델을 쓰지 않고, 세 단계로 나눠 동일한 데이터 분할과 지표로 비교합니다.

  1. Baseline: conv 블록 3개짜리 작은 CNN을 처음부터 학습
  2. Linear probing: 사전학습 ResNet의 backbone을 얼리고 마지막 분류층만 학습
  3. Full fine-tuning: backbone까지 전부 낮은 learning rate로 학습

Baseline을 먼저 두는 이유는 명확합니다. 3,000장 남짓한 데이터로 scratch 학습이 어디까지 가는지 숫자로 확인해야, transfer learning이 정확히 몇 %p를 벌어주는지 말할 수 있기 때문입니다. 딥러닝 기초 11편에서 “작은 데이터셋에는 fine-tuning이 유리하다”고 정리했는데, 이 프로젝트가 그 명제를 직접 측정하는 실험이기도 합니다.

실험 원칙

프로젝트 내내 지킬 원칙을 미리 정해뒀습니다.

  • test 셋은 6편의 최종 평가 전까지 열어보지 않는다. 모델 선택은 전부 validation 셋으로 한다
  • 모든 모델은 동일한 train/validation 분할, 동일한 입력 크기(224x224)로 비교한다
  • seed를 고정하고, 실험마다 config와 결과 지표를 JSON 파일로 남긴다
  • augmentation은 train에만 적용하고, validation과 test는 동일한 결정적 전처리를 쓴다

앞으로의 계획

  1. uv 기반 개발환경과 프로젝트 구조 세팅
  2. 데이터 다운로드, EDA, Dataset과 DataLoader 구성
  3. Baseline CNN 학습과 과적합 관찰
  4. ResNet fine-tuning 두 단계 실험
  5. test 셋 최종 평가, confusion matrix와 Grad-CAM 분석
  6. TorchScript export와 FastAPI 서빙

다음 글에서는 개발환경을 세팅합니다.

다음 글: 반려동물 품종 분류기 만들기 (2) 개발환경 세팅

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.