프로젝트 개요
계산 자원이 제한된 환경에서도 교통 표지판 사진을 보고 종류를 구분할 수 있도록 만든 프로젝트입니다. 독일 교통 표지판 이미지 데이터셋인 GTSRB의 43개 종류를 대상으로, 큰 모델이 각 종류에 부여한 확률을 작은 모델의 학습에 활용했습니다. 이처럼 다른 모델의 예측 정보를 전달하는 방법을 지식 증류라고 하며, 정보를 제공하는 모델을 ‘교사’, 배우는 모델을 ‘학생’이라고 부릅니다. 교사는 MobileNetV2, 학생은 이미지의 모양과 무늬를 학습하는 경량 합성곱 신경망(CNN)으로 구성했습니다.
학습 설정 9개를 각각 세 번 학습하고, 정답만 학습한 학생과 교사의 확률 분포만 학습한 학생을 대조했습니다. 한 번의 학습에서 우연히 좋은 결과가 나온 것은 아닌지 살피기 위해 시드, 즉 무작위 초기값과 데이터 처리 순서 등을 정하는 기준값을 378, 379, 380으로 바꿔 반복했습니다. 따라서 아래의 ‘세 시드 평균’은 서로 다른 세 번의 학습 결과를 평균한 값입니다. 같은 시드의 모델끼리는 시작 조건을 맞춰 학습 방식의 차이를 비교했습니다.
정확도와 함께 종류별 오류, 이미지를 판별하는 데 걸리는 CPU 추론 시간과 파일 크기를 측정했습니다. 이를 바탕으로 실제 사용하도록 제공하는 대표 배포 모델과 여러 설정을 비교한 실험 결과를 구분해 공개했습니다.
핵심 결과
대표 학생은 T5-a05 설정의 모델입니다. 이름의 T5는 교사 확률 분포를 부드럽게 조절하는 온도 5, a05는 전체 학습 손실에서 정답 손실에 곱한 계수 0.5를 뜻합니다. 배포에는 모델 수치를 32비트 실수로 저장하는 FP32와 경량 실행 형식인 TFLite를 사용했습니다. 파라미터는 모델이 학습으로 정하는 내부 수치이며, 그 개수는 모델 규모를 보여줍니다.
- 대표 학생 정확도
- 87.06%
- T5-a05, 시드 378의 FP32 모델: 5,093 / 5,850장
- 학생 파라미터
- 34,406개
- 교사 2,313,067개 대비 약 98.5% 감소
- FP32 CPU 추론 시간
- 0.429ms
- 배치 1과 스레드 1의 중앙값, 로딩과 이미지 처리 제외
- 증류 조건의 반복 비교
- 9개 × 3회
- 27개 증류 모델과 별도의 기준 모델 및 대조군 평가
대표 학생은 같은 시드의 정답 학습 학생보다 13.50퍼센트포인트, 교사보다 3.52퍼센트포인트 높은 정확도를 기록했습니다. 퍼센트포인트는 두 정확도 사이의 차이를 나타냅니다. 클래스별 평균 F1은 0.7903입니다. F1은 특정 종류로 예측한 결과가 얼마나 정확한지와 그 종류의 실제 이미지를 얼마나 놓치지 않았는지를 함께 보는 점수로, 1에 가까울수록 좋습니다. 종류별 F1을 동일한 비중으로 평균해 이미지가 많은 종류에 전체 점수가 치우치는 것을 줄였습니다. 이미 결과가 공개된 같은 참조 평가의 관측값이며, 새로운 비공개 벤치마크의 성능으로 제시하지 않습니다.
배포 모델 유지 결정과 전체 성능표
검증 집합은 학습 설정을 고르는 데 사용하는 이미지 묶음이고, 참조 평가 집합은 설정을 정한 뒤 성능을 보고하는 이미지 묶음입니다. 이 프로젝트의 참조 자료는 이미 결과가 공개되어 있어, 새로 확보한 비공개 평가 자료와 구분합니다. 아래 평균은 세 번의 학습 결과를, 시드 378의 값은 그중 사전에 지정한 한 모델을 나타냅니다.
| 비교 범위 | 대표 배포 T5-a05 | 9개 조건 비교의 선택 T5-a01 |
|---|---|---|
| 세 시드의 검증 정확도 평균 | 86.65% | 87.08% |
| 세 시드의 참조 정확도 평균 | 87.51% | 87.81% |
| 위 참조 평균의 표본 표준편차 | 2.18퍼센트포인트 | 2.08퍼센트포인트 |
| 시드 378의 정확도 | 87.06% | 85.69% |
| 시드 378의 정답 | 5,093 / 5,850 | 5,013 / 5,850 |
| 시드 378의 클래스별 평균 F1 | 0.7903 | 0.7719 |
전체 조합 실험은 세 시드의 검증 정확도 평균으로 학습 설정을 선택했고, 평가용 시드는 378로 미리 고정했습니다. 이 규칙의 선택은 정답 손실 계수만 0.1로 다른 T5-a01 그대로입니다. 참조 평가의 평균 차이 0.30퍼센트포인트만으로 배포 교체의 이점을 입증하지 못했고, 지정된 개별 모델은 정답이 80개 적었습니다. 이에 이미 공개한 T5-a05를 대표 배포로 유지했습니다. 이는 참조 결과를 관측한 뒤 내린 배포 판단이며, 검증 규칙으로 선택한 T5-a01의 기록과 구분합니다.
표본 표준편차는 반복 학습의 결과가 평균 주변에서 얼마나 달라졌는지를 나타냅니다. 값이 작으면 이번 반복에서 결과의 변동이 작았다는 뜻이며, 세 번의 측정만으로 통계적 우월성을 확정하지는 않습니다. 아래 실행 시간의 중앙값은 측정값의 가운데 값, 95백분위는 측정값의 95%가 그 이하였던 시간입니다. Keras와 TFLite는 저장된 모델을 불러와 실행하는 서로 다른 형식입니다.
| 대표 모델의 실행 파일 | CPU 중앙값 | CPU 95백분위 | 파일 크기 |
|---|---|---|---|
| 교사 Keras | 3.823ms | 4.641ms | 9,843,117바이트 |
| 학생 Keras | 1.040ms | 1.130ms | 187,164바이트 |
| 학생 FP32 TFLite | 0.429ms | 0.456ms | 143,316바이트 |
문제와 접근 방법
작은 모델은 실행 비용이 낮지만 정답 레이블만으로 학습하면 표현력이 제한될 수 있습니다. 교사가 출력하는 확률 분포에는 정답 클래스 외에도 혼동하기 쉬운 클래스의 관계가 담겨 있습니다. 같은 학생 구조에 이 정보를 추가해 분류 품질과 실행 비용을 함께 비교했습니다.
학생의 학습에는 두 가지 오류 점수인 손실을 결합했습니다. 정답 교차 엔트로피는 정답 종류를 잘 예측하도록 유도하고, KL 발산은 학생의 확률 분포가 교사의 분포와 가까워지도록 유도합니다. 온도를 높이면 교사가 낮은 확률을 부여한 종류 사이의 관계도 학습에 드러나도록 분포가 완만해집니다. 이미지 수가 종류마다 다른 점을 반영한 가중치는 정답 손실에 적용하고, 교사는 예측만 하도록 고정해 학생의 내부 수치만 갱신했습니다. 손실에 곱하는 계수가 실제 학습 변화량의 비율까지 그대로 뜻하지는 않습니다.
시스템 구조
학습 중에는 이미지에 변형을 가하는 데이터 증강 규칙을 두 학생에게 공통으로 적용합니다. 검증 결과에 따라 저장한 모델 상태를 체크포인트라고 하며, 실제 실행에는 선택한 학생 체크포인트만 필요합니다.
- 학습 입력
표지판 이미지와 정답, 공통 증강 규칙 준비
- 교사 분포
고정 MobileNetV2가 클래스별 예측 분포 제공
- 학생 학습
정답 손실과 증류 손실로 경량 CNN만 갱신
- 검증과 저장
검증 규칙으로 설정과 체크포인트 고정
- CPU 실행
저장된 학생을 Keras 또는 FP32 TFLite로 추론
학생은 32, 64, 128채널의 분리 합성곱 블록으로 이미지 특징을 추출합니다. 채널은 특징을 담는 통로이며, 분리 합성곱은 공간과 채널 방향의 계산을 나눠 연산량을 줄이는 방식입니다. 중간 값의 분포를 조절하는 배치 정규화와 특징을 요약하는 풀링을 거쳐 작은 분류기가 표지판 종류를 예측합니다. 정답 학습과 증류 학습에 같은 추론 구조를 사용하므로, 교사의 정보를 배우더라도 배포할 학생의 구조가 커지지는 않습니다. 학습용 증류 래퍼와 교사는 학생 배포 파일에 포함하지 않습니다.
입력은 RGB 96 × 96의 [0,1] 범위입니다. 교사 그래프 안에서 MobileNetV2가 사용하는 [-1,1]로 변환합니다. 정답 학습, 혼합 증류와 순수 증류 대조는 초기 가중치와 데이터 및 최대 학습 예산의 규칙을 맞췄습니다.
실험과 검증
온도 3, 5, 10과 정답 손실 비중 0.1, 0.3, 0.5를 조합한 9개 설정을 시드 378, 379, 380에서 비교했습니다. 각 설정을 세 번 학습한 27개 증류 체크포인트와 정답만 학습한 기준 학생 3개, 고정 교사 1개 및 교사의 분포만 학습한 순수 증류 대조군 3개를 평가했습니다. 대조군은 정답 정보와 교사 정보가 결과에 어떻게 관련되는지 살펴보기 위한 비교 대상입니다. 이미 저장된 증류 실행 6개는 파일의 동일성을 확인하는 해시값을 검사해 재사용하고 나머지 21개를 학습했습니다.
실험 채택 기준과 실행 비용 측정 조건
각 시드에서 증류 학생과 같은 시드의 정답 학습 학생을 한 쌍으로 비교했습니다. 이 세 쌍의 검증 정확도 차이를 평균한 값이 최소 0.2퍼센트포인트이고, 적어도 두 시드에서 개선된 설정만 후보로 인정했습니다. 후보 중 검증 정확도 평균으로 선택하며 동률은 평균 검증 교차 엔트로피와 선언한 순서로 판단합니다. 최종 평가 점수로 이 선택을 다시 바꾸지 않았습니다.
CPU 측정은 같은 i7-11800H 호스트에서 스레드 1개, 배치 1, 동일 검증 이미지 128장, 워밍업 10회와 반복 3회를 사용했습니다. 배치 1은 이미지를 한 장씩 처리한다는 뜻이며, 워밍업은 첫 실행의 준비 비용을 제외하기 위한 예비 실행입니다. 모델마다 새 프로세스를 실행하고 출력 배열을 받을 때까지 측정했습니다. 이미지 읽기와 크기 변환을 포함한 시간 및 프로세스 메모리는 별도로 기록했습니다.
학습 노트북의 공식 테스트 결과와 네 후보 비교 기록도 보존했습니다. 노트북의 공식 테스트는 모델 선택에 사용됐으므로 여기서 보고한 참조 결과와 직접적인 성능 차이로 비교하지 않습니다. Windows와 Linux의 모델 재현 기록도 각 기록에서 실제로 검증한 모델과 실행 범위에 한정합니다.
한계와 해석
증류는 교사의 최상위 클래스 결정을 그대로 복사하도록 강제하지 않습니다. 대표 학생은 교사의 오답 473개를 수정하고 정답 267개를 놓쳐, 정답이 206개 늘었습니다. 순수 교사 분포만 학습한 학생도 세 시드 모두 교사를 넘었으므로 학생의 정답 손실 추가만으로 이 현상을 설명할 수 없습니다.
교사는 사전학습 구조의 일부를 미세 조정하고 배치 정규화를 고정했습니다. 학생은 소형 구조 전체와 배치 정규화를 학습하며, 학습 예산과 최적화 경로도 다릅니다. 이 차이들은 설명 후보이지만 각각의 기여는 분리해서 입증하지 않았습니다. 이 참조 평가에서 학생의 정확도가 높았다는 관측과 일반적인 우월성 또는 원인 확정은 구분합니다.
INT8 TFLite는 실수형 모델을 주로 8비트 정수 표현으로 변환하는 양자화 실험입니다. 더 적은 비트로 수치를 저장해 크기와 계산 비용을 줄이려는 방법이지만, 수치 표현이 거칠어져 정확도가 떨어질 수 있습니다. 대표 T5-a05의 검증 정확도 손실은 61.86퍼센트포인트, FP32 대비 CPU 속도 비율은 0.771배였습니다. 9개 조건 비교에서 선택된 T5-a01도 각각 46.41퍼센트포인트와 0.786배로 기준을 충족하지 못했습니다. 이 속도 비율은 1보다 작으면 비교 대상보다 느렸다는 뜻입니다. 두 변환 모두 배포에서 제외했으며 파일과 실패 기록은 보존합니다. 정확도 급락의 단일 원인은 확정하지 않았습니다.
실험 자료는 같은 공개 참조 집합과 고정 교사 한 개를 사용합니다. 실제 도로 영상의 신뢰도나 다른 데이터 및 교사 초기화에 대한 일반화까지 검증한 결과는 아닙니다. 이 프로젝트는 반복 실험, 대조와 오류 분석을 통해 모델의 성능과 실행 비용을 판단하는 역량을 보여줍니다.
실행 방법
대표 배포 모델은 전용 모델 명세로 설치합니다. 최초 환경 준비와 다운로드에는 인터넷이 필요하며 저장된 모델의 CPU 실행에는 GPU, Docker나 API 키가 필요하지 않습니다.
.\launch-kd.bat doctor
.\launch-kd.bat download --manifest reports/artifact-download.json --output artifacts/runtime
.\launch-kd.bat fetch-data
.\launch-kd.bat predict --model artifacts/runtime/models/student-fp32.tflite --image IMAGE.png
대표 모델과 9개 조건 전체의 평가 재현 명령
대표 87.06% 모델은 해당 모델의 동결 기록으로 평가합니다. 여기서 동결은 비교에 사용할 모델, 데이터와 설정을 확정하고 바꾸지 않는다는 뜻입니다. 매번 새 출력 폴더를 사용합니다.
.\launch-kd.bat evaluate --model artifacts/runtime/models/student-fp32.tflite --manifest reports/split-manifest.json --data .local/data/gtsrb-v1 --split locked_holdout --freeze reports/evaluation-freeze.json --output .local/reproduced-representative-student9개 조건 비교의 모델과 기록은 별도의 경로로 설치합니다. 검증기는 동결된 입력 및 모델과 공개된 예측을 대조하며 새 학습이나 변환 및 재선택을 수행하지 않습니다.
.\launch-kd.bat download --manifest reports/full-grid/artifact-download.json --output artifacts/full-grid
.\.venv\Scripts\python.exe scripts/verify_full_grid_release.py --descriptor reports/full-grid/artifact-download.json --artifact-root artifacts/full-grid --manifest reports/split-manifest.json --freeze reports/full-grid/evaluation-freeze.json --reference-summary reports/full-grid/release-summary.json --reference-evaluations reports/full-grid/evaluations/locked_holdout --data .local/data/gtsrb-v1 --threads 1 --batch-size 64 --output .local/reproduced-full-gridLinux에서는 런처를 bash launch-kd.sh, Python 경로를 .venv/bin/python으로 바꿉니다. 각 검증의 실제 범위는 출력 보고서에 기록합니다. 실행 명령을 제공한다는 사실과 다른 환경에서 전체 재현을 완료했다는 사실은 구분하며, 작은 확률값 차이는 별도 관찰값으로 보고합니다.
코드와 자료
- 소스 코드와 한국어 문서 ZIP
- 대표 87.06% 모델 ZIP
- 9개 조건 비교 실험 모델 ZIP
- 비교 기준의 실험 근거 ZIP
- 대표 배포와 전체 결과 문서
- 9개 조건 실험과 재현 문서
모델 파일과 데이터 분할, 선택 기록 및 소스의 해시를 함께 제공합니다. 각 실험과 재현 기록에는 실제 사용한 모델과 검증 범위를 남겼습니다.
소스와 문서 ZIP 다운로드GitHub에서 소스 코드 보기

