What we found

Photoroom relight

Photoroom's "relight" API isn't actually a relight. We tested it across 6 chained variants on 3 SKUs and confirmed: it segments the subject and applies a tone curve to the cutout. It strips cast shadows and replaces backgrounds.

This is the input we sent it (Photoroom shadow output):

input

This is what came back:

output

The shadow is gone. So is the original background. That's not a relight — it's a cutout with mild tone normalization.

Useful for: brief deliverable #2 (clean PNG on white, no shadow). One API call. Not useful for: any actual photographic relighting. We need a different model for that.

Browse outputs: - outputs/photoroom/relight/preserve/ — all 22 SKUs, ai.preserve-hue-and-saturation - outputs/photoroom/relight/auto/ — all 22 SKUs, ai.auto - outputs/photoroom/pipeline_matrix/ — the full 6-variant exploration that proved the finding


Photoroom shadow

Photoroom's shadow API works well. We swept softness, intensity, and spread to land on a base config, locked direction to behindRight (matches the brief's front-left light), then ran four variants across all 22 SKUs to give us per-product flexibility.

default (s=0.6, i=0.55, long) subtle (s=0.85, i=0.40, long)
default subtle
shorter (s=0.6, i=0.55, medium) softest (s=0.95, i=0.35, long)
shorter softest

All 22 × 4 = 88 outputs are 4000×4000 with brief-compliant margins (≥400 px on every side). default is the production pick; the others are escape hatches for product-specific tuning.

Browse outputs: - outputs/photoroom/shadows/default/ — production batch - outputs/photoroom/shadows/{subtle,shorter,softest}/ — three variant batches - outputs/photoroom/sweeps/ — initial parameter exploration (3×3×3 sweeps on a couple of SKUs)


Cutouts — BiRefNet vs Photoroom

To restore product detail in the composite step we needed alpha cutouts. We tested two sources on the same 22 SKUs:

BiRefNet (PyTorch, local, GPU) Photoroom (removeBackground=true)
birefnet photoroom
BiRefNet Photoroom
Speed ~1.7 s/image network round-trip
Cost at 100k volume Free Paid per call
Visual quality on this catalog Good Cleaner

BiRefNet wins published matting benchmarks but Photoroom's segmenter is tuned for studio product photography on white, and visibly out-performs it on these IKEA SKUs. For the brief's "owned by IMC after handover" model, BiRefNet is more defensible (no recurring vendor cost); Photoroom is the quality leader. The proposal needs to test both on the brief's hard cases (transparent glass, fur, plants) before committing.

Browse outputs: - cutouts/ — BiRefNet, all 22 SKUs (PNG with alpha) - cutouts_photoroom/ — Photoroom, all 22 SKUs (PNG with alpha)


Pipeline: Photoroom shadow + Gemini relight + luminance composite

To get directional lighting on the subject without losing Photoroom's reliable shadow geometry, we built a 3-stage pipeline:

  1. Photoroom generates the cast shadow.
  2. Gemini relights the subject with a "soft front-left key light" prompt.
  3. We desaturate Gemini's relit render to a B&W lighting map and soft-light blend it over the original cutout, then composite over the Photoroom shadow base.

Step 3 uses Gemini purely as a luminance map — color and detail come from the original cutout, only the directional lighting cue comes from Gemini. This avoids Gemini's color/detail drift while keeping the shadow intact.

Which Gemini relight feeds this: the strong relight variant. Three intensity prompts were tested (subtle, standard, strong — all in src/gemini.mjs RELIGHT_VARIANTS); strong produces the most pronounced directional lighting cue, which we then dial back via the soft-light opacity to control the final intensity. The relight runs themselves are in outputs/gemini-relit/2026-04-28_04-57-42_strong/.

Input → lighting map (PE1016720, strong relight):

Photoroom shadow (input) Gemini lighting map (B&W)
input lightmap

Lighting effect strength — controlled by the lightmap's opacity in the soft-light blend. Lower opacity = more of the original cutout, less of Gemini's lighting. Strong relight prompt shown:

op0.3 (very subtle) op0.5 (mid) op0.7 op1.0 (full)
op0.3 op0.5 op0.7 op1.0

Relight prompt intensity at op0.5 — three different prompts feed Gemini before the lightmap is extracted:

subtle standard strong
subtle standard strong

The prompt intensity changes the shape of the lighting (how directional, how much falloff). Opacity is the amount of that effect mixed in. Combined: 3 prompts × 4 opacities = 12 composites in the catalog.

Higher opacity makes the lighting effect more pronounced but also brightens the subject toward washed-out (the cutout is already high-key catalog photography, soft-light has no headroom to darken). Production target is the lower end of this range.

Browse outputs: - outputs/composites/luminance_..._{subtle,standard,strong}_..._b0_op{0.3,0.5,0.7}/ — 3 prompts × 3 partial opacities - outputs/composites/luminance_..._{subtle,standard,strong}_..._b0/ — 3 prompts at full opacity (op1.0) - outputs/lightmaps/..._{subtle,standard,strong}_b0/ — the B&W lighting maps for each prompt - outputs/gemini-relit/2026-04-28_04-57-*_<variant>/ — Gemini's intermediate relit outputs


We also tried 3D from a Gaussian splat (Freepik)

We tested Freepik's Gaussian splat → 3D render path as an alternative to all of the above. The idea is to reconstruct the product as a 3D asset and re-render it under any lighting/camera setup we want. In principle that solves both shadow geometry and relighting in one stage.

In practice the detail loss is severe:

3D render

Compare to the original Photoroom shadow output for the same product:

original

The fabric weave, seam stitching, wood grain — the things the brief explicitly calls out as a hard fail when degraded — are smoothed away in the 3D render. The splat-derived geometry captures the silhouette and overall form but not surface detail.

Useful for: lighting/camera flexibility, hero shots where small detail loss is acceptable. Not useful for: the brief's catalog-fidelity bar. The 100% texture-preservation requirement rules this out as the primary pipeline.

/ · Esc close