1.下载
下载数据集Semantic3D并通过运行以下命令将其提取:
cd数据集/ semantic_raw。
bash download_semantic3d.sh
Open3D-PointNet2-Semantic3D /数据集/ 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
├──…
当然你也可以直接在数据集的官方下载,一共30个数据集,对该数据集不了解的可看我之前的博客Semantic3D介绍。
2.将txt转换为pcd文件
python preprocess.py
Open3D能够更有效地读取.pcd文件。
open3d提供了read_point_cloud()和write_point_cloud()函数进行数据集的读写。对open3d函数的学习可看我的open3d教程学习
代码修改:
point_cloud = open3d.read_point_cloud(pts_file)
open3d.write_point_cloud(pcd_file, point_cloud)
改成:
point_cloud = open3d.io.read_point_cloud(pts_file)
open3d.io.write_point_cloud(pcd_file, point_cloud)
代码实现过程:
Semantic数据集的格式为(x,y,z,i,r,g,b),这种点云数据格式为pts格式,现存在txt文件中,首先打开txt文件,每行逐行写进pts文件中,再利用open3d写进pcd文件中。
Open3D-PointNet2-Semantic3D /数据集/ 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(未标记)的点。
代码实现过程:
30个数据集全部进行下采样,0标签没有真实地面,不应该用于训练,故此先对训练集排除标签0采样。再利用open3d中的voxel_down_sample_and_trace()进行体素下的采样,设置体素大小。
由于我没有看到open3d的voxel_down_sample_and_trace()的源码,对于该函数的如何实现我不知道,如果有朋友知晓,请务必帮我解惑,谢谢~
Open3D-PointNet2-Semantic3D /数据集/ 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 Ops
我们需要在tf_ops中构建TF内核。首先,激活virtualenv并确保可以在当前python中找到TF。下一行应无错误运行。
python -c “import tensorflow as tf”
Then build TF ops. You’ll need CUDA and CMake 3.8+.
cd tf_ops
mkdir build
cd build
cmake …
make
After compilation the following .so files shall be in the build directory.
在这个部分,我没有编译成功,提示找不到Open3d的位置,我直接将pointnet++中编译好的三个.so文件复制到build文件夹可成功运行直到预测代码,但原作者在插值部分增加了一个label和color插值的部分,没法运行,故此最后的interpolate没有办法运行。
5.训练
python train.py
默认情况下,训练集将用于训练,而验证集将用于验证。要同时使用训练和验证集进行训练,请使用–train_set = train_full标志。检查点将输出到日志/语义。
6.预测
选择一个检查点并运行predict.py脚本。预测数据集由–set配置。由于PointNet2每向前通过仅获取几千个点,因此我们需要多次从预测数据集中进行采样,以很好地覆盖这些点。每个样本都包含PointNet2所需的几千个点。要指定每个场景中此类样本的数量,请使用–num_samples标志。
python Forecast.py
–ckpt日志/语义/best_model_epoch_040.ckpt
–set =验证
–num_samples = 500
预测结果将写入结果/稀疏。
Open3D-PointNet2-Semantic3D /结果/稀疏
├──sg27_station4_intensity_rgb.labels
├──sg27_station4_intensity_rgb.pcd
├──sg27_station5_intensity_rgb.labels
├──sg27_station5_intensity_rgb.pcd
├──…
效果展示
可在xianyu搜索标题提供代码