用户上传的票据照片在相册里是正的,直接把字节转 base64 传给 gpt-4o,识别出的金额和日期全错,下载原图一看是旋转 90 度的,方向标记写在 EXIF 里。

这类报错背后常见的原因有几处,逐个排除就行。EXIF 的方向标记只影响显示 不改变像素;模型按原始像素读 不会应用方向标记;部分安卓机写入的方向值是 6 或 8;压缩库默认丢弃 EXIF 导致方向信息丢失。

第一件事是读图片的方向标记

python -c "from PIL import Image;print(Image.open('a.jpg').getexif().get(274))"

然后按方向旋正后再编码

python -c "from PIL import Image,ImageOps;ImageOps.exif_transpose(Image.open('a.jpg')).save('a_fix.jpg')"

接着统一转 RGB 并限制长边

python -c "from PIL import Image;im=Image.open('a_fix.jpg').convert('RGB');im.thumbnail((1600,1600));im.save('a_send.jpg',quality=88)"

等前面都确认过,再用同一张图对比识别结果

python ocr_eval.py --a a.jpg --b a_send.jpg

手上没有现成的复现脚本,就照着线上请求手工拼了一个。

改完先别撤,确认这几项。旋正后的图识别金额与人工核对一致,方向值变成 1,长边不超过 1600。

方向标记是元数据,模型看不到,上传前必须按像素旋正,否则再高的分辨率也救不回来。监控比日志更早给出信号,事后回看经常能提前半小时发现异常。

作者 9823189