已移至 https://github.com/isl-org/Open3D-ML
使用Open3D和PointNet++进行Semantic3D语义分割
简介
这是一个使用Open3D和PointNet++进行Semantic3D(semantic-8)分割的演示项目。该项目旨在展示Open3D在深度学习流程中的应用,并为Semantic3D数据集的语义分割提供一个简洁的基准实现。这是我们在semantic-8测试基准页面上的参赛作品。
Open3D是一个开源库,支持快速开发处理3D数据的软件。Open3D前端以C++和Python两种语言提供了一组精心选择的数据结构和算法。后端经过高度优化,并为并行化做好了准备。我们欢迎开源社区的贡献。
在本项目中,Open3D用于:
- 点云数据的加载、写入和可视化。Open3D提供了各种点云操作方法的高效实现。
- 数据预处理,特别是基于体素的下采样。
- 点云插值,特别是用于标签插值的快速最近邻搜索。
- 以及更多用途。
本项目源自Mathieu Orhan和Guillaume Dekeyser的仓库,该仓库又源自原始的PointNet2。我们感谢原作者分享他们的方法。
使用方法
1. 下载
下载Semantic3D数据集并通过运行以下命令解压:
cd dataset/semantic_raw
bash download_semantic3d.sh
Open3D-PointNet2-Semantic3D/dataset/semantic_raw
├── bildstein_station1_xyz_intensity_rgb.labels
├── bildstein_station1_xyz_intensity_rgb.txt
├── bildstein_station3_xyz_intensity_rgb.labels
├── bildstein_station3_xyz_intensity_rgb.txt
├── ...
2. 将txt转换为pcd文件
运行
python preprocess.py
Open3D能够更高效地读取.pcd
文件。
Open3D-PointNet2-Semantic3D/dataset/semantic_raw
├── bildstein_station1_xyz_intensity_rgb.labels
├── bildstein_station1_xyz_intensity_rgb.pcd(新增)
├── bildstein_station1_xyz_intensity_rgb.txt
├── bildstein_station3_xyz_intensity_rgb.labels
├── bildstein_station3_xyz_intensity_rgb.pcd(新增)
├── bildstein_station3_xyz_intensity_rgb.txt
├── ...
3. 下采样
运行
python downsample.py
下采样后的数据集将被写入dataset/semantic_downsampled
。在下采样过程中,标签为0(未标记)的点将被排除。
Open3D-PointNet2-Semantic3D/dataset/semantic_downsampled
├── bildstein_station1_xyz_intensity_rgb.labels
├── bildstein_station1_xyz_intensity_rgb.pcd
├── bildstein_station3_xyz_intensity_rgb.labels
├── bildstein_station3_xyz_intensity_rgb.pcd
├── ...
4. 编译TF操作
我们需要在tf_ops
中构建TF内核。首先,激活虚拟环境并确保当前Python能找到TF。以下命令应能无错误运行。
python -c "import tensorflow as tf"
然后构建TF操作。您需要CUDA和CMake 3.8+。
cd tf_ops
mkdir build
cd build
cmake ..
make
编译后,以下.so
文件应位于build
目录中。
Open3D-PointNet2-Semantic3D/tf_ops/build
├── libtf_grouping.so
├── libtf_interpolate.so
├── libtf_sampling.so
├── ...
通过运行以下命令验证TF内核是否正常工作:
cd .. # 现在我们位于Open3D-PointNet2-Semantic3D/tf_ops
python test_tf_ops.py
5. 训练
运行
python train.py
默认情况下,训练集将用于训练,验证集将用于验证。要同时使用训练集和验证集进行训练,请使用--train_set=train_full
标志。检查点将输出到log/semantic
。
6. 预测
选择一个检查点并运行predict.py
脚本。预测数据集由--set
配置。由于PointNet2每次前向传播只能处理几千个点,我们需要从预测数据集中多次采样以获得良好的点覆盖。每个样本包含PointNet2所需的几千个点。要指定每个场景的此类样本数,请使用--num_samples
标志。
python predict.py --ckpt log/semantic/best_model_epoch_040.ckpt \
--set=validation \
--num_samples=500
预测结果将写入result/sparse
。
Open3D-PointNet2-Semantic3D/result/sparse
├── sg27_station4_intensity_rgb.labels
├── sg27_station4_intensity_rgb.pcd
├── sg27_station5_intensity_rgb.labels
├── sg27_station5_intensity_rgb.pcd
├── ...
7. 插值
最后一步是将稀疏预测插值到完整点云。我们使用Open3D的K-NN混合搜索,并指定半径。
python interpolate.py
预测结果将写入result/dense
。
Open3D-PointNet2-Semantic3D/result/dense
├── sg27_station4_intensity_rgb.labels
├── sg27_station5_intensity_rgb.labels
├── ...
8. 提交
最后,如果您要提交到Semantic3D基准测试,我们提供了一个方便的工具来重命名提交文件名。
python renamer.py
目录摘要
dataset/semantic_raw
:原始Semantic3D数据,包含.txt和.labels文件。还包含由preprocess.py
生成的.pcd文件。dataset/semantic_downsampled
:由downsample.py
生成。下采样数据,包含.pcd和.labels文件。result/sparse
:由predict.py
生成。稀疏预测,包含.pcd和.labels文件。result/dense
:密集预测,包含.labels文件。result/dense_label_colorized
:密集预测,点按标签类型着色。