[PaddleOCR] MCP 서버에서 모든 OCR 결과 배치를 파싱하도록 수정
PR 링크: PaddlePaddle/PaddleOCR#16756 상태: Merged | 변경: +16 / -14
들어가며
OCR 파이프라인에서 "결과가 일부만 반환된다"는 류의 버그는 발견하기 어렵지만 치명적입니다. 특히 MCP(Model Context Protocol) 서버처럼 AI 에이전트가 OCR 결과를 소비하는 환경에서는, 누락된 텍스트가 후속 추론의 정확도를 직접적으로 저하시킵니다. 이번 PR은 PaddleOCR MCP 서버의 _parse_local_result 메서드가 OCR 결과의 첫 번째 배치만 처리하던 버그를 수정합니다.
핵심 코드 분석
결과 파싱 루프 수정
Before:
async def _parse_local_result(self, local_result: Dict, ctx: Context) -> Dict:
result = local_result[0] # 첫 번째 배치만 사용
texts = result["rec_texts"]
scores = result["rec_scores"]
boxes = result["rec_boxes"]
clean_texts, confidences, text_lines = [], [], []
for i, text in enumerate(texts):
if text and text.strip():
conf = scores[i] if i < len(scores) else 0
clean_texts.append(text.strip())
confidences.append(conf)
instance = {
"text": text.strip(),
"confidence": round(conf, 3),
"bbox": boxes[i].tolist(),
}
text_lines.append(instance)
After:
async def _parse_local_result(self, local_result: Dict, ctx: Context) -> Dict:
clean_texts, confidences, text_lines = [], [], []
for result in local_result: # 모든 배치를 순회
texts = result["rec_texts"]
scores = result["rec_scores"]
boxes = result["rec_boxes"]
for i, text in enumerate(texts):
if text and text.strip():
conf = scores[i] if i < len(scores) else 0
clean_texts.append(text.strip())
confidences.append(conf)
instance = {
"text": text.strip(),
"confidence": round(conf, 3),
"bbox": boxes[i].tolist(),
}
text_lines.append(instance)
핵심 변경은 local_result[0]으로 첫 번째 요소만 접근하던 코드를 for result in local_result로 전체 결과 리스트를 순회하도록 바꾼 것입니다. PaddleOCR의 로컬 추론은 이미지가 여러 영역으로 분할될 때 각 영역의 결과를 별도 배치로 반환합니다. 기존 코드는 이 중 첫 번째 배치만 처리하여, 두 번째 이후 영역의 텍스트가 모두 누락되었습니다.
왜 이게 좋은가
-
데이터 무결성 확보: 다중 영역 문서(표, 다단 레이아웃 등)에서 모든 텍스트가 빠짐없이 반환됩니다. 이는 MCP 서버를 통해 AI 에이전트가 문서를 분석할 때 정확도에 직결됩니다.
-
하위 호환성 유지: 단일 배치 결과의 경우 루프가 한 번만 실행되므로 기존 동작과 완전히 동일합니다. 변경으로 인한 regression 위험이 없습니다.
-
전형적인 "off-by-scope" 버그 수정:
list[0]으로 첫 요소만 접근하는 패턴은 프로토타이핑 단계에서 흔히 발생하며, 프로덕션에서 다양한 입력을 처리할 때 비로소 문제가 드러납니다.
정리
local_result[0]에서 for result in local_result로의 변경은 코드 구조적으로 사소해 보이지만, 다중 영역 OCR 결과의 완전한 파싱을 보장하는 중요한 수정입니다. MCP 서버의 신뢰성을 높이고, AI 에이전트가 문서 전체를 올바르게 이해할 수 있는 기반을 마련합니다.
참고 자료
이 글은 AI(Claude)의 도움을 받아 작성되었으며, 실제 PR의 코드 변경 사항을 기반으로 분석한 내용입니다.
관련 포스트
PR Analysis 의 다른글
- 이전글 [Ultralytics] Pose Loss의 keypoint 배치 루프를 벡터 연산으로 최적화
- 현재글 : [PaddleOCR] MCP 서버에서 모든 OCR 결과 배치를 파싱하도록 수정
- 다음글 [axolotl] Context Parallel 이중 시퀀스 분할 버그 수정: noop context manager로 중복 적용 방지
댓글