Skip to main content

pcrobust

Companion package to Do We Still Need Rotation-Invariant Architectures? A Statistical Robustness Benchmark for Point Cloud Classification (WACV 2027). The version evaluated in the paper is release v1.0.0, archived on Zenodo: 10.5281/zenodo.23847450.

It packages the paper's benchmark as reusable parts:

  • Corruption generators: SO(3) pose, Gaussian noise, and hidden-point-removal occlusion, with the paper's exact five-step severity ladders, as pure functions over (N, 3) arrays.

  • Models: the 10 benchmark architectures (5 standard, 3 rotation-invariant, 2 rotation-equivariant), one Embedder API.

  • Evaluation protocol: embedding-drift and accuracy sweeps, ModelNet40-C, the fine-grained rotation sweep, and the head-independent probe.

  • Statistical pipeline: pilot, power analysis, confirmatory test, exploratory ANOVA, bootstrap CIs, difference-in-differences, TOST.

  • Training recipes: the baseline recipe and the invariance-regularized (invreg) recipe, including the warmup and pose270 variants.

  • Frozen paper data: the table-level result CSVs behind the paper (123 files), readable offline with no GPU.

  • Paper reproduction (Tier 1): every table and figure of the paper (27 tables, 4 figures) rebuilt from the frozen data in seconds, and checked number by number against what the paper prints.

  • Model zoo: all 193 trained checkpoints behind the paper, hosted as assets of the v1.0.0 GitHub release and downloaded on first use.

Install

pip install pcrobust

From a clone, for development:

pip install -e ".[figures,dev]"

Python 3.10–3.13. Extras: figures (matplotlib), download (gdown, for the ShapeNet archive), dev (pytest, ruff).

Quickstart

import numpy as np
import pcrobust
from pcrobust import paper

pts = np.random.rand(1024, 3).astype(np.float32)
occluded = pcrobust.corrupt(pts, "occlusion", severity=3)   # paper ladder, step 3

net = pcrobust.get_model("dgcnn", num_classes=10)           # untrained
pcrobust.list_models()                                       # all 10 keys

df = paper.load("summary/pose_primary_test.csv")             # frozen table data
pcrobust list models
pcrobust corrupt cloud.ply --corruption occlusion --severity 3
pcrobust paper list
pcrobust paper show pose_primary_test
pcrobust reproduce --list
pcrobust reproduce tab:noise --compare-paper
pcrobust reproduce all --out repro/ --compare-paper
pcrobust prepare modelnet40 --download
pcrobust evaluate robustness --arch pointnet --perturbation pose
pcrobust train invreg --arch riconvpp --device cuda
pcrobust stats --help

pcrobust evaluate|train|stats <command> --help lists each command's options. Each command is also runnable as python -m <module>.

Reproducing the paper

pcrobust reproduce rebuilds a table or figure from the bundled frozen data, offline and without a GPU. Targets are the paper's LaTeX labels (tab:noise, fig:rotation_sweep) or their bare names (noise). --out DIR writes each target as CSV, plus a PNG for figures (needs the figures extra). --compare-paper checks every rebuilt number against the number printed in the paper. A number matches when the printed value is a correct rounding of it. The command exits with status 1 if any cell differs.

from pcrobust.paper import reproduce

df = reproduce.build("tab:m40c")         # laid out like the printed table
rep = reproduce.compare("tab:m40c")      # rep.mismatches, rep.uncovered
reproduce.plot("fig:teaser", "teaser.png")

The printed numbers live in src/pcrobust/paper/expected/. That is a snapshot of the paper source, keyed to its git commit. After the paper changes, refresh it with:

python tools/sync_paper.py PATH/TO/PAPER/REPO

Two targets are partial because some of their inputs are not bundled: the latency column of tab:supp-cost, and the aug-only column of tab:supp-w4-types. pcrobust reproduce --list names them.

Data and checkpoints

Everything downloaded or produced lives under PCROBUST_HOME (default ~/.cache/pcrobust):

<PCROBUST_HOME>/
  <domain>/_raw_download/                 raw archives
  <domain>/data/{train,test,gallery}/     prepared point clouds
  checkpoints/wacv2027/<domain>/<key>.pth checkpoints (zoo download target)
  results/...                             evaluation and statistics outputs

A checkpoint key is an architecture plus an optional recipe suffix: pointnet, pointnet_invreg, pointnet_invreg_warmup, pointnet_invreg_pose270. Every evaluator accepts a directory override (--models_dir / --ckpt_root) for checkpoints kept elsewhere.

Released checkpoints download on first use and are verified against the SHA256 in src/pcrobust/models/zoo_manifest.json:

model, classes = pcrobust.load_model("modelnet40/riconvpp_invreg_rep1.pth")

pcrobust.models.zoo.list_checkpoints() lists all 193 names.

ModelNet40 downloads automatically (pcrobust prepare modelnet40 --download). ABO fetches its meshes during pcrobust prepare abo once listings.json.gz and 3dmodels.csv.gz from the public ABO bucket are in its _raw_download/. ShapeNet, ScanObjectNN, and S3DIS are registration- or request-gated: place the archive under <PCROBUST_HOME>/<domain>/_raw_download/ and run pcrobust prepare <domain>.

Tests

pytest tests

Covers every module importing standalone, a CPU forward pass for all 10 architectures, checkpoint loading, corruption properties and determinism, every frozen data file, and the CLI. The golden tests rebuild every paper table and figure and compare each printed number.

License

MIT for code. Checkpoints and result CSVs: CC BY 4.0.

Metadata

Release files for pcrobust 1.0.3

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pcrobust 1.0.3
File Size Uploaded Provenance Actions
pcrobust-1.0.3.tar.gz 427.7 kB With provenance Details for pcrobust-1.0.3.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for pcrobust 1.0.3
File Interpreter ABI Platform Actions
pcrobust-1.0.3-py3-none-any.whl Python 3 none any Details for pcrobust-1.0.3-py3-none-any.whl

Total release size: 960.1 kB

Release files / pcrobust-1.0.3.tar.gz

Download URL pcrobust-1.0.3.tar.gz
Size 427.7 kB
Tags Source
SHA-256 checksum
How to use checksums
d2e9eabd1e6987c5bb455a59cb8e9340f2b422a7bbea539ee03413ff516cc29d
BLAKE2b-256 checksum
How to use checksums
075a23020be4d8825d592cb2513541db0ae14af50351a0dcd431813a9c139f98
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.

Transparency log

Release files / pcrobust-1.0.3-py3-none-any.whl

Download URL pcrobust-1.0.3-py3-none-any.whl
Size 532.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e2369908b2e8fe8dd6d91e6765e3d9ce7f472cebff720839035438e803f64920
BLAKE2b-256 checksum
How to use checksums
4f774053a6bce68ab94c282f26bd28a8f20c057f3df1035988e65a2c78467149
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.

Transparency log

Security for pcrobust 1.0.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for pcrobust-1.0.3.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 1, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page