포스트

Python 영상 OCR, EasyOCR과 Tesseract 중 무엇을 쓸까? 프레임 코드 비교

복잡한 배경과 여러 언어가 섞인 영상은 EasyOCR을 먼저 시험하고, 배경이 단순한 고정 text라면 Tesseract를 baseline으로 두는 것이 원문 사용 경험에 맞는 선택입니다.

영상 OCR은 image OCR을 반복하는 것처럼 보이지만, frame 수만큼 추론이 늘고 같은 text가 연속해서 출력됩니다. 원문의 두 Python 조각은 이 기본 loop를 보여 주지만 package 설치, frame sampling, 결과 중복 제거와 저장까지 포함한 완성 pipeline은 아닙니다.

두 도구의 차이는 먼저 Data 난이도로 봅니다

EasyOCR은 PyTorch 기반 OCR library로 원문은 80개가 넘는 언어와 GPU 지원을 소개합니다. 사용 후기에서는 다양한 언어와 복잡한 배경의 text를 비교적 잘 인식했지만 처리 속도는 느리게 느껴졌다고 기록했습니다.

Tesseract는 Google이 개발한 open-source OCR engine이며 Python에서는 pytesseract를 통해 호출합니다. 원문은 100개 이상의 언어 지원을 언급하고, 단순한 image에서는 실용적이지만 복잡한 배경, 다국어에서는 EasyOCR보다 인식률이 떨어지는 경향을 관찰했습니다.

이는 동일한 test set과 지표로 측정한 benchmark가 아니라 한 사용기의 판단입니다. 실제 선택에서는 같은 영상의 몇 frame을 두 도구에 넣고 text 정확도와 처리시간을 함께 비교해야 합니다.

EasyOCR은 Box, Text, Confidence를 함께 돌려줍니다

OpenCV로 video를 열고 read()가 성공하는 동안 frame을 EasyOCR reader에 넘깁니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import cv2
import easyocr

cap = cv2.VideoCapture("video.mp4")
reader = easyocr.Reader(["en"])

while cap.isOpened():
    ret, frame = cap.read()
    if ret == True:
        result = reader.readtext(frame)
        for (bbox, text, prob) in result:
            print(f"Text: {text}, Probability: {prob}")
    else:
        break

cap.release()

결과에는 위치 bbox, 인식 문자열과 confidence prob가 있어 화면의 어느 text인지 구분할 수 있습니다. Reader를 frame loop 밖에서 한 번 만드는 것도 중요합니다. 매 frame마다 초기화하면 model loading을 반복할 수 있습니다.

이 조각은 영어 ["en"]만 설정합니다. 다른 언어를 처리하려면 reader language 구성이 달라져야 하지만, 어떤 조합을 설치해야 하는지는 원문에 없습니다. GPU 선택, video open 실패와 OCR exception 처리도 생략돼 있습니다.

Tesseract는 Frame 전체 문자열을 바로 얻습니다

Tesseract 예시는 각 frame을 pytesseract.image_to_string에 넘기고 반환 문자열을 출력합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import cv2
import pytesseract

cap = cv2.VideoCapture("video.mp4")

while cap.isOpened():
    ret, frame = cap.read()
    if ret == True:
        result = pytesseract.image_to_string(frame)
        print(result)
    else:
        break

cap.release()

구조가 단순하지만 이 결과에는 예시 코드 기준으로 box와 confidence를 따로 사용하지 않습니다. 화면 전체 text만 필요한지, text 위치까지 필요한지에 따라 후속 처리 요구가 달라집니다. 또한 Python package만으로 끝나는지와 OCR engine 준비 과정은 원문 코드에 포함되지 않았으므로 설치 완료를 가정한 핵심 조각으로 봐야 합니다.

모든 Frame을 읽는 비용과 결과 중복을 확인합니다

두 예시는 video의 모든 frame에 OCR을 실행합니다. 같은 subtitle이나 sign이 여러 frame 동안 유지되면 같은 문자열이 반복 출력되고, 긴 영상에서는 처리량도 frame 수에 비례해 커집니다. 현재 코드는 이를 줄이거나 결과를 file에 저장하지 않습니다.

따라서 먼저 짧은 clip으로 VideoCapture가 열리는지, 마지막에 ret=False로 정상 종료하는지, 원하는 text가 출력되는지 확인합니다. 그 다음 실제 목적이 편집, 요약, frame rate, 해상도 변경, object recognition 중 무엇인지 구분해야 합니다. OCR은 영상 처리 전체가 아니라 text extraction 한 단계입니다.

판단을 저장할 때는 영상 유형, 언어, 배경 복잡도, 도구 이름, 처리 시간과 대표 실패 frame을 함께 남기는 편이 좋습니다. 원문의 후기만으로 어느 도구가 항상 더 빠르거나 정확하다고 일반화할 수는 없습니다.

같은 Clip으로 어떻게 비교하나요?

다양한 글자 크기, 배경, motion blur와 언어를 포함한 frame을 시간 구간별로 뽑아 정답 text와 box를 만듭니다. 두 도구에 같은 crop, resolution을 주고 character 또는 word error, detection recall과 frame당 시간을 측정합니다. 한두 성공 frame이 아니라 작은 text, 세로 글자와 반사처럼 실제 실패를 분류합니다.

Reader initialization과 model load는 측정에서 분리하고 warm inference와 첫 실행 시간을 모두 기록합니다. GPU 여부와 Tesseract 언어 data도 함께 남깁니다.

