📦 레포: kh20134/jev-vehicle-classifier (MIT, v0.1.1, 커밋 7a53fd2)

🧭 연재: ① 개요 및 초기 구조 (이번 글) → ② 실제 검출 → ③ 데이터·라벨 → ④ confidence 보정 → ⑤ 현장 ITS 연계

1. 연재 배경

  • 교통량 조사는 도로 계획·설계·운영의 기초 자료임. 차종별·방향별·시간대별로 통과 대수를 셈
  • 고속국도·일반국도 상시조사는 AVC 장비로 365일 24시간 연속 수집함
  • 고속국도 수시조사는 매년 10월 셋째 주 목요일에 AVC·VDS·TCS와 CCTV 인력 조사를 병행함

현장에서 체감하는 문제는 매설식 AVC의 한계였음.

  • 노면 매설 센서(피에조 등)로 축수·축간거리·차량길이를 재고 제원과 비교해 분류하는 방식임
  • 센서 관리 상태에 분류 정확도가 크게 좌우됨
  • 편향 주행, 센서 손상 같은 현장 변수에 능동 대응이 어려움
  • 매설식이라 재포장·보수 때 센서 재시공이 따르고, 수시조사에서는 결국 CCTV 인력 조사를 병행함

그래서 CCTV 영상에서 특징을 뽑고, 마지막 차종 판단은 결정 모델에 맡기는 구조를 연재로 만들어 보기로 했음.

2. TypeSafe Jev란

  • TypeSafe의 System One 모델 중 첫 번째이자 대표 모델임
  • 상태(state)를 읽고 정해진 답과 확률을 돌려주는 결정 모델임. 글을 생성하는 LLM과 다름
  • 질문 유형은 Choice(선택지 중 하나), Score(척도), Noul(참/거짓) 세 가지임
  • Choice 응답은 choice, 선택지별 probabilities, 분포 모양으로 계산한 confidence로 구성됨
  • 입력은 현재 텍스트만 받음. 문자열, JSON 객체, 텍스트 배열까지임. 이미지·음성·영상은 미지원임

3. 왜 비전 → 특징 → state → Choice인가

  • Jev에 CCTV 화면을 바로 넣을 수 없음. 화소를 글로 바꾸는 단계가 반드시 필요함
  • 차종 분류표가 실제로 묻는 건 축수, 단위(트레일러 연결 여부), 세미/풀 형식, 적재 톤임
  • 비전은 그 값을 뽑는 데만 집중하고, 12종 판단은 Jev Choice가 맡도록 역할을 나눴음
  • 검출기는 YOLO가 될 수도, 현장 검지기 값이 될 수도 있음. state JSON만 고정하면 앞단을 갈아 끼워도 Choice 층은 그대로임
영상 또는 샘플 JSON → 특징(VehicleFeatures) → state JSON → Jev Choice → 12종 + 확률
                                                   └ 표 밖이거나 confidence가 낮으면 TRA_미분류

4. 도로교통량조사 12종 차종분류

기준은 한국건설기술연구원 교통량정보제공시스템의 12종 차종분류표임. 축수와 단위로 나눔.

  • 1단위: 차체 하나
  • 2단위: 견인차+피견인차 조합을 한 대로 셈. 축수도 조합 전체로 셈
  • 버스는 16인승 이상이면 한 종임. 이륜차 칸은 없음
코드종별축·단위정의(요약)AVC 열
class_011종 승용차·미니트럭2축 1단위16인승 미만 여객, 미니트럭TRA_01종
class_022종 버스2축 1단위16인승 이상 여객 버스TRA_02종
class_033종 소형화물차 A2축 1단위최대 적재 1~2.5톤 미만TRA_03종
class_044종 소형화물차 B2축 1단위최대 적재 2.5톤 이상TRA_04종
class_055종 중형화물차 A3축 1단위화물 트럭TRA_05종
class_066종 중형화물차 B4축 1단위화물 트럭TRA_06종
class_077종 중형화물차 C5축 1단위화물 트럭TRA_07종
class_088종 대형화물차 A4축 2단위세미 트레일러TRA_08종
class_099종 대형화물차 B4축 2단위풀 트레일러TRA_09종
class_1010종 대형화물차 C5축 2단위세미 트레일러TRA_10종
class_1111종 대형화물차 D5축 2단위풀 트레일러TRA_11종
class_1212종 대형화물차 E6축 이상 2단위세미 트레일러TRA_12종

