조형준DATA PORTFOLIO
CASE 05 / 회사 업무 / 모델·개발

고속도로 CCTV 차량분류 모델 학습 및 오류 분석

CCTV 차량분류의 데이터 준비·학습·평가

핵심 요약

모델 학습과 별도 평가를 구분하고, 차종별 오류를 분석했습니다.

MobileNetV4 학습 · 별도 평가 966장 · 희소 차종 한계 확인

내 역할데이터·라벨 정리, 분류 모델 학습·튜닝, 평가 및 오류 분석, CPU 실행 결과 검토

도구Python · PyTorch · timm · YOLO · ONNX Runtime

기록2026.04 학습 / 2026.06.16 별도 평가

작업 배경 · 고속도로 CCTV 차량분류 연구에서 이미지·정답 준비, 모델 학습·조정과 차종별 오류 분석을 담당했습니다.

학습 기록: 2026.04 / 별도 분류 평가: 2026.06.16

웹 작업 기록 QR 코드

웹 작업 기록QR 또는 제목 링크로 상세 내용 열기

업무 결과

작성한 자료와 확인한 결과

전체 정확도에 가려진 차종별 혼동을 찾아 오류 점검과 추가 표본 확보 대상을 나눴습니다.

직접 수행한 MobileNetV4 학습과 별도 EnsembleClassifier 평가를 구분했습니다. 별도 평가에서 소형화물 76장 중 35장은 정분류, 19장은 중형화물로 분류됐습니다.

CODE & VALIDATION

코드 구성과 검증 방식

이미지·정답 준비, 학습 설정, 평가 결과 해석을 구분해 기록했습니다. 평가 JSON의 정답 차종별 행을 읽으면 전체 점수와 차종별 오류를 따로 검산할 수 있습니다.

공개 평가 JSON으로 오류 건수 검산

import json

with open("model-evaluation.json", encoding="utf-8") as f:
    metrics = json.load(f)["metrics"]
small_truck = metrics["confusion_matrix"]["T3"]
support = sum(small_truck.values())
correct = small_truck["T3"]
as_medium_truck = small_truck["T4"]
assert (support, correct, as_medium_truck) == (76, 35, 19)

공개된 평가 JSON을 같은 폴더에 저장하면 실행할 수 있는 검산 예시입니다. 모델 학습 코드가 아니라 별도 평가 결과를 읽는 코드입니다.

검산에 사용한 평가 JSON 열기

차량분류 저장소 README · MobileNetV4 학습 코드 · holdout 평가 코드

저장소의 학습·holdout 코드와 위 966장 평가 JSON은 구분해 읽어주세요. 실행에는 별도 데이터·가중치가 필요합니다.

WORK LOG

작업 타임라인

학습·평가·영상 실행은 서로 다른 기록입니다. 동일 모델의 연속 개선 과정으로 연결하지 않았습니다.

상세 작업 기록 · 4단계 펼치기
01

2026.04 학습 기록

차량분류용 자료와 학습 설정 구성

차량 이미지와 정답을 준비하고 MobileNetV4의 추가 학습·분류부 조정을 수행했습니다. 밝기·잘라내기 변형과 자료가 적은 차종을 반영하는 학습 설정을 다뤘습니다.

fine_tune_v4 · 학습 손실 / 검증 손실0123456학습검증1591317epoch

확인한 결과학습 코드와 best·last 가중치가 남아 있습니다. 별도 실행의 학습곡선은 아래 자료에서 구분해 제공합니다.

02

별도 평가 준비

자료 구성·파일 연결의 문제 확인

기존 평가 준비 자료에서 해시 불일치와 외부 자료 혼입을 확인했습니다. 별도 정리된 평가 자료의 이미지 존재와 파일 정보를 점검했습니다.

승용차343장버스103장소형화물76장중형화물351장대형화물84장세미트레일러8장이륜차1장
막대 길이는 차종별 평가 이미지 수입니다. 세미트레일러 8장·이륜차 1장으로 평가 자료가 특히 적습니다.

확인한 결과966개 평가 자료의 파일 확인과 차종별 표본 분포를 정리했습니다. 파일 무결성 확인은 학습·평가 누수 해소와는 별개입니다.

03

2026.06.16

혼동행렬로 오류가 집중되는 차종 확인

EnsembleClassifier의 정답·예측 결과를 차종별로 나눴습니다. 전체 정확도와 클래스별 결과를 함께 보고 소형화물의 중형화물 오분류를 확인했습니다.

별도 EnsembleClassifier 평가: 정확도 82.61% · macro-F1 0.6731

예측 클래스 →T1T130315216610T2T239307000T3T31323519700T4T4271322891910T5T525067100T10T100001070T13T131000000실제 클래스 ↓
행은 정답 차종, 열은 예측 차종입니다. T1 승용차 · T2 버스 · T3 소형화물 · T4 중형화물 · T5 대형화물 · T10 세미트레일러 · T13 이륜차

확인한 결과전체 966장 중 798장을 맞혔지만 소형화물은 76장 중 35장만 정분류했습니다. 이륜차는 표본 1장이므로 일반적인 성능을 판단하기 어렵습니다.

04

별도 영상 실행

사진 평가와 영상 동작을 분리

차량을 검출·추적하고 차종을 기록하는 영상 실행 결과도 확인했습니다. 이미지 분류 정답과 실제 차량 단위 정답은 다른 검증 대상으로 구분했습니다.

영상 입력차량 찾기·추적차종 구분처리 기록 확인오류 사례 검토

