광학 문자 인식(OCR) 모델은 복잡한 딥러닝 구조로 인해 '블랙박스'처럼 작동하는 경우가 많다. EasyOCR은 80개 이상의 언어를 지원하며 다양한 서체를 처리할 수 있는 강력한 오픈소스 도구이지만, 특정 텍스트를 어떻게 인식했는지 그 근거를 이해하기는 어렵다. 이 문제를 해결하기 위해 LIME(Local Interpretable Model-agnostic Explanations) 기법을 활용하면, 모델의 예측에 영향을 미친 이미지 내 주요 영역을 시각적으로 분석할 수 있다.
EasyOCR의 핵심 구성 요소
EasyOCR은 다음과 같은 단계를 거쳐 이미지에서 텍스트를 추출한다:
- 전처리: 입력 이미지를 정규화하고 노이즈를 제거하여 안정적인 인식 환경을 조성한다.
- 텍스트 검출: CRAFT(Convolutional Recursive Attention for Scene Text)와 같은 알고리즘을 사용해 이미지 내 텍스트 영역을 박스 형태로 탐지한다.
- 문자 인식: ResNet 기반 특징 추출기와 LSTM 기반 시퀀스 모델, CTC(Connectionist Temporal Classification) 손실 함수를 결합하여 각 영역의 문자를 해석한다.
- 후처리: 인식된 결과를 정제하고 최종 출력 텍스트를 생성한다.
LIME 원리: 지역적 근사 모델을 통한 해석
LIME은 전체 모델 구조를 알 필요 없이 개별 예측에 대해 해석을 제공하는 기법이다. 핵심 아이디어는 대상 이미지 주변에 가벼운 섭동(perturbation)을 가한 여러 샘플을 생성하고, 원본 모델의 예측 결과와 함께 이를 기반으로 선형 회귀 등 단순한 모델을 학습시키는 것이다. 이렇게 학습된 보조 모델은 어떤 픽셀 또는 영역이 최종 예측에 가장 큰 영향을 미쳤는지를 설명할 수 있다.
EasyOCR + LIME 통합 구현 절차
1. 의존성 설치
필요한 패키지를 설치한다:
pip install easyocr lime scikit-image matplotlib numpy
2. OCR 모델 및 이미지 로드
간결한 코드로 EasyOCR 리더를 초기화하고 테스트 이미지를 불러온다:
import easyocr
import numpy as np
from PIL import Image
# 중국어 간체 및 영어 모델 로드
ocr_reader = easyocr.Reader(['ch_sim', 'en'])
# 이미지 열기 (RGB 변환)
input_image = Image.open('test_image.jpg').convert('RGB')
image_array = np.array(input_image)
3. 예측 함수 정의
LIME은 배치 형식의 입력을 요구하므로, NumPy 배열 리스트를 받아 각각에 대해 OCR 수행 후 텍스트 결과를 반환하는 함수를 작성한다:
def ocr_predict(image_batch):
predictions = []
for img in image_batch:
pil_img = Image.fromarray(np.uint8(img))
result = ocr_reader.readtext(pil_img, detail=0) # 텍스트만 추출
combined_text = ' '.join(result) if result else ''
predictions.append(combined_text)
return predictions
4. LIME 기반 해석 생성
이미지 기반 해석기를 초기화하고, 입력 이미지에 대한 설명 객체를 생성한다:
from lime import lime_image
explainer = lime_image.LimeImageExplainer()
explanation_result = explainer.explain_instance(
image_array,
classifier_fn=ocr_predict,
top_labels=1,
hide_color=0,
num_samples=1200
)
5. 결과 시각화
상위 중요도를 가진 세그먼트를 하이라이트하여 출력한다:
import matplotlib.pyplot as plt
from skimage.segmentation import mark_boundaries
top_label = explanation_result.top_labels[0]
temp_image, mask_region = explanation_result.get_image_and_mask(
label=top_label,
positive_only=True,
num_features=6,
hide_rest=True
)
plt.figure(figsize=(8, 6))
plt.imshow(mark_boundaries(temp_image / 255., mask_region))
plt.axis('off')
plt.title("LIME-based OCR Decision Regions")
plt.show()
시각화 해석의 실용적 활용 사례
생성된 해석 맵을 통해 다음과 같은 인사이트를 얻을 수 있다:
- 오인식 진단: 특정 글자가 잘못 인식된 경우, 해당 위치의 픽셀이 모델에 얼마나 중요한지를 확인함으로써 전처리 개선 방향을 도출할 수 있다.
- 검출 성능 평가: 실제 텍스트 영역 외부가 높은 중요도를 가지면, 텍스트 검출 단계에 문제가 있을 수 있음을 시사한다.
- 데이터 품질 개선: 반복적으로 동일한 패턴에서 오류가 발생하면, 해당 유형의 데이터로 재학습하거나 증강 전략을 적용할 수 있다.
결론
LIME을 활용하면 EasyOCR과 같은 복합 OCR 파이프라인의 판단 근거를 직관적으로 분석할 수 있다. 특히 신뢰성이 중요한 응용 분야에서 모델의 행동을 검증하고, 성능 저하 요인을 식별하는 데 유용하다. 이 기법은 모델 구조에 독립적이므로 다른 OCR 엔진에도 쉽게 적용 가능하며, AI 시스템의 투명성을 높이는 데 기여할 수 있다.