본문 바로가기

클라우드(Cloud)

[스나이퍼팩토리] 카카오클라우드 AIaaS 마스터 클래스 12주차 - OCR 기초 (Optical Character Recognition Basic)

 

 이번에는 딥러닝(Deep Learning)을 기반으로 한 이미지나 문서에 포함된 텍스트를 인식하고 디지털 텍스트로 변환하는 기술인 OCR(Optical Character Recognition)에 대해 정리하며 학습해볼 것이다. 

 

 아무래도 시각적으로 결과를 확인할 수 있어서 직관적으로 이해하고 변화하는 것을 볼 수 있다는 점이 흥미 있게 다가왔다. 정리하면서 예제 코드도 작성해 보며 OCR에 대한 이해도를 향상해 볼 것이다. 

 

https://www.sktenterprise.com/bizInsight/blogDetail/dev/7824

 

 

✅ OCR (Optical Character Recognition)

1️⃣ OCR 정의

 이미지나 문서에서 문자(Character)를 자동으로 인식해 디지털 텍스트로 변환하는 기술Optical Character Recognition, 즉 광학 문자 인식이라고 말할 수 있다. 

 

→ 기본적으로 문자 단위(Character Level)로 인식한 후, 단어나 문장으로 조합된다. 

 

예시:

  • 스캔한 문서의 'H', 'e', 'l', 'l', 'o'를 문자 단위로 인식 → 'Hello'로 조합
 
 

2️⃣ OCR의 필요성

OCR 기술은 단순히 텍스트를 읽는 것 이상의 다양한 산업과 일상에서 활용된다. 

활용 분야 설명
문서 디지털화 오래된 책, 신문 등을 스캔 후 OCR로 검색 가능한 텍스트로 변환
업무 자동화 수기로 입력하던 정보를 자동으로 인식 및 처리
정보 접근성 향상 이미지에 담긴 텍스트를 추출해 검색, 분석, 번역 등 가능
장애인 지원 시각장애인용 텍스트 → 음성 변환(TTS) 기술의 기반
다국어 문서 처리 영어, 한국어, 일본어, 한자 등 언어별 OCR 모델로 처리 가능
 

3️⃣ OCR의 품질에 영향을 주는 요소

1. 이미지 품질 요소

요소 설명 추천 조건
해상도 (Resolution) 픽셀이 뚜렷할수록 인식률 ↑ 최소 300 DPI
대비 (Contrast) 배경과 텍스트 색상이 확실히 달라야 함 밝은 배경 + 어두운 텍스트
조명 (Lighting) 그림자, 반사 없이 고르게 비춰져야 함 자연광, 라이트 박스
기울기 (Skew) 글자가 수평이어야 분할이 잘 됨 ±3° 이상일 경우 보정 필요
노이즈 (Noise) 얼룩, 점, 선 등이 있으면 글자 오인식 전처리로 제거 필요 (ex. 가우시안 블러)
 

2. 텍스트 자체 특성 요소

요소 설명
폰트 크기 너무 작으면 픽셀이 깨짐 (10pt 이상 권장)
폰트 종류 정형화된 폰트일수록 정확도 ↑ (명조체, 고딕체 등)
글자 간격 자간/행간이 좁으면 분할 오류 발생 가능
언어 Tesseract 등은 학습된 언어에 따라 성능이 다름
문자 유형 인쇄체는 잘 인식, 필기체는 인식률 낮음
 

4️⃣ 전통적 OCR vs 최신 OCR

전통적 OCR과 최근 많이 사용하고 있는 OCR에 대해서 비교해 정리해보았다.

구분 전통적 OCR(Tesseract 등) 최신 OCR (CRNN, TrOCR 등)
인식 방식 규칙 기반, 패턴 비교 딥러닝 기반 End-to-End
문자 분할 필요 (문자 단위 분할) 불필요 (시퀀스 처리)
가변 길이 처리 한계 있음 자유로움
문맥 이해 제한적 강력한 언어모델 적용 가능
대표 엔진 Tesseract, ABBYY EasyOCR, PaddleOCR, TrOCR
 

5️⃣ OCR 파이프라인 요약

1. 이미지 입력
2. 이미지 전처리 (Grayscale, Thresholding, Deskew, Noise 제거 등)
3. 텍스트 영역 검출 (Bounding Box 생성)
4. 문자 인식 (패턴 매칭 또는 딥러닝)
5. 후처리 (맞춤법 보정, 언어모델)
6. 결과 출력 (디지털 텍스트, JSON 등)

 

⚙️ 요약 정리

