Skip to main content

Official SMART pipeline for tight 3D bounding boxes

Project description

SMART: Split, Merge, and Refine

Official implementation of Split, Merge, and Refine: Fitting Tight Bounding Boxes via Over-Segmentation and Iterative Search, 3DV 2024.

SMART teaser

Paper | arXiv | Quickstart | Pipeline | Package Docs | All Docs

Chanhyeok Park and Minhyuk Sung

SMART fits a compact set of tight 3D bounding boxes to a mesh without human supervision. The package uses a Python CLI/API with a native C++ SMART core and the fixed vendored Manifold backend.

Highlights

  • Paper-style pipeline: normalize mesh, tetrahedralize, pre-segment, merge, refine, run MCTS, render, and evaluate.
  • Native C++ backend for the SMART core through smart._cpp and smart-cpp-native.
  • Fixed vendored Manifold source is kept unchanged for exact geometry operations.
  • Python API and CLI for reproducible experiments and package use.
  • ShapeNet airplane/chair/table reproduction configs are included.

Installation

Install the package:

python -m pip install "smart-bbox[pipeline]"

Install from source:

git clone https://github.com/chpark1111/SMART.git
cd SMART
python -m pip install -e ".[pipeline]"

Verify the install:

smart --config configs/smoke_5.yaml doctor
smart-cpp-native --help

For the complete install and reproduction path, see docs/QUICKSTART.md.

Documentation

Main user docs:

  • Quickstart: install, verify, prepare tools/data, and run a small reproduction.
  • Pipeline: stage order, config control, rendering, failure handling, and parameter overrides.
  • Python Package: CLI, Python API, native executable, packaged configs, and library usage.
  • Tetra Failure Playbook: why Mesh2Tet/fTetWild fails, how SMART records failures, and which repair knobs to try.
  • Repository Structure: public release layout versus ignored local data, runs, external tools, and experiments.

Maintainer and research docs:

  • Release Guide: local release preflight, wheel checks, tags, and PyPI publishing.
  • Release Notes 0.1.0: current release scope and verification notes.
  • Learned Geometry Router: packaged DeepSets refine router, hard-state gates, exact-call reduction, and quality reinvestment experiments.
  • Research Plan: RL/deep learning priors, MCTS upgrade, memory/table-based search, and promotion rules.

Local Example

If this checkout already has local ShapeNet meshes under data/, create a 3-per-category example set and run it:

bash examples/prepare_sample_shapes.sh
bash examples/run_example_3x3.sh

The example meshes are copied to examples/sample_shapes/, which is ignored by git and excluded from packages.

Data

SMART expects ShapeNet-style mesh folders:

data/shapenet_airplane/<model_id>/model.obj
data/shapenet_chair/<model_id>/model.obj
data/shapenet_table/<model_id>/model.obj

Paper category synsets:

airplane  02691156
chair     03001627
table     04379243

Prepare zipped category archives:

python scripts/prepare_shapenet_samples.py \
  --archive-dir /path/to/shapenet_zips \
  --output-root data/expanded \
  --categories airplane chair table \
  --limit 100000 \
  --normalize preserve

SMART writes normalized meshes under runs/<profile>/normalized/; it does not modify the downloaded meshes in data/.

Build External Tools

Full reproduction from raw meshes requires Mesh2Tet tools, CoACD, and the fixed Manifold runtime. In a source checkout:

smart --config configs/smoke_5.yaml build-tools

After installing from a wheel, run the same setup in a writable project/cache directory:

export SMART_TOOLS_ROOT="$PWD/.smart-tools"
smart --config smoke_5.yaml build-tools

pip install installs the SMART Python package and the bundled native SMART C++ extension/executable from wheels. It intentionally does not clone and compile Mesh2Tet/fTetWild/ManifoldPlus during installation. Those external builds are large, platform-specific, and can require local compiler/system packages, so SMART exposes them as an explicit smart build-tools step instead. That one command prepares ManifoldPlus, fTetWild, the CoACD Python CLI runtime, the fixed Manifold runtime, and the local smart._cpp/ smart-cpp-native build for a source checkout. It is idempotent: if CoACD already probes successfully, SMART skips the slow editable install; if source editable installation fails, SMART tries the PyPI CoACD runtime and only fails the command when no working coacd CLI is found.

