---
title: FaceAnything
emoji: ๐
colorFrom: pink
colorTo: gray
sdk: gradio
sdk_version: 6.19.0
python_version: '3.12'
app_file: app.py
pinned: false
license: cc-by-nc-4.0
short_description: 4D face reconstruction & tracking from an image sequence
models:
- depth-anything/DA3-GIANT-1.1
tags:
- face
- 4d-reconstruction
- depth
- normals
- point-tracking
---
# Face Anything โ Gradio demo
4D face reconstruction and tracking from **any image sequence** โ upload up to 40
images **or a video** (its first 40 frames are used) โ in a single feed-forward
pass. The model jointly predicts depth and **canonical facial coordinates**, from
which the demo derives:
- **Canonical 2D video** โ per-frame canonical facial-coordinate map
- **Depth 2D video** โ per-frame depth map (JET)
- **Normals 2D video** โ per-frame surface normals (from depth)
- **3D point cloud with colorful tracks** โ viewable/orbitable in the 3D viewer
(rendered as a `.glb` on a white background), with a frame slider to scrub the
sequence and a downloadable `.zip` containing both the track-colored point
clouds (`tracks/`) and the plain colored point clouds (`points/`)
- *(bonus)* a 2D point-track overlay video
Reconstruction always uses the model's **predicted camera poses** (a multi-view
consistent world frame).
**Two inference modes** (the repo's `--process-mode`):
- **Joint (all-at-once)** โ all frames processed together โ more 3D-consistent.
- **One-by-one** โ each frame processed independently โ more surface detail and
lower memory (pairs well with a higher processing resolution).
Exposed hyperparameters (defaults match the published `run_inference.py`):
processing resolution, background removal (Robust Video Matting),
depth-confidence cut, number/blur/threshold of point tracks, output FPS, and a
frame cap.
## Deploying this Space
The Gradio code (`app.py`) and the model source (`src/faceanything`,
`src/depth_anything_3`) are included here. To make the Space runnable you still
need the **checkpoint** (~15 GB), which is not committed.
### Checkpoint storage
Don't commit 15 GB into the Space repo. Put the checkpoint in a Hugging Face
**model** repo and expose it to the Space with a mounted volume (HF's current
mechanism for persisting data โ the old fixed persistent-storage disk has been
superseded by volumes / storage buckets).
**Recommended โ mount the model repo as a read-only volume.** The checkpoint then
appears as a plain local file; no download code, nothing to re-fetch on cold
start, and zero ZeroGPU seconds spent moving it.
```bash
# one-time: upload the checkpoint into your model repo
hf upload UmutKocasari/FaceAnything /path/to/checkpoint.pt checkpoint.pt --repo-type=model
# mount that model repo into the Space at /models (read-only) โ restarts the Space
hf spaces volumes set UmutKocasari/FaceAnything \
-v hf://models/UmutKocasari/FaceAnything:/models
```
Then set one Space variable (*Settings โ Variables and secrets*):
```
FACEANYTHING_CHECKPOINT = /models/checkpoint.pt
```
Add the `HF_TOKEN` secret too if the model repo is private. Verify the mount with
`hf spaces volumes ls UmutKocasari/FaceAnything`. (Models/datasets are always
read-only mounts; only storage buckets can be mounted read-write.)
**Alternative โ download at startup.** Skip the volume and set
`FACEANYTHING_CHECKPOINT_REPO = UmutKocasari/FaceAnything`; the app calls
`hf_hub_download` on the CPU node at startup. It re-downloads on each cold start
unless you back the HF cache with a read-write **Storage Bucket** volume and point
`HF_HOME` at it:
```bash
hf buckets create UmutKocasari/faceanything-cache
hf spaces volumes set UmutKocasari/FaceAnything \
-v hf://buckets/UmutKocasari/faceanything-cache:/data
# then set Space variable: HF_HOME = /data/.huggingface
```
*Last resort:* commit the weights via Git LFS at `checkpoints/checkpoint.pt`
(bloats the Space repo and slows every clone).
### Hardware
This needs a CUDA GPU. On **ZeroGPU**, `@spaces.GPU` is used automatically; raise
`FACEANYTHING_GPU_DURATION` (seconds, default 180) if long clips time out. On a
dedicated GPU Space, `spaces` degrades to a no-op.
The DA3 backbone config/architecture is pulled from the public model
`depth-anything/DA3-GIANT-1.1` on first run (its weights are then overwritten by
the checkpoint); it lands in the same `HF_HOME` cache.
### Environment variables
| Variable | Default | Purpose |
|---|---|---|
| `FACEANYTHING_CHECKPOINT_REPO` | โ | HF repo id to download the checkpoint from |
| `FACEANYTHING_CHECKPOINT_FILE` | `checkpoint.pt` | filename within that repo |
| `FACEANYTHING_CHECKPOINT_REPO_TYPE` | `model` | `model` / `dataset` / `space` |
| `FACEANYTHING_CHECKPOINT_REVISION` | โ | branch/tag/commit to pin |
| `HF_TOKEN` | โ | token for a private checkpoint repo |
| `FACEANYTHING_CHECKPOINT` | `checkpoints/checkpoint.pt` | explicit local path (overrides the repo download if it exists) |
| `FACEANYTHING_ROOT` | the app dir | root holding `src/` and `checkpoints/` |
| `FACEANYTHING_BASE_MODEL` | `depth-anything/DA3-GIANT-1.1` | DA3 backbone id |
| `FACEANYTHING_GPU_DURATION` | `180` | ZeroGPU seconds per request |
| `FACEANYTHING_MAX_IMAGES` | `40` | hard cap on uploaded frames |
## Running locally
```bash
export FACEANYTHING_ROOT=/path/to/FaceAnything # source checkout (has src/, checkpoints/)
pip install -r requirements.txt
python app.py
```
Project page: ยท
Code: