PointCNN

yangyanli更新放缓

PointCNN 提出 X-变换卷积算子,直接在无序点云上做特征学习,可用于三维点云分类和分割,服务于自动驾驶、机器人等场景。

PointCNN: Convolution On X-Transformed Points (NeurIPS 2018)

v1.0发布于 2018-10-25 01:52 UTC1,436star358fork同步于 2026-11-07 07:30 UTC

怎么上手

由 README 提炼,执行前请确认
cd data_conversions && python3 ./download_datasets.py -d modelnet
cd ../pointcnn_cls && ./train_val_modelnet.sh -g 0 -x modelnet_x3_l4
硬件要求按 README 说明

README 未说明显存要求;训练脚本用 -g 指定 GPU 编号,quick_draw 数据集需大内存,Semantic3D 需约 900 GB 磁盘空间

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

NeurIPS 2018 的 PointCNN 官方 TensorFlow 实现,用于点云分类与分割的特征学习

PointCNN 提出 X-变换卷积算子,直接在无序点云上做特征学习,可用于三维点云分类和分割,服务于自动驾驶、机器人等场景。

核心能力

  • 用 X-Conv 在 X 变换后的点上做卷积
  • 提供分类与分割两类任务的完整训练脚本
  • 内置 ModelNet40、ScanNet、S3DIS 等数据集准备脚本
  • 分割任务用 PointNet++ 的 FPS 采样并需先编译
  • 超参数按数据集写在 pointcnn_cls/pointcnn_seg 配置中

容易踩的坑

基于 TensorFlow 1.6,低于 1.5 的版本因 API 不推荐;分割任务训练前须先 cd sampling && bash tf_sampling_compile.sh 编译 FPS;预训练模型需从 OneDrive 链接单独下载,ScanNet 等数据也要自行按官方流程获取

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

