记录一下那天晚上的排查过程。用 paddleocr 2.7 的 PP-OCRv4 识别一页竖排扫描件,文字都识别对了,但输出顺序是从左到右按行拼,读起来完全不通,use_angle_cls 已经设成 True。

刚开始盯着「rec 模型没有竖排语料,单字识别本身有误」,折腾了半个多小时,排掉了。

这类报错背后常见的原因有几处,逐个排除就行。检测框按横向坐标排序,竖排文本需要按列重排。少数情况下是use_angle_cls 只做 180 度判断,不处理竖排。

还有一种情况,检测阈值偏低,把一个字切成两个字框。

第一件事是打印每个框的坐标与文本确认排序依据

python -c "from paddleocr import PaddleOCR;o=PaddleOCR(use_angle_cls=True);r=o.ocr('v.jpg');print([(b[0][0][0],t) for b,t,_ in r[0]][:10])"

接着按 x 坐标聚列再按 y 排序重组

python -c "import json;d=json.load(open('boxes.json'));print(sorted(d,key=lambda z:(round(z['x']/40),z['y']))[:5])"

随后把竖排页旋转 90 度后再识别

python -c "from PIL import Image;Image.open('v.jpg').rotate(-90,expand=True).save('v2.jpg')"

剩下的就是对重排结果做一次人工对照

python -c "print('check first 50 chars')"

别只看报错消失,验证要多做一步。重排后的文本与原件逐列对照可读,前 200 字的部首顺序正确,标点落在句末。

补一句。竖排的核心问题是排序而不是识别,检测框坐标拿全之后自己重排,比换模型快得多。同一份配置在测试环境跑通,不代表线上没事,两边的默认值经常不一样。

作者 9823189