Use smart --config configs/smoke_5.yaml build-cpp only when you need to rebuild the SMART C++ extension/executable without rebuilding external tools.

Prebuilt binaries can also be supplied:

export SMART_MANIFOLDPLUS_BIN=/path/to/ManifoldPlus/build/manifold
export SMART_FTETWILD_BIN=/path/to/fTetWild/build/FloatTetwild_bin
export SMART_COACD_BIN=/path/to/coacd
export SMART_MANIFOLD_PYTHON=/path/to/smart/vendor/manifold/build/bindings/python

Tetrahedralization Failures

Mesh2Tet can fail on noisy ShapeNet meshes because the input OBJ may be non-watertight, self-intersecting, degenerate, or split into awkward components. SMART handles this per mesh, not as a fatal dataset error:

  • logs each ManifoldPlus/fTetWild attempt under runs/<profile>/logs/tetra/;
  • retries with finer settings, coarser settings, --coarsen, and robust winding number settings;
  • validates that tetra.msh and tetra.msh__sf.obj exist and are usable;
  • records failed attempts in the tetra manifest, then skips downstream stages for that mesh while continuing the rest of the dataset.

Before tetrahedralization, SMART runs conservative mesh cleanup. The tetra stage also classifies failures and queues targeted repair retries automatically:

Detected failure Likely cause Automatic SMART response
surface is not watertight holes or open mesh boundaries retry with a temporary fill_holes=true repaired input
fTetWild/ManifoldPlus timeout or crash self-intersection, very thin parts, degenerate faces, non-manifold edges retry with conservative repaired input and robust/coarser parameter attempts
tetra element count below minimum tetra parameters too fine/coarse or damaged repair output keep fine/coarse retry schedule and record the failed parameters
disconnected components true multi-part shape or small detached fragments only use keep_largest_component=true if explicitly enabled, because it can delete real parts

Repaired inputs are written under runs/<profile>/logs/tetra/...; SMART never mutates the original data/ OBJ. More destructive rescue, such as keep_largest_component=true, is available in config but is off by default because it can remove real disconnected shape parts. A failed mesh is therefore usually recoverable by either enabling a stronger repair variant or loosening/coarsening the tetra parameters, but SMART will not silently corrupt the shape just to force success.

See docs/TETRA_FAILURE_PLAYBOOK.md for debug commands and stronger repair options.

Run SMART

Smoke run through the Python pipeline:

smart --config configs/smoke_5.yaml run
smart --config configs/smoke_5.yaml summary

Run one mesh through the native C++ executable:

smart-cpp-native run-pipeline \
  --input data/shapenet_airplane/<model_id>/model.obj \
  --work_dir runs/native_one/<model_id> \
  --manifoldplus_bin external/mesh2tet/ManifoldPlus/build/manifold \
  --ftetwild_bin external/mesh2tet/fTetWild/build/FloatTetwild_bin \
  --coacd_bin external/CoACD/python/package/bin/coacd \
  --epsilon 0.002 \
  --edge_length 0.1 \
  --refine_max_step 2000 \
  --mcts_iter 3000

Run a native batch:

smart-cpp-native run-batch \
  --data_root data \
  --categories shapenet_airplane,shapenet_chair,shapenet_table \
  --limit_per_category 1 \
  --output_root runs/native_batch \
  --manifoldplus_bin external/mesh2tet/ManifoldPlus/build/manifold \
  --ftetwild_bin external/mesh2tet/fTetWild/build/FloatTetwild_bin \
  --coacd_bin external/CoACD/python/package/bin/coacd \
  --jobs auto \
  --reuse_existing \
  --resume_success

smart-cpp-native batch-summary \
  --manifest runs/native_batch/native_pipeline.jsonl

Evaluate And Render

Evaluate bbox outputs with the paper metrics:

smart --config configs/smoke_5.yaml evaluate

Render final boxes:

smart --config configs/smoke_5.yaml render \
  --set render.transparent=true \
  --set render.joint_mesh=false

The default renderer is the packaged software preview renderer so macOS does not launch Blender during normal runs. The adapted paper Blender renderer is still packaged under smart/legacy/renderer and can be enabled explicitly:

smart --config configs/smoke_5.yaml --set render.backend=blender render

Python API

import smart

cfg = smart.load_config("configs/smoke_5.yaml")
records = smart.run(cfg)
print(records[-1])

Package/API details are in docs/PYTHON_PACKAGE.md.

Research acceleration hooks are also exposed from smart.cpp. The packaged DeepSets refine router ranks candidate edits cheaply, then exact-scores the selected subset with native SMART/Manifold before applying an action. The accepted reward therefore remains exact; the speed gain comes from fewer exact geometry calls.

The learned refine helper's profile="auto" now resolves to the v9 production-candidate router for multibox states while preserving exact native refine for one-box states:

import smart.cpp as sc

engine = sc.NativeSmartEngine(...)
result = sc.run_builtin_deepset_policy_refine(
    engine,
    max_steps=4,
    profile="auto",
)

Local validation for this profile:

1000 replay states:        0 losses, 30.7% fewer exact calls, 1.203x vs exact oracle
held-out test 264 states:  0 losses, 38.7% fewer exact calls, 1.361x vs exact oracle

The portfolio and MCTS-prior helpers remain available for research sweeps: smart.cpp.run_builtin_deepset_portfolio_refine(...) and smart.cpp.run_builtin_deepset_prior_mcts(...). The packaged configs/learned_auto_safe.yaml profile is a quick local validation preset:

smart --config configs/learned_auto_safe.yaml run

The same router can be enabled in the normal pipeline:

smart --config configs/smoke_5.yaml refine \
  --set refine.learned_router.enabled=true \
  --set refine.learned_router.profile=auto

See docs/PYTHON_PACKAGE.md for profile details.

The variable-length macro-skill controller is a newer experimental post-refinement path. It proposes reusable multi-step fitting skills and accepts only exact SMART/Manifold non-worse updates:

smart macro-skill \
  --msh runs/example/tetra/airplane/0001/tetra.msh \
  --bbox-metadata runs/example/mcts/airplane/0001/bbox_params.json \
  --category airplane \
  --quality-preset balanced \
  --output runs/example/macro_skill/airplane/0001/result.json \
  --output-bbox-dir runs/example/macro_skill/airplane/0001/bboxs

The default macro-skill executor is the compact C++ path. Use --no-native-executor only for ablations against the Python skill loop. Use --quality-preset efficient to spend the higher exact budget only on the currently validated chair-like scheduler bucket. Use the learned Pareto family --quality-preset learned_fast, learned_efficient, or learned_quality to let a packaged state-conditioned ridge gate decide where to spend higher exact budget from native geometry features. Use --quality-preset quality to spend all top-k exact skill attempts for stronger quality polishing. See docs/LEARNED_ROUTER.md for the current benchmark evidence and safety contract.

Repository Layout

smart/        Python package, CLI/API, configs, pipeline wrappers
cpp/          Native C++ SMART core and smart-cpp-native executable
configs/      Source-checkout YAML profiles
examples/     Public shell examples; local sample meshes are ignored
scripts/      Supported data prep, release, and reproduction utilities
tests/        Package/native/release tests
docs/         User docs, paper assets, and release notes
experiments/  Ignored local research configs, scripts, assets, and tests
data/         Local ShapeNet data only; not packaged
runs/         Local outputs only; not packaged
external/     Downloaded Mesh2Tet/CoACD tools; not packaged
past_codes/   Original research archive; reference only

See docs/REPOSITORY_STRUCTURE.md for more detail.

Configs

Recommended public configs:

  • configs/smoke_5.yaml: fast local smoke test.
  • configs/example_3x3.yaml: 3 meshes per paper category from local example data.
  • configs/demo.yaml: small demo profile.
  • configs/paper_like.yaml: paper-style parameters.
  • configs/expanded_full.yaml: larger local ShapeNet layout.