출처: 한국건설기술연구원 교통량정보제공시스템 「도로교통량조사 12종 차종분류표」 (road.re.kr, 2026-10-17 확인). AVC 열 이름은 한국도로공사 고속도로 AVC 원시자료(공공데이터포털) 기준

  • 코드 class_01~class_12는 AVC 원시자료 TRA_01종~TRA_12종과 순서를 맞췄음
  • 원시자료에 있는 TRA_미분류는 Choice 선택지로 넣지 않았음 (9장 참고)
  • 이륜차, 6축 이상 풀트레일러처럼 표에 없는 차량은 TRA_미분류로 집계함

5. 전체 구조

Jev 차종 식별 파이프라인 구조도 (연재 1회)

연재 1회 파이프라인 구조도 · 출처: kh20134/jev-vehicle-classifier docs/diagrams/architecture.png (커밋 7a53fd2)

  • ① 입력: 도로 CCTV를 가정함. 이번 회차는 샘플 특징 JSON을 읽음
  • ② 비전 특징 추출: MockVisionExtractor가 자리만 잡음. 이미지·가중치 사용 안 함
  • ③ state 구성: 축수, 단위(트레일러), 적재 톤을 VehicleFeatures.to_state()로 JSON화함
  • ④ TypeSafe Jev: Choice 하나, 선택지 12개 (jev-latest)
  • 출력: 차종 코드·한글명·확률분포·AVC 집계 열, 저신뢰는 needs_review

6. 프로젝트 구조

src/jev_vehicle/classes.py       12종, TRA_01종~TRA_12종, Choice criteria
src/jev_vehicle/features.py      축수, 단위, trailer_type, load_tonnage_t, to_state()
src/jev_vehicle/vision_mock.py   연재 1회 mock 추출기 (extract()가 계약)
src/jev_vehicle/classifier.py    Jev 호출, MockJevClient, TRA_미분류 라우팅
src/jev_vehicle/cli.py           python -m jev_vehicle
examples/sample_features/        샘플 특징 JSON 14종
tests/                           키 없이 도는 단위 테스트
  • 특징 JSON에 정답 코드는 넣지 않음
  • 번호판, 얼굴, 영상 바이트도 필드로 두지 않음. 개인정보는 처음부터 경로에서 뺐음
  • 연재 2회 검출기는 extract()가 같은 VehicleFeatures만 돌려주면 됨

7. 설치 및 테스트

git clone https://github.com/kh20134/jev-vehicle-classifier
cd jev-vehicle-classifier
python3 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest
  • Python 3.10 이상 필요함
  • mock 모드와 테스트는 typesafe-sdk, API 키 없이 동작함
pip install 및 pytest 35개 통과 화면

설치 후 단위 테스트 35개 통과 · 출처: 직접 실행 (2026-10-17 KST, Python 3.13, 커밋 7a53fd2)

8. 실행 화면 (mock)

아래 화면은 전부 --mock 실행임. 실제 Jev 응답이 아님. 확률 값은 데모 규칙이 만든 고정 분포임.

python -m jev_vehicle classify --sample sedan --mock
python -m jev_vehicle classify --sample bus --mock
python -m jev_vehicle classify --sample truck3axle --mock
python -m jev_vehicle classify --sample semi5 --mock
python -m jev_vehicle classify --sample motorcycle --mock

① 승용차 (sedan)

sedan 샘플 mock 실행 결과 class_01 승용차·미니트럭

2축 1단위, 5인승 → class_01, 집계 TRA_01 · 출처: 직접 실행 (2026-10-17 KST, mock)

② 버스 (bus)

bus 샘플 mock 실행 결과 class_02 버스

45인승 버스 → class_02, 집계 TRA_02. 좌석형·입석형 구분 안 함 · 출처: 직접 실행 (2026-10-17 KST, mock)

③ 3축 단일 트럭 (truck3axle)

truck3axle 샘플 mock 실행 결과 class_05 중형화물 A

