尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Scan2CAD|把 CAD 模型摆进真实扫描里——3D CNN 加 9DoF 优化的管线全拆解

Scan2CAD|把 CAD 模型摆进真实扫描里——3D CNN 加 9DoF 优化的管线全拆解 Scan2CAD把 CAD 模型摆进真实扫描里——3D CNN 加 9DoF 优化的管线全拆解【免费下载链接】Scan2CAD[CVPR19] Dataset and code used in the research project Scan2CAD: Learning CAD Model Alignment in RGB-D Scans项目地址: https://gitcode.com/gh_mirrors/sc/Scan2CADScan2CAD 是一个 CVPR 2019 的开源项目学习把 CAD 模型对齐到 RGB-D 三维扫描替代人工对每个场景数小时的反复试错。3D CNN 在 CAD 上预测关键点热图Ceres 求解 9DoF 姿态得到最终 9 参数变换。本文交付原理拆解、从零跑通的完整管线、调参与排障手册。场景与断点人工调 9DoF 卡在哪一个室内 BIM 项目交付 1506 个扫描场景候选模型库里有 14225 个物体。就算每个物体只花 20 分钟人工微调对齐总量约 100 人天——这正是官方数据集标注 97607 组关键点对应关系所对应的真实工作量。逆向工程场景更直接操作者在 CAD 软件里手动拖平移、旋转、缩放共 9 个参数一次旋转微调就可能让零件整体错位收敛半径小、没有视觉抓手。传统流程扫描→网格重建→挑候选模型→手调 9DoF→检查贴合断在第 4 步旋转与各向缩放不可视化调参换一个候选 CAD 就得从头再来。Scan2CAD 的路线分三段把扫描和 CAD体素化为 SDF/DF 距离场网格3D CNN 预测关键点热图、匹配概率与缩放最后把初值交给 Ceres 做 9 自由度优化。引擎内部体素化、热图与 9DoF 优化怎么衔接体素化两种距离场把数据喂进网络一句话把连续三维离散成 CNN 能吃的规整网格。扫描侧做体积融合把深度图融成 SDF有符号距离场体素 3cm、截断距离 15cmCAD 侧用改造的 SDFGen 输出 DF无符号距离场坐标 unitless。两者符号与坐标系约定不同网络统一吃 32×32×32 体SDF 边缘常数填充 -0.15数值截断到 1.8Network/pytorch/main.py的ConstantPad3d与in0[in0 1.8] 1.8。数据场类型体素分辨率坐标系约定生成入口ScanNet 扫描SDF 有符号3cm截断 15cm世界坐标z-up体积融合ShapeNet CADDF 无符号unitless模型坐标y-upRoutines/Script/CADVoxelization.py网络输入32³ 体SDF 填充 -0.15截断 1.8统一网格Network/pytorch/main.py热图网络到底预测了什么一句话输入扫描裁剪 候选 CAD一对体输出 CAD 在 32³ 网格上的对应概率体外加匹配分数和 xyz 缩放。Network/pytorch/model.py里是双编码器结构扫描编码器 4 级下采样24→40→64 通道CAD 编码器 3 级且参数全部冻结bottleneck 拼接后解码三个头分别接热图、match、scale。训练损失是热图加权 BCE 交叉熵--weight 64、match 0.1、scale MSE 0.2Network/pytorch/losses.py。# Network/pytorch/model.py —— Model3d.forward三头输出 x self.encode0(x) # 扫描 SDF4x4x4 64ch y self.encode1(y) # CAD DF参数冻结 z self.decode(self.bottleneck(torch.cat((x, y), 1))) match self.feature2float(self.bottleneck(torch.cat((x, y), 1))) scale self.feature2scale(self.bottleneck(torch.cat((x, y), 1))) return self.feature2heatmap(z), match, scale # 32³热图 / 标量 / (sx,sy,sz)一个训练样本长这样左图是扫描中心裁剪体右图是 CAD 侧的热图目标对应扫描的对应关系训练前会高斯模糊。9DoF 优化把网络初值磨成稳定位姿一句话网络只给粗初值真正让 CAD 表面体素贴住扫描表面的是 Ceres 非线性优化。Routines/AlignmentHeatmap/main.cpp把参数化为 6D 旋转 3D 平移 3D 缩放经R9toSE3变出 SE3 矩阵代价是 CAD 表面体素|sdf| ≤ 体素尺寸映射进扫描空间后的 SDF 平方均值并带无效位姿护栏——表面体素落在扫描域内的不足 30% 时代价直接记 1e6。优化走 3 级梯度金字塔下采样 2x 高斯模糊由粗到细。// Routines/AlignmentHeatmap/main.cpp —— calc_li_confidence 摘录 if (std::abs(vox_cad.sdf[i]) vox_cad.res) { // 只统计表面体素 if (is_hit) cost val * val; // 代价 SDF 平方 } if (counter/(double)counter_total 0.3) cost 1e6; // 30% 护栏无效位姿坐标坑ShapeNet 是 y-up、ScanNet 是 z-upRoutines/Script/Alignment9DoF.py优化前固定乘rot [1,-1,0,0]的 y→z 旋转漏掉它所有代价都会是 1e6。 跑通它从零到第一次对齐的完整管线基于Assets/自带样例数据仓库根目录为工作目录git clone https://gitcode.com/gh_mirrors/sc/Scan2CAD—— 拉代码Assets/里已含全部样例数据pip install -r Routines/Script/requirements.txt—— 装 Python 依赖把 ScanNet、ShapeNet、Scan2CAD 标注三套数据拷进./Routines/Script/—— 样例场景下Parameters.json已指向Assets/无需改在Routines/Vox2Mesh、Routines/DFGen、Routines/CropCentered各跑一次make—— 编译 C 工具Routines/AlignmentHeatmap走CMakeLists.txt构建依赖 Ceres 与 Eigenpython3 Routines/Script/CADVoxelization.py—— ShapeNet 的 .obj 转 .df 网格python3 Routines/Script/GenerateCorrespondences.py—— 由标注生成训练样本扫描中心裁剪、热图、scale、matchcd Network/pytorch ./run.sh—— 启动热图训练默认 batch 8、lr 1e-3、weight 64cd Routines/Script python3 Alignment9DoF.py --projectdir ../../Network/pytorch/output/dummy—— 收集网络输出、写 json 任务文件并调用 C 对齐程序python3 Alignment2Mesh.py --alignment ./tmp/alignments/dummy/scene0470_00.csv --out ./—— 扫描加对齐后的 CAD 合并成场景可视化检查验证输出别跳过cat Network/pytorch/output/dummy/scene0470_00_*/predict-match.txt # 预期 0~1 概率正样本接近 1官方样例 0.9899 cat Network/pytorch/output/dummy/scene0470_00_*/predict-scale.txt # 预期 3 个接近 1 的缩放样例 1.20/1.35/1.05 head -3 tmp/alignments/dummy/scene0470_00.csv # 预期表头 id-scan ... sx sy sz 对齐行对照Assets/output-network/example/里的gt-match.txt与gt-scale.txt正样本的 match 应与 gt 一致。快跑路径5 步验证效果编译3 个目录make CMake 构建 AlignmentHeatmappython3 Routines/Script/CADVoxelization.py样例 .df 已预生成可跳过python3 Routines/Script/GenerateCorrespondences.pycd Network/pytorch ./run.shAlignment9DoF.pyAlignment2Mesh.py按上面 3 条命令验证 CSV 与 match完整路径换成自己的数据申请 ScanNet / ShapeNet / Scan2CAD 完整数据集README 中的申请入口下载到本地拷入./Routines/Script/更新Parameters.json里 6 个路径CADVoxelization.py体素化全量 CADGenerateCorrespondences.py生成全量样本官方数据约 500GB先留磁盘./run.sh训练后跑Alignment9DoF.py用Routines/Script/EvaluateBenchmark.py接官方基准评测 卡住了4 个高频故障与参数速查故障 1启动训练直接断言现象train-list does not exists报错退出根因--train_list指向的 trainset.json 不存在训练样本没生成修复先跑GenerateCorrespondences.py再把产出的trainset.json路径传给--train_list故障 2对齐跑完却没有 CSV现象Alignment9DoF.py正常结束tmp/alignments/下空目录根因Python 侧subprocess.check_call包在try/except pass里C 程序失败被静默吞掉修复确认Routines/AlignmentHeatmap/build/main存在手动执行一次看真实报错故障 3对齐代价全是 1e6现象每个候选位姿代价都是 1e6无有效对齐根因CAD 表面体素落在扫描域内不足 30%初值离得太远或 y-up/z-up 旋转没乘修复检查rot[1,-1,0,0]是否生效对照热图输出与 gt 看初值质量故障 4训练慢或显存爆现象32³ 三维卷积下 batch 8 已接近显存上限根因体素分辨率与 batch 同时吃显存修复--batch_size降到 4n_samples_eval调小n_threads保持 4参数速查Network/pytorch/main.py与run.sh参数作用推荐区间改大 / 改小的副作用--weight热图正负样本损失权重32–128大→热图塌成单像素小→弥散不聚焦--lr学习率1e-4–1e-2大→发散小→10 万迭代欠拟合--batch_size批大小4–16大→显存爆小→BN 统计噪声大--interval_eval评估间隔迭代数50–2000大→收敛难观察小→循环慢SDF 体素 3cm扫描网格分辨率2–5cm小→网格膨胀、生成慢大→丢小特征 周边地图数据在哪、怎么扩展Assets/scannet-sample/—— 一个 ScanNet 场景含网格与语义标签Assets/shapenet-sample/—— 5 个 ShapeNet 模型.obj 加 .mtlAssets/scannet-voxelized-sdf-sample/与Assets/shapenet-voxelized-df-sample/—— 对应 SDF/DF 网格Routines/Vox2Mesh可转 .ply 可视化Assets/training-data/—— 扫描中心裁剪与 CAD 热图各一份样例加 trainset.jsonAssets/output-network/example/—— 网络已跑出的示例输出predict 与 gt 各两列社区参与PR 提进Network/pytorch模块数据集与基准走 README 申请入口引用 CVPR 2019 论文落地场景室内 BIM场景级对齐把家具 CAD 直接摆进 BIM 模型替代逐件人工放置基准评测用官方 97 场景隐藏测试集横向比较对齐算法AR 预览候选家具模型秒级对齐到房间扫描做摆放预览Scan2CAD 把 CAD 对齐从小时级人工试错压成分钟级的推理 优化流程全部对应关系在 3cm 体素分辨率下验证。它最适合做室内扫描转 BIM、需要批量摆 CAD 的团队以及找对齐基线做算法研究的人。下一步跑通上面快跑路径的 5 步效果不满意时从参数速查表的--weight和热图初值开始查。【免费下载链接】Scan2CAD[CVPR19] Dataset and code used in the research project Scan2CAD: Learning CAD Model Alignment in RGB-D Scans项目地址: https://gitcode.com/gh_mirrors/sc/Scan2CAD创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表