记录一下那天晚上的排查过程。调 gpt-4o 做界面元素定位,让它返回按钮坐标,文档说坐标是 0 到 1000 的相对值,按图宽乘 1000 除回去,点击位置整体偏到右下,误差约两倍。

刚开始盯着「宽高顺序写反,x 乘了高度」,折腾了半个多小时,排掉了。

原因不止一个,得分开看。坐标是按 0 到 1000 归一化,换算要除以 1000 再乘宽高。也可能是上传前图片被压缩过,换算用的是原图尺寸。

少数情况下是模型返回的是中心点,点击时又按左上角处理。

先打印返回的原始坐标确认量纲

python -c "import json;r=json.load(open('resp.json'));print(r['points'][:3])"

再往下按 0 到 1000 的规则换算成像素

python -c "w,h=1280,800;print([(p[0]/1000*w,p[1]/1000*h) for p in pts])"

接着把换算后的点画回图片上肉眼核对

python -c "from PIL import Image,ImageDraw;im=Image.open('ui.png');d=ImageDraw.Draw(im);d.ellipse((x-6,y-6,x+6,y+6),fill='red');im.save('mark.png')"

末了改用模型输出中心点加宽高的格式重试

python locate.py --format box --image ui.png

别只看报错消失,验证要多做一步。换算后的坐标落在按钮区域内,连续 20 个元素标注位置与人工点击点误差在 10 像素内。

容易忽略的是,归一化坐标最容易错在量纲和宽高顺序,先用一张已知尺寸的图打印原始值再换算,比照着文档推公式可靠。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189