1 个版本v1.0
  1. v1.0NIPS 2018 Release最新正式版2018-10-25 · 2018-10-25 01:52 UTC

    The release is corresponding to our NIPS 2018 paper: https://arxiv.org/abs/1801.07791

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    PointCNN: Convolution On X-Transformed Points

    Created by Yangyan Li, Rui Bu, Mingchao Sun, Wei Wu, Xinhan Di, and Baoquan Chen.

    🚀 Exciting Update: Introducing PointCNN++

    We are thrilled to share our most recent work, PointCNN++! Building upon the foundations laid here, PointCNN++ features our latest architectural advancements, modernized codebase, and improved performance for point cloud processing.

    We highly encourage researchers and developers to check out the new repository for state-of-the-art results and ongoing development.

    Introduction

    PointCNN is a simple and general framework for feature learning from point cloud, which refreshed five benchmark records in point cloud processing (as of Jan. 23, 2018), including:

    • classification accuracy on ModelNet40 (91.7%, with 1024 input points only)
    • classification accuracy on ScanNet (77.9%)
    • segmentation part averaged IoU on ShapeNet Parts (86.13%)
    • segmentation mean IoU on S3DIS (65.39%)
    • per voxel labelling accuracy on ScanNet (85.1%)

    See our preprint on arXiv (accepted to NeurIPS 2018) for more details.

    Pretrained models can be downloaded from here.

    Performance on Recent Benchmarks

    Revisiting Point Cloud Classification: A New Benchmark Dataset and Classification Model on Real-World Data

    PartNet: A Large-scale Benchmark for Fine-grained and Hierarchical Part-level 3D Object Understanding

    ABC: A Big CAD Model Dataset For Geometric Deep Learning

    Practical Applications

    3D cities: Deep Learning in three-dimensional space (from Esri)

    PointCNN: replacing 50,000 man hours with AI (from Esri)

    More Implementations

    • Pytorch implementation from PyTorch Geometric
    • Pytorch implementation from Berkeley CS294-131 Course Proj
    • MXNet implementation
    • Jittor implementation

    We highly welcome issues, rather than emails, for PointCNN related questions.

    License

    Our code is released under MIT License (see LICENSE file for details).

    Code Organization

    The core X-Conv and PointCNN architecture are defined in pointcnn.py.

    The network/training/data augmentation hyper parameters for classification tasks are defined in pointcnn_cls, for segmentation tasks are defined in pointcnn_seg.

    Explanation of X-Conv and X-DeConv Parameters

    Take the xconv_params and xdconv_params from shapenet_x8_2048_fps.py for example:

    xconv_param_name = ('K', 'D', 'P', 'C', 'links')
    xconv_params = [dict(zip(xconv_param_name, xconv_param)) for xconv_param in
                    [(8, 1, -1, 32 * x, []),
                     (12, 2, 768, 32 * x, []),
                     (16, 2, 384, 64 * x, []),
                     (16, 6, 128, 128 * x, [])]]
    
    xdconv_param_name = ('K', 'D', 'pts_layer_idx', 'qrs_layer_idx')
    xdconv_params = [dict(zip(xdconv_param_name, xdconv_param)) for xdconv_param in
                     [(16, 6, 3, 2),
                      (12, 6, 2, 1),
                      (8, 6, 1, 0),
                      (8, 4, 0, 0)]]
    

    Each element in xconv_params is a tuple of (K, D, P, C, links), where K is the neighborhood size, D is the dilation rate, P is the representative point number in the output (-1 means all input points are output representative points), and C is the output channel number. The links are used for adding DenseNet style links, e.g., [-1, -2] will tell the current layer to receive inputs from the previous two layers. Each element specifies the parameters of one X-Conv layer, and they are stacked to create a deep network.

    Each element in xdconv_params is a tuple of (K, D, pts_layer_idx, qrs_layer_idx), where K and D have the same meaning as that in xconv_params, pts_layer_idx specifies the output of which X-Conv layer (from the xconv_params) will be the input of this X-DeConv layer, and qrs_layer_idx specifies the output of which X-Conv layer (from the xconv_params) will be forwarded and fused with the output of this X-DeConv layer. The P and C parameters of this X-DeConv layer is also determined by qrs_layer_idx. Similarly, each element specifies the parameters of one X-DeConv layer, and they are stacked to create a deep network.

    PointCNN Usage

    PointCNN is implemented and tested with Tensorflow 1.6 in python3 scripts. Tensorflow before 1.5 version is not recommended, because of API. It has dependencies on some python packages such as transforms3d, h5py, plyfile, and maybe more if it complains. Install these packages before the use of PointCNN.

    If you can only use Tensorflow 1.5 because of OS factor(UBUNTU 14.04),please modify "isnan()" to "std::nan()" in "/usr/local/lib/python3.5/dist-packages/tensorflow/include/tensorflow/core/framework/numeric_types.h" line 49

    Here we list the commands for training/evaluating PointCNN on classification and segmentation tasks on multiple datasets.

    • Classification

      • ModelNet40

      cd data_conversions
      python3 ./download_datasets.py -d modelnet
      cd ../pointcnn_cls
      ./train_val_modelnet.sh -g 0 -x modelnet_x3_l4
      
      • ScanNet

      Please refer to http://www.scan-net.org/ for downloading ScanNet task data and scannet_labelmap, and refer to https://github.com/ScanNet/ScanNet/tree/master/Tasks/Benchmark for downloading ScanNet benchmark files:

      scannet_dataset_download

      |_ data

      |_ scannet_labelmap

      |_ benchmark

      cd ../data/scannet/scannet_dataset_download/
      mv ./scannet_labelmap/scannet-labels.combined.tsv ../benchmark/
      
      #./pointcnn_root
      cd ../../../pointcnn/data_conversions
      python extract_scannet_objs.py -f ../../data/scannet/scannet_dataset_download/data/ -b ../../data/scannet/scannet_dataset_download/benchmark/ -o ../../data/scannet/cls/
      python prepare_scannet_cls_data.py -f ../../data/scannet/cls/
      cd ../pointcnn_cls/
      ./train_val_scannet.sh -g 0 -x scannet_x3_l4
      
      • tu_berlin

      cd data_conversions
      python3 ./download_datasets.py -d tu_berlin
      python3 ./prepare_tu_berlin_data.py -f ../../data/tu_berlin/ -a --create-train-test
      cd ../pointcnn_cls
      ./train_val_tu_berlin.sh -g 0 -x tu_berlin_x3_l4
      
      • quick_draw

      Note that the training/evaluation of quick_draw requires LARGE RAM, as we load all stokes into RAM and converting them into point cloud on-the-fly.

      cd data_conversions
      python3 ./download_datasets.py -d quick_draw
      cd ../pointcnn_cls
      ./train_val_quick_draw.sh -g 0 -x quick_draw_full_x2_l6
      
      • MNIST

      cd data_conversions
      python3 ./download_datasets.py -d mnist
      python3 ./prepare_mnist_data.py -f ../../data/mnist
      cd ../pointcnn_cls
      ./train_val_mnist.sh -g 0 -x mnist_x2_l4
      
      • CIFAR-10

      cd data_conversions
      python3 ./download_datasets.py -d cifar10
      python3 ./prepare_cifar10_data.py
      cd ../pointcnn_cls
      ./train_val_cifar10.sh -g 0 -x cifar10_x3_l4
      
    • Segmentation

      We use farthest point sampling (the implementation from PointNet++) in segmentation tasks. Compile FPS before the training/evaluation:

      cd sampling
      bash tf_sampling_compile.sh
      
      • ShapeNet

      cd data_conversions
      python3 ./download_datasets.py -d shapenet_partseg
      python3 ./prepare_partseg_data.py -f ../../data/shapenet_partseg
      cd ../pointcnn_seg
      ./train_val_shapenet.sh -g 0 -x shapenet_x8_2048_fps
      ./test_shapenet.sh -g 0 -x shapenet_x8_2048_fps -l ../../models/seg/pointcnn_seg_shapenet_x8_2048_fps_xxxx/ckpts/iter-xxxxx -r 10
      cd ../evaluation
      python3 eval_shapenet_seg.py -g ../../data/shapenet_partseg/test_label -p ../../data/shapenet_partseg/test_data_pred_10 -a
      
      • S3DIS

      Please refer to data_conversions for downloading S3DIS, then:

      cd data_conversions
      python3 prepare_s3dis_label.py
      python3 prepare_s3dis_data.py
      python3 prepare_s3dis_filelists.py
      mv S3DIS_files/* ../../data/S3DIS/out_part_rgb/
      ./train_val_s3dis.sh -g 0 -x s3dis_x8_2048_fps -a 1
      ./test_s3dis.sh -g 0 -x s3dis_x8_2048_fps -a 1 -l ../../models/seg/s3dis_x8_2048_fps_xxxx/ckpts/iter-xxxxx -r 4
      cd ../evaluation
      python3 s3dis_merge.py -d <path to *_pred.h5>
      python3 eval_s3dis.py
      

    We use a hidden marker file to note when prepare is finished to avoid re-processing. This cache can be invalidated by deleting the markers.

    Please notice that these command just for Area 1 (specified by -a 1 option) validation. Results on other Areas can be computed by iterating -a option.

    • ScanNet

    Please refer to data_conversions for downloading ScanNet, then:

    cd data_conversions
    python3 prepare_scannet_seg_data.py
    python3 prepare_scannet_seg_filelists.py
    cd ../pointcnn_seg
    ./train_val_scannet.sh -g 0 -x scannet_x8_2048_k8_fps
    ./test_scannet.sh -g 0 -x scannet_x8_2048_k8_fps -l ../../models/seg/pointcnn_seg_scannet_x8_2048_k8_fps_xxxx/ckpts/iter-xxxxx -r 4
    cd ../evaluation
    python3 eval_scannet.py -d <path to *_pred.h5> -p <path to scannet_test.pickle>
    
    • Semantic3D

    Please check the free disk space before start, about 900 GB will be required.

    cd data_conversions
    bash download_semantic3d.sh
    bash un7z_semantic3d.sh
    python3 prepare_semantic3d_data.py
    mkdir ../../data/semantic3d/filelists
    python3 prepare_semantic3d_filelists.py
    cd ../pointcnn_seg
    ./train_val_semantic3d.sh -g 0 -x semantic3d_x4_2048_fps
    ./test_semantic3d.sh -g 0 -x semantic3d_x4_2048_fps -l <path to ckpt>
    cd ../evaluation
    python3 semantic3d_merge.py -d <path to *_pred.h5> -v <reduced or full>
    
    • Tensorboard

      If you want to monitor your train step, we recommend you use the following command
      cd <your path>/PointCNN
      tensorboard --logdir=../models/<seg/cls> <--port=6006>