{"id":14970647,"url":"https://github.com/rubenwiersma/deltaconv","last_synced_at":"2025-10-07T17:08:57.133Z","repository":{"id":41559932,"uuid":"491469479","full_name":"rubenwiersma/deltaconv","owner":"rubenwiersma","description":"Code for the SIGGRAPH 2022 paper \"DeltaConv: Anisotropic Operators for Geometric Deep Learning on Point Clouds.\"","archived":false,"fork":false,"pushed_at":"2023-07-26T16:31:40.000Z","size":35041,"stargazers_count":143,"open_issues_count":0,"forks_count":10,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-09-05T23:24:24.296Z","etag":null,"topics":["differential-geometry","geometric-deep-learning","graph-learning","point-cloud","point-cloud-classification","point-cloud-segmentation","pytorch"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rubenwiersma.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2022-05-12T10:36:54.000Z","updated_at":"2025-06-14T20:59:03.000Z","dependencies_parsed_at":"2023-10-11T11:54:47.292Z","dependency_job_id":null,"html_url":"https://github.com/rubenwiersma/deltaconv","commit_stats":{"total_commits":37,"total_committers":1,"mean_commits":37.0,"dds":0.0,"last_synced_commit":"186fec369fa2ceb4559830bc421282dddb2300a2"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/rubenwiersma/deltaconv","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rubenwiersma%2Fdeltaconv","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rubenwiersma%2Fdeltaconv/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rubenwiersma%2Fdeltaconv/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rubenwiersma%2Fdeltaconv/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rubenwiersma","download_url":"https://codeload.github.com/rubenwiersma/deltaconv/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rubenwiersma%2Fdeltaconv/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278811851,"owners_count":26050183,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-07T02:00:06.786Z","response_time":59,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["differential-geometry","geometric-deep-learning","graph-learning","point-cloud","point-cloud-classification","point-cloud-segmentation","pytorch"],"created_at":"2024-09-24T13:43:55.389Z","updated_at":"2025-10-07T17:08:57.116Z","avatar_url":"https://github.com/rubenwiersma.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DeltaConv\n[[Paper]](https://rubenwiersma.nl/assets/pdf/DeltaConv.pdf) [[Project page]](https://rubenwiersma.nl/deltaconv) [[Replicability Stamp]](http://www.replicabilitystamp.org#https-github-com-rubenwiersma-deltaconv)\n\nCode for the SIGGRAPH 2022 paper \"[DeltaConv: Anisotropic Operators for Geometric Deep Learning on Point Clouds](https://arxiv.org/abs/2111.08799)\" by Ruben Wiersma, Ahmad Nasikun, Elmar Eisemann, and Klaus Hildebrandt.\n\nAnisotropic convolution is a central building block of CNNs but challenging to transfer to surfaces. DeltaConv learns combinations and compositions of operators from vector calculus, which are a natural fit for curved surfaces. The result is a simple and robust anisotropic convolution operator for point clouds with state-of-the-art results.\n\n![](img/deltaconv.png)\n\n*Top: unlike images, surfaces have no global coordinate system. Bottom: DeltaConv learns both scalar and vector features using geometric operators.* \n\n## Contents\n- [Installation](#installation)\n- [Replicating the experiments](#replicating-the-experiments)\n- [FAQ](#faq)\n- [Tests](#tests)\n- [Visualization](#visualization)\n- [Citation](#citations)\n\n## Installation\n1. Clone this repository:\n```bash\ngit clone https://github.com/rubenwiersma/deltaconv.git\n```\n\n2. Create a conda environment from the `environment.yml`:\n```bash\nconda env create -n deltaconv -f environment.yml\n```\n\nDone!\n\n### Manual installation\nIf you wish to install DeltaConv in your own environment, proceed as follows.\n\n1. Make sure that you have installed:\n    - Numpy - `pip install numpy`\n    - [PyTorch](https://pytorch.org/get-started/locally/) - see [instructions](https://pytorch-geometric.readthedocs.io/en/latest/notes/installation.html)\n    - [PyG](https://pytorch-geometric.readthedocs.io/en/latest/notes/installation.html) - `conda install pyg -c pyg`\n\n2. Install DeltaConv:\n```bash\npip install deltaconv\n```\n### Building DeltaConv for yourself\n1. Make sure you clone the repository with submodules:\n```bash\ngit clone --recurse-submodules https://github.com/rubenwiersma/deltaconv.git\n```\nIf you have already cloned the repository without submodules, you can fix it with `git submodule update --init --recursive`.\n\n2. Install from folder:\n```bash\ncd [root_folder]\npip install ./\n```\n\n\n## Replicating the experiments\nSee the README.md in `replication_scripts` for instructions on replicating the experiments and using the pre-trained weights (available in `experiments/pretrained_weights`).\n\nIn short, you can run bash scripts to replicate our experiments. For example, evaluating pre-trained weights on ShapeNet:\n```bash\ncd [root_folder]\nconda activate deltaconv\nbash replication_scripts/pretrained/shapenet.sh\n```\n\nYou can also directly run the python files in `experiments`:\n```bash\npython experiments/train_shapenet.py\n```\nUse the `-h` or `--help` flag to find out which arguments can be passed to the training script:\n```bash\npython experiments/train_shapenet.py -h\n```\n\nYou can keep track of the training process with tensorboard:\n```bash\ntensorboard --logdir=experiments/runs/shapenet_all\n```\n\n### Anisotropic Diffusion\nThe code that was used to generate Figure 2 from the paper and Figure 2 and 3 from the supplement is a notebook in the folder `experiments/anisotropic_diffusion`.\n\n## Data\nModelNet40, ShapeNet, SHREC, and human body shape segmentation automatically download the datasets from a public repository and place them in the correct folder. Note: this can take a while. The data for ScanObjectNN can be downloaded from the ScanObjectNN website: https://hkust-vgd.github.io/scanobjectnn/. Download and extract the files into `experiments/data/ScanObjectNN/raw`. The folder structure in `experiments/data/ScanObjectNN` should look like:\n```\nScanObjectNN\n└─── raw\n     └─── main_split\n     |    | train_objectdataset.h5\n     |    | test_objectdataset.h5\n     |    | ...\n     |\n     └─── main_split_nobg\n          | train_objectdataset.h5\n          | test_objectdataset.h5\n          | ...\n```\n\n## FAQ\n**Can I run these scripts with low GPU memory?**\nYes, you can reduce the memory requirements by changing some of the arguments for the train/test scripts. Some suggestions: reduce the batch size (e.g., 8: `--batch_size 8`), reduce the number of points (e.g., 512 points: `--num_points 512`), reduce the number of neighbors per point (e.g., 15 neighbors: `--k 15`). Note that these changes **will** affect the accuracy of the models.\n\n**Can I get the scripts to run faster?**\nThere are a couple of ways to reduce the time it takes to train a model. Some of these are explained in the answer on memory (e.g., reduce the number of points, reduce the number of neighbors). For ShapeNet, it's also possible to only train/test on a subset of the data. You can adjust this with the `class_choice` argument, e.g. `--class_choice Airplane`.\n\n**How can I run the bash scripts on Windows?**\nThe bash scripts typically only run one or two commands. You could the commands line by line if you are unable to run .sh scripts in your preferred command-line interace.\n\n**How did you render the figures in the paper?**\nThe figures in the paper are rendered in Blender, using Animation Nodes to load in the point clouds and features. A detailed explanation can be found in the folder [visualization](https://github.com/rubenwiersma/deltaconv/tree/master/visualization).\n\n## Tests\nIn the paper, we make statements about a number of properties of DeltaConv that are either a result of prior work or due to the implementation. We created a test suite to ensure that these properties hold for the implementation, along with unit tests for each module. For example:\n- Section 3.6, 3.7: Vector MLPs are equivariant to norm-preserving transformations, or coordinate-independent (rotations, reflections)\n    - `test/nn/test_mlp.py`\n    - `test/nn/test_nonlin.py`\n- Section 3.7: DeltaConv is coordinate-independent, a forward pass on a shape with one choice of bases leads to the same output and weight updates when run with different bases\n    - `test/nn/test_deltaconv.py`\n- Introduction, section 3.2: The operators are robust to noise and outliers.\n    - `test/geometry/test_grad_div.py`\n- Supplement, section 1: Vectors can be mapped between points with equation (15).\n    - `test/geometry/test_grad_div.py`\n    \n## Visualization\nThe figures in the paper are rendered in Blender, using Animation Nodes to load in the point clouds and features. A detailed explanation can be found in the folder [visualization](https://github.com/rubenwiersma/deltaconv/tree/master/visualization).\n\n## Citations\nPlease cite our paper if this code contributes to an academic publication:\n\n```bib\n@Article{Wiersma2022DeltaConv,\n  author    = {Ruben Wiersma, Ahmad Nasikun, Elmar Eisemann, Klaus Hildebrandt},\n  journal   = {Transactions on Graphics},\n  title     = {DeltaConv: Anisotropic Operators for Geometric Deep Learning on Point Clouds},\n  year      = {2022},\n  month     = jul,\n  number    = {4},\n  volume    = {41},\n  doi       = {10.1145/3528223.3530166},\n  publisher = {ACM},\n}\n```\n\nThe farthest point sampling code relies on Geometry Central:\n```bib\n@misc{geometrycentral,\n  title = {geometry-central},\n  author = {Nicholas Sharp and Keenan Crane and others},\n  note = {www.geometry-central.net},\n  year = {2019}\n}\n```\n\nAnd we make use of PyG (and underlying packages) to load point clouds, compute sparse matrix products, and compute nearest neighbors:\n```bib\n@inproceedings{Fey/Lenssen/2019,\n  title={Fast Graph Representation Learning with {PyTorch Geometric}},\n  author={Fey, Matthias and Lenssen, Jan E.},\n  booktitle={ICLR Workshop on Representation Learning on Graphs and Manifolds},\n  year={2019},\n}\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frubenwiersma%2Fdeltaconv","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frubenwiersma%2Fdeltaconv","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frubenwiersma%2Fdeltaconv/lists"}