报销票据识别,把 3000×4000 的手机照片缩到 768 长边上传,金额和税号经常串行,同一张图不缩放直接传又报 payload too large。

一开始怀疑是「JPEG 二次压缩产生块状伪影」,查了一圈,方向不对。

把日志和配置对完,能解释这个现象的基本就这几处。缩放后单字高度不足 12px,视觉编码器分块时把笔画抹平。还有一种是整图等比缩小丢失小字细节,模型只能靠上下文猜。

少数情况下是没有裁掉票据外的桌面背景,有效像素被摊薄。

动手时先按 3×4 切块保证每块字高够用

magick input.jpg -crop 3x4@ +repage tile_%02d.jpg

再往下切块后不再缩放直接送识别

python ocr_call.py --dir tiles --no-resize --out ocr.json

裁掉背景再缩放作为对照

magick input.jpg -fuzz 10% -trim cropped.jpg

等前面都确认过,再用标注集算字段级准确率

python ocr_eval.py --gt labels.json --pred ocr.json

改完先别撤,确认这几项。金额与税号字段准确率回到 95% 以上,单块请求体小于 3MB,块数在 8 到 12 之间,返回里没有截断。

切块会切断跨块的表格线,块之间留 10% 重叠再合并结果,等分切是最省事也最容易丢字段的做法。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189