내용 설명
OCR 정의 이미지 속 문자를 디지털 텍스트로 변환하는 기술
OCR 필요성 자동화, 디지털화, 접근성 향상 등
품질 영향 요소 해상도, 대비, 조명, 기울기, 폰트, 자간 등
발전 과정 템플릿 → 패턴 인식 → 머신러닝 → 딥러닝
전통 vs 최신 OCR 규칙 기반 vs 딥러닝 기반
전처리 중요성 OCR 정확도는 전처리 품질에 달림

 


✅ OCR 이미지 전처리

1️⃣ 전처리의 중요성

OCR 성능은 전처리를 얼마나 잘했는가에 따라 달라진다. 만약 이미지에 노이즈, 기울기, 조명 문제, 대비 부족 등이 있으면 OCR 정확도가 급격히 떨어지는 결과를 볼 수 있다. 

문제 상황 인식 실패 원인
노이즈 많은 이미지 글자가 점, 선에 가려짐
기울어진 텍스트 문자가 비뚤어져 분할 오류 발생
조명 불균형 밝기 차가 적어 텍스트 경계가 흐릿
배경과 글자 색상이 유사 인식 자체 불가
 

2️⃣ 주요 전처리 기법 정리

기법 설명 예시 함수
Grayscale 변환 컬러 이미지를 흑백으로 변환 (처리 간단, 명암만 사용) convert_to_grayscale()
이진화 (Thresholding) 명암 기반으로 글자/배경을 명확히 구분 apply_threshold()
노이즈 제거 점, 얼룩, 선 등을 제거하여 글자 윤곽 보존 remove_noise()
기울기 보정 (Skew Correction) 비뚤어진 문서를 회전 보정 correct_skew()
리사이즈 (Resize) 너무 작은 텍스트를 확대해 인식률 향상 resize_image()
 

🔹 Grayscale 변환

✔️ 개념

  • 컬러 정보(RGB)는 OCR에 불필요함 → 연산량 증가, 잡음 유입 가능성 있음
  • 명암 정보(0~255)만 추출해서 흑백 이미지로 변환

✔️ 코드 예시

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

 

🔹 이진화 (Binarization)

✔️ 개념

  • 픽셀값을 기준으로 텍스트를 검정(0), 배경을 흰색(255)으로 나누는 과정
  • Threshold 값은 고정 or 자동 두 가지 방식 존재

✔️ 종류별 비교

방법 설명 함수 옵션
Simple 기준값 127 등을 고정하여 분리 cv2.threshold(img, 127, 255, ...)
Adaptive 주변 밝기를 고려한 가변 기준값 적용 cv2.adaptiveThreshold(...)
Otsu 전체 밝기 분포를 기준으로 자동 임계값 계산 cv2.threshold(... + cv2.THRESH_OTSU)
 

🔹 노이즈 제거 (Noise Removal)

✔️ 왜 필요한가?

  • 작은 점이나 얇은 선이 글자처럼 오인식될 수 있음
  • OCR이 "I"와 "|" 또는 "i"와 잡음을 혼동함

✔️ 사용 기법

기법 설명
가우시안 블러 주변 픽셀을 가중 평균해서 부드럽게 처리
모폴로지 연산 팽창/침식, 열기/닫기로 글자 보존하며 잡음 제거
 

✔️ 예시 코드

opening = cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel=(3,3))
blurred = cv2.GaussianBlur(opening, (3,3), 0)

 

🔹 기울기 보정 (Skew Correction)

✔️ 왜 필요한가?

 

문서가 약간 기울어지면 라인 추출, 문자 분할이 실패함 → OCR이 줄 단위 텍스트를 문자 단위로 인식해 버림

 

✔️ 대표 방법: Hough Transform

  1. Canny Edge Detection으로 윤곽 검출
  2. HoughLines()로 직선 검출
  3. 검출된 각도의 중앙값을 기준으로 회전 보정

✔️ 예시 코드

edges = cv2.Canny(image, 50, 150)
lines = cv2.HoughLines(edges, ...)
angle = np.median([np.degrees(theta) - 90 for rho, theta in lines[:, 0]])
M = cv2.getRotationMatrix2D(center, angle, 1.0)
rotated = cv2.warpAffine(image, M, ...)

 

🔹 리사이즈 (Resize)

✔️ 왜 필요한가?

  • 작은 글자는 OCR이 인식하지 못하거나 "rn"을 "m"으로 인식할 수 있음
  • 일정한 높이(예: 800px)로 확대하면 인식률 향상
resized = cv2.resize(image, (new_width, target_height), interpolation=cv2.INTER_CUBIC)

 

🔹 전처리 파이프라인 흐름 

image → grayscale → remove_noise → threshold → skew_correction → resize → OCR

 

