← All Projects

PROJECT / 02

지식 증류 기반 교통 표지판 인식 모델 경량화

MobileNetV2의 예측 분포를 34,406개 파라미터의 경량 CNN에 전달했습니다. 동일한 모델 크기에서 최고 검증 정확도를 54.61%에서 80.97%로 높이고, 9개 실험 조건과 클래스별 오류를 비교했습니다.

CompletedTensorFlowKnowledge DistillationComputer VisionMobileNetV2GTSRBSource Code

Overview · 프로젝트 소개

큰 모델의 정확도를 작은 모델에 얼마나 전달할 수 있는지 확인한 컴퓨터 비전 실험입니다. 43개 교통 표지판을 분류하는 GTSRB 데이터셋에서 사전학습 MobileNetV2를 Teacher로 사용하고, 34,406개 파라미터의 경량 CNN을 Student로 설계했습니다.

실험의 중심 질문은 배포할 모델의 구조와 크기를 유지하면서 학습 신호만 바꿔 정확도를 개선할 수 있는가입니다. Teacher, 정답 레이블만 학습한 Student 기준 모델, 지식 증류를 적용한 9개 Student를 같은 평가 데이터로 비교했습니다. 코드뿐 아니라 학습 로그, 하이퍼파라미터별 정확도, 추론 지연 측정, 혼동행렬 분석을 노트북에 함께 보존했습니다.

Problem · 해결하려던 문제

작은 CNN은 메모리와 계산량 부담이 적지만, 비슷하게 생긴 표지판을 구분하는 표현을 충분히 학습하기 어렵습니다. 이 프로젝트의 경량 기준 모델은 최고 검증 정확도 54.61%에 머물렀고, 2,313,067개 파라미터의 Teacher는 88.37%를 기록했습니다.

정답 레이블은 하나의 클래스만 알려줍니다. 반면 Teacher의 예측 분포에는 정답과 다른 클래스 사이의 유사도 정보도 담깁니다. 예를 들어 서로 비슷한 속도 제한 표지판에 Teacher가 부여하는 상대적인 확률을 학습에 이용하면, 경량 모델이 단순한 정답 분류를 넘어 클래스 사이의 구조를 배울 수 있습니다.

목표는 경량 모델을 크게 만드는 대신, 정답 레이블과 Teacher의 부드러운 예측 분포를 함께 학습하는 방식으로 정확도 손실을 줄이는 것이었습니다.

Approach · 구현 과정

  1. 데이터 파이프라인 구성: 학습 이미지 39,209장과 평가 이미지 12,630장을 읽고, 이미지를 96 × 96으로 조정한 뒤 픽셀 값을 0~1로 정규화했습니다. 클래스 빈도의 역수에 비례한 가중치를 계산하고 캐시·셔플·프리페치를 적용했습니다.
  2. Teacher 학습: ImageNet 사전학습 MobileNetV2의 마지막 60개 backbone layer를 미세 조정했습니다. 밝기·대비·확대 변환, Global Average Pooling, Dropout, 43개 클래스의 출력층을 결합했습니다.
  3. 경량 기준 모델 학습: 세 개의 depthwise-separable convolution block과 작은 분류기를 구성하고, 정답 레이블만으로 10 epoch를 학습했습니다. 이후 증류 모델도 동일한 구조를 사용하도록 했습니다.
  4. 증류 학습 구현: TensorFlow의 사용자 정의 train_step에서 Teacher의 예측과 Student의 예측을 함께 계산하고, 정답 손실과 KL divergence를 결합했습니다. 기울기는 Student 파라미터에만 적용했습니다.
  5. 9개 조건 비교: Temperature 3·5·10과 hard-label weight 0.1·0.3·0.5의 모든 조합을 학습했습니다. 각 조건의 최고 검증 정확도, 학습 곡선, 파라미터 수와 지연 시간을 비교했습니다.
  6. 오류 분석: 전체 43개 클래스와 속도 제한 표지판 부분집합의 혼동행렬을 확인하고, 클래스별 정확도 변화에서 증류의 이점과 실패 사례를 분석했습니다.

Architecture · 학습 구조

Teacher는 학습 중 Student에 추가 정보를 제공하며, 추론 시에는 경량 Student만 사용합니다. 증류 설정을 바꾸어도 Student의 층 구성과 파라미터 수는 바뀌지 않습니다.

