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).

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.0

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.0
File Size Uploaded Provenance Actions
pcrobust-1.0.0.tar.gz 425.0 kB With provenance Details for pcrobust-1.0.0.tar.gz

Built distribution (wheel)

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

Total release size: 955.8 kB

Release files / pcrobust-1.0.0.tar.gz

Download URL pcrobust-1.0.0.tar.gz
Size 425.0 kB
Tags Source
SHA-256 checksum
How to use checksums
0e5d1e813d64f801e490b35dcb9bbc7d29f0e90223c3ec964ecf678459e032e8
BLAKE2b-256 checksum
How to use checksums
f8705346137bc833bac166f806ece124d698206fb5b10df7d7f08f41301d2fd8
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 Oct 31, 2026.

Transparency log

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

Download URL pcrobust-1.0.0-py3-none-any.whl
Size 530.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
20ff38c46d3f4e169450fd341ceca9a16d6b4c96f973fe28587ae1d71f092a61
BLAKE2b-256 checksum
How to use checksums
fe56d263dd23f2f93b4a32342b412dc490805109019004ec6336f82b062bd053
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 Oct 31, 2026.

Transparency log

Security for pcrobust 1.0.0

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.0.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 Oct 31, 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