跳到主要内容

更新日志

v0.1.0 -- 混合流水线比例尺与几何精度

发布日期:2026-05-09

问题

混合 CV+VLM 流水线产生了不正确的房间面积(约 3 倍过大)和错误的比例尺(mpp=0.02,实际约 0.0076)。使用同一户型图的旧流水线产生了近乎完美的结果(27m2、14m2、9.4m2)。

根本原因

  1. 比例尺:VLM 返回了不合理的 mpp(0.02 -> 建筑 27.4m),合理性阈值过于宽松(50m)。标注推导的 mpp 使用 img_w * 0.8 作为墙体范围估计,而非实际墙体边界框。
  2. 房间面多边形:从墙体中心线延伸到中心线,未裁剪到墙体边界框,导致外围单元包含建筑外的空白区域。
  3. 墙体厚度过度修正:标注 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

结果

指标修复前修复后
比例尺 mpp0.01(VLM,错误)0.0083(标注推导)
面积(客厅)39.2 m229.6 m2(目标:27.0)
面积(卧室)22.0 m212.8 m2(目标:14.0)
面积(卫生间)15.9 m28.3 m2(目标:9.4)
总面积77.1 m250.7 m2(目标:50.4)
验证分数0.450.95
对齐总分0.420.64

版本历史

版本日期说明
v0.1.02026-05-09混合流水线比例尺检测和房间面几何精度修复