⚙️ 전처리 정리 요약

처리 단계 목적 함수
Grayscale 컬러 제거, 속도 향상 convert_to_grayscale()
Threshold 글자/배경 구분 apply_threshold()
Noise 제거 점, 선, 얼룩 제거 remove_noise()
Skew 보정 기울기 수정 correct_skew()
Resize OCR이 읽기 좋게 확대 resize_image()

 


✅ Tesseract 엔진

1️⃣ Tesseract OCR이란?

 Google에서 개발한 오픈소스 OCR 엔진으로 높은 정밀도를 가지고 있고, 다양한 언어를 지원하는 것이 특징이다. 또 전통적인 문서 OCR, 스캔한 문서, 영수증, 라벨 등에 활용이 가능하며 pytesseract 라이브러리를 통해 Python에서 간단하게 사용이 가능하다. 

 

2️⃣ Tesseract 작동 원리

이미지 입력 → 문서 레이아웃 분석 → 문자 분할 → 문자 인식 → 언어모델 보정 → 출력

단계 설명
1. 페이지 분석 블록, 단락, 줄, 단어 단위로 문서의 구조 분석
2. 문자 분할 단어를 문자 단위로 쪼갬 (전통 OCR 방식)
3. 패턴 매칭 학습된 모델을 기반으로 문자 인식
4. 언어 모델 적용 문맥상 잘못된 단어를 교정 (예: ‘Thls’ → ‘This’)

→ 딥러닝 기반인 OCR (CRNN)은 문자 분할이 필요하지 않지만, 전통적인 방식으로 분류되는 Tesseract는 분할이 필요하다. 

 

3️⃣ 설치 방법

 Tesseract는 아래와 같은 방법으로 설치해 사용할 수 있다.

📦 Python 라이브러리 설치

pip install pytesseract

⚙️ Tesseract 엔진 설치 (시스템)

운영체제 설치 방법
macOS brew install tesseract
Windows UB Mannheim 빌드 설치 → 환경 변수 설정
Ubuntu sudo apt install tesseract-ocr

 설치한 후에 터미널에 tesseract --version 명령어를 입력해 설치가 되었는지 여부를 확인할 수 있다. 

 

4️⃣ pytesseract 기본 사용법

import cv2
import pytesseract

image = cv2.imread('sample.jpg')
text = pytesseract.image_to_string(image, lang='eng')
print(text)

 

주요 함수

함수 설명
image_to_string() 텍스트 추출
image_to_boxes() 문자별 박스 정보 추출
image_to_data() 위치, 신뢰도 등 자세한 정보 포함
image_to_osd() 페이지 방향, 회전 정보 등
 

5️⃣ 언어 설정

Tesseract는 여러 언어를 지원한다. (kor, eng, jpn, chi_sim 등) 그리고 여러 언어를 동시에 사용할 수도 있다. 

text = pytesseract.image_to_string(image, lang='kor+eng')

 

언어를 추가하려면 tessdata 경로에 .traineddata 파일 설치가 필요하다. 

 

6️⃣ 장점 / 한계점

장점 한계점
무료 오픈소스 딥러닝 기반 OCR보다 유연성 낮음
다양한 언어 지원 필기체, 왜곡된 이미지 인식 어려움
높은 정확도 (인쇄체 기준) 분할 기반이라 복잡한 레이아웃에 취약
바운딩 박스 및 레이아웃 정보 제공 딥러닝 OCR만큼 유연하진 않음
 

⚙️ 요약 정리

항목 내용
정의 Google 오픈소스 OCR 엔진, 문자 단위 인식 기반
작동 방식 페이지 분석 → 문자 분할 → 인식 → 문맥 보정
사용법 pytesseract.image_to_string() 등으로 OCR 처리
설치 시스템 + Python 라이브러리 설치 필요
강점 다국어, 인쇄체 정확도 높음
한계 필기체, 잡음, 복잡한 배치에 약함

 


✅ CRNN 모델 (Convolutional Recurrent Neural Network)

1️⃣ CRNN이란?

구성요소 역할
C: Convolutional 글자 모양을 추출 (CNN)
R: Recurrent 글자의 순서를 학습 (RNN, LSTM)
NN: Neural Network 전체 네트워크 연결 (딥러닝 모델)

 CRNN을 간단히 설명하면 이미지에서 글자의 특징을 추출(CNN)하고, 글자 순서를 이해(RNN)하고, 최종적으로는 텍스트를 출력(CTC)하는 End-to-End OCR 딥러닝 모델이라고 할 수 있다. 

 

2️⃣ 전통 OCR vs CRNN

