Skip to content

CCTV Brakelight Classifier 3 Model Comparison

ehdwo0427 edited this page May 27, 2026 · 1 revision

후미등 ON/OFF 분류기 — 3 모델 비교 (ResNet18 / MobileNetV3-L / EfficientNet-B0)

차량 후면 crop → 브레이크등 ON/OFF 이진 분류기 학습 기록. CCTV 공회전 탐지의 보조 신호로 사용 (정지·탑승과 다중 신호 조합). 메인 프로젝트: CCTV 자전거 경로 추적 & 차량 공회전 탐지

목차

요약

모델 params val_acc test_acc brake_on 정답률 batch=1 FPS
ResNet18 11.18M 83.94% 80.94% 72.4% 603
MobileNetV3-Large 4.20M 83.87% 82.58% 73.7% 236
EfficientNet-B0 4.01M 83.94% 82.68% 77.0% 189

EfficientNet-B0 채택. test 정확도 최고 + brake_on FN 가장 낮음 + 가장 작은 모델.

왜 분류로 풀었는가

원본 Roboflow 데이터는 COCO detection format (이미지 위에 차량 박스 + 클래스). 그런데 공회전 탐지에 필요한 건 "이 차량 후면 patch 가 ON 이냐 OFF 이냐" 이진 분류였습니다.

원본 (detection)            우리 사용 (classification)
  이미지 + 박스(클래스)  →   박스대로 crop → ImageFolder 폴더 분리
                              brake_on/  brake_off/

scripts/coco_brakelight_to_classify.py 가 변환을 담당:

  • 박스 좌표 그대로 crop, padding 5%
  • min_box_size 24px 미달은 skip
  • image_id 기반 split — 같은 이미지에서 나온 박스들이 train/val 에 섞이지 않게 (leakage 방지)

detection 모델을 새로 학습할 필요가 없고, classification 분류 단순 분기로도 충분히 풀리는 문제였습니다.

데이터셋

  • 출처: Roboflow Universe — Tail_Lamp_KLETECH (lees-workspace-vrg81)
  • 라이선스: CC BY 4.0
  • 원본 클래스: Brake_Light, car_BrakeOn, car_BrakeOff (3 카테고리)
  • 사용 클래스: car_BrakeOn, car_BrakeOff 만 사용

변환 통계

항목 수치
원본 이미지 7,892 (2560×1440)
원본 박스 라벨 19,913
변환된 classification crop 19,643 (min_size 미달 270 skip)
train brake_on 7,160 / brake_off 8,544 (= 15,704)
val brake_on 1,340 / brake_off 1,623 (= 2,963)
test brake_on 460 / brake_off 516 (= 976)
디스크 466 MB

ON/OFF 비율 약 46:54 — 클래스 불균형 거의 없음.

학습 데이터 예시

Brake light dataset — tunnel scene

Brake light dataset — bridge scene

Brake light dataset — city street

🟥 빨간 박스 = car_BrakeOn, ⬜ 회색 박스 = car_BrakeOff. 모든 샘플이 블랙박스 정면 시점 — 차량 후면이 큼직하게 잡힙니다. 이게 한계 섹션에서 다시 등장하는 도메인 갭의 원인입니다.

학습 설정

3 모델 공통 (timm 라이브러리):

항목
Backbone ImageNet 사전학습
입력 96×192 (가로형, 차량 후면 비율)
Epoch 25
Batch 128
Optimizer AdamW, lr=1e-3, cosine schedule
Label smoothing 0.05
AMP True
Augmentation Albumentations (회전 / 원근 / 블러 / 노이즈 / JPEG / CoarseDropout / brightness)
환경 RTX 3090 Ti, PyTorch 2.9 + timm 1.0

3 모델을 GPU 3장 병렬로 동시에 돌렸습니다. 순차로 돌면 GPU 한 장이 노는 시간이 너무 길고, test 시점에 비교 결과를 받는 시점도 늦어집니다.

정확도 결과

Val (best epoch) vs Test (held-out)

모델 best_ep val_acc test_acc val→test gap
ResNet18 16 83.94% 80.94% -3.00%p
MobileNetV3-Large 3 83.87% 82.58% -1.29%p
EfficientNet-B0 9 83.94% 82.68% -1.26%p

관찰:

  • ResNet18 overfit — val 16 epoch 부터 train_loss 계속 감소했지만 val_loss 증가. 큰 모델이 작은 데이터에 일반화 약함
  • MBV3-L 빨리 수렴 — best ep 3, 이후 평탄. 작은 모델 우위
  • EffNet-B0 일반화 최강 — test 82.68% 로 1위, val→test gap 도 가장 작음

Confusion matrix (test 976장)

ResNet18                MBV3-L                  EffNet-B0
            off    on              off    on              off    on
  off  [  457   59 ]    off  [  467   49 ]    off  [  453   63 ]
  on   [  127  333 ]    on   [  121  339 ]    on   [  106  354 ]
