09 / 11
PaddleOCR 도입
PaddleOCR 도입 배경, 학습 구조, 환경 설정, 교체 전략, 배치 추론
PaddleOCR 도입 배경
기존 Tesseract OCR의 한국어 인식 한계를 보완하기 위해 PaddleOCR 도입을 검토. LayoutXLM이 레이블 매핑을, PaddleOCR이 OCR을 담당하는 구조.
LayoutXLM
레이블 매핑 (문서 이해)
PaddleOCR
OCR (글자 인식)
PaddleOCR 학습 구조
PaddleOCR은 Detection과 Recognition이 분리된 구조. 테스트 결과 Detection은 이미 잘 되지만 Recognition이 문제.
Detection
글자 영역 찾기
✅ 이미 잘 됨
Recognition
글자 읽기
⚠️ 개선 필요
학습 목표: Recognition 오류 줄이기
공급받는져→공급받는자2024.0l.15→2024.01.15Recognition 학습 전략
bbox 그대로 활용
→ crop 이미지 생성
→ 텍스트 학습
Label Studio에서 텍스트 교정
기존 Label Studio 인터페이스에는 OCR 텍스트를 수정할 수 있는 필드가 없었음. "정답 텍스트 입력용 필드"를 따로 만들어야 함.
Labeling Interface 핵심 변경
transcription→ OCR 원본 텍스트 (읽기 전용)corrected_text→ 정답 텍스트 입력 (편집 가능)✅ Tesseract 기반 기존 아키텍처에 적용 테스트 완료 — 텍스트 수정 필드가 정상 동작
동작 방식:
기존 OCR 결과 텍스트가 각 region에 표시됨
사용자는 그 아래 정답 텍스트 입력 칸에 올바른 텍스트를 직접 입력
Submit 시 OCR 원본 텍스트 + 사람이 수정한 정답 텍스트 + 필드 라벨 + bbox가 같이 저장됨
두 종류의 학습
A. LayoutLM 학습
입력: OCR 결과 텍스트 + bbox + 라벨
목적: 이 토큰이 어떤 필드인지 분류
"공급받는자"가 OCR로 잘 들어왔다고 가정하고 → 이게 어떤 엔티티(label)인지 학습
B. PaddleOCR 학습 (Recognition)
입력: crop 이미지 (bbox 영역)
목적: 이미지에서 글자를 정확히 읽기
OCR 원본 "공급받는져"는 버리고, 사람이 고친 "공급받는자"를 정답(label)으로 사용
Recognition 학습 데이터 생성
Label Studio에서 교정된 데이터를 기반으로 PaddleOCR Recognition 학습용 데이터셋을 생성. bbox 영역을 crop하여 이미지를 만들고, corrected_text를 정답(ground truth)으로 사용.
데이터 구조
images/→ bbox crop 이미지 파일들label.txt→ 이미지 경로 + 정답 텍스트 (탭 구분)label.txt 형식 예시
images/crop_001.jpg 공급받는자images/crop_002.jpg 2024.01.15bbox 수정 시 학습/추론 반영
bbox는 LayoutLM과 PaddleOCR에서 서로 다른 역할을 수행. 수정 시 양쪽 모두에 영향을 미치므로 주의가 필요.
LayoutLM에서의 bbox
position embedding으로 사용
→ 토큰의 문서 내 위치 정보를 학습에 반영
PaddleOCR에서의 bbox
crop 영역으로 사용
→ 해당 영역을 잘라서 Recognition 입력으로 사용
⚠️ bbox를 수정하면 LayoutLM의 위치 임베딩과 PaddleOCR의 crop 영역이 동시에 변경됨
Tesseract → PaddleOCR 교체 전략
현재 구조는 Tesseract에 종속된 것이 아니라 OCR 출력 포맷에 종속. 출력 형식만 맞추면 교체가 가능한 구조.
교체 체크리스트
PaddleOCR 출력 → Tesseract 호환 포맷 변환 함수 작성
testOCR.py에서 Tesseract 호출부를 PaddleOCR로 교체
bbox 좌표계 통일 (xyxy 형식)
confidence score 필터링 기준 설정
LayoutLM 입력 형식에 맞게 변환 로직 검증
기존 테스트 케이스로 결과 비교
배치 추론 스크립트 업데이트
PaddleOCR 환경 설정
Python 3.11 가상환경 기반으로 PaddleOCR 및 관련 패키지를 설치.
핵심 패키지
Python3.11paddlepaddle3.2.2paddleocr3.0.1torch2.1.0venv 설정
python3.11 -m venv paddle_envsource paddle_env/bin/activatepip install paddlepaddle==3.2.2 paddleocr==3.0.1PaddleOCR 결과 → LayoutLM 입력 변환
PaddleOCR 출력을 LayoutLM이 기대하는 입력 형식으로 변환하는 매핑 규칙.
필드 매핑
rec_texts→wordsrec_polys→bbox (xyxy)img.shape→H, W💡 rec_polys는 4점 좌표(polygon)이므로 min/max로 xyxy 형식의 bbox로 변환 필요
testOCR.py 핵심 작업
testOCR.py는 PaddleOCR 결과를 LayoutLM에 전달하기 위한 전처리 스크립트. 4단계로 구성.
세로 분할 OCR
이미지를 세로로 분할하여 PaddleOCR 실행
score < 0.70 필터링
신뢰도 낮은 결과 제거
포맷 변환
PaddleOCR 출력 → LayoutLM 입력 형식 변환
LayoutLM 추론
변환된 데이터로 LayoutLM 모델 추론 실행
⚠️ score 0.70 미만은 노이즈로 판단하여 필터링 — 임계값은 테스트 결과에 따라 조정 가능
단계별 진행 Phase
PaddleOCR 도입부터 운영까지 8단계 로드맵. Phase 0~4(OCR 교체 및 검증)는 완료되었으며, Phase 5~7(Recognition 파인튜닝)은 운영 환경을 고려하여 진행 예정입니다.
사전 준비
환경 설정, PaddleOCR 설치 및 기본 테스트
단건 테스트
단일 이미지로 PaddleOCR → LayoutLM 파이프라인 검증
연결 테스트
testOCR.py 통합 및 전체 흐름 연결
배치 테스트
다수 문서 배치 추론 테스트
결과 검토
Tesseract 대비 정확도 비교 및 분석
학습 데이터 생성
Recognition 학습용 crop 이미지 + label.txt 생성
Recognition 학습
PaddleOCR Recognition 모델 fine-tuning
성능 비교
학습 전/후 Recognition 정확도 비교
언어별 모델 분기
문서 언어에 따라 서로 다른 PaddleOCR Recognition 모델을 사용.
영어 / 스페인어 (Latin)
latin_PP-OCRv3_mobile_recEN, ES 등 라틴 문자 기반 문서
한국어 (Korean)
korean_PP-OCRv3_mobile_recKR 한글 문서 전용
💡 언어 감지는 문서 메타데이터 또는 프로젝트 설정 기반으로 자동 분기
사전 검증 단계
PaddleOCR 교체 전, 기존 checkpoint 기반으로 사전 검증을 수행하여 안정성 확인.
검증 설정
checkpoint→ checkpoint-740 기반model_version→ LayoutLM-paddle-v1✅ 기존 Tesseract 기반 결과와 PaddleOCR 기반 결과를 동일 문서로 비교하여 품질 검증
배치 추론 스크립트
PaddleOCR 기반 배치 추론을 위한 전용 스크립트. 테스트 단계에서는 특정 프로젝트만 대상으로 실행.
스크립트 정보
파일명layout_batch_predict_paddle.py대상project id=34 (테스트용)⚠️ 테스트 단계에서는 project id=34만 대상으로 제한하여 안전하게 검증 후 전체 확대 예정