feat: 尺度精修上线,首次机器 PASS(live_160548 s=1.0375)

- method_l_shape: OK 候选尺度 ±0.0375 精修(步长 0.0125 + ±6px 窗口),
  GT live_165204 Δ 179→176(真人 177),离线 9/10 保持
- 插桩 JSON.stringify 捕获 SDK 日志明文;指针 probe 排除 coalesced/pressure
- 拖动不跟手指标作废:post_pos 晚于 SDK 重置滑块,鼠标事件流始终完整
- 剩余 VerifyErr = 候选整体选错(视觉确证),方向:多候选质量评估
- docs: experiments/solution/retrospective 同步收尾
This commit is contained in:
杨豪
2026-09-15 16:20:05 +08:00
parent d8c1b636e3
commit cae37465d2
191 changed files with 3624 additions and 17 deletions
+74
View File
@@ -124,6 +124,80 @@ result = solve(big_image_b64, mark_image_b64) # 支持 dataURI 前缀
- 洞叠在深色照片上时"内-环亮度差"约束减弱,可提高方向倒角权重;
- 若验证码改用亮色覆盖物,需要把亮度差项改为双向(|内-环|)并重标权重。
## 线上增强:tip_y 锚定与 flatness 贴片检测(2026-05-15)
线上实测发现题目分布漂移:覆盖物从离线样本的暗色洞变为**亮白半透明贴片**,
方法 L 分数从 1–3 恶化到 3.6–7.7,且出现假峰(chamfer 精修分 2.6 的雪枝纹理
压过真缺口 8.3)—— 边界/纹理特征在亮贴片雪景题上完全失灵。
两阶段解决:
### 1. 坐标系修正(bug 修复)
服务端 `question.tip_y×2` 是**画布坐标系**(mark 全图左上)缺口顶 y 真值,
而求解器内部候选 `e.y` 是 alpha-bbox 左上 y,两者相差 `bbox_y0 × scale`
(实测 ≈9px)。不换算会把真候选推出 ±8px 锚窗、错误候选反而入选。
换算关系(由离线 GT 实证):**canvas = bbox − bbox_y0×s**。
### 2. flatness 贴片检测(线上新特征,决定性)
亮白半透明贴片的物理特征:**把盖住的背景“贴平”** —— 贴片区域内纹理方差
远低于周围。定义 flatness = 掩码内灰度 std / 环形外灰度 std:
- 线上真缺口 flatness 实测 **0.04–0.28**(live_145400 GT 位置 0.056);
- 同图假峰(雪枝纹理)0.49–0.67,区分度巨大;
- 内部纹理 zNCC、亮度抬升等其它特征在此类题上全部失效(实测)。
求解流程(tip_y 提供时):各尺度在 y 条带内用 filter2D 向量化扫描 flatness,
取画布 y 落在锚窗(±8px)内的最低值位置;flatness ≤ 0.30 判 OK(method
= "flatness")。无匹配或未提供 tip_y → 回退 chamfer 路径(离线逻辑不变)。
**验证结果**:
- 线上 batch 8/8 全 OK(此前 3 道 AMBIGUOUS 全修复),dy ≤ 8 全部满足;
- live_145400(chamfer 假峰题)flatness 命中 (407,64),与 IoU 亚像素实证
GT (412,68) 差 (5,4)px;
- 离线 10 题无 tip_y 走原逻辑,9/10 保持(4db94793 为历史已知边界)。
`solve(big, mark, tip_y=...)` 返回新增 `method` 字段;score 量纲随 method
变化(flatness 为 0–1 比值,chamfer 为 px 分)。
### 3. flatness 路径最终降级为禁用(2026-05-15 晚,真人 GT 实证)
flatness 在线批量指标全绿,但**位置真值校准暴露系统性偏差**。用真人手拖
(轨迹录制器采样 down→up 位移)拿到 4 个真值:
| 题 | flatness | chamfer(tip_y 锚定) | 真人 GT | 判定 |
| --- | --- | --- | --- | --- |
| live_165204 | — | 179 | 177 | chamfer ✓(真人 PASS) |
| live_172458 | 433 (s=0.70) | 388 | 388 | flatness +45px ✗ |
| live_173321 | 209 (s=0.825) | 391 | 391 | flatness −182px ✗ |
| live_180227 | 266 (s=0.95) | 257 | (用户拖偏,不采信) | — |
结论:**chamfer(tip_y 锚定 + refined 排序)3/3 命中(dx=0/0/2),
flatness 每次都大幅偏移**。平坦区特征在雪景题上会吸到贴片内部/
天空等大平坦区,且可与同样为假的弱 chamfer 候选互相“掩护”
(交叉验证被穿透,live_173321 实测)。
处理:`FLAT_DISABLED = True` 禁用 flatness 选点(`flatness_scan`
函数保留供参考);主路径 = tip_y 锚定 chamfer。采题侧把
“flatness/chamfer 共识”作为加分项但不作硬依赖。
同时期的输入层排除(详见 experiments.md):CDP 合成指纹、事件指纹、
时序积压均被 xdotool 硬件输入 + 60Hz 样条加密重放排除——
**此前所有失败案例事后看都是位置错,不存在独立的“输入指纹拒”**。
### 4. 尺度精修 + 首次机器 PASS(2026-09-15 深夜)
SCALES 网格步长 0.025,真尺度落在步间时轮廓对齐可偏 5-15px —— 正是 VerifyErr
(社区资料确认其语义 = 缺口距离错,非轨迹问题)的量级。修法:对入选 OK 候选在
s±0.0375(步长 0.0125)重扫 + ±6px 窗口局部最优,取 rotation_scan refined 最低者。
- GT live_165204:179 → 176(真人 177,Δ −1);离线回归 9/10 保持
- **机器 PASS**:live_160548 x=255 **s=1.0375**(精修值,网格外),拖 157.1px → code=200
- 剩余 VerifyErr 案例视觉确证为候选整体选错(如 s=0.7 网格下边界假峰),
方向:多候选质量评估 / 不像就 refresh 换题
## 复现
```bash