모델 brake_off 정답률 brake_on 정답률 (FN 위험 측정)
ResNet18 88.6% 72.4% ← brake_on 28% 놓침
MBV3-L 90.5% 73.7%
EffNet-B0 87.8% 77.0% ← FN 가장 적음

공회전 탐지 관점: brake_on 을 놓치면 (False Negative) 공회전을 못 잡는 직접적 손실. brake_off 를 ON 으로 잘못 보는 (False Positive) 건 보조 신호라 정지·탑승이 막아줍니다. → FN 이 더 치명적이라 EffNet-B0 이 가장 유리.

추론 속도

RTX 3090 Ti, FP32, 96×192:

모델 batch=1 batch=8 batch=128
ResNet18 603 FPS 4,770 FPS 13,857 FPS
MobileNetV3-Large 236 1,880 14,867
EfficientNet-B0 189 1,470 8,805
  • ResNet18 이 작은 batch 에서 압도. MBV3 가 큰 batch 에서 우위.
  • 우리 영상 추론은 한 차량당 호출 (batch=1) 이라 EffNet-B0 의 189 FPS 도 충분 — 영상이 30 FPS 이고 한 프레임당 차량 510대 추론이면 60ms 안에 끝남.

최종 선택과 근거

메인: EfficientNet-B0

  • test_acc 82.68% (최고)
  • brake_on FN 가장 낮음 (공회전 놓치는 위험 ↓)
  • 모델 작음 (4M params), edge 배포 가능
  • batch=1 189 FPS 는 영상 추론에 충분

백업: MobileNetV3-Large

  • test_acc 82.58% (근소 차이)
  • batch=128 에서 가장 빠름 (14,867 FPS)
  • 다수 차량 동시 추론 시 유리

제외 (정량 근거): ResNet18

  • overfit 명확
  • test_acc 가장 낮음
  • 일반화 약함. 데이터 더 늘어나면 다시 고려

한계와 도메인 갭

위 데이터 예시 이미지들에서 보듯, 학습 데이터는 모두 블랙박스 정면 시점:

  • 차량 후면이 큼직하게 잡힘
  • 차량 정렬이 정면 방향
  • 조명·도로 분포가 운전 시점 분포

우리 한동대학교 CCTV 는:

  • 부감 30~40°
  • 차량 후면이 비스듬하고 작게 잡힐 가능성
  • 빛 조건 (천장 조명·자연광) 도 다름

도메인 갭으로 인해 brake_on FN 23% 가 실제 운용에서는 더 커질 수 있습니다.

실제 Zone A dry-run 에서:

  • 빨간 차체 (트럭 등) 가 brake_prob 단발적으로 튀는 패턴 관찰
  • 어두운 그림자 영역도 비슷한 패턴

이게 brake 신호를 보조로만 쓰는 결정의 이유입니다. require_brake=True 로 강제하면 부감 시점 약점이 그대로 공회전 미탐지로 새어 나갑니다.

향상 옵션

현 정확도 한계가 운영에 결정적이면 다음 순서로:

  1. brake_prob rolling 평균 5–10초 적용 — 단발 false positive 감소 (코드만 수정, 학습 불필요)
  2. 카메라 도착 후 fine-tune 한 사이클 — 실데이터 100~500장 라벨링 → 도메인 적응. CLAUDE.md §10 의 "도착 후 fine-tune" 전략
  3. Focal loss + class_weight — brake_on FN 줄이기 (재학습 필요)
  4. Augmentation 강화 — 부감 시뮬레이션. 회전·원근을 더 강하게
  5. Train + Val 합쳐서 재학습 — best epoch 알았으니 더 많은 데이터로

데이터 80% 가 학습에 쓰였으니 여유 있음. 직접 라벨링은 다른 옵션 다 시도 후 검토.

산출물 경로

모델 best.pt
ResNet18 experiment/brakelight/run_resnet18/best.pt
MobileNetV3-Large experiment/brakelight/run_mobilenetv3_large/best.pt
EfficientNet-B0 experiment/brakelight/run_efficientnet_b0/best.pt

각 폴더에 config.json, train_log.json, confusion matrix 포함.

Woody's AI Backend Engineering Log


💼 About

Deepvisions | AI Engineer 2026.03 ~ 재직중


🚀 Projects (최신순)

CCTV 자전거 경로 & 공회전 탐지 — 한동대학교 리빙랩

2026.05 ~ | @ Deepvisions 캠퍼스 CCTV 4대 · 자전거 OCR + 차량 공회전 다중 신호

야생동물 탐지 — RPi 엣지 배포

2026.04 ~ | @ Deepvisions 포도밭 침입 탐지 (5종 multi-class · 라즈베리파이 4 실시간)

포도밭 병해충 탐지 및 수확량 예측

2026.03 ~ | @ Deepvisions 드론 이미지 기반 객체 탐지 + GSD calibration + 수확량 예측


📦 종료된 프로젝트

OnTheTop

2025.03 ~ 2025.08 | 카카오테크부트캠프 | ✅ 종료 AI 기반 데스크테리어 추천 서비스


AI Notes


About

Clone this wiki locally