Skip to main content

Anny — A human model for every body Anny

Anny is a differentiable human body mesh model written in PyTorch. Anny models a large variety of human body shapes, from infants to elders, using a common topology and parameter space.

PyPI version License arXiv Demo Blogpost

Features

  • Anny is based on the tremendous work of the MakeHuman community, which offers plenty of opportunities for extensions.
  • We provide both full body and part-specific models for hands and faces.
  • Anny is open-source and free.

News

  • 2026-08-06: v0.6: New "anny" rig, facial actions, improved SOMA compatibility, API refactoring, and better torch.compile support. See CHANGELOG.md for more details.
  • 2026-06-03: v0.5: code refactoring (one can now use anny.Anny syntax). Support for "soma" rig and topology. SMPLX wrapper with "anny" topology support.
  • 2026-02-04: v0.3: "smplx" topology available for interoperability with SMPL-X (non-commercial use only). Nipple blend shapes excluded from default settings (use local_changes="all" for backward compatibility).
  • 2025-11-21: v0.2: support for different mesh topologies.
  • 2025-11-05: v0.1: initial release.

Installation

pip install anny[smpl,examples] # Full install (non-free dependencies).
pip install anny[examples] # Free install.
pip install anny # Minimal install.
# Note that the free install may download non-commercial only assets when needed.
pip install anny[examples]@git+https://github.com/naver/anny.git # latest sources.

Quickstart example

import torch, anny, trimesh
model = anny.Anny(local_changes="default", facial_actions="all").to(dtype=torch.float32)
# The model accept both dictionnary and stacked tensor inputs.
# Skeletal rig pose parameters (see model.bone_labels).
pose_parameters = torch.eye(4)[None, None].repeat(1, model.bone_count, 1, 1)
# High-level shape parameters (within [0,1], see model.phenotype_labels):
phenotype_kwargs = {key : 0.5 for key in model.phenotype_labels}
# Local shape changes (within [-1,1], see model.local_change_labels):
local_changes = {'stomach-pregnant-incr': 1.}
# Facial expression changes (within [0,1], see model.facial_action_labels):
facial_actions = {"jawOpen": 0.8, "mouthSmileLeft": 0.4}
# Export default mesh output
output = model(
      pose_parameters=pose_parameters,
      phenotype_kwargs=phenotype_kwargs,
      local_changes_kwargs=local_changes,
      facial_actions=facial_actions
      )
trimesh.Trimesh(vertices = output["vertices"].squeeze(dim=0).numpy(), faces=model.faces).export("anny_output.ply")

Tutorials

To get started with Anny, you can have a look at the different tutorials in the tutorials directory:

Interactive demo

We provide a simple Gradio demo enabling to interact with the model easily:

python -m anny.examples.interactive_demo
Interactive demo

Technical details

Default anny rig

By default, anny.Anny() uses the compact anny rig with 104 bones. This is the recommended default for most full-body use cases: it keeps the main body, hand, and head articulation while removing facial expression, eye, tongue, and other zero-weight/pruned bones that are present in the full MakeHuman rig. For comparison, Anny(rig="makehuman") exposes the full 163-bone MakeHuman rig with the old blender/root-identity orientation. Choose rig="anny" for a smaller, stable default skeleton; choose rig="makehuman" if you need exact compatibility with old models or direct access to the removed face/tongue/eye bones. Facial action blendshapes remain available separately with facial_actions="all".

Default anny topology

By default, anny.Anny() uses the anny topology: a MakeHuman-derived full-body mesh with Anny's minor nudity-related mesh edits, unattached vertices removed, and triangular faces. This is the recommended topology for new full-body models because every output vertex is referenced by the mesh connectivity and the triangulated faces work directly with downstream tools such as anthropometry and most mesh processing libraries. Use topology="anny-quads" if you need the original quad faces, topology="anny-full" if you need to keep unattached vertices and disable the nudity-related mesh edits, or topology="makehuman" for the unedited quad MakeHuman body mesh convention. Alternative retopologies such as smplx, smpl, and soma are available when interoperability with those ecosystems is more important than using Anny's native mesh.

Migration from legacy defaults

anny.Anny() defaults to the new Anny model (rig="anny", topology="anny", pose_parameterization="local-ref"), while the deprecated anny.create_fullbody_model(...) factory preserves the legacy full-body defaults. If you just want the new defaults, call anny.Anny() directly. If you need the exact legacy behavior, either keep using create_fullbody_model(...) while migrating, or translate its arguments to Anny(...) as follows:

Legacy create_fullbody_model(...) argument Equivalent anny.Anny(...) argument
rig="default" (full 163-bone MakeHuman rig) rig="makehuman"
topology="default" (with the default triangulate_faces=False) topology="anny-quads"
topology="default", triangulate_faces=True topology="anny"
remove_unattached_vertices=False append -full to the topology string (e.g. topology="anny-quads-full")
pose_parameterization (default "local-bone") pose_parameterization="local-bone", passed explicitly (Anny() defaults to "local-ref")
all_phenotypes=True phenotypes="all"
bone_orientation=... folded into the rig string via modifiers such as -blender or -rootidentity

⚠️ Pose parameters are not interchangeable across pose parameterizations: pose data saved with the legacy "local-bone" default will not produce the same pose under the new "local-ref" default. Either pass pose_parameterization="local-bone" explicitly for compatibility, or convert existing pose data with anny.utils.pose.transfer_pose_parameters (see the pose portability tutorial).

See CHANGELOG.md for the full list of changes.

Caching

Anny parses MakeHuman assets and caches pre-computed blend shape data to avoid recomputation on subsequent runs. The first instantiation of a model can take a few minutes. By default the cache is stored in ~/.cache/anny/. To use a different location, set the ANNY_CACHE_DIR environment variable:

export ANNY_CACHE_DIR=/path/to/cache

License

The code of Anny, Copyright (c) 2025 NAVER Corp., is licensed under the Apache License, Version 2.0 (see LICENSE).

data/mpfb2: Anny relies on MakeHuman assets adapted from MPFB2 that are licensed under the CC0 1.0 Universal License.

data/faceunits01: Facial actions of Anny rely on Face Units asset pack by Mika Suominen, licensed under the CC0 1.0 Universal License.

data/soma: Anny provide a "soma" topology adapted from SOMA-X which is licenced under the Apache 2.0 license.

smplx: A "smplx" topology can be downloaded for non-commercial use only, allowing interoperability with SMPL-X. See LICENSE.txt and NOTICE.txt files in http://download.europe.naverlabs.com/humans/Anny/noncommercial.zip for more information.

Citation

@inproceedings{anny,
      title={Human Mesh Modeling for {A}nny {B}ody},
      author={Romain Br{\'e}gier and Gu{\'e}nol{\'e} Fiche and Laura Bravo-S{\'a}nchez and Thomas Lucas and Matthieu Armando and Philippe Weinzaepfel and Gr{\'e}gory Rogez and Fabien Baradel},
      booktitle="Computer Vision -- ECCV 2026",
      year={2026},
      publisher="Springer Nature Switzerland",
      address="Cham",
      pages="170--188",
      isbn="978-3-032-37314-4"
}

Metadata

Release files for anny 0.6.1

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

Source distribution (sdist)

Source distribution for anny 0.6.1
File Size Uploaded
anny-0.6.1.tar.gz 47.6 MB Details

Built distribution (wheel)

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

Total release size: 95.3 MB

Release files / anny-0.6.1.tar.gz

Download URL anny-0.6.1.tar.gz
Size 47.6 MB
Tags Source
SHA-256 checksum
How to use checksums
b3eeb81f439f6e331d57383f624d0a7de903456d06a82636ce73a303dc105456
BLAKE2b-256 checksum
How to use checksums
15c65f79a7488cffc8706c07951253d0a5f12e37065568db1a309462e95ea0ed
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / anny-0.6.1-py3-none-any.whl

Download URL anny-0.6.1-py3-none-any.whl
Size 47.7 MB
Tags Python 3
SHA-256 checksum
How to use checksums
9dbd3d6c2e5dae20a4f5e0b80e104f50fd13d2e15e42c90fc288e00d86e60e09
BLAKE2b-256 checksum
How to use checksums
f85e0833d42b1ed3afd6c5c52c61fc31185348bc6cc2e17f296c518d593fdc37
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"22.04","id":"jammy","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

This release

0.6.1 This release

2 release files

0.6.0

2 release files

0.5

2 release files

0.3.1

2 release files

0.3.0

1 release file

0.2.0

2 release files

0.1.0

2 release files

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