Transform thousands of wedding photos and hours of footage into an immersive 3D Gaussian Splatting experience with theatre mode replay, face-clustered guest roster, and AI-curated best photos per...
Transform wedding photos and video into an eternal, immersive 3D experience. Create living memories that let couples and guests relive the magic forever.
Use for:
NOT for:
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β WEDDING IMMORTALIST PIPELINE β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β 1. INGEST 2. RECONSTRUCT 3. CLUSTER β
β ββ Photos (1000s) ββ COLMAP SfM ββ Face detect β
β ββ Video (hours) ββ 3DGS training ββ Embeddings β
β ββ Audio/speeches ββ Scene merge ββ Identity link β
β β
β 4. CURATE 5. DESIGN 6. PRESENT β
β ββ Aesthetic score ββ Theme extract ββ Web viewer β
β ββ Per-person best ββ Color palette ββ Theatre mode β
β ββ Moment detect ββ Typography ββ Guest roster β
β β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Every wedding has a unique aesthetic. Extract and honor it:
| Theme Type | Color Palette | Typography | UI Elements |
|---|---|---|---|
| 70s Disco | Gold, orange, burnt sienna, deep purple | Groovy script, bold sans | Mirror balls, starbursts, warm gradients |
| Rustic/Barn | Earth tones, sage, cream, wood | Serif, hand-lettered | Burlap textures, wildflower accents |
| Beach/Coastal | Ocean blues, sand, coral, seafoam | Light sans, script | Shell motifs, wave patterns |
| Modern Minimal | Black, white, metallics | Clean geometric sans | Sharp lines, negative space |
| Queer Joy | Rainbow spectrums, bold colors | Expressive, varied | Pride elements, celebration maximalism |
| Cultural Fusion | Per tradition | Traditional + modern | Cultural motifs, heritage patterns |
# Theme extraction signals
THEME_SIGNALS = {
'color_palette': 'Dominant colors from venue, florals, attire',
'lighting_mood': 'Warm/cool, natural/dramatic, string lights/chandeliers',
'decor_elements': 'Rustic/modern/vintage/eclectic',
'attire_style': 'Traditional/non-traditional, formal/casual',
'cultural_markers': 'Religious symbols, cultural traditions',
'era_aesthetic': '70s disco, 20s gatsby, etc.'
}
Optimal Input Strategy:
βββ Video: Extract 2-3 fps (80% overlap minimum)
βββ Photos: Include ALL photographer shots
βββ Phone photos: Guest uploads (georeferenced bonus)
βββ Coverage: Ceremony + reception + all spaces
Quality Thresholds:
βββ Minimum images per space: 50-100
βββ Overlap requirement: 60-80%
βββ Blur rejection: Laplacian variance < 100 = skip
βββ Exposure: Reject severe over/underexposure
# Feature extraction
colmap feature_extractor \
--database_path database.db \
--image_path images/ \
--ImageReader.single_camera 0 \
--SiftExtraction.max_image_size 3200
# Exhaustive matching for comprehensive coverage
colmap exhaustive_matcher \
--database_path database.db \
--SiftMatching.guided_matching 1
# Sparse reconstruction
colmap mapper \
--database_path database.db \
--image_path images/ \
--output_path sparse/
# Dense reconstruction (optional, for mesh)
colmap image_undistorter ...
colmap patch_match_stereo ...
# Wedding-optimized 3DGS settings
WEDDING_3DGS_CONFIG = {
'iterations': 50_000, # High quality for permanent archive
'densify_from_iter': 500,
'densify_until_iter': 15_000,
'densification_interval': 100,
'opacity_reset_interval': 3000,
'sh_degree': 3, # Full spherical harmonics for lighting
'percent_dense': 0.01,
'densify_grad_threshold': 0.0002,
}
# Multi-space merge strategy
SPACES = ['ceremony', 'cocktail_hour', 'reception', 'photo_booth', 'dance_floor']
# Train each separately, then create unified navigation
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β FACE CLUSTERING PIPELINE β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β 1. Detection (RetinaFace/MTCNN) β
β ββ All faces in all photos β
β 2. Alignment (5-point landmark) β
β ββ Standardize for embedding β
β 3. Embedding (ArcFace/AdaFace) β
β ββ 512-dim identity vector per face β
β 4. Clustering (HDBSCAN) β
β ββ Group by identity, handle edge cases β
β 5. Identity Linking β
β ββ Match to couple, wedding party, family, guests β
β 6. Best Photo Selection β
β ββ Aesthetic scoring per cluster β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
CLUSTERING_CONFIG = {
'min_cluster_size': 3, # At least 3 photos to form identity
'min_samples': 2,
'metric': 'cosine',
'cluster_selection_epsilon': 0.3,
'cluster_selection_method': 'eom',
}
# Identity priority for naming
IDENTITY_PRIORITY = [
'couple_1', 'couple_2', # The married couple
'wedding_party', # Bridesmaids, groomspeople
'parents', # Parents of the couple
'grandparents',
'siblings',
'extended_family',
'friends',
'vendors', # Photographer, DJ, etc.
]
AESTHETIC_FEATURES = {
# Technical quality
'sharpness': 'Laplacian variance, MTF analysis',
'exposure': 'Histogram analysis, dynamic range',
'noise': 'High-ISO detection, grain analysis',
# Composition
'rule_of_thirds': 'Subject placement scoring',
'symmetry': 'For venue/group shots',
'framing': 'Negative space, balance',
# Face-specific
'expression': 'Smile detection, eye openness',
'blink_detection': 'Eyes closed penalty',
'gaze_direction': 'Looking at camera vs. candid',
'face_occlusion': 'Nothing blocking the face',
'face_lighting': 'Even illumination, no harsh shadows',
# Emotional
'genuine_smile': 'Duchenne marker detection',
'moment_quality': 'Laughter, tears, embraces',
}
def select_best_photos(cluster_photos, n=5):
"""Select top N photos for a person across all their appearances."""
scores = []
for photo in cluster_photos:
score = (
0.25 * technical_quality(photo) +
0.25 * composition_score(photo) +
0.30 * expression_quality(photo) +
0.20 * context_diversity(photo, scores) # Avoid all similar shots
)
scores.append((photo, score))
# Select top N with diversity constraint
return diverse_top_n(scores, n, diversity_threshold=0.7)
KEY MOMENTS (auto-detected + user-tagged):
βββ Ceremony
β βββ Processional
β βββ Vows exchange
β βββ Ring ceremony
β βββ First kiss
β βββ Recessional
βββ Reception
β βββ Grand entrance
β βββ First dance
β βββ Parent dances
β βββ Toasts/speeches
β βββ Cake cutting
β βββ Bouquet/garter
βββ Party
β βββ Dance floor highlights
β βββ Exit/sendoff
βββ Candids
βββ Emotional moments (tears, laughter)
βββ Spontaneous joy
Theatre Mode Rendering:
1. User navigates 3DGS scene freely
2. Approaches "moment marker" (glowing orb/frame)
3. Video/slideshow plays IN the 3D space
βββ On walls where projector was
βββ Floating frames in dance floor area
βββ Photo booth backdrop location
4. Spatial audio for speeches/music
5. User can pause, scrub, exit to continue exploring
// Wedding Immortalist Viewer Components
const VIEWER_FEATURES = {
// 3DGS Navigation
gaussianSplatting: {
renderer: 'three-gaussian-splat',
navigation: 'orbit + first-person',
qualityLevels: ['preview', 'standard', 'maximum'],
},
// Theatre Mode
theatreMode: {
momentMarkers: true,
videoInScene: true,
spatialAudio: true,
transitionEffects: 'theme-matched',
},
// Guest Roster
guestRoster: {
faceGrid: 'clustered by identity',
photoGallery: 'per-person best shots',
searchByName: true,
shareableLinks: 'per-guest galleries',
},
// Theme
theming: {
colorPalette: 'extracted from wedding',
typography: 'theme-matched',
uiElements: 'aesthetic-consistent',
},
};
Wrong: Extracting every video frame for 3DGS. Why: Redundant data, 10x slower processing, no quality improvement. Right: 2-3 fps extraction with motion-based keyframe selection.
Wrong: Training single 3DGS for entire venue. Why: Memory explosion, quality degradation, impossible on consumer hardware. Right: Train per-space, create unified navigation with seamless transitions.
Wrong: Using default HDBSCAN settings. Why: Wedding photos have varying lighting, makeup, anglesβneed tuning. Right: Tune per-wedding based on photo count and quality variance.
Wrong: Generic white/gray viewer UI for disco wedding. Why: Destroys the personality and joy of the event. Right: Extract and honor the couple's aesthetic choices.
Wrong: Using only professional photos. Why: Misses candid moments, guest perspectives, coverage gaps. Right: Merge professional + guest photos for complete coverage.
Per-Guest Experience:
βββ Personalized link: yourwedding.com/guests/aunt-martha
βββ Their best photos (AI-curated)
βββ Photos with the couple
βββ Group photos they appear in
βββ Download options (full-res)
βββ "Add to my memories" for their own archives
Guest Contribution Portal:
βββ Upload their own photos
βββ Tag themselves in unidentified clusters
βββ Correct misidentifications
βββ Add names to unknown guests
βββ Submit video moments they captured
wedding-immortalist-output/
βββ 3dgs-scenes/
β βββ ceremony/
β βββ cocktail/
β βββ reception/
β βββ unified-navigation.json
βββ guest-roster/
β βββ face-clusters/
β βββ identity-mapping.json
β βββ per-person-galleries/
βββ theatre-mode/
β βββ moment-markers.json
β βββ video-segments/
β βββ spatial-audio/
βββ web-viewer/
β βββ index.html
β βββ theme-config.json
β βββ assets/
βββ exports/
βββ full-resolution-photos/
βββ guest-gallery-zips/
βββ video-compilations/
Core Philosophy: A wedding happens once. The memories should live forever. This skill transforms ephemeral moments into an eternal, explorable experience that honors the couple's unique celebrationβwhether it's a disco dance party, a rustic barn gathering, or two grooms celebrating their love with chosen family.