확인한 결과100프레임 처리와 추적번호 기준 45개 대상을 확인했습니다. 차량 단위 정답이 없어 현장 차종 정확도를 계산하지 않았습니다.

분석 범위

후속 데이터·평가 점검의 근거입니다. 별도 모델의 82.61% 정확도를 직접 학습한 모델의 개선율이나 현장 차량 단위 정확도로 제시하지 않습니다.

세부 구현·검산·평가 조건 읽기

평가 전에 데이터의 구성부터 점검

데이터 준비에서는 영상에서 추출한 차량 이미지와 라벨을 연결하고 학습·검증·평가 대상을 구분했습니다. 평가 준비 점검에서는 기존 4,336행 파일의 해시가 일치하지 않고, 그 안에 외부 자료 2,542행이 섞여 있음을 확인했습니다.

별도 정리한 966개 평가 자료는 파일 해시와 이미지 존재를 확인할 수 있었습니다. 다만 희소 클래스의 표본 부족이 남아 있어, 이를 서비스 적용 여부를 판단할 수 있는 충분한 평가 자료로 취급하지 않았습니다.

파일의 누락·변경 여부와 학습 자료와의 중복 여부는 다른 검사입니다. 이 자료만으로 현장 적용 성능을 확정하지 않았습니다.

분류기 학습과 미세조정 기록

학습 코드에는 좌우 반전·부분 잘라내기·밝기 변화와 클래스별 가중 손실이 구현돼 있습니다. MobileNetV4 전체 학습 후에는 기존 가중치를 불러와 특징 추출부를 고정하고 분류부를 조정하는 경로를 구성했습니다. 해당 학습의 best·last 가중치 파일이 남아 있습니다.

아래 곡선은 별도 분류기 실행 fine_tune_v4의 17개 epoch 기록입니다. 훈련 손실이 감소해도 검증 손실은 같은 방식으로 줄지 않는 구간이 있어, 훈련 결과만으로 판단하지 않았습니다. 이 곡선은 MobileNetV4나 6월 평가 모델의 학습곡선으로 제시하지 않습니다.

곡선은 별도 fine_tune_v4 실행 기록이며 MobileNetV4·6월 평가 모델의 곡선이 아닙니다. 자료 구성이 다른 회차의 점수는 직접 비교하지 않았습니다.

어떤 차종을 잘못 구분하는지 확인

2026년 6월 16일 EnsembleClassifier 평가의 혼동행렬을 기준으로 각 클래스의 정분류·오분류를 확인했습니다. 전체 정확도와 클래스별 F1을 함께 보면 표본이 많은 클래스의 성능이 전체 지표에 미치는 영향을 구분할 수 있습니다.

T3의 재현율은 약 46.1%이며 T4로 분류한 사례가 19개입니다. T13은 평가 표본이 1개뿐이므로 F1이 0이라는 값만으로 일반적인 성능을 판단할 수 없습니다. 해당 평가는 적용 한계를 설명하는 자료이며 최종 현장 성능으로 확대하지 않습니다.

966개 평가와 4월 학습 실험 사이의 모델 계보가 모두 확인된 것은 아닙니다. 이 수치를 특정 튜닝의 개선 효과로 연결하지 않았습니다.

모델 점수와 영상에서의 동작을 분리

차량 이미지 분류가 맞는지와 실제 영상에서 검출·추적이 안정적으로 이어지는지는 다른 문제입니다. 영상 시험에서는 처리 프레임, 추적 대상, 차종 관측과 로그의 일치 여부를 확인했습니다.

10초 구간을 10fps로 구성한 100프레임 시험은 6.339초에 처리됐습니다. 사람이 확인한 차량 단위 정답이 없으므로 이 기록은 실행 확인에 사용하며, 속도 정확도나 현장 차종 분포 정확도로 해석하지 않습니다.

영상의 실제 차량 수·차종을 사람이 확인한 정답은 없어 현장 정확도를 계산하지 않았습니다.

실험 비교에서 지킨 범위

회차별 학습 기록에는 표본 구성과 클래스 포함 여부가 달라진 실험이 함께 있습니다. 서로 다른 평가 자료의 점수를 빼서 성능 향상률을 만들지 않았습니다. 모델 이름·데이터 분할·평가 시점이 일치하는 비교만 개선 근거로 사용할 수 있습니다.

현재 자료의 한계

4월 분류기 학습 실행과 MobileNetV4 가중치는 확인되지만, 모든 모델에 대한 학습곡선과 6월 평가까지의 완전한 계보는 확인되지 않습니다. 일부 학습 코드의 분할은 이미지 경로 단위이므로 영상·차량 단위 누수까지 해소됐다고 주장하지 않습니다. 평가 표본과 적용 범위의 한계를 남겨 두었습니다.

용어와 집계 단위
용어이 자료에서의 의미
라벨각 차량 이미지의 정답 차종 정보입니다.
해시·무결성 검사파일의 식별값을 대조해 누락·변경 여부를 확인합니다. 학습 자료와의 중복 검사와는 별개입니다.
혼동행렬·재현율실제 차종과 예측 차종을 교차한 표와, 해당 차종의 정답 중 맞힌 비율입니다.
macro-F1차종별 정밀도·재현율을 함께 반영한 F1 점수를 차종마다 같은 비중으로 평균한 값입니다.
학습 손실·epoch학습 중 계산한 오류 크기와 학습 자료를 반복해서 보는 횟수입니다.