Images,
and the systems
that make them.

artist-led imaging systems by Dominic Hawgood

Creative technologist, bridging creative and engineering. I design, build and consult on AI workflows and systems for studios, agencies, production companies and image‑led brands.

Study 02 — liquid chrome folding into a seam
Typewriter Scans — land shell

01 / typewriter scans

Neandertal — the cave mouth, light dropping through the opening

03 / neandertal

02 / comfy bridge

Restoration Engine — a portrait restored from a low-resolution source

05 / restoration engine

Portrait Performance System — a head in profile, the fitted head's normal map on the left meeting the finished render on the right

06 / portrait performance

Casting Out the Self — the scanned Buddha head, in profile

casting out the self

Chasing Demons in the Night

chasing demons in the night

The Anointing Water

the anointing water

Under the Influence

under the influence

Archive, 2012–2020→

[fig. 1]the record

Portrait Performance System — one identity, the rendered record

06 / system · portrait performance

Portrait Performance System

contents
31 stills · 1 canvas · 3 documents
models
GNM · Gemini 3.1 Pro · Nano Banana 2 · gpt-image-2
made with
ComfyUI · Python · MediaPipe · Claude Code · Comfy Bridge

A portrait system built as ten custom ComfyUI nodes. A person is held as a written identity specification, read from a reference photograph by a language model or authored by selection with no photograph. The photograph never reaches the image model. Identity, expression and pose are then addressed separately.

Expression is authored in FACS, the coding system that numbers each movement a face can make, through a vocabulary that turns a word into those numbers. To turn the head, a 3D head is fitted to the portrait and the description is derived from the geometry actually rendered, so the words and the map cannot disagree.

identity · expression · geometry · a render document to the image model

[fig. 2]comfyui canvas · portrait-performance-system workflow

The Portrait Performance System workflow on one ComfyUI canvas, in five groups: 01 spec, 02 compose and hero render, 03 expression — semantic, 04 spec edit, 05 expression — geometry, each ending in its rendered portrait

The canvas, stage by stage

spec → compose and hero render → expression, semantic → spec edit → expression, geometry

01 spec 02 compose 03 express 04 edit 05 turn

A language model reads the reference photograph and writes an identity specification. It records identity only: expression and head pose are assessed, because they decide which asymmetries may be recorded, but never written down. The same document can be authored by selection in the Identity Builder, with no photograph.

The person as a document

The photograph never reaches the image model. It is read, and what was read is what gets rendered.

The specification is what gets edited. Blocking a tattoo deletes the tattoo from the document; changing the backdrop changes a value in a field. A second model resolves what is left, and only a render document projected from that result reaches the image model.

The reference and the result below are shown as they came out: no field of the specification was edited by hand. Where the result drifts, in the skin or the hair for example, the field can be edited and the portrait rendered again.

[fig. 3]the reference

The reference — a character rendered from a written specification with no photograph: black hair combed back, a mole above the lip, a red cable-knit cardigan with a sailor collar and two black bows

[doc. 1]identity specification · fragments

Identity specification fragments · authored by selection · no photograph

[fig. 4]the result

The result — the same character after the reference was read into a specification and rendered from it: the mole sits on the other side of the mouth and the two bows have become one ribbon tie

One identity, four expressions

EMFACS gives anger one row: 4 + 5 + 7 + 23. The vocabulary holds 31 words for it, skeptical among them. A word picks a starting point; which muscles fire, how hard, on which side, and where the eyes and head go are separate dials. With no units set, the compiler returns its fixed neutral clause byte for byte, and a test enforces it.

[pl. i]at rest and four expressions

aat rest

At rest — no action units; the neutral render every expression beside it starts from

bcurious

Curious — the inner brows lifted, the head turned to one side and tilted, the eyes back on the lens

camused

Amused — the cheeks raised and the lip corners drawn back in a closed smile, the head square to the camera

dskeptical

Skeptical — the brows drawn down and one corner of the mouth tightened, the head square to the camera

eashamed

Ashamed — the head turned well away and bowed, the eyes lowered, the mouth corners slightly down

[doc. 2]the action units that separate them

a  at rest
   no units

b  curious
   1B + 2B + 5A

c  amused
   6C + 12C + 7B

d  skeptical
   4C + 14C on one side

e  ashamed
   1B + 15B

A trace · B slightly · C markedly

One expression, two identities

An expression block names muscles and how hard they work, never a face, so the same block applies to any identity. Both portraits were re-expressed from the same five blocks.

[pl. ii]the same five blocks on two identities

aprinted top

A directed character — long blonde hair parted in the centre, a high-necked top printed in red and coral

bwool coat · beaded knit

A directed character — a black wavy bob, a grey wool coat over a white knit with beading at the neck

action unitsnone

six expressions — move across a portrait, tap it, or pick from the scale

The head solved at three angles

As the head turns away from the camera, the system shortens the description. The image model follows the text over the geometry map, so describing the eyes of a head that faces away turns it back to the camera. To set how much to cut, 24 action units are measured against neutral at every ten degrees of the turn.

[fig. 5]geometry over render

The fitted head at three angles of turn, about 40°, 90° and 140°, laughing with the jaw dropped — the normal map above, the finished render below

[doc. 3]what each muscle still says as the head turns

                  0°  40°  90° 140°
inner brow raise 1 ●   ●    ○    ○
jaw drop 26        ●   ●    ●    ●

at strength C, markedly

Ten identities at neutral

Every cell is the same rig at rest — neutral, frontal, evenly lit, the same distance. Nothing varies across a row, because the anchor is the document before any world field has been filled in. What differs between them was written, not directed.

[pl. iii]the cast

hover for the register — click to enlarge — arrows step through the cast

Ten nodes, three groups

PPS/Expression · PPS/Geometry · PPS/Identity

no.nodewhat it doesstage
01Identity builderAuthors an identity specification by selection, or loads one and changes a field.01 · 04
02Compose inputJoins specification, render choices and expression into the document the composer reads.02
03Extract sentencePasses on only what the renderer may see: the composed sentence, or a render document.02 · 04
04Sheet viewsSplits a multi-view character sheet into its named views for the stages that follow.optional
05Expression studioOne authoring surface: 146 emotion words, 57 presets, eight action-unit slots, head, gaze, containment.03 · 05
06Apply expressionRe-expresses a resolved specification without another language-model round trip.optional
07Expression compileOne expression block in, anatomical prose out. Deterministic, and adapted to what is visible.05
08Ear pointsMarks the top and bottom of one ear on the image, giving the fit a measured ear extent.05
09Identity fitFits a 3D head to the portrait, posed with the block’s expression. Emits the map and what it measured.05
10Prompt assembleBuilds the prompt from that measurement: map contract, view lock, expression, final instruction.05

Limits and provenance

The likeness is similar rather than exact, and the description is allowed to say that an expression cannot be read from an angle. Both are deliberate: the description states what the view supports and no more.

The head is Google Research’s GNM and the landmarks come from MediaPipe. GNM was trained on binary gender categories and four broad demographic groups, and the identity builder inherits that limit.

The nodes were briefed rather than written. Comfy Bridge, an MCP for local ComfyUI, built, tested and deployed them.