先把当时的情况摆出来。PaddleOCR 3.0 识别竖排的快递面单,det 出的框没错,rec 结果按从左到右拼接,收件人和电话串成一串,加 use_angle_cls=True 后部分框仍被转成横向。

原因不止一个,得分开看。后处理默认按 x 坐标排序,竖排文本应按 y 坐标。另一种情况是角度分类模型只处理 180 度,不处理 90 度旋转。

另外,det 的框是细长竖框,rec 输入被强行拉成横条变形。少数情况下是多列文本没有按列聚类,跨列直接拼在一起。

先把 det 框坐标导出来看排序依据

python -c "import json;d=json.load(open('det.json'));print([(round(b[0]),round(b[1])) for b in d[0][:6]])"

识别时关闭角度分类并指定 rec 输入不缩放

python -c "from paddleocr import PaddleOCR;o=PaddleOCR(use_angle_cls=False,rec_image_shape='3,48,320');print(o.ocr('ticket.jpg',cls=False)[0][:2])"

再往下按列聚类后逐列自上而下拼接

python -c "print(sorted(boxes,key=lambda b:(round(b[0][0]/50),b[0][1])))"

等前面都确认过,再用官方竖排样本回归验证拼接顺序

python ocr_check.py --dir samples/vertical --order column

恢复的判定其实很直接。竖排面单的收件人与电话分行输出,列内顺序自上而下,20 张抽样里字段错位为 0。

容易忽略的是,竖排识别不是模型能力问题而是排序问题,det 框本身是对的,改后处理比换模型或调阈值更直接。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189