항목 전통 OCR (Tessearct 등) CRNN (딥러닝 기반) 
처리 방식 문자 분할 후 인식 분할 없이 전체 이미지 처리
가변 길이 지원 제한적 자유로움
문맥 이해 제한적 Bidirectional LSTM 사용으로 앞뒤 문맥 모두 반영
특징 패턴 매칭 기반 End-to-End 딥러닝 모델
학습 불가능 (사전 훈련 모델 사용) 가능 (커스터마이징 학습 가능)
성능 인쇄체 위주로 좋음 손글씨, 왜곡, 다양한 상황에서도 강력함
 

3️⃣ CRNN 구조

[Input 이미지]
   ↓
[ CNN ]
→ 이미지 특징 추출 (패턴, 곡선, 획 등)
   ↓
[ RNN (Bi-LSTM) ]
→ 시퀀스 이해, 순서 고려
   ↓
[ CTC (Connectionist Temporal Classification) ]
→ 시퀀스를 텍스트로 변환 (중복 제거, 공백 처리)

 

1. CNN: 이미지 특징 추출

  • 다양한 크기의 커널로 이미지의 선, 곡선, 점, 경계 등 시각적 패턴 추출
  • 글자의 모양을 숫자 형태의 특징 벡터(feature map)로 바꿈

2. RNN: 시퀀스 처리

  • CNN이 추출한 특징 벡터를 순서대로 입력
  • LSTM 또는 Bidirectional LSTM을 사용해 앞과 뒤의 문맥 모두 고려
  • 예: H-E-L-L-O → 'HELLO' 인식

3. CTC: 텍스트 변환

  • 문자 간의 정렬 정보가 없어도 인식 가능
  • 중복된 글자를 제거하고 실제 단어로 변환
  • 예: [H, H, E, E, _, L, L, L, _, O] → "HELLO"

CTC는 OCR에서 위치 정보 없이 문자를 인식할 수 있게 해주는 핵심 기술이다. 

 

4️⃣ CRNN 학습을 위한 환경 구축

 CRNN을 사용하기 위해 학습시키려면 사용이 가능한 환경이 구축되어있어야 한다. 환경은 아래와 같이 구축할 수 있다. 

PyTorch 사용 이유

특징 설명
동적 그래프 실행 중에 유연하게 구조 변경 가능
직관적 코드 Python 스타일로 짜기 쉬움
CTC 손실 함수 내장 nn.CTCLoss()로 쉽게 학습 구현 가능
GPU 지원 CUDA 사용 시 학습 속도 수십 배 향상

설치 예시: 

pip install torch torchvision torchaudio

 

CUDA 지원 GPU 버전:

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

 

 여기서 갑자기 CUDA라는 것이 나왔는데 CUDA는 NVIDIA가 만든 GPU 프로그래밍 플랫폼으로 우리가 GPU를 CPU처럼 사용할 수 있도록 만들어주는 도구라고 생각하면 된다. 딥러닝 학습이 오랜 시간이 걸리기 때문에 GPU를 사용함으로써 연산 시간을 단축할 수 있다는 장점을 가지고 있다. 

GPU와 CUDA

  • CPU는 4~16개의 강한 코어 → 순차 연산
  • GPU는 수천 개의 약한 코어 → 병렬 연산

 

5️⃣ CRNN의 장점

항목 내용
위치 불변 특징 글자 위치가 조금씩 달라도 인식 가능
순서 정보 이해 Bi-LSTM으로 문맥 정확히 해석
길이 제한 없음 텍스트 길이에 제약 없음
학습 가능 커스텀 OCR 모델 훈련 가능
강력한 일반화 잡음, 손글씨, 복잡한 배경에서도 강인함
 

⚙️ 요약 정리

구성 요소 역할
CNN 시각적 특징 추출
RNN (Bi-LSTM) 문맥 및 순서 학습
CTC 시퀀스를 글자로 변환 (중복 제거, 공백 처리)
프레임워크 PyTorch, GPU 사용 시 학습 가속화
차별점 문자 분할 불필요, 복잡한 환경에서도 강력한 성능

 


 이번에는 OCR의 개념과 기초적인 내용에 대해 정리하며 학습해 보았다. 아직 기본적인 내용만 정리하며 학습한 상태기에 다음 OCR의 조금 심화적인 내용을 학습하면서 예제 코드도 함께 이해해보려 한다. 예제 코드를 이해하면서 들었던 궁금증도 함께 정리해 볼 예정이다. 

 


본 후기는 [카카오엔터프라이즈x스나이퍼팩토리] 카카오클라우드로 배우는 AIaaS 마스터 클래스 (B-log) 리뷰로 작성 되었습니다.