GTSRB 이미지 + 정답 레이블
        │
        ├── MobileNetV2 Teacher ── temperature softmax ── soft target
        │                                                     │
        └── 경량 Student CNN ── logits ──┬── 정답 분류 손실    │
                                         └── KL divergence ────┘
                                                  │
                                           가중 결합 손실
                                                  │
                                       Student 파라미터 업데이트

추론: 이미지 → 동일한 경량 Student CNN → 43개 클래스 예측

Student는 32·64·128채널의 SeparableConv2D 블록, Batch Normalization, 두 개의 Max Pooling, Global Average Pooling, 128차원 Dense, Dropout, 43클래스 출력층으로 구성됩니다. 출력은 logits이며, 정답 분류 손실에서 from_logits=True를 사용합니다.

Design Decisions · 주요 설계 선택

  • Student 구조를 고정: 모델 크기를 늘려 얻은 이득과 증류 자체의 이득을 구분하기 위해 기준 모델과 9개 증류 모델의 파라미터 수를 모두 34,406개로 유지했습니다.
  • Temperature와 손실 비중을 함께 탐색: Temperature는 확률 분포를 얼마나 부드럽게 만들지, alpha는 정답 손실을 얼마나 반영할지 결정합니다. 두 값의 상호작용을 확인하기 위해 한 변수씩 바꾸는 비교와 전체 조합 비교를 함께 수행했습니다.
  • 정답과 Teacher 신호를 결합: Teacher의 판단을 그대로 복제하는 대신, 정답 레이블도 함께 사용해 잘못된 Teacher 예측의 영향을 조절하도록 했습니다.
  • Temperature 제곱으로 증류 손실을 보정: Temperature 조절로 달라지는 기울기 크기를 고려해 KL divergence 항에 temperature의 제곱을 곱했습니다.
  • 총 정확도와 클래스별 변화를 함께 확인: 평균 정확도가 좋아져도 일부 클래스는 나빠질 수 있으므로, 혼동행렬과 클래스별 개선 폭을 결과 해석에 포함했습니다.

Implementation · 핵심 구현

노트북의 Distiller 클래스는 Keras 모델을 상속하고 train_step과 test_step을 직접 구현합니다. Teacher는 training=False로 실행하고, Student는 학습 모드에서 실행합니다. 두 logits를 temperature로 나눈 뒤 softmax를 적용해 부드러운 확률 분포를 만들고, 두 분포 사이의 KL divergence를 계산합니다.

loss = alpha * hard_label_loss + (1 - alpha) * temperature**2 * soft_loss

GradientTape로 Student의 학습 가능한 변수에 대한 기울기만 구해 Adam optimizer로 갱신합니다. 각 조합에서 새 Student를 만들고 난수 시드를 다시 설정해 초기화 조건을 맞췄습니다. Teacher에는 조기 종료와 검증 손실 기반 learning-rate 감소를 적용했고, Student는 조건마다 10 epoch를 학습했습니다.

추론 지연 측정은 10회 warm-up 후 batch size 1의 model.predict를 100회 호출하는 방식입니다. 이 수치는 모델 계산뿐 아니라 TensorFlow prediction 호출 비용을 포함합니다. 지식 증류 모델이 Teacher를 호출하는 구조는 아니며, 최종 추론 그래프는 기준 Student와 같습니다.

Experiments · 비교 실험

저장된 실행 결과는 Python 3.12·TensorFlow 2.19·Tesla P100 GPU 환경에서 생성되었습니다. Teacher는 15 epoch, 기준 Student와 각 증류 Student는 10 epoch를 학습했으며, 요약 정확도는 각 학습 이력의 최고 검증 정확도입니다.

Temperature alpha 0.1 alpha 0.3 alpha 0.5
3 78.21% 76.43% 76.66%
5 79.38% 80.29% 76.98%
10 77.47% 80.97% 80.54%

Temperature와 alpha의 9개 조합별 최고 검증 정확도

9개 조건의 전체 비교. 가장 높은 값은 Temperature 10, alpha 0.3에서 관측했습니다.

alpha를 0.1로 고정했을 때 Temperature만 높이는 것이 일관된 개선으로 이어지지는 않았습니다. 이 고정 alpha 비교의 최고값은 79.38%였으며, 두 변수를 함께 탐색해 80.97%의 조합을 찾았습니다. 따라서 이 실험에서는 Temperature의 효과를 손실 비중과 함께 해석해야 합니다.

