记录一下那天晚上的排查过程。调 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 像素内。
容易忽略的是,归一化坐标最容易错在量纲和宽高顺序,先用一张已知尺寸的图打印原始值再换算,比照着文档推公式可靠。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
