모델 정확도가 기대만큼 오르지 않을 때 보통은 모델 구조, 증강, 하이퍼파라미터부터 의심한다. 하지만 차량 사진의 촬영 부위 13종을 분류하는 모델을 개선하면서 가장 큰 변화는 다른 곳에서 나왔다. 바로 test 정답지 자체의 오류였다.
MobileNetV3-Large를 사전학습 가중치 없이 학습했고, 약 6만 장의 차량 사진을 사용했다. 라벨은 사람이 사진마다 붙인 값이 아니라 폴더 이름에서 가져왔다. 이 조건은 나중에 평가 결과를 해석할 때 결정적인 변수가 됐다.
먼저 막은 것: 평가 데이터 누수
같은 차량의 사진이 train과 test에 함께 들어가면 모델은 차량 고유의 색상이나 배경을 외워 점수를 부풀릴 수 있다. 그래서 차량 단위로 데이터를 분할했다.
또한 지각 해시(dHash)와 union-find를 활용해 거의 같은 사진을 하나의 묶음으로 처리했다. 다른 차량 ID로 등록됐더라도 사실상 같은 사진이라면 train과 test에 동시에 들어가지 않게 막기 위해서다.
이 단계는 점수를 높이기 위한 작업이 아니라, 점수가 믿을 만한지 확인하기 위한 작업이다.
좌우 반전은 라벨도 함께 바꿔야 한다
이미지 분류에서 좌우 반전은 흔한 증강이다. 하지만 차량 촬영 부위 분류에서는 문제가 된다. 좌측 앞 대각 사진을 뒤집으면 우측 앞 대각이 되기 때문이다.
그래서 일반적인 horizontal flip은 금지하고, 반전할 때 좌우 클래스도 함께 교체하는 증강을 만들었다. 추론 단계에서도 원본과 반전본을 모두 예측한 뒤, 반전본의 좌우 확률을 다시 맞바꿔 평균했다.
| 조건 | 정확도 |
|---|---|
| 반전 없음 | 91.89% |
| 라벨 교환 반전 | 93.00% |
| 라벨 교환 반전 + affine | 93.27% |
흥미로운 점은 개선의 상당수가 좌우 오답 감소가 아니라 그 외 오답 감소에서 나왔다는 것이다. 좌우 정보를 학습한 효과뿐 아니라, 데이터 다양성이 늘어난 정규화 효과도 컸다고 볼 수 있다.
차량 단위로 보면 한 장씩 보는 것보다 낫다
한 차량에서 촬영한 사진들은 보통 서로 다른 부위를 담고 있다. 이를 이용해 사진마다 독립적으로 가장 높은 클래스를 고르는 대신, 차량 전체 사진을 모아 부위가 겹치지 않도록 함께 배정했다.
사진×부위 확률 행렬을 만들고 헝가리안 알고리즘으로 확률 합이 최대가 되는 배정을 구했다. 다만 실제로 같은 부위를 두 번 촬영할 수 있으므로, 모델이 매우 확신하는 사진은 결과를 바꾸지 않는 guard도 뒀다.
1차 정정 기준에서 사진 단위 정확도는 93.27%, 차량 단위 후처리 적용 후에는 94.55%가 됐다.
모델로 train 라벨의 의심 사례를 찾기
학습 라벨도 폴더 이름에서 왔으므로 오류가 섞여 있을 가능성이 높았다. 다만 6만 장을 사람이 전수 검수하기는 어렵다.
그래서 데이터를 두 묶음으로 나누고, 각 묶음으로 학습한 모델이 반대쪽 묶음을 채점하게 했다. 모델이 폴더 라벨과 다른 답을 높은 확신도로 낸 사진만 라벨 의심 사례로 골랐다.
- 확신도 0.7 이상: 학습에서 제외
- 확신도 0.95 이상: 모델 예측으로 라벨 교체
중요한 원칙은 하나다. 이 방식은 train 라벨에만 적용한다. 모델 판단으로 test 정답지를 고치면, 모델이 자기 답안지를 수정한 뒤 채점하는 셈이 된다.
진짜 병목은 test 정답지였다
오답 갤러리를 살펴보다 바퀴 관련 오답 일부에서 이상한 점을 발견했다. 모델이 틀린 것이 아니라, 폴더 라벨이 틀렸는데 모델은 맞고 있었다.
그래서 모델 예측과 폴더 라벨을 모두 숨긴 블라인드 검수를 진행했다. 검수자는 사진만 보고 부위를 판정했고, 판단 불가와 사용 불가도 선택할 수 있게 했다.
모델과 라벨이 달랐던 441장 중 판정 가능한 사례를 보면, 227장은 라벨이 틀렸고 모델이 맞았다. 특히 좌우만 반대인 사례에서는 라벨 오류 비중이 매우 높았다.
| 채점 기준 | affine 모델 | clean2 모델 |
|---|---|---|
| 폴더 라벨 | 90.90% | 91.13% |
| 1·2차 정정 | 95.32% | 95.76% |
| 사용 불가 제외 | 96.86% | 97.31% |
모델은 바뀌지 않았는데 점수는 약 6%p 올랐다. 기존의 91% 정확도는 모델 성능의 한계가 아니라, 정답지 노이즈가 반영된 측정값에 가까웠다.
정확도를 개선하기 전, 정답지를 먼저 확인하자
이 경험에서 얻은 결론은 단순하다. 정확도 숫자는 정답지의 정확도를 넘을 수 없다.
라벨 오류가 많은 상태에서는 모델 간 미세한 차이도 노이즈에 가려진다. 하이퍼파라미터를 계속 조정해도 실제 성능 대신 잘못된 정답지에 맞춰질 수 있다.
앞으로는 seed를 바꾼 반복 학습으로 라벨 정리 효과를 재현하고, 사용 불가 사진의 공식 제외 기준을 고정할 계획이다. 동시에 남은 진짜 오답인 측면 앞쪽 ↔ 대각처럼 경계가 모호한 사례의 라벨 기준도 문서화해야 한다.
좋은 모델을 만들기 전에, 먼저 좋은 정답지를 만들어야 한다.
'AI' 카테고리의 다른 글
| OpenClaw Discord 채널별 AI 에이전트 — 설정 전체 공개 (실전 셋업 Part 2) (0) | 2026.06.21 |
|---|---|
| OpenClaw로 만드는 Discord 채널별 AI 에이전트 팀 (실전 셋업 기록) (0) | 2026.06.21 |
