← Back to the form
# Photo guidelines

Three photos build your 3D body: **front**, **back**, **face**. A person with a
phone and a blank wall can shoot all three in five minutes. Everything below
exists because the reconstruction needs it — each rule says what breaks without it.

The checker (`python -m pipeline.validate_photos`) enforces the measurable rules
before we spend anything on reconstruction, and tells you in plain words what to
retake.

---

## The three photos

| | what it shows | framing |
|---|---|---|
| `front.jpg` | whole body, facing the camera, A-pose | head to feet, space above and below |
| `back.jpg` | whole body, facing away, same A-pose | same distance, same framing as the front |
| `face.jpg` | head and shoulders only | the face fills at least a quarter of the frame width |

---

## How to stand

**A-pose: arms straight, hanging 20–30° away from your body.** Not a T-pose, not
arms-down.

*Why:* the reconstructor has to find where your arm ends and your torso begins
from a single silhouette. Arms flat against the body merge the two, and the mesh
comes back with the arm fused to the ribcage — which puts the `left_sleeve` and
`chest` ad slots on the same lump of geometry. Arms too high (a full T-pose)
stretch the armpit skin and distort the sleeve slots.

**Feet shoulder-width apart, weight even, toes forward.**

*Why:* the same occlusion problem, lower down. Legs together merge into one
column and the anchor step reads the body's outline wrongly. Feet also
give the pipeline the only cue it has for which way you are facing — the anchor
step checks that toes reach further forward than heels, and refuses to guess if
your feet are hidden.

**Look straight ahead, relaxed face, mouth closed** (front and face shots).

*Why:* the head is generated from `face.jpg` and stitched onto the body at the
neck. A tilted or turned head makes the neck ring an ellipse and the seam shows.

**Stand still and stand tall** — same posture in both body shots.

*Why:* front and back are fused into one mesh. If you slouch in one and not the
other, the two silhouettes disagree and the back comes out shorter than the front.

## What to wear

**Fitted clothing: training kit, tri-suit, shorts and a fitted top.** No baggy
hoodies, no loose shorts, no jackets, no bags, nothing hanging off you.

*Why:* the ad slots sit on **skin and kit** — they are painted directly onto the
body surface. Loose fabric becomes part of the body in the reconstruction, so a
baggy shirt gives you a barrel-shaped torso and the chest slots end up floating
on cloth that will not exist on race day. Fitted clothing means the 3D body
matches the body the logos are actually worn on.

**Avoid pure white or pure black kit if you can, and nothing reflective.**

*Why:* the texture is sampled from these photos. Blown-out white and crushed
black carry no detail, so the logos rendered on top of them have nothing to sit
against and read as stickers floating in space.

**Tie long hair back.**

*Why:* hair over the shoulders is reconstructed as body geometry and eats the
`left_sleeve` / `right_sleeve` slots, which are placed by casting a ray in at
shoulder height from outside the body.

## Where to shoot

**Plain background: an empty wall, a garage door, a clean floor.** Nothing
directly behind you, no other people anywhere in frame.

*Why:* the first step of the pipeline cuts you out of the background. A busy
background leaves fragments of wall attached to your silhouette, and those
fragments become bumps on the mesh. A second person in frame is an outright
rejection — the pipeline cannot tell which body to build.

**Even, soft light. Indirect daylight, or a shaded spot outdoors. No direct sun,
no single hard lamp, no backlight.**

*Why:* light is baked into the texture. A hard shadow down one side becomes a
permanent dark stripe on the 3D body that rotates with you, and a brand's logo
sitting in that stripe is unreadable. Backlight turns you into a silhouette and
the texture has no colour at all.

**Camera at chest height, 3–4 m away, held upright (portrait).** Prop the phone
on something at chest height rather than having a friend hold it at eye level.

*Why:* a phone held low or high adds perspective distortion — shoot from hip
height and your legs come out long and your head small. The mesh inherits that
distortion and every slot ends up the wrong size. 3–4 m is far
enough that the lens is close to orthographic; at arm's length the nearest part
of you (usually your chest) balloons.

**Full body in frame with margin: roughly a hand's width of space above your head
and below your feet.**

*Why:* the pipeline needs the crown of your head and both ankles to scale the
body and place the anchors. Feet cut off at the bottom edge means no ground
plane and no height, so every slot is sized against a guess.

## Camera settings

- **Portrait orientation** for the two body shots (taller than wide).
- **At least 1500 px tall** for `front.jpg` and `back.jpg`, **at least 800 px
  tall** for `face.jpg`. Any phone from the last decade clears this at default
  settings — just don't email the photos to yourself at "small" size.
- **Rear camera, not the selfie camera.** Selfie cameras are wide-angle and
  distort faces.
- **No portrait mode, no beauty filters, no background blur.**
  *Why:* portrait mode blurs the edge of your silhouette, which is exactly the
  edge the cut-out needs.
- **JPEG or PNG.** Save the photo upright — if your phone records the rotation as
  metadata instead of rotating the pixels, the checker will tell you and you can
  re-save it.

## The face shot

- Head and shoulders, **face at least a quarter of the frame width**.
- **No hat, no cap, no sunglasses, no prescription glasses, no face covering.**
  *Why:* the head provider builds geometry from what it can see. Glasses get
  reconstructed as part of your skull; a cap deletes the top of your head.
- **Neutral expression, mouth closed, eyes open, looking straight at the lens.**
  *Why:* the generated head is stitched onto the body and shown rotating on your
  public page. A mid-laugh expression is frozen there permanently, and the
  bake-off judges "recognisably this person at first glance" — a neutral face is
  the one people recognise.
- Same even light as the body shots. No flash.

---

## Checklist

Use this when collecting the 10 Phase 0 subjects. One row per subject; a subject
is only "done" when `python -m pipeline.validate_photos --subjects <name>` exits 0.

| | check |
|---|---|
| ☐ | Subject folder is `pipeline/inputs/<name>/` and contains `front`, `back`, `face` (`.jpg`, `.jpeg` or `.png`) |
| ☐ | A-pose, arms 20–30° from the body, in both body shots |
| ☐ | Feet shoulder-width apart, toes forward, in both body shots |
| ☐ | Fitted kit, nothing loose, nothing hanging, hair tied back |
| ☐ | Plain background, no second person anywhere in frame |
| ☐ | Even light, no hard shadow, no backlight, no flash |
| ☐ | Camera at chest height, 3–4 m away, portrait, same spot for front and back |
| ☐ | Whole body in frame with space above the head and below the feet |
| ☐ | Body shots ≥ 1500 px tall; face shot ≥ 800 px tall |
| ☐ | Face shot: no hat, no glasses, neutral expression, face ≥ 25% of frame width |
| ☐ | `validate_photos` exits 0 |
| ☐ | Consent line signed (below) |

For the Phase 0 set, aim for **variety on purpose**: different body types, skin
tones, kit colours, and lighting conditions. Ten photogenic athletes in identical
studio light would tell us nothing about whether the pipeline survives reality.
Record which subject is which in `pipeline/bakeoff/scores.csv`.

---

## Consent

Collect this from every subject, in writing, before shooting. Phase 0 subjects
included.

> I agree that athlete impact may use the photographs I provide to build a 3D model of
> me, and may display that model, my name and my likeness publicly on the
> athlete impact website. I understand that brand logos may be shown on the model as
> part of the service, and that I can ask for my model and photographs to be
> removed at any time.
>
> Name: ______________________  Signature: ______________________  Date: __________

Store the signed line with the subject folder name so it can be matched to the
photos. If a subject withdraws, delete `pipeline/inputs/<name>/` and
`pipeline/out/<name>/`.