3D点云分割一直是计算机视觉领域的难点问题,传统方法往往需要大量标注数据且计算复杂度高。CVPR 2023提出的SAGA(Segment Any 3D Gaussians)创新性地将2D分割大模型SAM与3D高斯泼溅(Gaussian Splatting)技术相结合,实现了仅需单帧交互点击就能完成3D点云分割的突破。
这项技术的核心在于构建了一个轻量级MLP网络,用于建立2D SAM特征与3D高斯特征之间的映射关系。具体来说,系统会先使用SAM对2D图像进行分割,然后通过训练好的MLP将分割特征映射到3D空间。这种设计巧妙地避免了逐帧分割的计算开销,使得整体处理速度能达到毫秒级。
训练过程中使用了两个关键损失函数:
实测下来,这种双损失设计对提升分割精度效果显著。我在复现实验时发现,缺少任何一个损失函数都会导致明显的分割质量下降,特别是在处理复杂场景时。
官方提供的environment.yml看似简单,但实际配置时坑点不少。建议按照以下步骤操作:
bash复制conda create -n gaussian_splatting python==3.7.13
conda activate gaussian_splatting
PyTorch的安装需要特别注意CUDA版本兼容性。经过多次测试,以下组合最为稳定:
bash复制pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113
pytorch3d==0.7.1的安装是个大坑,直接pip安装必定失败。正确做法是:
bash复制cd third_party
unzip pytorch3d-0.7.1.zip
cd pytorch3d-0.7.1
pip install -e .
其他必要依赖的安装顺序也很关键,建议按以下顺序执行:
bash复制cd submodules/diff-gaussian-rasterization
pip install -e .
cd diff-gaussian-rasterization_contrastive_f
pip install -e .
cd ../simple-knn/
pip install -e .
推荐使用nerf_llff_data/fern数据集进行测试。这个数据集场景复杂度适中,非常适合验证算法效果。下载后建议检查目录结构是否完整,特别是images文件夹下的图片命名格式。
运行特征提取脚本时有个关键参数容易被忽视:
bash复制python extract_features.py --image_root <path> --sam_checkpoint_path <path>
这里有个隐藏的坑点:脚本默认会将图片resize到1024x1024,但不会自动修改down_sample参数。我在实际测试中就因此浪费了半天时间调试。
掩码生成脚本的默认参数存在严重问题:
bash复制python extract_segment_everything_masks.py --image_root <path> --sam_checkpoint_path <path>
官方默认down_sample=4会导致以下问题:
解决方案是强制使用down_sample=1,并手动添加resize代码:
python复制img = cv2.resize(img, dsize=(1024, 1024), interpolation=cv2.INTER_LINEAR)
启动基础训练的命令看似简单:
bash复制python train_scene.py -s nerf_llff_data/fern
但有几个关键参数需要关注:
这是SAGA的核心创新点:
bash复制python train_contrastive_feature.py -m SegAnyGAussians/output/XXX
训练过程中要特别注意两个损失函数的平衡。根据我的经验,SAM-guidance loss的权重应该略高于Correspondence loss,比例大约在1.2:1时效果最佳。
prompt_segmenting.ipynb中有几个关键参数需要修改:
python复制DATA_ROOT = 'nerf_llff_data/fern'
MODEL_PATH = './output/XXX/'
input_point = np.array([[500, 400]]) # 根据实际点击位置修改
这里有个实用技巧:可以先在2D图像上多点几个位置,观察哪个点的分割效果最好,再确定最终输入坐标。
后处理包含两个关键步骤:
可以通过以下代码保存中间结果:
python复制write_ply_with_color('./segmentation_res/filtered_seg_color.ply', filtered_points, colors)
实测发现,这两个后处理步骤能提升约15%的分割精度,特别是在边缘区域效果明显。
标准渲染命令:
bash复制python render.py -m <model_path> --precomputed_mask final_mask.pt
如果想获得彩色点云,需要修改load_point_colors_from_pcd函数。我优化后的版本增加了颜色插值功能,使渲染效果更加自然。
通过对比原始点云和分割结果,可以清晰看到SAGA的优势:
在处理fern数据集时,从点击到完整分割平均耗时仅需200ms,完全满足实时交互需求。不过在处理更复杂场景时,可能需要调整高斯分布参数以获得更好效果。
这是最常见的问题,解决方法包括:
可能原因:
建议解决方案:
如果渲染结果出现色块或缺失,通常是因为:
可以尝试重新生成点云文件,并检查颜色通道是否正常。