Cattleya Hybrid Visualizer

What would this orchid cross look like? SDXL steered by a botanical phenotype engine, for hybrids that take 4-7 years to actually flower.

Part of the Orchid Vision program.

Orchid breeding is slow. A Cattleya cross takes roughly four to seven years from pollination to first flowering, and the decision about which cross to attempt is made years before anyone sees the result. Breeders make that call on intuition built from decades of watching parents and their offspring.

The Cattleya Hybrid Visualizer is an attempt to make that intuition explicit and queryable. Given two parent species, it composes a botanically-grounded description of the expected phenotype and renders it — so the question “what would this cross plausibly look like?” gets an answer before the four-year wait, not after.

Cattleya Hardyana — C. dowiana × C. warscewiczii, 50/50. One of 27 registered crosses in the pre-rendered gallery.

The honest problem

SDXL will produce a beautiful orchid for any prompt you give it. It will not, on its own, produce an orchid that reflects the genetics of the two parents you named. Left alone, the model draws a generic pretty flower and the output tells you nothing.

So the interesting part of this project is not the generation. It is the layer that decides what to ask for.

The phenotype engine

Parent traits are blended as pigment chemistry, not colour names. Anthocyanin, carotenoid and co-pigment are modelled as independent biochemical channels — which matters, because a magenta Cattleya crossed with a yellow one does not give you an orange Cattleya. The pigment pathways are independent, so you get a magenta-and-yellow flower, often mottled or patterned. A naive RGB blend gets this exactly wrong.

On top of the channel merge:

  • 119 species carry trait profiles in phenotype_db.json.
  • Dominance overrides (dominance_rules.json) encode species-specific behaviour that a weighted average would flatten.
  • Recessive expression is generation-dependent. The threshold relaxes as ancestry dilutes — F1 suppresses recessives hard, F2 admits them at 50%, F3 and beyond at 25% — so a trait hidden in the first generation can surface in the second, as it does in life.

The engine emits a ~77-token description shaped for CLIP’s context window, which is what actually reaches the model.

Generation

  • Base model: stabilityai/stable-diffusion-xl-base-1.0
  • LoRA: mjarnold/orchid-ancestry-lora-v2 (not yet public) — one ancestry-aware LoRA, applied at an ancestry-weighted scale
  • Hue tokens: small textual-inversion embeddings trained per pigment channel (anthocyanin-red, carotenoid-yellow), so colour can be steered independently of the prose prompt

The published gallery is pre-rendered at seed 42, F1 depth, under the diffusers regime the LoRA was validated against. A live interactive generator — arbitrary parent pairs, warm-colour control, multiple seeds — also exists, but needs ZeroGPU hardware to run in-Space.

The latent map

Each cross is also placed in orchid-clip-v8 embedding space. The two parents sit at the ends of a chord and the predicted F1 at its midpoint. Where a real example of the hybrid exists, it is plotted perpendicular to that chord — and its off-chord distance is the interesting number.

That offset is the transgressive residual: the part of the real hybrid that is not a blend of its parents at all, but novel beyond both. It survives permutation testing and reproduces under a DINOv2 backbone, so it is not an artifact of the embedding.

Honest limits

  • The parent species reference photos are real and CC-licensed; every generated bloom is a prediction, not a photograph. Nothing here is evidence of what a cross actually produced.
  • There is no automated recognition gate on generation. An earlier design called for scoring each sample against a per-species prototype and rejecting the ones that missed; that loop is not implemented. Output quality currently rests on the phenotype engine and the LoRA, with a human looking at the results.
  • 119 species is a fraction of Cattleya and its allied genera. Crosses outside that set fall back to weaker trait inference.

Code: github.com/musharna/orchid-hybrid-visualizer