更新日志
v0.1.0 -- 混合流水线比例尺与几何精度
发布日期:2026-05-09
问题
混合 CV+VLM 流水线产生了不正确的房间面积(约 3 倍过大)和错误的比例尺(mpp=0.02,实际约 0.0076)。使用同一户型图的旧流水线产生了近乎完美的结果(27m2、14m2、9.4m2)。
根本原因
- 比例尺:VLM 返回了不合理的 mpp(0.02 -> 建筑 27.4m),合理性阈值过于宽松(50m)。标注推导的 mpp 使用
img_w * 0.8作为墙体范围估计,而非实际墙体边界框。 - 房间面多边形:从墙体中心线延伸到中心线,未裁剪到墙体边界框,导致外围单元包含建筑外的空白区域。
- 墙体厚度过度修正:标注 mpp 将墙体厚度添加到 bbox 范围,但标注测量的是房间内部(中心线到中心线),而非建筑外部尺寸。
变更内容
比例尺检测(plan_graph.rs)
- 标注 mpp 现在直接使用墙体边界框范围(不再进行墙体厚度修正)
- 使用所有标注的平均 mpp 而非最小值 -- 补偿像素/米的纵横比差异
extract_scale_candidates接受wall_segments参数以计算 bbox
房间面多边形(plan_graph.rs)
- 新增
clip_polygon_to_rect()-- 使用 Sutherland-Hodgman 算法裁剪到墙体边界框 - 面多边形经过裁剪以移除建筑外的空白区域
- 网格生成的最小线段长度过滤(50px)-- 移除短噪声线段
- 单元格回退:确保每个房间标签至少有一个网格单元
墙体检测(wall_graph.rs)
- 在 Hough 线检测前使用 Zhang-Suen 骨架化 -- 将 37 条墙体线段减少到约 7 条
- 端点延伸:延伸线段端点以与垂直墙体相交
- 基于中心的聚类合并平行线段
- 移除退化线段(长度 < 4px)
- 预分配骨架化缓冲区 -- 消除每次运行约 600MB 的临时分配
代码清理
- 将
wall_bbox()从每个标签的循环中提升(之前每个房间重复调用) - 用轻量级计数数组替代
cell_owner.clone() - 移除了 13 处无意义的注释
- 收紧测试断言:alignment > 0.5、mpp 0.005-0.015、总面积 20-100m2
结果
| 指标 | 修复前 | 修复后 |
|---|---|---|
| 比例尺 mpp | 0.01(VLM,错误) | 0.0083(标注推导) |
| 面积(客厅) | 39.2 m2 | 29.6 m2(目标:27.0) |
| 面积(卧室) | 22.0 m2 | 12.8 m2(目标:14.0) |
| 面积(卫生间) | 15.9 m2 | 8.3 m2(目标:9.4) |
| 总面积 | 77.1 m2 | 50.7 m2(目标:50.4) |
| 验证分数 | 0.45 | 0.95 |
| 对齐总分 | 0.42 | 0.64 |
版本历史
| 版本 | 日期 | 说明 |
|---|---|---|
| v0.1.0 | 2026-05-09 | 混合流水线比例尺检测和房间面几何精度修复 |