// Expert in temporal event detection, spatio-temporal clustering (ST-DBSCAN), and photo context understanding. Use for detecting photo events, clustering by time/location, shareability prediction, place recognition, event significance scoring, and life event detection. Activate on "event detection", "temporal clustering", "ST-DBSCAN", "spatio-temporal", "shareability prediction", "place recognition", "life events", "photo events", "temporal diversity". NOT for individual photo aesthetic quality (use photo-composition-critic), color palette analysis (use color-theory-palette-harmony-expert), face recognition implementation (use photo-content-recognition-curation-expert), or basic EXIF timestamp extraction.
| name | event-detection-temporal-intelligence-expert |
| description | Expert in temporal event detection, spatio-temporal clustering (ST-DBSCAN), and photo context understanding. Use for detecting photo events, clustering by time/location, shareability prediction, place recognition, event significance scoring, and life event detection. Activate on "event detection", "temporal clustering", "ST-DBSCAN", "spatio-temporal", "shareability prediction", "place recognition", "life events", "photo events", "temporal diversity". NOT for individual photo aesthetic quality (use photo-composition-critic), color palette analysis (use color-theory-palette-harmony-expert), face recognition implementation (use photo-content-recognition-curation-expert), or basic EXIF timestamp extraction. |
| allowed-tools | ["Read","Write","Edit","Bash","Grep","Glob","mcp__firecrawl__firecrawl_search","WebFetch"] |
| integrates_with | ["photo-content-recognition-curation-expert","collage-layout-expert","color-theory-palette-harmony-expert","clip-aware-embeddings"] |
Expert in detecting meaningful events from photo collections using spatio-temporal clustering, significance scoring, and intelligent photo selection for collages.
โ Use for:
โ NOT for:
photo-composition-criticcolor-theory-palette-harmony-expertphoto-content-recognition-curation-expertclip-aware-embeddingsNeed to group photos into meaningful events?
โโ Have GPS + timestamps? โโโโโโโโโโโโโโโโโโโโ ST-DBSCAN
โ โโ Also need visual similarity? โโโโโโโโโโ DeepDBSCAN (add CLIP)
โ โโ Need hierarchical events? โโโโโโโโโโโโโ Multi-level cascading
โ
โโ No GPS, only timestamps? โโโโโโโโโโโโโโโโโโ Temporal binning
โ โโ With visual content? โโโโโโโโโโโโโโโโโโโ CLIP + temporal
โ
โโ Photos have faces + want groups? โโโโโโโโโโโ Face clustering first
โโ Then event detection per person
The Problem: Standard clustering fails for photosโsame location on different days shouldn't be grouped.
Key Insight: 100 meters apart in same hour = same event. 100 meters apart 3 days later = different events.
ST-DBSCAN Parameters:
ฮต_spatial: 50m (indoor) โ 500m (outdoor festival) โ 5km (city tour)
ฮต_temporal: 1hr (short event) โ 8hr (day trip) โ 24hr (multi-day)
min_pts: 3 (small gathering) โ 10 (large event)
Algorithm: Both spatial AND temporal constraints must be satisfied:
Neighbor(p) = {q | distance(p,q) โค ฮต_spatial AND |time(p)-time(q)| โค ฮต_temporal}
โ Deep dive: references/st-dbscan-implementation.md
Problem: Photos at same time/place can be different subjects (ceremony vs empty chairs).
Solution: Add CLIP embeddings as third dimension:
Neighbor(p) = {q | spatial_ok AND temporal_ok AND cosine_sim(clip_p, clip_q) > threshold}
eps_visual: 0.3 (similar subjects) โ 0.5 (diverse event content)
Use case: "Paris Vacation" contains "Day 1: Louvre", "Day 2: Eiffel Tower"
Approach: Cascade ST-DBSCAN with expanding thresholds:
Goal: Birthday party > Daily commute photos
Multi-Factor Model (weights sum to 1.0):
| Factor | Weight | Description |
|---|---|---|
| location_rarity | 0.20 | Exotic location > home |
| people_presence | 0.15 | Photos with people score higher |
| photo_density | 0.15 | More photos/hour = more memorable |
| content_rarity | 0.15 | Landmarks, celebrations detected via CLIP |
| visual_diversity | 0.10 | Varied shots = special event |
| duration | 0.10 | Longer events score higher |
| engagement | 0.10 | Shared/edited/favorited photos |
| temporal_rarity | 0.05 | Annual patterns (birthdays, holidays) |
โ Deep dive: references/event-scoring-shareability.md
Goal: Predict which photos will be shared on social media.
High-Signal Features (2025 research):
Shareability Threshold: >0.6 = "Highly Shareable"
โ Deep dive: references/event-scoring-shareability.md
Automatically detect major life events using multi-modal signals:
| Event Type | Primary Signals | Threshold |
|---|---|---|
| Graduation | Cap/gown, diploma, auditorium | 0.6 |
| Wedding | Formal attire, bouquet, cake, rings | 0.7 |
| Birth | New infant face cluster, hospital setting | 0.8 |
| Residential Move | 50km+ location shift, >30 days | 0.8 |
| Travel Milestone | First visit to new country | 1.0 |
โ Deep dive: references/place-recognition-life-events.md
Problem: Without constraints, collage might be all vacation photos.
| Method | Best For | Use When |
|---|---|---|
| Temporal Binning | Even time coverage | Need chronological spread |
| Temporal MMR | Quality + diversity balance | Balanced selection |
| Event-Based | Event representation | Each event matters |
MMR(photo) = ฮป ร quality + (1-ฮป) ร min_temporal_distance_to_selected
โ Deep dive: references/temporal-diversity-pipeline.md
What it looks like: Using K-means or basic DBSCAN on timestamps only
clusters = KMeans(n_clusters=10).fit(timestamps) # WRONG
Why it's wrong: Multi-day trips at same location get split; same-day different-location events get merged.
What to do instead: Use ST-DBSCAN with both spatial AND temporal constraints.
What it looks like: Using same eps_spatial=100m for all events
Why it's wrong: Indoor events need 50m, city tours need 5km.
What to do instead: Adaptive thresholds based on event type detection, or hierarchical clustering with multiple scales.
What it looks like: ST-DBSCAN alone for event detection
Why it's wrong: Wedding ceremony and empty chairs setupโsame time/place, completely different importance.
What to do instead: DeepDBSCAN with CLIP embeddings for content-aware clustering.
What it looks like:
distance = sqrt((lat2-lat1)**2 + (lon2-lon1)**2) # WRONG
Why it's wrong: Degrees โ meters. 1ยฐ latitude = 111km, but 1ยฐ longitude varies by latitude.
What to do instead: Haversine formula for great-circle distance:
from geopy.distance import geodesic
distance_meters = geodesic((lat1, lon1), (lat2, lon2)).meters
What it looks like: Forcing every photo into a cluster
Why it's wrong: Solo commute photos pollute event clusters.
What to do instead: DBSCAN naturally identifies noise (label=-1). Keep noise separateโdon't force into nearest cluster.
What it looks like: Predicting shareability from photo features alone
Why it's wrong: A mediocre photo from your wedding is more shareable than a great photo from Tuesday's lunch.
What to do instead: Include event significance as feature:
features['event_significance'] = photo.event.significance_score
from event_detection import EventDetectionPipeline
pipeline = EventDetectionPipeline()
# Process photo corpus
results = pipeline.process_photo_corpus(photos)
# Access events
for event in results['events']:
print(f"{event.label}: {len(event.photos)} photos, significance={event.significance_score:.2f}")
# Access life events
for life_event in results['life_events']:
print(f"{life_event.type} detected on {life_event.timestamp}")
# Select for collage with diversity
collage_photos = pipeline.select_for_collage(results, target_count=100)
| Operation | Target |
|---|---|
| ST-DBSCAN (10K photos) | < 2 seconds |
| Event significance scoring | < 100ms/event |
| Shareability prediction | < 50ms/photo |
| Place recognition (cached) | < 10ms/photo |
| Full pipeline (10K photos) | < 5 seconds |
numpy scipy scikit-learn hdbscan geopy transformers xgboost pandas opencv-python
Version: 2.0.0 Last Updated: November 2025