인공지능과 기계학습

차량 번호판 인식(2/3)-번호판 특화 데이터셋으로 학습된 OCR 모델을 사용-CRAFT 텍스트 감지기와 딥러닝 기반 OCR 엔진인 EasyOCR을 결합

지콩빵 2024. 6. 30. 17:33

1편에서 Tesseract OCR과 OpenCV를 사용하여 차량 번호판을 인식하는 방법은 정확도가 현저히 떨어져 번호판 특화 데이터셋으로 학습된 OCR 모델 (CRAFT 텍스트 감지기와 딥러닝 기반 OCR 엔진인 EasyOCR을 결합) 을 사용해보았다.

!pip install easyocr
!pip install torch torchvision
!pip install opencv-python-headless

import cv2
import numpy as np
import easyocr
from google.colab.patches import cv2_imshow

def detect_text(image_path):
    # EasyOCR 리더 초기화
    reader = easyocr.Reader(['ko', 'en'])

    # 이미지 읽기
    image = cv2.imread(image_path)
    if image is None:
        print(f"이미지를 불러올 수 없습니다: {image_path}")
        return

    # EasyOCR로 텍스트 감지
    result = reader.readtext(image)

    detected_plates = []

    # 결과 처리 및 시각화
    for (bbox, text, prob) in result:
        if len(text) >= 7 and any(char.isdigit() for char in text):  # 번호판 형식에 가까운 텍스트만 선택
            # 바운딩 박스 좌표
            (tl, tr, br, bl) = bbox
            tl = tuple(map(int, tl))
            br = tuple(map(int, br))

            # 텍스트 영역에 사각형 그리기
            cv2.rectangle(image, tl, br, (0, 255, 0), 2)

            # 텍스트 출력
            cv2.putText(image, text, (tl[0], tl[1] - 10),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2)

            detected_plates.append((text, prob))

    # 결과 이미지 표시
    cv2_imshow(image)

    return detected_plates

# 이미지 처리
image_paths = ['00.jpg', '01.jpg', '02.jpg', '03.jpg', '04.jpg',
               '05.jpg', '06.jpg', '07.jpg', '08.jpg', '09.jpg',
               '10.jpg', '11.jpg', '12.jpg', '13.jpg', '14.jpg']

for path in image_paths:
    print(f"Processing {path}")
    plates = detect_text(path)
    if plates:
        for text, prob in plates:
            print(f"감지된 번호판: {text} (신뢰도: {prob:.2f})")
    else:
        print("감지된 번호판이 없습니다.")
    print()