三维扫描一键变 CAD:Scan2CAD 把家具模型自动摆进真实房间
【免费下载链接】Scan2CAD[CVPR'19] Dataset and code used in the research project Scan2CAD: Learning CAD Model Alignment in RGB-D Scans项目地址: https://gitcode.com/gh_mirrors/sc/Scan2CAD
Scan2CAD 是一个把三维扫描转 CAD 的深度学习方案:输入一个扫描出的室内场景和一堆 CAD 家具模型,它自动告诉你每件家具是哪个模型、放在哪、多大。CVPR 2019 Oral 论文的开源实现,数据集覆盖 1506 个扫描场景、14225 个物体、97607 组对应点。
先跑起来:三步快速上手 🚀
第 1 步,装环境。克隆仓库,装 Python 依赖;C++ 小工具(体素化、裁切、网格转换那几个目录)各自进目录make一下即可。
第 2 步,拿数据。这个仓库没有现成的预训练模型权重,示例数据就是你的"起步包":Assets/scannet-sample是一份 ScanNet 示例场景,Assets/shapenet-sample是几件 ShapeNet 模型,Assets/training-data是训练样本索引。想拉一份示例扫描数据,跑一下python3 Assets/download_dataset.py。
第 3 步,执行转化。下面这条是官方 run.sh 里的核心命令:
git clone https://gitcode.com/gh_mirrors/sc/Scan2CAD cd Scan2CAD/Network/pytorch python3 ./main.py --name example --weight 64.0 --batch_size 8 \ --train_list ../../Assets/training-data/trainset.json \ --mask_neg 1 --with_scale 1 --with_match 1热图网络训完,接着用Alignment9DoF.py解出 9DoF 位姿,再用Alignment2Mesh.py把结果转成能打开看的网格,一条链路就通了。
它是怎么工作的
体素化:把三维数据变成"我的世界方块"
网络吃不了点云和网格,得先变成规整的三维数组。Scan2CAD 把扫描融合成 SDF 符号距离体素网格(默认分辨率 3cm、截断距离 15cm),CAD 模型变成 df 距离网格——相当于把房间变成我的世界场景,每个小方块里存着"离表面有多远"。这块逻辑在Routines/DFGen/和CADVoxelization.py里。
3D CNN 对应预测:玩一局"找同一处"
网络(Network/pytorch/ 下的 model.py)同时看"扫描裁剪块"和"候选 CAD",输出热图,指明扫描上的特征点对应到 CAD 的哪个位置——就像找茬游戏:给你一张实拍的椅子和一张理想化的椅模,让你指认靠背落在哪儿。训练样本正是这样的成对数据。
9DoF 姿态优化:推、转、缩放,推到严丝合缝
热图只告诉你"在哪儿"。网络还顺带预测语义匹配(这俩是不是同一类东西)和缩放比,剩下的交给优化求解器:平移 3 个方向、旋转 3 个方向、缩放 3 个方向,共 9 个参数一起解,把 CAD 又推又转又缩放,直到"卡"进扫描里。位姿运算基于 SE3 李群,代码在Routines/AlignmentHeatmap/。
调参微调出效果 🎯
参数都是main.py的命令行参数,run.sh里那组就是推荐起点:
- 训练太慢:先看
--batch_size(8)和--n_threads(4);显存富余就把 batch_size 往上加。 - 损失降不动:把
--lr从默认 0.01 降到 0.001,官方脚本就是这么设的。 - 负样本干扰大:保持
--mask_neg 1;想让网络学语义判断开--with_match 1,想让它预测尺度开--with_scale 1。 - 体素化参数设置:扫描侧默认 3cm 体素、15cm 截断。想更细就调小体素,但体积和内存大致按分辨率的立方膨胀,显卡和硬盘扛得住再动。
卡住了怎么办
问:对齐结果偏了,怎么查?先看输入——裁剪块是不是完整、候选 CAD 和场景里的东西是否同类。再看输出目录里的predict-match.txt:如果是 0,说明网络自己就觉得"这俩不是一回事",问题在匹配而不是位姿。最后比对predict-scale.txt和gt-scale.txt,差得远多半是数据或尺度学习的问题。
问:.vox / .df 文件打不开?用Routines/Vox2Mesh/的工具转成网格:./main --in 文件.vox --out 文件.ply,再拖进 Meshlab 就能看到。
问:训练日志半天不更新?把--interval_eval调小(run.sh 用的是 50),每 50 个迭代打印一次验证统计。
它能帮你做什么 📦
- 开箱即用的数据:
Assets/scannet-sample(ScanNet 场景,网格 + 语义标签)、Assets/shapenet-sample(椅子、桌子、垃圾桶等模型)、Assets/training-data(训练样本对),拿它们就能把整条流水线跑通。 - 公开评测:Scan2CAD 维护着 CAD 模型对齐的公开 benchmark,你的方法可以上去跟别人的比。
- 能延伸的方向:改
model.py的网络结构、调losses.py的损失权重,或者把Routines/Script/的数据管线搬到你自己扫的场景上——"体素化 → 生成对应 → 训热图 → 解 9DoF"这套流程换个场景照样成立。
一间屋子扫得好、家具库备得全,Scan2CAD 就能把"是哪个、在哪、多大"一次算清——这正是三维扫描转 CAD 这条路上很实用的一块起点。把仓库克隆下来,照着上面三步从示例数据跑一遍,你就知道它适合不适合你的场景了。
【免费下载链接】Scan2CAD[CVPR'19] 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),仅供参考