OCR_Vehicle_01 / src /validator /standards.py
Esketch's picture
v39: Add model-spec lookup for dimension fill/correction
babe376
Raw
History Blame Contribute Delete
9.64 kB
# -*- coding: utf-8 -*-
"""자동차관리법 기반 차량 규격 표준 상수
자동차관리법 시행규칙 별표1 기준 차종 분류 및 규격 범위.
OCR 값 검증 및 교차 검증에 사용.
Ported from OCR_Vehicle_02.
"""
# ── 차종 (규모 x 유형 조합) ──
VEHICLE_TYPES = {
"경형승용", "소형승용", "중형승용", "대형승용",
"경형승합", "소형승합", "중형승합", "대형승합",
"경형화물", "소형화물", "중형화물", "대형화물",
"경형특수", "소형특수", "중형특수", "대형특수",
"소형이륜", "중형이륜", "대형이륜",
}
# ── 용도 ──
USAGE_TYPES = {"자가용", "영업용", "관용"}
# ── 연료타입 ──
FUEL_TYPES = {
"휘발유", "경유", "LPG", "CNG", "LNG",
"전기", "수소전기", "수소",
"하이브리드", "휘발유+전기", "경유+전기", "LPG+전기",
"플러그인하이브리드", "휘발유+전기(PHEV)", "경유+전기(PHEV)",
"기타",
}
# OCR 오인식 보정 매핑
FUEL_TYPE_CORRECTIONS = {
"수소전키": "수소전기",
"수소전거": "수소전기",
"수소전기차": "수소전기",
"수소전": "수소전기",
"휘발": "휘발유",
"디젤": "경유",
"가솔린": "휘발유",
"엘피지": "LPG",
"액화석유가스": "LPG",
"천연가스": "CNG",
"압축천연가스": "CNG",
}
# ── 잡음 패턴: 안내문구/법률 텍스트 필터링 ──
NOISE_PATTERNS = [
"말합니다", "증명합니다", "과태료", "위반", "무보험",
"사유발생일", "변경등록", "말소등록", "검사 시행",
"자동차등록규칙", "별지", "번호판교부",
"형사고발", "범칙금", "벌점", "위반시",
"보험에 가입", "의무보험", "소유권 이전",
"자동차관리법", "도로교통법", "등록원부",
]
# ── 차종별 규격 범위 (자동차관리법 시행규칙 별표1) ──
DIMENSION_RANGES = {
"경형승용": {
"length_mm": (2500, 3700), "width_mm": (1200, 1700),
"height_mm": (1200, 2100), "weight_kg": (500, 1400),
"capacity": (2, 5),
},
"소형승용": {
"length_mm": (3500, 4800), "width_mm": (1400, 1800),
"height_mm": (1200, 2100), "weight_kg": (800, 2100),
"capacity": (4, 7),
},
"중형승용": {
"length_mm": (4200, 5100), "width_mm": (1650, 1950),
"height_mm": (1200, 2100), "weight_kg": (1100, 2500),
"capacity": (5, 7),
},
"대형승용": {
"length_mm": (4600, 5700), "width_mm": (1750, 2200),
"height_mm": (1200, 2100), "weight_kg": (1400, 3500),
"capacity": (5, 10),
},
"경형승합": {
"length_mm": (2500, 3700), "width_mm": (1300, 1700),
"height_mm": (1400, 2100), "weight_kg": (600, 1500),
"capacity": (6, 11),
},
"소형승합": {
"length_mm": (3600, 4800), "width_mm": (1500, 1800),
"height_mm": (1700, 2200), "weight_kg": (1000, 3500),
"capacity": (11, 15),
},
"중형승합": {
"length_mm": (4700, 9200), "width_mm": (1700, 2300),
"height_mm": (1900, 3300), "weight_kg": (2500, 12000),
"capacity": (16, 35),
},
"대형승합": {
"length_mm": (9000, 14000), "width_mm": (2300, 2600),
"height_mm": (2800, 3900), "weight_kg": (8000, 25000),
"capacity": (36, 80),
},
"경형화물": {
"length_mm": (2500, 3700), "width_mm": (1200, 1700),
"height_mm": (1200, 2100), "weight_kg": (400, 1500),
"capacity": (2, 3),
},
"소형화물": {
"length_mm": (3600, 4800), "width_mm": (1400, 1800),
"height_mm": (1400, 2200), "weight_kg": (1000, 3500),
"capacity": (2, 6),
},
"중형화물": {
"length_mm": (4700, 9500), "width_mm": (1700, 2400),
"height_mm": (1800, 3600), "weight_kg": (3500, 10000),
"capacity": (2, 3),
},
"대형화물": {
"length_mm": (7000, 14000), "width_mm": (2200, 2600),
"height_mm": (2400, 4200), "weight_kg": (8000, 50000),
"capacity": (2, 3),
},
"소형특수": {
"length_mm": (3000, 4800), "width_mm": (1400, 1800),
"height_mm": (1400, 2600), "weight_kg": (1000, 3500),
"capacity": (2, 3),
},
"대형특수": {
"length_mm": (5000, 16000), "width_mm": (2000, 2600),
"height_mm": (2000, 4500), "weight_kg": (5000, 50000),
"capacity": (2, 5),
},
}
# ── 차명별 표준 규격 (차명 → 고정 스펙) ──
# 차명+차종이 같으면 규격이 동일하므로, OCR 누락/오인식 시 보충·교정에 사용
# 키: 차명 내 포함 키워드 (OCR 변형 대응), 값: 표준 규격
MODEL_SPECS = {
# ── 현대 대형승합 ──
"뉴슈퍼에어로시티저상": {
"vehicle_type": "대형승합", "length_mm": "11090", "width_mm": "2490",
"height_mm": "3100", "total_weight_kg": "18000", "passenger_capacity": "44",
"fuel_type": "경유",
},
"뉴슈퍼에어로시티초저상": {
"vehicle_type": "대형승합", "length_mm": "11090", "width_mm": "2490",
"height_mm": "3100", "total_weight_kg": "18000", "passenger_capacity": "44",
"fuel_type": "경유",
},
"슈퍼에어로시티": {
"vehicle_type": "대형승합", "length_mm": "11090", "width_mm": "2490",
"height_mm": "3100", "total_weight_kg": "18000", "passenger_capacity": "44",
"fuel_type": "경유",
},
"일렉시티": {
"vehicle_type": "대형승합", "length_mm": "11090", "width_mm": "2490",
"height_mm": "3100", "total_weight_kg": "18000", "passenger_capacity": "44",
"fuel_type": "전기",
},
"일렉시티수소": {
"vehicle_type": "대형승합", "length_mm": "11090", "width_mm": "2490",
"height_mm": "3340", "total_weight_kg": "18000", "passenger_capacity": "33",
"fuel_type": "수소전기",
},
"유니버스": {
"vehicle_type": "대형승합", "length_mm": "12000", "width_mm": "2490",
"height_mm": "3575", "total_weight_kg": "18000", "passenger_capacity": "45",
"fuel_type": "경유",
},
# ── 현대 중형승합 ──
"그린시티": {
"vehicle_type": "중형승합", "length_mm": "9000", "width_mm": "2490",
"height_mm": "3050", "total_weight_kg": "14000", "passenger_capacity": "33",
"fuel_type": "경유",
},
"카운티": {
"vehicle_type": "소형승합", "length_mm": "7080", "width_mm": "2040",
"height_mm": "2755", "total_weight_kg": "8500", "passenger_capacity": "25",
"fuel_type": "경유",
},
# ── 현대 화물 ──
"마이티": {
"vehicle_type": "소형화물", "length_mm": "6085", "width_mm": "1995",
"height_mm": "2420", "total_weight_kg": "8500",
"fuel_type": "경유",
},
"파비스": {
"vehicle_type": "중형화물", "length_mm": "8590", "width_mm": "2340",
"height_mm": "2945", "total_weight_kg": "15000",
"fuel_type": "경유",
},
"엑시언트": {
"vehicle_type": "대형화물", "length_mm": "11550", "width_mm": "2495",
"height_mm": "3465", "total_weight_kg": "40000",
"fuel_type": "경유",
},
# ── 자일대우 대형승합 ──
"BS110": {
"vehicle_type": "대형승합", "length_mm": "11050", "width_mm": "2490",
"height_mm": "3150", "total_weight_kg": "16500", "passenger_capacity": "43",
"fuel_type": "경유",
},
"BS106": {
"vehicle_type": "대형승합", "length_mm": "10555", "width_mm": "2490",
"height_mm": "3090", "total_weight_kg": "16000", "passenger_capacity": "40",
"fuel_type": "경유",
},
"FX120": {
"vehicle_type": "대형승합", "length_mm": "12000", "width_mm": "2490",
"height_mm": "3575", "total_weight_kg": "18000", "passenger_capacity": "45",
"fuel_type": "경유",
},
"FX116": {
"vehicle_type": "대형승합", "length_mm": "11635", "width_mm": "2490",
"height_mm": "3575", "total_weight_kg": "18000", "passenger_capacity": "43",
"fuel_type": "경유",
},
# ── 자일대우 중형승합 ──
"레스타": {
"vehicle_type": "소형승합", "length_mm": "7080", "width_mm": "2040",
"height_mm": "2705", "total_weight_kg": "8500", "passenger_capacity": "25",
"fuel_type": "경유",
},
}
def lookup_model_specs(model_name):
"""차명에서 표준 규격 조회. 키워드 포함 매칭 (OCR 변형 대응).
Args:
model_name: OCR로 추출한 차명 문자열
Returns:
dict or None: 매칭된 표준 규격 딕셔너리
"""
if not model_name:
return None
# 공백 제거 후 매칭
clean = model_name.replace(' ', '')
# 1. 긴 키워드부터 매칭 (초저상 > 저상 > 에어로시티 순)
for keyword in sorted(MODEL_SPECS.keys(), key=len, reverse=True):
if keyword in clean:
return MODEL_SPECS[keyword]
# 2. 영문 모델명 (대소문자 무시)
clean_upper = clean.upper()
for keyword in MODEL_SPECS:
if keyword.upper() in clean_upper:
return MODEL_SPECS[keyword]
return None
# ── 차종 미확인 시 전체 허용 범위 ──
UNIVERSAL_RANGES = {
"length_mm": (1400, 16000),
"width_mm": (500, 2600),
"height_mm": (800, 4500),
"weight_kg": (70, 50000),
"capacity": (1, 80),
"model_year": (1970, 2030),
}