Experimental RL, pruning, and acceleration profiles are local-only under experiments/configs/; they are ignored by git and excluded from release packages.

Research directions for learned policy/value agents, MCTS priors, local-minimum escape policies, and memory/table-based search are tracked in docs/RESEARCH_PLAN.md.

Compatibility Notes

pymesh.py is a compatibility shim, not the external PyMesh package. It keeps legacy SMART code that imports pymesh working by forwarding to smart.pymesh_compat. New code should import smart.pymesh_compat directly.

Release

Build and validate release artifacts:

smart-release-preflight \
  --dist-dir /private/tmp/smart_release_check \
  --venv-dir /private/tmp/smart_release_venv \
  --recreate-venv \
  --run-asan-smoke

Release notes and publishing steps are in docs/RELEASE.md.

Citation

@inproceedings{park2024smart,
  title = {Split, Merge, and Refine: Fitting Tight Bounding Boxes via Over-Segmentation and Iterative Search},
  author = {Park, Chanhyeok and Sung, Minhyuk},
  booktitle = {International Conference on 3D Vision (3DV)},
  year = {2024}
}

License

This project is released for non-commercial research under CC BY-NC-SA 4.0. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

smart_bbox-0.1.17.tar.gz (3.5 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

smart_bbox-0.1.17-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.2 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

smart_bbox-0.1.17-cp311-cp311-macosx_11_0_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.11macOS 11.0+ x86-64

smart_bbox-0.1.17-cp311-cp311-macosx_11_0_arm64.whl (2.2 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

smart_bbox-0.1.17-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.2 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

smart_bbox-0.1.17-cp310-cp310-macosx_11_0_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.10macOS 11.0+ x86-64

smart_bbox-0.1.17-cp310-cp310-macosx_11_0_arm64.whl (2.2 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

smart_bbox-0.1.17-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (11.2 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

smart_bbox-0.1.17-cp39-cp39-macosx_11_0_x86_64.whl (2.3 MB view details)

Uploaded CPython 3.9macOS 11.0+ x86-64

smart_bbox-0.1.17-cp39-cp39-macosx_11_0_arm64.whl (2.2 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

File details

Details for the file smart_bbox-0.1.17.tar.gz.

File metadata

  • Download URL: smart_bbox-0.1.17.tar.gz
  • Upload date:
  • Size: 3.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for smart_bbox-0.1.17.tar.gz
Algorithm Hash digest
SHA256 9bb53dcfde1a735f183050b206dc381e98d347bbfe555df125b53a3a26f91271
MD5 88d97718b908baf7ed0613b86d24b9bd
BLAKE2b-256 09766d48095ae349b1eb57c516da0d0746361d6239d922ee50f83f663d7f9546

See more details on using hashes here.

Provenance

The following attestation bundles were made for smart_bbox-0.1.17.tar.gz:

Publisher: wheels.yml on chpark1111/SMART

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file smart_bbox-0.1.17-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for smart_bbox-0.1.17-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 68aa815d8a863e1f919d03c4622a7b306746db219f4882b38c27a1175821cb11
MD5 acaf5fcf1c0c201d64adeea00020bf52
BLAKE2b-256 9fa1e8e00a1698b4a487a3be911c96aca1bf54cb9e571042cb48181566470379

See more details on using hashes here.

Provenance

The following attestation bundles were made for smart_bbox-0.1.17-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: wheels.yml on chpark1111/SMART

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file smart_bbox-0.1.17-cp311-cp311-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for smart_bbox-0.1.17-cp311-cp311-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 c5ece25e839724fbacb6b603008fe8bf506b716e595435a56721e1e8b751c932
MD5 bc4df10188712ee278230967f9d8dee8
BLAKE2b-256 c69b9bb97d800dd55f4b350ea22fa700a9bc979d0380c31006f69dd179f691ea

See more details on using hashes here.

Provenance

The following attestation bundles were made for smart_bbox-0.1.17-cp311-cp311-macosx_11_0_x86_64.whl:

Publisher: wheels.yml on chpark1111/SMART

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file smart_bbox-0.1.17-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for smart_bbox-0.1.17-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 acef7e64888a73099bb39ead3928a5a744a65e87e61d2c8c21f30e517aeaac6b
MD5 f4fd702cbec829d421e54b3e7a70f581
BLAKE2b-256 249d315d5569843177b85aadb6182b36ffc9ad9c0f65f9cccf08b026903b6f51

See more details on using hashes here.

Provenance

The following attestation bundles were made for smart_bbox-0.1.17-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: wheels.yml on chpark1111/SMART

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file smart_bbox-0.1.17-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for smart_bbox-0.1.17-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 4c5249bee219294ae54758d83912a26890512152698b9f8a0cae1fb0e6035c48
MD5 be6198d93398b62731820d90eeedf9ec
BLAKE2b-256 e0bcff4e7fb9d965629c25cab671daaa1f7c7ac9b8736f860d61f652b323278b

See more details on using hashes here.

Provenance

The following attestation bundles were made for smart_bbox-0.1.17-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: wheels.yml on chpark1111/SMART

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file smart_bbox-0.1.17-cp310-cp310-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for smart_bbox-0.1.17-cp310-cp310-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 82b618b2ed37ca98738b24cc0d50e7e137f3cc8663ce9b159ffb405c72d2bfb8
MD5 7c56ca5891fe12e9e7102440079625ea
BLAKE2b-256 e4ee9bea30378a9738f000b6d1ec6760082286da07b42dee3a99aa6b5ae484a3

See more details on using hashes here.

Provenance

The following attestation bundles were made for smart_bbox-0.1.17-cp310-cp310-macosx_11_0_x86_64.whl:

Publisher: wheels.yml on chpark1111/SMART

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file smart_bbox-0.1.17-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for smart_bbox-0.1.17-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 92ca49a137e8dc06fb34286e435509f7a8ed35bb20c91a310596fafd3b38c2dc
MD5 6445a1b5d505be3c60f8484ce0678c27
BLAKE2b-256 341a144b30754a2a3c445662e94128259e4660537d88d5669a7a438ca69c5ba8

See more details on using hashes here.

Provenance

The following attestation bundles were made for smart_bbox-0.1.17-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: wheels.yml on chpark1111/SMART

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file smart_bbox-0.1.17-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for smart_bbox-0.1.17-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f83849308d14d916b26008cc26fa82818279fb825af04e1c45f55c7fd83b8ef9
MD5 9729e35c79741aceeeb9bc76cdd17306
BLAKE2b-256 a5cf130ab618d987a7356ade790f293f1da5eb119687c1f2f702491dd61e2e70

See more details on using hashes here.

Provenance

The following attestation bundles were made for smart_bbox-0.1.17-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: wheels.yml on chpark1111/SMART

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file smart_bbox-0.1.17-cp39-cp39-macosx_11_0_x86_64.whl.

File metadata

File hashes

Hashes for smart_bbox-0.1.17-cp39-cp39-macosx_11_0_x86_64.whl
Algorithm Hash digest
SHA256 ae5283da110f2e2624acc2ec4507a20feebcad3cab567b21b9a6bfc25cdcd603
MD5 594f3281845ae267fc27d7ea1a5ad2e1
BLAKE2b-256 042d502910e65e4326a99918c315508492956f35b717d4dd0b125cc9e6205d57

See more details on using hashes here.

Provenance

The following attestation bundles were made for smart_bbox-0.1.17-cp39-cp39-macosx_11_0_x86_64.whl:

Publisher: wheels.yml on chpark1111/SMART

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file smart_bbox-0.1.17-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for smart_bbox-0.1.17-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f6dcce82a57e7310ac433ac8702611cb117675945d59a94e0c8e21ab43f6f0cb
MD5 48b54d53f3767d5fd10c8e0f4cfd0ca0
BLAKE2b-256 647f18bd91b75e8df3bc6af2588bc6369d0c356139ad01c2f077b7727b9f35d9

See more details on using hashes here.

Provenance

The following attestation bundles were made for smart_bbox-0.1.17-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: wheels.yml on chpark1111/SMART

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page