--- title: GNM Head — Interactive 3D Face Model emoji: 🧬 colorFrom: green colorTo: blue sdk: gradio sdk_version: 6.20.0 app_file: app.py short_description: Reactive 3D demo of Google's GNM parametric head model python_version: "3.12" startup_duration_timeout: 30m license: apache-2.0 --- # GNM Head — Interactive 3D Face Model A reactive Gradio demo of **[GNM](https://github.com/google/GNM)** (Generative aNthropometric Model), Google's state-of-the-art parametric 3D statistical model of the human head. This Space replicates the official interactive slider demo from [`gnm/shape/demos/gnm_head_demo.ipynb`](https://github.com/google/GNM/blob/main/gnm/shape/README.md#demo): move any slider and the 3D head mesh regenerates live. ## Controls Control labels are named to match exactly what each one changes in the model: - **Identity** — first 10 components of the linear identity basis, i.e. overall **head shape**. - **Expression** — selected blendshape components per region, named as in the upstream `gnm_head_demo.ipynb`: **left eye**, **right eye**, **mouth** (the `lower_face_region_*` components the notebook exposes as its `mouth` group), **tongue**, and **pupil dilation**. The Expression tab also has a **keyword-expression** control (mirroring the reference [semantic sampling demo](https://github.com/google/GNM/blob/main/gnm/shape/README.md#demo-1)): pick a named expression (happy, surprise, wink, smile, ...) — or several to blend — set the **strength**, and hit **Apply** to drive the expression sliders toward that expression via GNM's semantic CVAE sampler. It only *sets* the slider values, so you can keep tweaking each slider by hand afterwards. - **Pose** — neck and head **rotations** (pitch / yaw / roll, in degrees), plus **gaze** (eyeball pitch / yaw with a cross-eye vergence control). - **Translation** — global position of the whole head (X left/right, Y up/down, Z forward/back). The 3D view opens **front-facing** and keeps your current camera position and orientation as you move the sliders. The viewer is a small custom Three.js component with a persistent scene: each slider change only streams the new vertex positions, which are written straight into the existing geometry buffer, so the mesh **morphs in place** — it is never reloaded/remounted, so there is no camera reset and no flicker. The model is pure NumPy (a few matrix multiplies, ~40 ms per evaluation), so the Space runs on `cpu-basic` with no GPU required. ## Direct manipulation You can also **grab the 3D head directly** instead of only moving sliders — hover any region to see what it does (the head is colour-coded by control region): - **Eye** — drag ↕ to open / close that eye, ↔ to glance (aim the eyes). - **Mouth** — drag the centre / chin **down** to open the jaw; drag a **lip corner outward** to smile / stretch. - **Tongue** — drag down to stick it out. - **Skull / forehead** — drag to turn & nod the head; **gaze** aims when you grab an eyeball. - **Ear** — drag in / out (drives *Head shape 8*); **Cheek** — drag to stretch the face (drives *Head shape 7*). - **Alt + drag** free-sculpts the surface under the cursor with a soft falloff brush (nose, brow, jawline). These are geometric offsets on top of the model — a **↺ Reset shaping** button clears them. - **Shift + drag** repositions the head, **right-drag** (or drag empty space) orbits the camera, **scroll** zooms. Each region drives the very same slider(s) — hovering one glows the matching control and its tab — so the sliders and the head stay in sync. Every gesture runs through the same reactive pipeline as the sliders; slider-driving drags are throttled and run off the queue so the mesh tracks the cursor in real time. ## Credits Model and reference demo: [google/GNM](https://github.com/google/GNM), Apache 2.0. This Space vendors the upstream `gnm.shape` NumPy backend and its model data (`gnm_head.npz`).