공식 GTSRB test split을 노트북의 val_ds로 사용해 epoch와 하이퍼파라미터 선택에도 활용했습니다. 별도로 보존한 최종 test set의 성능을 측정한 결과는 아닙니다. 결과는 이 데이터와 학습 설정에서 모델 및 학습 방식의 차이를 비교한 실험으로 해석합니다.

Results · 결과

비교 항목 관측 결과
Teacher 최고 검증 정확도 88.37%
경량 기준 모델 최고 검증 정확도 54.61%
최고 증류 모델 검증 정확도 80.97%
기준 모델 대비 개선 +26.37%p, 노트북의 반올림 전 값 기준
Teacher / Student 파라미터 수 2,313,067 / 34,406
Teacher 대비 파라미터 비율 Student가 약 67.2배 작음
Teacher 정확도 대비 비율 약 91.6%
최고 증류 설정 Temperature 10 · alpha 0.3

Temperature 및 alpha 변화에 따른 증류 정확도 비교

기준 Student와 Teacher를 함께 표시한 비교 결과. 그래프는 고정 alpha의 Temperature 탐색과 고정 Temperature의 alpha 탐색을 보여줍니다.

9개 증류 조건 모두 기준 모델보다 최소 21.82%p 높은 최고 검증 정확도를 기록했습니다. 기준 모델과 동일한 34,406개 파라미터로 개선했으므로, 이 실험의 핵심 성과는 추론 모델을 확장하지 않고 학습 신호를 개선한 것입니다.

측정 환경에서 기준 Student의 단일 이미지 지연 시간은 평균 54.01 ± 2.96 ms, 최고 증류 Student는 55.19 ± 3.79 ms였습니다. 같은 구조의 모델들이 유사한 범위에서 측정되었으며, 이 값으로 Teacher 대비 속도 향상이나 다른 하드웨어에서의 실시간 성능을 주장하지 않습니다.

Failure Analysis · 오류 분석과 한계

속도 제한 표지판 클래스 0~8의 평균 클래스별 정확도 개선은 +33.11%p로, 나머지 클래스의 +23.44%p보다 컸습니다. 이 결과는 시각적으로 혼동하기 쉬운 하위 집단에서 Teacher의 확률 분포가 유용한 학습 정보를 제공할 수 있다는 해석을 뒷받침합니다. 다만 동일 현상이 다른 데이터셋에서도 유지된다는 증거는 아닙니다.

반대로 일부 방향 표지판 클래스에서는 성능이 낮아졌습니다. 모양이 비슷하지만 의미는 분명히 구분해야 하는 클래스에서 Teacher의 soft target이 경계를 흐릴 수 있습니다. 총 정확도 개선만으로 모든 클래스의 품질이 좋아졌다고 판단할 수 없는 이유입니다.

경량 기준 모델은 9번째 epoch에서 최고 검증 정확도 54.61%를 기록했지만, 학습 마지막 가중치로 계산한 후반부 혼동행렬에서는 54.12%를 기록합니다. 요약표는 최고 epoch 값, 클래스별 분석은 마지막 메모리 가중치의 예측을 사용하므로 두 비교의 기준이 완전히 같지는 않습니다. 이 차이를 숨기지 않고 결과를 구분해 제시합니다.

또한 고정 시드의 단일 실행이며, 여러 시드에서의 평균과 신뢰구간은 제공하지 않습니다. 다음 평가에서는 학습·검증·최종 테스트를 분리하고 최고 epoch 가중치를 저장한 뒤, 같은 체크포인트로 전체 정확도·클래스별 정확도·지연 시간을 측정해야 합니다.

Demo · 결과 확인과 재현

Kaggle 실행 노트북에서 데이터 로딩, 모델 학습, 9개 증류 실험, 추론 지연과 혼동행렬의 저장된 실행 결과를 확인할 수 있습니다. 전체 학습은 저장된 Kaggle 환경에서 약 56분이 걸렸습니다.

저장소의 requirements.txt를 설치하고 Jupyter에서 notebooks/knowledge_distillation_gtsrb.ipynb를 열어 재실행할 수 있습니다. 데이터셋과 MobileNetV2 사전학습 가중치를 내려받을 인터넷 연결이 필요하며, 저장 결과와 유사한 실행 조건을 위해 GPU 환경을 권장합니다.

python -m venv .venv
python -m pip install -r requirements.txt
jupyter lab notebooks/knowledge_distillation_gtsrb.ipynb

Source Code · 코드와 보고서

View Full Source on GitHub
All ProjectsNext / DM100 · 로켓 발사와 회수