-
Notifications
You must be signed in to change notification settings - Fork 0
CCTV Brakelight Classifier 3 Model Comparison
차량 후면 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 — 클래스 불균형 거의 없음.



🟥 빨간 박스 = 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 시점에 비교 결과를 받는 시점도 늦어집니다.
| 모델 | 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 도 가장 작음
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 이고 한 프레임당 차량 5
10대 추론이면 60ms 안에 끝남.
- test_acc 82.68% (최고)
- brake_on FN 가장 낮음 (공회전 놓치는 위험 ↓)
- 모델 작음 (4M params), edge 배포 가능
- batch=1 189 FPS 는 영상 추론에 충분
- test_acc 82.58% (근소 차이)
- batch=128 에서 가장 빠름 (14,867 FPS)
- 다수 차량 동시 추론 시 유리
- overfit 명확
- test_acc 가장 낮음
- 일반화 약함. 데이터 더 늘어나면 다시 고려
위 데이터 예시 이미지들에서 보듯, 학습 데이터는 모두 블랙박스 정면 시점:
- 차량 후면이 큼직하게 잡힘
- 차량 정렬이 정면 방향
- 조명·도로 분포가 운전 시점 분포
우리 한동대학교 CCTV 는:
- 부감 30~40°
- 차량 후면이 비스듬하고 작게 잡힐 가능성
- 빛 조건 (천장 조명·자연광) 도 다름
→ 도메인 갭으로 인해 brake_on FN 23% 가 실제 운용에서는 더 커질 수 있습니다.
실제 Zone A dry-run 에서:
- 빨간 차체 (트럭 등) 가 brake_prob 단발적으로 튀는 패턴 관찰
- 어두운 그림자 영역도 비슷한 패턴
이게 brake 신호를 보조로만 쓰는 결정의 이유입니다. require_brake=True 로 강제하면 부감 시점 약점이 그대로 공회전 미탐지로 새어 나갑니다.
현 정확도 한계가 운영에 결정적이면 다음 순서로:
- brake_prob rolling 평균 5–10초 적용 — 단발 false positive 감소 (코드만 수정, 학습 불필요)
- 카메라 도착 후 fine-tune 한 사이클 — 실데이터 100~500장 라벨링 → 도메인 적응. CLAUDE.md §10 의 "도착 후 fine-tune" 전략
- Focal loss + class_weight — brake_on FN 줄이기 (재학습 필요)
- Augmentation 강화 — 부감 시뮬레이션. 회전·원근을 더 강하게
- 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 포함.
Deepvisions | AI Engineer 2026.03 ~ 재직중
2026.05 ~ | @ Deepvisions 캠퍼스 CCTV 4대 · 자전거 OCR + 차량 공회전 다중 신호
2026.04 ~ | @ Deepvisions 포도밭 침입 탐지 (5종 multi-class · 라즈베리파이 4 실시간)
2026.03 ~ | @ Deepvisions 드론 이미지 기반 객체 탐지 + GSD calibration + 수확량 예측
- 프로젝트 메인
- 관련 연구 종합 + 한계 (2026-05) ← 최신
- 수확량 close-up 4장 + 3-Model (2026-05-19)
- 드론 포도 수확량 예측 — 파이프라인 (2026-05)
- 드론 포도송이 탐지 — 학습 변천사 (2026-04)
- SAM3 vs Fine-tuned YOLO
- Grounding DINO vs YOLO Top3 비교 요약
- YOLO Baseline Top3 비교 요약
- YOLO Model Comparison Summary
- 포도 탐지를 위한 데이터 수집
- 포도 수확량 측정을 위한 Object Detection
2025.03 ~ 2025.08 | 카카오테크부트캠프 | ✅ 종료 AI 기반 데스크테리어 추천 서비스
- Name: Woody (이동재)
- Focus: Vision AI, LLM Integration, Backend Engineering
- GitHub: @ehdwo0427
- Email: ehdwo0427@naver.com
- 포트폴리오 : 포트폴리오