SAGE — Superquadric-based Adaptive Geometric Explainability
A non-neural, interpretable object recognition system for robotic manipulation. Objects are represented as superquadrics fit directly to point clouds via nonlinear least-squares — every number the system reasons over is a named physical quantity (a radius, a roundness exponent, a color hue), not a learned embedding. A category vocabulary is learned online, with no gradient descent and no neural network weights anywhere in the pipeline.
Classification uses a non-neural tree ensemble (ExtraTrees) over these physically interpretable features — on held-out, video-disjoint YCB-Video data, this reaches 89.4% top-1 accuracy from a single observation, and 95.7% when multiple viewpoints of the same object are fused before classification (5-fold cross-validated, statistically significant improvement, p=0.0072). See the project's paper for the full accuracy characterization, including honestly-reported limitations and negative results.
Install
pip install sage-superquadrics
Quick start
from sage_superquadrics import SAGE
# Loads a pretrained model, downloading and caching it on first use
model = SAGE.load("SAGE_V2")
# point_cloud: an (N, 3) numpy array of XYZ points, isolating one object
pred = model.predict(point_cloud)
print(pred.label, pred.confidence) # e.g. "mug", 0.87
print(pred.top_k) # [("mug", 0.87), ("bowl", 0.09), ...]
Online learning from scratch
from sage_superquadrics import SAGE
model = SAGE() # fresh, untrained
# Each call is one real, confirmed example -- no batching required
model.train(point_cloud_1, "mug")
model.train(point_cloud_2, "mug")
model.train(point_cloud_3, "bowl")
# Build the classifier from whatever's been confirmed so far
model.rebuild_classifier()
pred = model.predict(new_point_cloud)
model.save("my_model.json")
Why superquadrics instead of a learned embedding?
Every prediction traces back to physically meaningful numbers you can inspect directly:
print(model.describe("mug"))
# I know 2 structural variant(s) of "mug":
# - graph mode a1b2c3d4 (n=14): parts=['dominant', 'secondary_0']
# dominant: ~81x78mm footprint, 75mm tall, eps=(0.10,0.91), ...
When something misclassifies, you can look at why — a specific fitted dimension, a roundness exponent that hit its optimizer bound — not just a confidence score with no further explanation available. This is the actual trade-off, stated plainly: a full raw-point-cloud black-box baseline (PointNet) outperforms SAGE on raw accuracy under the same evaluation protocol (93.2% vs. 89.4%). SAGE's contribution is interpretability and a non-neural, physically-grounded representation, not a claim of beating black-box accuracy.
What's in this package
The core fitting, online-learning, and classification pipeline only —
SAGE, Registry, superquadric fitting, and graph-based multi-part
matching. Dataset-specific training/evaluation tooling (used to produce
the accuracy numbers above) lives in the
GitHub repository,
not in this package, to keep the installable library small and
general-purpose.
Citation
If you use this in research, please cite the accompanying paper (see the GitHub repository for the current reference).
License
Apache-2.0
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sage_superquadric-1.0.0.tar.gz.
File metadata
- Download URL: sage_superquadric-1.0.0.tar.gz
- Upload date:
- Size: 33.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
322b5145af5ca3b23ce400d6c051299c321d32d46a8a666e33c3f445f680dfb1
|
|
| MD5 |
46507c9bf106e1c536cd0acc0595e1a5
|
|
| BLAKE2b-256 |
219c76f835e3b3447cfe5e6eb34d2544703f360c851d1d08c2a24c0ad69ebd08
|
Provenance
The following attestation bundles were made for sage_superquadric-1.0.0.tar.gz:
Publisher:
publish.yml on shreyan01/sage-superquadrics
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sage_superquadric-1.0.0.tar.gz -
Subject digest:
322b5145af5ca3b23ce400d6c051299c321d32d46a8a666e33c3f445f680dfb1 - Sigstore transparency entry: 2707850709
- Sigstore integration time:
-
Permalink:
shreyan01/sage-superquadrics@341433fc15e82db6b3bb35ad718492504a6d9f5a -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/shreyan01
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@341433fc15e82db6b3bb35ad718492504a6d9f5a -
Trigger Event:
release
-
Statement type:
File details
Details for the file sage_superquadric-1.0.0-py3-none-any.whl.
File metadata
- Download URL: sage_superquadric-1.0.0-py3-none-any.whl
- Upload date:
- Size: 37.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6c521e4cf6c5f31095c90a15173bfeee8829d830ae2598e40c9eabeb925842ac
|
|
| MD5 |
0206a191577807d6669f3158009fc01f
|
|
| BLAKE2b-256 |
ee48bcfe30e8a833fb7850ab8b9f17f06ea98a7cd08e2c72ce74c01ef4871c13
|
Provenance
The following attestation bundles were made for sage_superquadric-1.0.0-py3-none-any.whl:
Publisher:
publish.yml on shreyan01/sage-superquadrics
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
sage_superquadric-1.0.0-py3-none-any.whl -
Subject digest:
6c521e4cf6c5f31095c90a15173bfeee8829d830ae2598e40c9eabeb925842ac - Sigstore transparency entry: 2707850722
- Sigstore integration time:
-
Permalink:
shreyan01/sage-superquadrics@341433fc15e82db6b3bb35ad718492504a6d9f5a -
Branch / Tag:
refs/tags/v1.0.0 - Owner: https://github.com/shreyan01
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@341433fc15e82db6b3bb35ad718492504a6d9f5a -
Trigger Event:
release
-
Statement type: