Level 9: 종합 프로젝트
🏆

Level 9

프로젝트 개요

요구사항 분석, 시스템 설계

40분
프로젝트 개요 강의 영상
강의 영상 보기 (새 탭에서 재생)YouTube

📓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 이내실시간 처리 기준
N2GPU 활용CUDA 지원딥러닝 추론 가속
N3확장성다중 카메라 동시 지원주차장 시나리오
N4배포 형태REST API 서비스다양한 클라이언트 연동
N5메모리 사용GPU 메모리 4GB 이내보급형 GPU 대응
N6가용성24/7 무중단 운영주차장/단속 시나리오

성능 목표를 숫자로 정의하는 이유

비유: "빨리 달려!"보다 "100m를 15초 안에 달려!"가 훨씬 명확하죠? 소프트웨어 프로젝트도 마찬가지입니다. 숫자로 정의된 목표가 있어야 "달성했는지 아닌지"를 객관적으로 판단할 수 있습니다.


시스템 아키텍처 상세 설계

전체 시스템을 모듈별로 나누어 설계합니다. 각 모듈은 독립적으로 개발하고 테스트한 뒤 통합합니다.

모듈 구성

모듈역할입력출력
이미지 입력카메라/파일에서 이미지 획득파일 경로 또는 카메라 스트림BGR 이미지 (numpy 배열)
번호판 검출YOLO로 번호판 위치 검출BGR 이미지바운딩 박스 좌표 리스트
영역 추출검출 좌표로 이미지 크롭원본 이미지 + 좌표번호판 영역 이미지
전처리크기 조정, 정규화, 이진화번호판 영역 이미지전처리된 이미지
문자 분리번호판에서 개별 문자 분리전처리된 이미지문자 이미지 리스트
문자 인식CNN으로 각 문자 분류문자 이미지예측 문자 + 신뢰도
후처리문자열 조합, 형식 검증문자 리스트최종 번호판 텍스트

데이터 흐름 시각화

[카메라/파일] ──→ [전체 이미지: 1920x1080] │ ▼ [YOLOv8 검출기] │ ▼ [바운딩 박스: (x1,y1,x2,y2)] │ ▼ [이미지 크롭: 200x60] │ ▼ [전처리: 그레이스케일, 이진화] │ ▼ [문자 분리: 7~8개 문자 이미지] │ ▼ [CNN 분류기: 각 문자 → 클래스] │ ▼ [후처리: "12가3456" 조합]

핵심 설계 코드 구조

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가 45672019년 이후
영업용지역 + 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마무리회고 문서, 확장 방향 제안전체

기술 스택 정리

핵심 라이브러리와 역할

라이브러리버전역할사용 단계
PyTorch2.0+딥러닝 프레임워크전체
Ultralytics8.0+YOLOv8 객체 검출검출
OpenCV4.0+이미지 처리전처리
Albumentations1.3+데이터 증강데이터 준비
FastAPI0.100+REST API 서버배포
Docker24.0+컨테이너화배포
bash
# 개발 환경 설치 (참고용) pip install torch torchvision # 딥러닝 pip install ultralytics # YOLOv8 pip install opencv-python-headless # 이미지 처리 pip install albumentations # 데이터 증강 pip install fastapi uvicorn # API 서버

개발 환경 권장 사양

항목최소 사양권장 사양
GPUGTX 1060 (6GB)RTX 3060 (12GB)
RAM8GB16GB
저장소SSD 50GBSSD 100GB
OSUbuntu 20.04Ubuntu 22.04
Python3.8+3.10+
CUDA11.712.1

성공적인 프로젝트를 위한 팁

  1. 모듈별 독립 테스트: 통합 전에 각 모듈이 개별적으로 잘 동작하는지 확인하세요
  2. 작은 데이터로 먼저: 10장으로 파이프라인을 완성한 뒤 데이터를 늘리세요
  3. 버전 관리: 모델 가중치, 설정 파일, 실험 결과를 체계적으로 관리하세요
  4. 시각화 습관: 중간 결과를 항상 눈으로 확인하세요 (검출 박스, 크롭된 이미지 등)

핵심 정리

개념설명비유
LPR 시스템번호판 자동 검출 + 문자 인식경비원의 눈(검출) + 뇌(인식)
2-Stage 구조검출과 인식을 분리재료 손질과 조리를 나누는 것
요구사항 분석숫자로 정의된 목표 설정"100m를 15초 안에" 같은 명확한 기준
모듈화 설계독립 개발 + 통합 테스트레고 블록 조립
  1. 2단계 구조: 검출(Detection) → 인식(Recognition)으로 분리하면 개발과 디버깅이 쉬워진다
  2. 목표 성능: 95% 정확도, 200ms 이내 추론이라는 구체적 숫자 목표
  3. 기술 스택: YOLOv8(검출) + CNN(인식) + PyTorch + FastAPI(배포)
  4. 모듈화 설계: 각 단계를 독립적으로 개발하고 테스트한 뒤 통합
  5. 한국 번호판 특수성: 숫자 + 한글 혼합, 다양한 형식 대응 필요

레슨 정보

레벨
Level 9: 종합 프로젝트
예상 소요 시간
40분
참고 영상
YouTube 링크

💡실습 환경 안내

이 레벨은 PyTorch/GPU가 필요하여 Google Colab 사용을 권장합니다.

Colab은 무료 GPU를 제공하여 PyTorch, CNN, Transformer 등을 실행할 수 있습니다.