
📓Google Colab에서 실습하기
이 레슨은 PyTorch/GPU가 필요합니다. 노트북을 다운로드 후 Google Colab에서 열어주세요.
학습 내용
프로젝트 개요 - 번호판 인식 시스템
학습 목표
- •번호판 인식 시스템(LPR)의 전체 구조를 이해한다
- •기능 및 비기능 요구사항을 체계적으로 분석한다
- •2단계 아키텍처(검출 + 인식)의 설계 근거를 파악한다
- •프로젝트 전체 로드맵과 기술 스택을 설계한다
일상 속 번호판 인식
비유: 주차장 입구에 서 있는 경비원을 떠올려 보세요. 차가 들어오면 경비원은 먼저 "저기 번호판이 있네!"라고 위치를 찾고(검출), 그다음 "12가 3456이군"이라고 글자를 읽습니다(인식). AI 번호판 인식 시스템도 정확히 이 두 단계를 거칩니다.
번호판 인식 시스템(License Plate Recognition, LPR)은 카메라로 촬영한 이미지에서 차량 번호판을 자동으로 검출하고 문자를 인식하는 시스템입니다. 이미 우리 일상 곳곳에서 작동하고 있습니다.
실제 활용 분야
| 분야 | 활용 예시 | 핵심 요구사항 |
|---|---|---|
| 주차장 관리 | 입출차 자동 기록, 정기권 확인 | 높은 정확도, 빠른 응답 |
| 교통 단속 | 과속, 신호위반 차량 식별 | 고속 이동 물체 처리 |
| 물류 추적 | 화물차 운송 경로 관리 | 24시간 안정 운영 |
| 스마트 시티 | 교통 흐름 분석, 혼잡도 예측 | 대량 데이터 처리 |
| 요금소 시스템 | 하이패스 미장착 차량 인식 | 극한 환경 대응 |
이런 시스템을 직접 설계하고 구현하는 것이 Level 9의 목표입니다.
왜 2단계 구조인가?
번호판 인식을 한 번에 처리할 수도 있지 않을까요? 이론적으로는 가능하지만, 실무에서는 2단계로 나누는 것이 압도적으로 유리합니다.
End-to-End vs 2-Stage 비교
| 항목 | End-to-End (1단계) | 2-Stage (2단계) |
|---|---|---|
| 구조 | 이미지 → 바로 텍스트 | 이미지 → 검출 → 인식 |
| 학습 난이도 | 매우 높음 | 각 단계별로 쉬움 |
| 디버깅 | 어디서 틀렸는지 파악 어려움 | 검출 문제인지 인식 문제인지 분리 가능 |
| 데이터 요구량 | 매우 많음 | 상대적으로 적음 |
| 모듈 교체 | 전체 재학습 필요 | 해당 모듈만 교체 가능 |
| 성능 최적화 | 한꺼번에 최적화 | 단계별 독립 최적화 |
비유: 요리를 생각해 보세요. 재료 손질과 조리를 한 사람이 동시에 하면 복잡하지만, "재료 준비 담당"과 "조리 담당"을 나누면 각자 전문성을 발휘할 수 있습니다. 문제가 생겨도 어느 단계 문제인지 바로 알 수 있죠.
2단계 파이프라인 흐름
[입력 이미지] → [1단계: 번호판 검출] → [2단계: 문자 인식] → [결과 출력]
(Detection) (Recognition)
YOLO 모델 CNN 모델
"어디에 있나?" "뭐라고 쓰여 있나?"
1단계: 번호판 검출 (Detection)
- •전체 이미지에서 번호판이 있는 위치를 찾습니다
- •결과: 바운딩 박스 좌표 (x, y, width, height)
- •사용 모델: YOLOv8 (실시간 Object Detection에 최적)
- •핵심 도전: 다양한 크기, 각도, 조명 조건 대응
2단계: 문자 인식 (Recognition)
- •검출된 번호판 영역을 잘라내어 문자를 읽습니다
- •결과: 인식된 텍스트 문자열 ("12가3456")
- •사용 모델: CNN 기반 문자 분류기
- •핵심 도전: 한글 + 숫자 혼합 인식, 훼손된 문자 처리
요구사항 분석
실제 프로젝트에서 가장 먼저 하는 일은 "무엇을 만들 것인가?"를 명확히 정의하는 것입니다.
기능 요구사항 (Functional Requirements)
| ID | 항목 | 설명 | 우선순위 |
|---|---|---|---|
| F1 | 한국 번호판 인식 | "12가 3456", "123가 4567" 형식 지원 | 필수 |
| F2 | 다양한 환경 대응 | 주간/야간, 역광, 비/눈 환경 | 필수 |
| F3 | 다중 번호판 | 한 이미지에 여러 차량이 있을 때 모두 인식 | 필수 |
| F4 | 실시간 처리 | 영상 스트림(30fps) 처리 가능 | 권장 |
| F5 | 정확도 보장 | 95% 이상 문자 인식률 | 필수 |
| F6 | 신뢰도 출력 | 인식 결과의 확신도를 함께 반환 | 권장 |
비기능 요구사항 (Non-Functional Requirements)
| ID | 항목 | 목표값 | 근거 |
|---|---|---|---|
| N1 | 추론 시간 | 이미지당 200ms 이내 | 실시간 처리 기준 |
| N2 | GPU 활용 | CUDA 지원 | 딥러닝 추론 가속 |
| N3 | 확장성 | 다중 카메라 동시 지원 | 주차장 시나리오 |
| N4 | 배포 형태 | REST API 서비스 | 다양한 클라이언트 연동 |
| N5 | 메모리 사용 | GPU 메모리 4GB 이내 | 보급형 GPU 대응 |
| N6 | 가용성 | 24/7 무중단 운영 | 주차장/단속 시나리오 |
성능 목표를 숫자로 정의하는 이유
비유: "빨리 달려!"보다 "100m를 15초 안에 달려!"가 훨씬 명확하죠? 소프트웨어 프로젝트도 마찬가지입니다. 숫자로 정의된 목표가 있어야 "달성했는지 아닌지"를 객관적으로 판단할 수 있습니다.
시스템 아키텍처 상세 설계
전체 시스템을 모듈별로 나누어 설계합니다. 각 모듈은 독립적으로 개발하고 테스트한 뒤 통합합니다.
모듈 구성
| 모듈 | 역할 | 입력 | 출력 |
|---|---|---|---|
| 이미지 입력 | 카메라/파일에서 이미지 획득 | 파일 경로 또는 카메라 스트림 | BGR 이미지 (numpy 배열) |
| 번호판 검출 | YOLO로 번호판 위치 검출 | BGR 이미지 | 바운딩 박스 좌표 리스트 |
| 영역 추출 | 검출 좌표로 이미지 크롭 | 원본 이미지 + 좌표 | 번호판 영역 이미지 |
| 전처리 | 크기 조정, 정규화, 이진화 | 번호판 영역 이미지 | 전처리된 이미지 |
| 문자 분리 | 번호판에서 개별 문자 분리 | 전처리된 이미지 | 문자 이미지 리스트 |
| 문자 인식 | CNN으로 각 문자 분류 | 문자 이미지 | 예측 문자 + 신뢰도 |
| 후처리 | 문자열 조합, 형식 검증 | 문자 리스트 | 최종 번호판 텍스트 |
데이터 흐름 시각화
핵심 설계 코드 구조
python# 전체 파이프라인의 뼈대 (PyTorch + Ultralytics) class LPRSystem: def __init__(self): self.detector = YOLO("best_detector.pt") self.recognizer = CharClassifier(num_classes=50) self.recognizer.load_state_dict( torch.load("char_classifier.pth") ) def process(self, image): # 1단계: 검출 detections = self.detector(image) results = [] for box in detections[0].boxes: # 2단계: 크롭 + 인식 x1, y1, x2, y2 = box.xyxy[0].int() plate_img = image[y1:y2, x1:x2] text = self.recognize_plate(plate_img) results.append({ "bbox": (x1, y1, x2, y2), "text": text, "confidence": box.conf[0].item() }) return results
한국 번호판의 특수성
우리 시스템은 한국 번호판을 대상으로 합니다. 한국 번호판은 다른 나라와 다른 고유한 특징이 있습니다.
번호판 형식 종류
| 유형 | 형식 | 예시 | 특징 |
|---|---|---|---|
| 구형 일반 | 2자리 + 한글 + 4자리 | 12가 3456 | 가장 흔한 형식 |
| 신형 일반 | 3자리 + 한글 + 4자리 | 123가 4567 | 2019년 이후 |
| 영업용 | 지역 + 2자리 + 한글 + 4자리 | 서울 12바 3456 | 택시, 버스 등 |
| 전기차 | 번호 앞 파란색 표시 | 12가 3456 | 색상 구분 필요 |
인식 대상 문자 클래스
python# 한국 번호판에서 인식해야 할 문자들 digits = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"] print(f"숫자: {len(digits)}개") # 용도별 한글 문자 (주요) hangul_chars = [ "가", "나", "다", "라", "마", "바", "사", "아", "자", "거", "너", "더", "러", "머", "버", "서", "어", "저", "고", "노", "도", "로", "모", "보", "소", "오", "조", "구", "누", "두", "루", "무", "부", "수", "우", "주", "허", "하", "호", "배" ] print(f"한글: {len(hangul_chars)}개") print(f"총 클래스 수: {len(digits) + len(hangul_chars)}개")
프로젝트 로드맵
전체 프로젝트는 8개 레슨에 걸쳐 단계적으로 진행됩니다. 각 레슨은 이전 레슨의 결과물 위에 쌓이는 구조입니다.
| 레슨 | 주제 | 핵심 산출물 | 의존성 |
|---|---|---|---|
| 9-1 | 프로젝트 개요 | 요구사항 문서, 아키텍처 설계 | 없음 |
| 9-2 | 데이터 파이프라인 | 전처리된 학습 데이터셋 | 9-1 |
| 9-3 | 번호판 검출 모델 | 학습된 YOLOv8 모델 (best.pt) | 9-2 |
| 9-4 | 문자 인식 모델 | 학습된 CNN 분류기 (classifier.pth) | 9-2 |
| 9-5 | 모델 통합 | End-to-end 파이프라인 | 9-3, 9-4 |
| 9-6 | 성능 평가 | 평가 리포트 (정확도, 속도) | 9-5 |
| 9-7 | 배포 | FastAPI 서버 + Docker 이미지 | 9-5 |
| 9-8 | 마무리 | 회고 문서, 확장 방향 제안 | 전체 |
기술 스택 정리
핵심 라이브러리와 역할
| 라이브러리 | 버전 | 역할 | 사용 단계 |
|---|---|---|---|
| PyTorch | 2.0+ | 딥러닝 프레임워크 | 전체 |
| Ultralytics | 8.0+ | YOLOv8 객체 검출 | 검출 |
| OpenCV | 4.0+ | 이미지 처리 | 전처리 |
| Albumentations | 1.3+ | 데이터 증강 | 데이터 준비 |
| FastAPI | 0.100+ | REST API 서버 | 배포 |
| Docker | 24.0+ | 컨테이너화 | 배포 |
bash# 개발 환경 설치 (참고용) pip install torch torchvision # 딥러닝 pip install ultralytics # YOLOv8 pip install opencv-python-headless # 이미지 처리 pip install albumentations # 데이터 증강 pip install fastapi uvicorn # API 서버
개발 환경 권장 사양
| 항목 | 최소 사양 | 권장 사양 |
|---|---|---|
| GPU | GTX 1060 (6GB) | RTX 3060 (12GB) |
| RAM | 8GB | 16GB |
| 저장소 | SSD 50GB | SSD 100GB |
| OS | Ubuntu 20.04 | Ubuntu 22.04 |
| Python | 3.8+ | 3.10+ |
| CUDA | 11.7 | 12.1 |
성공적인 프로젝트를 위한 팁
- •모듈별 독립 테스트: 통합 전에 각 모듈이 개별적으로 잘 동작하는지 확인하세요
- •작은 데이터로 먼저: 10장으로 파이프라인을 완성한 뒤 데이터를 늘리세요
- •버전 관리: 모델 가중치, 설정 파일, 실험 결과를 체계적으로 관리하세요
- •시각화 습관: 중간 결과를 항상 눈으로 확인하세요 (검출 박스, 크롭된 이미지 등)
핵심 정리
| 개념 | 설명 | 비유 |
|---|---|---|
| LPR 시스템 | 번호판 자동 검출 + 문자 인식 | 경비원의 눈(검출) + 뇌(인식) |
| 2-Stage 구조 | 검출과 인식을 분리 | 재료 손질과 조리를 나누는 것 |
| 요구사항 분석 | 숫자로 정의된 목표 설정 | "100m를 15초 안에" 같은 명확한 기준 |
| 모듈화 설계 | 독립 개발 + 통합 테스트 | 레고 블록 조립 |
- •2단계 구조: 검출(Detection) → 인식(Recognition)으로 분리하면 개발과 디버깅이 쉬워진다
- •목표 성능: 95% 정확도, 200ms 이내 추론이라는 구체적 숫자 목표
- •기술 스택: YOLOv8(검출) + CNN(인식) + PyTorch + FastAPI(배포)
- •모듈화 설계: 각 단계를 독립적으로 개발하고 테스트한 뒤 통합
- •한국 번호판 특수성: 숫자 + 한글 혼합, 다양한 형식 대응 필요
레슨 정보
- 레벨
- Level 9: 종합 프로젝트
- 예상 소요 시간
- 40분
- 참고 영상
- YouTube 링크
💡실습 환경 안내
이 레벨은 PyTorch/GPU가 필요하여 Google Colab 사용을 권장합니다.
Colab은 무료 GPU를 제공하여 PyTorch, CNN, Transformer 등을 실행할 수 있습니다.