paddle-onnx OCR: 얇은 글자 영역 하나가 세션 오류를 내면 그 이미지의 인식 결과가 전량 폐기된다 #239
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
증상
paddle-onnx엔진이 이미지 또는 스캔 PDF 페이지에서 글자를 전혀 인식하지 못하고 provenance 에 경고만 남기는 경우가 있다.이미지 문서는 본문에 파일명만 남고, 스캔 PDF 페이지는 청크가 0이 된다. ingest 자체는 성공으로 끝나므로 해당 문서를 검색해서 0건이 나올 때까지 드러나지 않는다.
실측 (실사용 KB, 문서 11,867개 / 청크 65,764개, v0.33.0)
전체 이미지의 11.8%. PDF 는 1건(
jira/attachments/MLOPS-532/2375964.pdf, 1페이지 스캔본)이 청크 0이다.원인
crates/kebab-parse-image/src/paddle_onnx.rs의run_rec은 crop 을 높이 48로 리사이즈하면서 폭을 1 이상으로만 보장한다. rec 네트워크는 폭을 반복해서 절반으로 줄이므로 폭이 한 자릿수인 입력은 도중에 폭 0인 텐서가 되고, Conv 에서 ORT 가 세션 실행 전체를 실패시킨다.그리고 그 실패가
recognize를 중단시킨다.바로 아래 줄이 "박스 하나가 비면 나머지는 살린다" 는 의도를 이미 담고 있는데 오류 경로에는 그 방어가 없다. 그래서 손실이 얇은 조각 하나에서 그치지 않고, 이미 검출해 둔 나머지 박스 전부로 번진다.
설정으로 우회할 수 없다
같은 이미지 6장, 같은 v0.33.0 바이너리에서
[ingest.ocr] max_pixels만 바꿔 측정했다.896까지 낮춰도 실패가 남고, 낮추는 대가로 현재 성공하는 4,144장의 인식 품질이 함께 떨어진다.
수정 방향 (로컬 검증 완료, 미제출)
run_rec에서 리사이즈한 폭이 네트워크의 최소 입력 폭보다 작으면 빈 문자열을 돌려주어 기존text.is_empty()경로로 그 박스만 버린다. 높이 48px 에서 폭 16px 미만은 글자가 아니라 얇은 조각이므로, 늘려 입력하지 않고 버리는 편이 맞다.검증한 내용:
[ingest.ocr] max_pixels = 1600그대로 재색인 → 실패 6/6 에서 0/6, 문서당 본문 23자에서 607자.MLOPS-532/2375964.pdf를[ingest.pdf.ocr] max_pixels = 2048그대로 재색인 → 청크 0에서 2 (OCR 4.1초). 한국어 메일 본문이 실제로 인식된다.cargo test -p kebab-parse-image58 passed / 2 ignored,cargo clippy -p kebab-parse-image --all-targets -- -D warnings경고 없음.남은 일
kebab ingest --force-reingest가 필요하다. issue #232 의 페이지 렌더러 도입 전에 본문 없이 색인된 PDF 14개 / 112페이지도 같은 재색인 한 번으로 함께 복구되므로, 이 수정을 먼저 넣고 재색인을 한 번만 돌리는 편이 낫다.