# 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>/`.