AI photo tagging pipeline: 10,000+ species classification, XMP sidecars, GPU accelerated
699
Status: Version 1.1.0 - Production Release
AI-powered photo analysis pipeline that extracts EXIF metadata, detects objects, classifies species, and writes results to XMP sidecar files compatible with Adobe Lightroom Classic, On1 PhotoRAW, Immich and other photo management software.
Docker Hub: https://hub.docker.com/r/stevenvanassche/luminaā
GitHub: https://github.com/stevenvanassche/Luminaā
š Installation Guideā - Complete setup instructions with platform-specific details
TL;DR for experienced users:
# Create project directory
mkdir -p lumina-docker/{photos,cache} && cd lumina-docker
# Download docker-compose.yml
curl -o docker-compose.yml https://raw.githubusercontent.com/stevenvanassche/Lumina/master/docker/docker-compose.yml
# Create basic .env file
cat > .env << EOF
PHOTOS_PATH=./photos
CACHE_PATH=./cache
EOF
# Add your photos to the photos/ directory, then run:
docker compose --profile cpu up # CPU mode (~1 photo/sec)
docker compose --profile gpu up # GPU mode (~10 photos/sec, requires NVIDIA GPU + WSL2 on Windows)
# NEW in v1.1: Watch mode - continuously monitor for new photos
LUMINA_WATCH_MODE=on docker compose --profile cpu up
First Run: Models download automatically (~2.5GB, 5-15 minutes)
ā ļø Windows GPU Users: WSL2 is required for GPU acceleration. See the Installation Guideā for setup instructions.
<dc:subject>
<rdf:Seq>
<rdf:li>COCO Detection</rdf:li>
<rdf:li>bird</rdf:li>
<rdf:li>Inat21</rdf:li>
<rdf:li>European Starling</rdf:li>
</rdf:Seq>
</dc:subject>
<lr:hierarchicalSubject>
<rdf:Seq>
<rdf:li>COCO Detection|bird</rdf:li>
<rdf:li>Inat21|bird|European Starling</rdf:li>
</rdf:Seq>
</lr:hierarchicalSubject>
ā Validated:
ā Expected:
š Integration Guides: See Installation Guideā for detailed setup instructions for each platform.
š Detailed Requirements: See Installation Guideā for platform-specific setup instructions
Basic configuration via .env file:
| Variable | Description |
|---|---|
PHOTOS_PATH | Directory containing your photos (required) |
CACHE_PATH | Directory for models, checkpoints, and logs (required) |
LUMINA_WORKERS | Number of parallel workers (default: 2 CPU, 1 GPU) |
LUMINA_BATCH_SIZE | Photos per batch (default: 5 CPU, 10 GPU) |
LUMINA_LOG_LEVEL | Logging level: DEBUG, INFO, WARNING, ERROR (default: INFO) |
LUMINA_EXECUTION_MODE | Processing mode: quick_scan/normal_scan/force_update (default: normal_scan) |
LUMINA_WATCH_MODE | Watch mode: on/off (default: off) (New in v1.1) |
LUMINA_MODEL_IDLE_TIMEOUT | Model unload timeout: auto/disabled/ (default: auto) (New in v1.1) |
LUMINA_WATCH_IDLE_EXIT | Auto-exit after N seconds idle, 0=disabled (default: 0) (New in v1.1) |
LUMINA_RAW_SUPPORT | RAW file handling: on/off/only (default: on) (New in v1.1) |
Example .env for CPU mode:
PHOTOS_PATH=./photos
CACHE_PATH=./cache
LUMINA_WORKERS=2
LUMINA_BATCH_SIZE=5
Example .env for GPU mode:
PHOTOS_PATH=./photos
CACHE_PATH=./cache
LUMINA_WORKERS=1
LUMINA_BATCH_SIZE=10
LUMINA_PARALLEL_BATCHES=3
Example .env for Watch mode (continuous monitoring):
PHOTOS_PATH=./photos
CACHE_PATH=./cache
LUMINA_WATCH_MODE=on
LUMINA_MODEL_IDLE_TIMEOUT=auto # auto = unload after 300s idle in watch mode
Example .env to disable RAW support (JPEG-only mode):
PHOTOS_PATH=./photos
CACHE_PATH=./cache
LUMINA_RAW_SUPPORT=off # Disable RAW+JPEG pairing (default is on)
š Complete Configuration Reference: See Installation Guideā for all environment variables, performance tuning, and advanced options.
Tested on 1627 photos with EXIF ā RT-DETR ā iNat21 ā XMP Writer pipeline.
Standard formats:
.jpg, .jpeg).png)RAW formats (enabled by default in v1.1):
.nef).cr2, .cr3).arw).dng).raf).orf).rw2)RAW+JPEG Pairing: When enabled, Lumina intelligently pairs RAW and JPEG files with the same base filename (e.g., IMG_001.jpg + IMG_001.nef). The JPEG is used for faster AI analysis, and one XMP sidecar is created for the pair.
ā ļø RAW Format Limitations: Lumina uses LibRawā for RAW processing. Some newer formats like Nikon Z9 High Efficiency (HE/HE*) are not yet supported. For unsupported formats, shoot RAW+JPEG and enable pairing mode.
Note: XMP sidecar files are only created when objects or species are detected in the photo. Photos without any detections will not have an XMP file generated.
ā ļø Existing XMP Files: Lumina will merge AI-generated keywords with existing XMP metadata. This feature is still being tested - backup your XMP files before processing photos with existing metadata.
ā ļø JSON Format: JSON metadata files are provided for advanced integrations, but the structure may change in future versions. Build integrations with schema flexibility in mind.
This software is proprietary. The Docker images are provided for evaluation and non-commercial use.
| Use Case | Allowed | Requirements |
|---|---|---|
| Personal use | ā Yes | Free |
| Educational/Research | ā Yes | Free |
| Commercial use | ā No | Requires commercial license |
iNaturalist 21 Model Restriction:
RT-DETR Object Detection:
Commercial licensing is available for organizations wanting to use Lumina in production.
Contact: [email protected]ā
See LICENSEā for complete terms.
See CHANGELOG.mdā for version history.
This project uses the following AI models:
RT-DETR - Real-Time Detection Transformer (Apache 2.0)
iNat21 - EVA-02 model fine-tuned on iNaturalist 2021 (CC BY-NC 4.0)
Built with:
Built with ā¤ļø for wildlife photographers and photo enthusiasts
Content type
Image
Digest
sha256:db46b7099ā¦
Size
789.2 MB
Last updated
9 months ago
docker pull stevenvanassche/lumina:cpu-1.1.0