Case Study Live AI · B2B

WatchEnhance – studiobilleder, uden at opfinde uret

Halfdan Harring byggede WatchEnhance til urhandlere, der allerede har billedet: telefonen, skrivebordet, det dyre ur. Motoren retter lys, skygge og baggrund — og tjekker, at skivens tekst, visere og dato stadig er dem, der kom ind. Hvis den ikke kan stå inde for det, sender den den originale skive med det nye lys. ChatGPT kan lave et pænt billede. Den kan ikke bevise, at Rolexen stadig er den Rolex.

~$0.20
Pr. foto i motoren
90%
Dial-gate IoU
16 GiB
Cloud Run job
$25
Entry · 5 ure

Problemet

En urhandler tager billedet der, hvor uret ligger: ved vinduet, under en varm lampe, på et rodet bord. Chrono24, eBay og WhatsApp belønner det foto, der ligner et studie. Et studie koster tid og et telt. En chat-boks koster tilliden.

Almindelige billedmodeller er trænet til at gøre et ur smukt. De kender den klassiske 10:10-stilling. De kender ståludgaven af et ur, der i virkeligheden er rosaguld. De tegner “SUPERLATIVE CHRONOMETER”, når skiven kun er 300 pixels høj, fordi de ikke kan læse den.

WatchEnhance startede med det spørgsmål, Halfdan Harring stillede motoren: kan du rette lyset — og bevise, at skiven stadig er den skive, der kom ind?

Sådan virker det

1. Tag billedet der, hvor du er

Telefonen, skrivebordet, hvilken som helst vinkel du alligevel ville lægge i en annonce. Ingen opsætning. Motoren er ikke bundet til et bestemt mærke eller en bestemt reference.

2. Identificér, relight, align

En vision-model navngiver uret ud fra fotoet — og dropper felter, den er usikker på, i stedet for at gætte. Nano Banana 2 retter lyset i hele rammen. SIFT, momenter og masked ECC lægger resultatet tilbage på originalen, fordi de her modeller typisk flytter billedet 60–170 pixels og ændrer skalaen med cirka otte procent.

3. Skiven skal dække skiven

SAM 2 finder skiven i AI-billedet. Når det lægges tilbage på originalen, skal den dække mindst 90 procent af den oprindelige skive, og centrum må højst flytte sig ti procent. Fejler tjekket, sendes fotoet som ikke verificeret — aldrig i stilhed.

4. Macro-re-render, eller originalen

Kilde-HEIC’en har skiven på omkring 1.000 pixels. Motoren læser den trykte tekst, måler viserne og tegner skiven forfra. Den tekst, der kommer tilbage, må kun være en del af den tekst, vi har låst — en viser kan dække bogstaver, men den må ikke opfinde nye. Viserne tjekkes op mod fotoet, ikke op mod et ur. Fejler det, sender vi den originale skive, bare tilpasset det nye lys.

De tekniske udfordringer

At læse tiden på et handler-foto er upålideligt. En vision-model rammer minuttet oftere end timen. Det gamle tjek sammenlignede det færdige billede med et klokkeslæt, modellen selv havde læst. På arkivet nægtede den alle macro-renders — seks af seksten havde visere, der dokumenterbart ikke havde rørt sig. Det nuværende tjek sammenligner de to stærkeste viser-linjer på fotoet med resultatet. Det behøver ikke at vide, hvad klokken er.

Metal skal læses tilbage, ikke måles som farve. En Royal Oak Offshore i rosaguld blev rettet som stål, fordi prompten spurgte om bezel og lænke — ikke om kassemetal. Lokal farvestatistik kunne ikke skille et rigtigt skift fra guld til stål fra et varmt foto, der blev neutraliseret. Et par-tjek kan tage fejl begge veje. Den fejl, det vogter, er den en handler ikke tilgiver.

Cloud Run lukker jobs, der ser ledige ud. En baggrundstråd midt i et foto, uden en åben request, ligner en ledig instans. Autoscaleren tager den. Jobs døde ved 16 procent. Løsningen er synkron: Cloud Scheduler rammer /v1/tick, og jobbet kører inde i requesten. 16 GiB, 30 minutters deadline, tre fejl og så stop — ikke evige modelkald på samme foto.

For lidt forandring er også en fejl. Alle andre tjek spørger, om modellen ændrede for meget. Ingenting spurgte, om den ændrede noget. To fotos, en handler pegede ud som “ser ikke rigtig forbedret ud”, målte CIELAB ΔE 7 og 18 mod en 33-foto-median på 36. Nu kører den igen, når både ur og ramme er for flade.

Arkitekturen

WEB React · Vite · Firebase Auth / Firestore / Storage
MOTOR Python på Cloud Run · Nano Banana 2 · SAM 2 · lokal geometri (hænder, dégradé, ECC)
GATES Tekst-subsequence · hand ridges · same-dial pair · metals read-back · blown-pixel invariant
DRIFT Cloud Scheduler tick · synkron request · 16 GiB · tre retries
PLAN Entry $25 / 5 ure · Dealer $99 / 50 md. · Shop $349 / 200 · Group $999 / 800

Resultatet

  • Live SaaS på watchenhance.com, bygget og lanceret af Halfdan Harring
  • Nyt lys med verificeret skive — eller den originale skive tilpasset lyset, aldrig et opfundet ur
  • Ikke bundet til mærker: en ukendt microbrand behandles som en Submariner
  • Et foto, vi holder tilbage til et nyt skud, tæller ikke på planen
  • Downloads i 2048 px, JPEG eller PNG, uden vandmærke
  • Bygget til Chrono24, eBay, WhatsApp og boutique-sites — ikke et almindeligt fotoværktøj med ur-mode

Hvad jeg lærte

En model uden kvittering er et andet produkt. WatchEnhance konkurrerer ikke med Photoshop. Den konkurrerer med “jeg smider det i ChatGPT”. Forskellen er ikke, hvor pænt det ser ud. Forskellen er, at et forkert ur kommer tilbage som en returnering.

Gates skal kunne køres offline. Hvert skive-render, motoren nogensinde har købt, ligger stadig ved siden af det originale udsnit. handcheck.py var den fil, der betalte sig: den fandt fejlen, der nægtede alle de rigtige billeder, før der blev brugt flere penge på at tune den.

At nægte er en feature, handleren kan se. Et foto, der holdes tilbage, koster ingenting på planen. Et foto, der sendes forkert, koster butikken. Den rigtige standard er den kedelige.

Skal du bygge en AI-pipeline med rigtige gates?

Verifikation, alignment og jobs, der ikke dør stille på Cloud Run — Halfdan Harring har netop lanceret det.

Book 20 min. intro