从零部署点云实例分割项目Mask3D

一、下载

论文地址:arxiv.org/pdf/2210.03105v2.pdf

Github地址:GitHub - JonasSchult/Mask3D: Mask3D predicts accurate 3D semantic instances achieving state-of-the-art on ScanNet, ScanNet200, S3DIS and STPLS3D.

二、环境配置

export TORCH_CUDA_ARCH_LIST="6.0 6.1 6.2 7.0 7.2 7.5 8.0 8.6"

conda create -n mask3d python=3.10.9
conda activate mask3d

pip3 install torch==1.12.1+cu113 torchvision==0.13.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113
pip3 install torch-scatter -f https://data.pyg.org/whl/torch-1.12.1+cu113.html
pip3 install 'git+https://github.com/facebookresearch/detectron2.git@710e7795d0eeadf9def0e7ef957eea13532e34cf' --no-deps

pip install pytorch-lightning==1.7.2
pip install tensorboard
pip install loguru
pip install natsort
pip install fire
pip install scikit-learn
pip install scikit-image
pip install numpy==1.23.5            # 高于24会有np.int的不兼容
pip install hydra-core==1.0.5        # 安装了高版本的之后,训练的时候会报错
pip install pillow==9.5.0            # 如已有较高版本,需要降版本
pip install torchmetrics==0.11.4     # 如已有较高版本,需要降版本
pip install matplotlib
pip install pyviz3d
pip install python-dotenv
pip install plyfile
pip install trimesh
pip install wandb==0.15.0
pip install pyyaml==5.4.1
pip install fvcore
pip install cloudpickle
pip install pycocotools
pip install albumentations==1.2.1
pip install -U git+https://github.com/kumuji/volumentations
pip install volumentations --no-build-isolation
pip uninstall pip uninstall importlib-metadata        # 不卸载后面会一直报错…


# MinkowskiEngine
cd third_party
git clone --recursive "https://github.com/NVIDIA/MinkowskiEngine"
cd MinkowskiEngine
git checkout 02fc608bea4c0549b0a7b00ca1bf15dee4a0b228
python setup.py install --force_cuda --blas=openblas

# pointnet2
cd ..
cd pointnet2
python setup.py install
cd ../..



三、数据准备

下载 Stanford3dDataset_v1.2数据集,网盘可参考

S3DIS场景点云数据集_s3dis/stanford3ddataset_v1.2_aligned_version-优快云博客

mkdir data

# 将下载的数据集放在data目录下

unzip Stanford3dDataset_v1.2

python -m datasets.preprocessing.s3dis_preprocessing preprocess \
--data_dir="./data/Stanford3dDataset_v1.2" \
--save_dir="./data/processed/s3dis"

预处理后数据解析】:

 processed/s3dis下

Area_1/conferenceRoom_1.npy文件:arr.shape为(N, 12),N为conferenceRoom_1这个房间的点总个数,12分别是points.coord三位,points.color三位,points.normal三位(且均为1),填充一位(代码中提到add segment id as addtional feature),points.semantic_label(语义标签)一位,points.instance_label(实例标签)一位,共12位。

instance_gt/Area_1/conferenceRoom_1.txt文件:arr.shape为(N, 1),N为conferenceRoom_1这个房间的点总个数,存放着这个房间所有点的标签值(计算方式=(语义标签+1)*1000 + 实例标签 +1,例如3001=(2+1)*1000 + 2 + 1)

Area_1_database.yaml文件:存放着Area_1区域下每一个场景房间的信息,例如该场景的颜色均值、颜色方差、点云个数、点云路径、场景名称等。

Area_1_color_mean_std.yaml文件 :存放着Area_1区域下颜色均值、颜色方差。

Area_1_database.yaml_color_mean_std.yaml文件:同上。

label_database.yaml文件:存放着所有语义标签的信息,包含标签号,颜色,名称,是否有效。

train_Area_1_database.yaml文件:存放着除了Area_1之外的几个区域下的每个场景房间的信息。(不太明白这样设计的意义何在…)

四、代码分析

Dataset——SemanticSegmentationDataset

Dataloader——torch.utils.data.DataLoader

Model——Mask3D

Optimizer——torch.optim.AdamW

Scheduler——torch.optim.lr_scheduler.OneCycleLR

Loss——SetCriterion

五、训练流程分析

1.命令

python main_instance_segmentation.py \
  general.project_name="s3dis" \
  general.experiment_name="area5_from_scratch" \
  data.batch_size=1 \
  data/datasets=s3dis \
  general.num_targets=14 \
  data.num_labels=13 \
  trainer.max_epochs=1001 \
  general.area=5 \
  trainer.check_val_every_n_epoch=10

2.流程剖析

 数据经由SemanticSegmentationDataset类的__getitem__之后,会经过train_dataloader的collate_fn——本项目为VoxelizeCollate类

注意:collate_fn参数用于指定如何将多个样本合并成一个批次数据。collate_fn是一个可调用对象,接受一个样本列表作为输入,并返回一个合并后的批次数据。

<think>嗯,用户现在想用Depth mask 3D diffusion模型进行3D重组,需要具体的步骤和完整代码。首先,我需要理解用户已经做了什么。他们用cameractrl生成视频,然后通过OpenCV切分成关键帧图片,构建了一个包含三个动物类别的小型数据集。接着用YOLOv8和SAM做了检测分割,生成mask,还用MiDaS生成了深度图。现在下一步是3D重组,用户需要实现步骤和代码。 首先,我得确认Depth mask 3D diffusion模型是什么。可能是指利用深度图和mask进行3D重建的扩散模型?或者是一个结合了深度信息和扩散模型的3D生成方法?可能用户指的是像Zero-1-to-3这样的项目,它利用单张图片和深度信息生成3D模型。或者可能是其他类似的工作,比如3D Diffusion模型,将2D图像转为3D结构。 接下来,用户的数据结构是怎样的?图片存放在子文件夹中,分辨率都是384x256。需要确认每个样本对应的RGB图、mask、深度图是否对应正确,路径结构是否一致。可能每个类别的子文件夹里包含对应的图像,或者不同的子文件夹分别存放原图、mask、深度图。这部分可能需要用户整理好数据路径,方便后续读取。 然后是具体的步骤。通常3D重建的流程可能包括数据预处理、模型选择与置、数据加载、模型训练或推理、后处理生成3D网格或点云。如果使用预训练的Depth mask 3D diffusion模型,可能需要加载预训练权重,输入RGB图、mask和深度图,输出3D结构。但具体模型的结构和输入输出需要明确。 假设用户使用的是类似Zero-1-to-3这样的模型,步骤可能包括安装依赖库,准备数据,调整输入格式,运行推理代码生成新视角的图像,然后使用这些图像进行3D重建,比如通过NeRF或其他方法生成3D模型。但用户提到的是Depth mask 3D diffusion,可能需要结合深度和mask信息进行扩散过程,生成3D结构。 另外,用户可能需要将现有的RGB图、mask和深度图作为输入,通过扩散模型生成3D模型。这时候可能需要一个能够处理多模态输入的模型,或者分步骤处理,比如先利用深度图生成点云,再通过扩散模型优化,或者直接使用扩散模型生成3D体素或网格。 现在,我需要考虑代码部分。由于具体的Depth mask 3D diffusion模型可能没有现成的标准实现,可能需要参考相关论文或开源项目。例如,Hugging Face的Diffusers库可能提供相关模型,或者GitHub上的某些项目。假设用户参考的是某个特定项目,可能需要按照其文档进行步骤调整。 可能的实现步骤: 1. 环境置:安装必要的库,如PyTorch, Diffusers, Open3D, NumPy等。 2. 数据预处理:确保RGB、mask、深度图对齐,可能需要归一化或调整尺寸。 3. 加载预训练模型:如加载Diffusion模型,置参数。 4. 数据加载器:读取图像数据,组织成模型需要的输入格式。 5. 模型推理:输入RGB、mask和深度图,生成3D表示(如点云、体素、网格)。 6. 后处理:将输出转换为可视化的3D格式,保存结果。 7. 可视化:使用如Open3D或Mayavi进行3D渲染。 但具体代码需要根据所选模型来定。例如,如果使用Zero-1-to-3,代码可能涉及加载模型,生成新视角,然后用NeRF训练。或者使用其他库如Kaolin、PyTorch3D进行处理。 由于用户没有指定具体模型,可能需要假设一个通用的流程,或者提示用户明确模型来源。但用户可能期望一个具体的示例代码,所以可能需要基于类似的工作给出代码框架,比如使用Diffusers库中的Pipeline,或者自定义模型。 可能的代码结构包括数据加载部分,模型初始化,前向传播,保存结果。同时需要注意路径处理,确保每个图像对应的mask和深度图正确对。 另外,用户的数据是384x256的分辨率,可能需要调整模型输入尺寸,或者对图像进行resize。此外,不同模型的输入要求可能不同,比如是否需要归一化到特定范围,通道顺序等。 总结步骤: 1. 安装依赖库 2. 数据准备与预处理 3. 加载预训练Depth mask 3D diffusion模型 4. 运行推理生成3D数据 5. 后处理与可视化 代码示例可能需要使用PyTorch,加载模型,处理输入,生成输出。但具体实现需要依据模型结构,因此可能需要用户参考特定项目的文档。这里可能需要提供一个通用框架,并建议用户根据具体模型调整。 最后,需要提醒用户注意路径的正确性,库版本的兼容性,以及可能的显存限制。此外,如果模型需要训练,用户可能需要微调,但更可能的是使用预训练模型进行推理。</think>以下为基于Depth Mask 3D Diffusion模型进行3D重组的具体步骤及核心代码框架: --- ### **一、环境准备** ```python # 必需库清单(需提前安装) !pip install torch torchvision open3d diffusers transformers numpy Pillow ``` --- ### **二、数据预处理** #### 1. 数据结构规范 建议按如下目录结构组织: ``` dataset/ ├─ class1/ │ ├─ rgb/ # 原始RGB图像 │ ├─ mask/ # SAM生成的掩码 │ └─ depth/ # MiDaS生成的深度图 ├─ class2/ └─ class3/ ``` #### 2. 数据对齐校验代码 ```python import os from PIL import Image def validate_data(root_path): for class_dir in os.listdir(root_path): rgb_path = os.path.join(root_path, class_dir, "rgb") mask_path = os.path.join(root_path, class_dir, "mask") depth_path = os.path.join(root_path, class_dir, "depth") # 检查文件数量一致性 assert len(os.listdir(rgb_path)) == len(os.listdir(mask_path)) == len(os.listdir(depth_path)), "文件数量不匹" # 检查分辨率一致性 for fname in os.listdir(rgb_path): rgb = Image.open(os.path.join(rgb_path, fname)) mask = Image.open(os.path.join(mask_path, fname)) depth = Image.open(os.path.join(depth_path, fname)) assert rgb.size == (384, 256), f"分辨率错误: {fname}" assert mask.size == rgb.size and depth.size == rgb.size, f"尺寸不匹: {fname}" ``` --- ### **三、3D扩散模型实现** #### 1. 核心推理代码框架 ```python import torch from diffusers import DiffusionPipeline from torchvision import transforms class DepthFusion3D: def __init__(self, model_name="stabilityai/3d-diffusion"): self.device = "cuda" if torch.cuda.is_available() else "cpu" self.pipeline = DiffusionPipeline.from_pretrained(model_name).to(self.device) self.transform = transforms.Compose([ transforms.Resize((256, 384)), transforms.ToTensor(), ]) def load_data(self, rgb_path, mask_path, depth_path): rgb = self.transform(Image.open(rgb_path)).unsqueeze(0) mask = self.transform(Image.open(mask_path)).unsqueeze(0) depth = self.transform(Image.open(depth_path)).unsqueeze(0) return torch.cat([rgb, mask, depth], dim=1).to(self.device) def generate_3d(self, input_tensor): with torch.no_grad(): output = self.pipeline( input_tensor, num_inference_steps=50, guidance_scale=7.5 ) return output["3d_output"] ``` #### 2. 批量处理代码 ```python def batch_process(root_path, output_dir): fusion = DepthFusion3D() os.makedirs(output_dir, exist_ok=True) for class_dir in os.listdir(root_path): class_path = os.path.join(root_path, class_dir) output_class_dir = os.path.join(output_dir, class_dir) os.makedirs(output_class_dir, exist_ok=True) rgb_files = sorted(os.listdir(os.path.join(class_path, "rgb"))) for idx, fname in enumerate(rgb_files): rgb_path = os.path.join(class_path, "rgb", fname) mask_path = os.path.join(class_path, "mask", fname) depth_path = os.path.join(class_path, "depth", fname) input_tensor = fusion.load_data(rgb_path, mask_path, depth_path) output_3d = fusion.generate_3d(input_tensor) # 保存为PLY点云格式 output_path = os.path.join(output_class_dir, f"3d_{idx}.ply") save_as_ply(output_3d, output_path) ``` --- ### **四、后处理与可视化** #### 1. 保存为3D格式文件 ```python import open3d as o3d def save_as_ply(tensor, filename): # 假设输出张量为[N,3]点云 pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(tensor.cpu().numpy()) o3d.io.write_point_cloud(filename, pcd) ``` #### 2. 可视化代码 ```python def visualize_3d(ply_path): pcd = o3d.io.read_point_cloud(ply_path) o3d.visualization.draw_geometries([pcd]) ``` --- ### **五、执行流程** ```python if __name__ == "__main__": # 1. 数据校验 validate_data("dataset") # 2. 批量生成3D模型 batch_process("dataset", "3d_output") # 3. 可视化样例 visualize_3d("3d_output/class1/3d_0.ply") ``` --- ### **六、注意事项** 1. **模型选择**:实际应替换`stabilityai/3d-diffusion`为具体使用的Depth Mask 3D Diffusion模型名称 2. **显存需求**:批量处理时需注意显存限制,建议使用`torch.cuda.empty_cache()` 3. **格式转换**:若需网格输出,可使用Poisson表面重建等算法进行后处理 4. **参数调优**:根据实际效果调整`num_inference_steps`和`guidance_scale`参数 建议参考具体使用的3D扩散模型官方文档进行参数细节调整。若需更完整的实现,建议提供具体模型论文或仓库链接以便进一步优化方案。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值