Frame 처리량을 어떻게 줄이나요?

원본 FPS가 높고 text가 오래 유지되면 매 N frame sampling, scene change 또는 이전 box tracking을 사용할 수 있습니다. Sampling 간격은 짧게 나타나는 text를 놓치지 않는 validation으로 정합니다. OCR 전에 관심 영역 crop, resize와 contrast 처리를 비교하되 두 도구에 공정하게 적용합니다.

결과를 어떤 구조로 저장하나요?

Frame number, timestamp, bbox, text, confidence와 tool을 한 record로 저장합니다. 연속 결과를 병합할 때 단순 문자열 일치만 쓰면 OCR 한 글자 흔들림이 중복을 만들므로 normalized edit distance와 box overlap을 함께 봅니다. 원본 frame 또는 crop reference를 남겨 오류를 재검토합니다.

실패와 자원 정리는 어떻게 처리하나요?

Video open 여부, FPS, frame count와 read exception을 검사하고 finally에서 capture와 output writer를 해제합니다. Empty frame과 정상 EOF를 구분하고 OCR 오류 한 건이 전체 긴 작업을 조용히 중단하지 않게 로그를 남깁니다. Result가 많아 memory에 전부 쌓이지 않도록 stream 저장합니다.

전처리는 어떤 순서로 비교하나요?

원본 frame 기준선을 만든 뒤 grayscale, resize, denoise, contrast와 threshold를 하나씩 추가합니다. 자막 영역이 고정돼 있다면 crop으로 배경을 줄이되 글자가 이동하거나 두 줄이 되는 frame을 놓치지 않습니다. 전처리마다 OCR accuracy와 시간을 같은 fixture에서 측정합니다.

OpenCV frame은 BGR이므로 library가 기대하는 RGB, gray 변환을 확인합니다. 해상도를 무조건 크게 하면 작은 글자에는 도움 될 수 있지만 inference와 memory 비용도 늘고 blur가 복원되는 것은 아닙니다.

언어와 Confidence를 어떻게 사용하나요?

실제 언어 조합만 reader에 넣고 혼합 문장, 숫자와 고유명사를 별도 평가합니다. Confidence threshold 아래 결과를 버리기 전에 낮은 점수의 정답과 높은 점수 오답 분포를 validation에서 봅니다. Tesseract도 필요한 경우 data output으로 box, confidence를 얻는 별도 API가 있는지 목적에 맞춰 조사하되 원문 단순 string code와 구분합니다.

시간축 후처리는 어떤 실패를 만들 수 있나요?

너무 공격적인 dedup은 같은 위치에서 짧게 바뀐 숫자나 subtitle 한 단어를 합쳐 버릴 수 있습니다. 병합 최대 gap, text similarity와 box 이동 조건을 정하고 ground-truth segment로 precision, recall을 평가합니다. Frame sampling과 dedup 오류를 각각 표시해야 OCR model 문제로 오해하지 않습니다.

처리 성능을 어떻게 보고하나요?

Decode, preprocessing, OCR와 write 시간을 분리하고 source duration 대비 처리 배수를 계산합니다. GPU OCR과 CPU video decode가 겹칠 수 있는 pipeline은 queue 크기와 frame order를 보장합니다. Batch OCR이 지원되면 latency와 throughput을 분리해 비교합니다.

개인정보와 출력 보관은 어떻게 다루나요?

영상에 차량번호, 이름 같은 민감 text가 있을 수 있으므로 원본 crop과 OCR 결과의 접근, 보관 기간을 정합니다. Debug log에 모든 frame text를 무기한 남기지 않고 필요한 최소 정보만 저장합니다.

자주 남는 질문

EasyOCR과 Tesseract 중 무엇을 먼저 고르나요?

복잡한 배경, 다국어와 box, confidence가 필요하면 EasyOCR, 단순 고정 text의 가벼운 baseline에는 Tesseract를 먼저 비교합니다.

영상의 모든 frame에 OCR을 해야 하나요?

아닙니다. Text 변화 속도와 목적에 맞춰 frame을 sampling하고 scene 변화나 tracking으로 중복 연산을 줄일 수 있습니다.

반복 subtitle은 어떻게 한 번만 저장하나요?

정규화된 text와 위치, 시간을 함께 비교해 연속 frame 결과를 병합하고 시작, 종료 timestamp를 기록합니다.

함께 읽으면 이해가 이어지는 글

자주 묻는 질문

EasyOCR과 Tesseract 중 무엇을 먼저 고르나요?

복잡한 배경, 다국어와 box, confidence가 필요하면 EasyOCR, 단순 고정 text의 가벼운 baseline에는 Tesseract를 먼저 비교합니다.

영상의 모든 frame에 OCR을 해야 하나요?

아닙니다. Text 변화 속도와 목적에 맞춰 frame을 sampling하고 scene 변화나 tracking으로 중복 연산을 줄일 수 있습니다.

반복 subtitle은 어떻게 한 번만 저장하나요?

정규화된 text와 위치, 시간을 함께 비교해 연속 frame 결과를 병합하고 시작, 종료 timestamp를 기록합니다.

THE END / OPSOAI

여기까지 읽었습니다

핵심 장면을 한 번 더 떠올려 보세요. 이해가 남았다면 이 책은 제 역할을 다했습니다.

다른 책 고르기
표지 1

키와 좌우 스와이프를 지원합니다. 읽던 페이지는 이 기기에 저장됩니다.

CONTENTS

이 책의 목차

    17개 장 14 분읽는 시간