3축 1단위 → class_05 중형화물 A, 집계 TRA_05 · 출처: 직접 실행 (2026-10-17 KST, mock)

④ 5축 세미트레일러 (semi5)

semi5 샘플 mock 실행 결과 class_10 대형화물 C

5축 2단위, 세미 → class_10 대형화물 C, 집계 TRA_10. 견인차·피견인차를 한 대로 셈 · 출처: 직접 실행 (2026-10-17 KST, mock)

⑤ 이륜차 (motorcycle) → TRA_미분류

motorcycle 샘플 mock 실행 결과 TRA_미분류 needs_review

표 밖 차량(out_of_scope) + 저신뢰 → 집계 TRA_미분류, needs_review · 출처: 직접 실행 (2026-10-17 KST, mock)

  • Choice는 12개 중 하나(여기선 class_01)를 고르지만, 집계 칸은 TRA_미분류로 감
  • Choice가 고른 코드는 리포트에 남기고, 자동 집계에 쓰는 값은 집계 칸임

9. 미분류와 needs_review 임계값

  • TRA_미분류는 13번째 차종이 아님. 애플리케이션이 정하는 집계 처리임
  • Choice 선택지에 미분류를 넣으면 확률이 차종 아닌 쪽으로 새고, AVC 12개 열과 어긋남
  • 그래서 Jev는 항상 12개 중 하나를 고르게 두고, 뒤에서 라우팅함
이륜차 등 표 밖        →  집계 TRA_미분류, needs_review
confidence < 임계값    →  집계 TRA_미분류, needs_review
그 외                  →  집계 TRA_01 … TRA_12
  • 기본 임계값은 0.45임. 12지선다에서 최상위 확률 약 0.50에 해당함
  • confidence는 "맞을 확률"이 아니라 확률이 한곳에 얼마나 몰렸는지를 0~1로 나타낸 값임
  • 0.45는 자리표시자임. 현장 라벨로 보정하기 전엔 운영 기준으로 쓰지 않음
  • --threshold 옵션으로 바꿔 볼 수 있음

10. 이번 회차의 한계

  • 비전 단계는 mock임. 실제 CCTV 이미지를 열지 않음
  • 모든 실행 화면은 MockJevClient 결과임. 공식 판정도 아니고 Jev 응답도 아님
  • 실제 Jev(--live) 호출은 아직 검증하지 않았음. 코드 경로와 SDK 사용법(response.answers)만 문서 기준으로 맞춰 둠
  • 정확도·처리 속도 같은 성능 수치는 아직 없음. 라벨 데이터가 생기는 3회부터 측정함
  • 임계값 0.45는 보정 전 값임

11. 다음 연재 예고

회차내용
① 이번 글공식 12종, mock 특징, state, Jev Choice, TRA_미분류
② 실제 검출YOLO 등으로 차량 검출. 가림·야간·원거리 누락값은 null로 표현. Jev 입력은 계속 state
③ 데이터·라벨평가 세트, 혼동행렬. 1톤·2.5톤 경계, 세미/풀, 축 하나 잘못 센 조합 사례 정리
④ confidence 보정현장 라벨로 임계값 선정. 자동 집계 비율과 사람 검토 비율 동시 확인
⑤ 현장 ITS 연계AVC 원시자료 TRA_01종~TRA_12종·TRA_미분류 집계, 검토 큐, 지점·차로 메타데이터 분리

12. 한눈에 정리

구분내용
목표CCTV 차량을 도로교통량조사 12종으로 분류
결정 모델TypeSafe Jev (System One) Choice, jev-latest
Jev 입력state JSON (축수·단위·트레일러 형식·적재 톤). 이미지 아님
집계 열TRA_01종~TRA_12종 + TRA_미분류
검토 기준confidence < 0.45 또는 표 밖 → needs_review
1회 범위mock 특징·mock 응답, CLI, 테스트 35개
레포kh20134/jev-vehicle-classifier
jev-vehicle-classifier GitHub 저장소 화면

GitHub 저장소 메인 화면 · 출처: github.com/kh20134/jev-vehicle-classifier (2026-10-17 KST 캡처)

13. 출처