报销票据识别,把 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% 重叠再合并结果,等分切是最省事也最容易丢字段的做法。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
