2025.7.3学习日记
1.Scannet数据集
Scannet数据集的所占的存储空间非常大,一般使用其预处理后的数据集文件,以下是与scannet数据集预处理相关的项目
1.1 3DMV
3DMV是将RGB颜色和几何信息相结合,进行语义分割。该项目将scannet数据集预处理为如下的文件结构:
等待中...
1.2 Pointcept
Pointcept是一个大型项目的集合,用于点云感知。该项目将scannet数据集处理为如下文件结构
1.3 BPNet
2.SAM3D
SAM3D项目的基于Scannet数据集和SAM模型实现。Scannet数据集经过3DMV项目处预理得到RGBD数据,经过Pointcept项目处理的到npy数据。
2.1 Scannet数据集
由于Scannet数据集过于庞大导致无法完整做训练,需要使用部分数据集做训练时,可以采用单场景训练的策略,需要做出的修改如下
- 创建以下三个路径,用于存储场景,处理点云,处理rgb几何信息
autodl-tmp/scannet/scans/scene0000_00
autodl-tmp/scannet/processed/pointclouds
autodl-tmp/scannet/processed/rgb
scans用于存放场景的原始数据,processed用于存放处理后的数据.
2. 在sam3d.py同级目录下创建三个.sh脚本
- sam3d.sh:依照sam3d.py的说明,将PATH修改为processed,将SAVE_PATH修改为导出结果目录,依照mete—_ data文件中的txt文件,将Train与Val_Path修改为场景存在的文本文件
结果如下:
#!/bin/bash
export RGB_PATH="/root/autodl-tmp/scannet/processed/rgb"
export DATA_PATH="/root/autodl-tmp/scannet/processed/pointclouds"
export SAVE_PATH="/root/autodl-tmp/output/pcd_result"
export SAVE_2DMASK_PATH="/root/autodl-tmp/output/2dseg_result"
export SAM_CHECKPOINT_PATH="/root/autodl-tmp/segment_anything/checkpoints/sam_vit_b_01ec64.pth"
export Train_Path="/root/autodl-tmp/SegmentAnything3D/scannet-preprocess/meta_data/scannetv2_test.txt"
export Val_Path="/root/autodl-tmp/SegmentAnything3D/scannet-preprocess/meta_data/scannetv2_test.txt"
python sam3d.py --rgb_path $RGB_PATH --data_path $DATA_PATH --save_path $SAVE_PATH --save_2dmask_path $SAVE_2DMASK_PATH --sam_checkpoint_path $SAM_CHECKPOINT_PATH --scannetv2_train_path $Train_Path --scannetv2_val_path $Val_Path
- preprocess_scannet.sh:添加原始数据的路径,以及输出的路径,修改过程如下:

- prepared_2d_data.sh:添加原始数据的路径,以及输出的路径,修改过程如下:

- 修改py文件
-
修改sam3d.py文件:主要是添加
sys.path.append('/root/autodl-tmp/segment_anything'),让其能够识别sam -
修改preprocess_scannet.py文件:
【修改load splits】将load splits部分修改为下图

【修改load scene paths】将load scene paths部分修改为下图
【最终结果】:


成功出现该场景的pth文件 -
修改prepare_2d_data.py文件:
【出现label标签】将False改为True,会出现label,但还是建议将label关闭

【排除.开头文件】在列表推导式中加上一段判断条件,排除.开头文件,结果如下:

【最终结果】:这里可以设置frameskip选项为1000,使处理结果编号的间隔为1000,降低硬件处理压力


2.2 Sam的接入
由于Sam有不同的下载模型,在buildsam时需要根据自身下载的sam模型去修改默认使用的模型,修改方法为调整build_sam的位置,并让build_sam = 相应的模型创建函数(build_sam_vit_b)
3.Python/Cuda/C++
3.1 等待中...
使用cuda编写运算,使用c++进行调用。
3.2 Python编译cuda和cpp
上次介绍到,Python需要使用setup函数并且导入CppExtension去编译cpp,如果cpp程序使用到了cuda程序,则需要将CppExtension改为CUDAExtension。
如果使用到了cuda程序,则需要在setup中ext_module中加上sources和include_dirs列表。由于文件众多,sources和include_dirs列表需要提前创建,使用python中的os和glob包即可
4.SAM详细解读
SAM由三个神经网络模块组成,ImageEncoderViT,PromptEncoder和MaskDecoder。PromptEncoder支持四种类型的输入为
4.1 模型加载
官方提供了三种不同大小的模型,sam_model_registry函数字典在build_sam.py文件中定义
sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
sam.to(device=device)
SAM的函数字典如下
sam_model_registry = {
'default':build_sam_vit_h,
'vit_h':build_sam_vit_h,
'vit_l':build_sam_vit_l,
'vit_b':build_sam_vit_b
}
SAM函数字典中对应的函数如下
def build_sam_vit_h(checkpoint=None):
return _build_sam(
encoder_embed_dim=1280, #l系列模型为1024,b系列模型为768
encoder_depth=32,
encoder_num_heads=16,
encoder_global_attn_indexes=[7,15,23,31],
checkpoint = checkpoint
)
不同系列模型参数参照本文章,最后通过_build_sam函数完成模型的初始化与权重加载
https://blog.csdn.net/yangyu0515/article/details/130319437
【注】函数/类字典及其调用方法,Python支持将函数/类保存在字典中,并通过func[]()的形式调用函数/类字典中的函数/构造方法

浙公网安备 33010602011771号