Turning pet photos into oil portraits without losing the pet's actual face (FLUX.2 [pro] edit, not a LoRA)
Most "AI pet portrait" generators are a text-to-image model with your pet's name stuffed into the prompt. The output looks like a dog in a crown, not your dog in a crown — the markings drift, the ear shape changes, the face is close enough to fool nobody who actually owns the animal.
I built Regal Paws around a different primitive: fal.ai's flux-2-pro/edit model (fal-ai/flux-2-pro/edit), which does image editing from a reference photo rather than text-to-image generation from a prompt alone.
Why an edit model instead of generation-from-prompt
The two approaches solve different problems:
- Text-to-image + LoRA fine-tune: train a small model on the pet's photos, then generate. Identity fidelity depends entirely on how well the LoRA trained, and it degrades fast the further the target style is from the training photos (a corgi in Renaissance oil paint is a big style jump).
-
Image-editing model with a reference: pass the actual photo in as
image_urls, and the prompt describes the transformation to apply to that specific image rather than describing a new image from scratch. The model has the real pixels of the real pet to work from, not a compressed embedding of "roughly this dog."
For a one-shot product (someone uploads one photo and wants one good result in under a minute, no training queue), the edit-model approach is the only one that doesn't need a per-user training step.
The prompt design problem this creates
Every style prompt in the pipeline explicitly repeats the same instruction:
"Preserve the EXACT face, fur color, markings, breed and likeness of THIS specific pet."
That's not filler — it's load-bearing. Edit models will happily reinterpret a subject if the prompt leans too hard on the target style (a "regal royal portrait as a king or queen" prompt, taken alone, gives the model license to invent a generic regal animal). Anchoring the identity-preservation instruction in every single style prompt, worded almost identically to how a fal team engineer describes their own image-editing model's spec, is what keeps the actual pet recognizable across five very different aesthetics (realistic studio, Renaissance oil, royal/baroque, classic oil, Victorian).
The finishing pass
Raw edit-model output goes through a fal-ai/clarity-upscaler pass afterward — moderate creativity (0.35), high resemblance (0.7), which enriches painterly detail without letting the upscaler drift the face again. If the upscale call fails for any reason, the pipeline falls back to the un-upscaled base image rather than losing the job — a paid generation should never come back empty because a secondary enhancement step timed out.
Reliability: one retry, not an open-ended loop
For unattended production traffic (no human reviewing outputs before delivery), the generation function tries once, and if the model returns nothing usable, retries exactly once more before surfacing a "contact support for a refund" error. That single retry meaningfully cuts the failure rate on a paid flow without turning every request into an open-ended retry loop that burns fal credits on a request that's actually going to keep failing.
What I'd tell anyone building a "keep the real subject" image tool on fal
- If your use case is "transform this specific photo" rather than "generate something inspired by this photo," reach for an edit/image-to-image model before a LoRA training pipeline — it's less infrastructure and the identity fidelity ceiling is usually higher for a single-shot product.
- Repeat your identity-preservation instruction inside every style prompt, not just once in a system-level preamble. Style-specific language competes with it for the model's attention.
- Always have a same-quality fallback for your finishing/upscale pass. Treat it as an enhancement, never a dependency the paid job can fail on.
Live tool: https://regal-paws.pages.dev/
Happy to go deeper on the fal edit-model prompt structure or the style preset list if useful — drop a comment.
Top comments (0)