jsis3d


JSIS3D 论文学习记录

论文地址:

环境准备

  • CUDA 10
  • Python 3.5+
  • Pytorch 0.4.0+

Installation

首先需要编译MV-CRF,在下载的文件根目录中运行一下命令:

    cd external/densecrf
    mkdir build
    cd build
    cmake -D CMAKE_BUILD_TYPE=Release ..
    make
    cd ../../.. # You should be at the root folder here
    make

Dataset

  1. 如果想自己准备数据集:
  • 数据集准备,JSIS3D论文使用的是开源的S3DIS数据集,所以需要下载S3DIS数据集,这个数据集下载之后大约4个G,解压之后16G。
  • data/s3dis文件夹下创建rawprocessed两个空文件夹用于存放原始数据和处理的过程数据
  • 创建完rawprocessed两个空文件夹之后,将我们下载的S3DIS数据集解压之后放入raw文件夹下
  • 进入根目录下的script文件夹中,里面包含四个py文件,先运行collect_annotations.py文件,之后再运行prepare_h5.py
  • 运行prepare_h5.py文件时,首先需要修改文件中91行的代码,将其中num_points改成4096,这是根据pointnet作者代码设置的参数进行设置的
  • 运行完prepare_h5.py文件之后,接着运行estimate_mean_size.pyestimate_median_freq.py文件,数据集这样就制作完毕了。
  1. 如果想使用作者提供的数据集:
  • 作者提供了已经处理好的S3DIS数据集,文件地址
  • 下载了作者的数据集之后,将解压后的数据集放入data/s3dis/h5即可

Training & Evaluation

准备数据集之后,开始训练数据:

    python train.py --config configs/s3dis.json --logdir logs/s3dis

数据训练完成之后,模型相关的数据将会放在logs/s3dis文件夹下。

运行训练完的模型进行预测:

    python pred.py --logdir logs/s3dis --mvcrf

预测代码运行之后,会在logs/s3dis文件夹下生成pred.npz文件,之后想要对预测的结果进行可视化以及评价精度,运行以下代码:

    python eval.py --logdir logs/s3dis --visualize

运行完以上代码之后,将会在logs/s3dis文件夹中,生成ply文件,运用相关程序打开ply文件可以,发现里面有各个点运行的class和label信息。本文结合open3dplyfile两个python库,对ply文件进行了处理与可视化,代码如下:

    import open3d as o3d
    import numpy as np
    from plyfile import PlyData, PlyElement
    plydata = PlyData.read(
        r'F:\python_work\open3d_work\Area_5_conferenceRoom_1.ply')
    pc = plydata['vertex'].data
    pcd_array = []
    for i in range(pc.size):
        pcd_array.append(list(pc[i]))
    pcd_array = np.array(pcd_array)
    colors=pcd_array[:, 3:6]
    class_label = pcd_array[:, 6]
    t=class_label.tolist()
    s=set(t)
    class_label_pro = list(s)
    colors_list=[[152, 0, 0],[255, 0, 0],[255, 153, 0],[255, 255, 0],[0, 255, 0],[0, 255, 255],[74, 134, 232],[0, 0, 255],[255, 0, 255],[230, 184, 175],[252, 229, 205],[208, 224, 227],[221, 126, 107]]
    for i in range(class_label.size):
        colors[i]=colors_list[class_label_pro.index(class_label[i])]
    pointcloud = o3d.geometry.PointCloud()
    pointcloud.points = o3d.utility.Vector3dVector(pcd_array[:, 0:3])
    pointcloud.colors = o3d.utility.Vector3dVector(colors/255)
    o3d.io.write_point_cloud("copy_of_fragment.pcd", pointcloud)
    o3d.visualization.draw_geometries([pointcloud])
    print('ok')

针对以上代码可以在理解的基础上进行修改。结果图展示:

结果图
数据图

注意:论文中针对S3DIS数据集,以区域1,2,3,4,6作为训练集,区域5作为测试集


文章作者: Fanrencli
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Fanrencli !
  目录