415 lines
12 KiB
Markdown
415 lines
12 KiB
Markdown
# Face Recognition System
|
|
|
|
**Version:** 6.5.1
|
|
**Status:** Production Ready
|
|
**Last Updated:** 2025-11-01
|
|
|
|
## Overview
|
|
|
|
The Media Downloader now includes an automated face recognition system that analyzes downloaded media (images and videos) and routes them based on whether they match reference faces in the database.
|
|
|
|
## Features
|
|
|
|
- **Automatic Face Detection**: Scans all downloaded images and videos
|
|
- **Video Support**: Extracts frames from videos for face analysis
|
|
- **Smart Routing**: Matched media → final destination, unmatched → review queue
|
|
- **Web UI Review Queue**: Manual review interface with batch operations
|
|
- **Reference Training**: Build face database from known good images
|
|
- **Configurable Tolerance**: Adjustable matching sensitivity
|
|
|
|
## Architecture
|
|
|
|
### Components
|
|
|
|
1. **Face Recognition Module** (`modules/face_recognition_module.py`)
|
|
- Face detection using `face_recognition` library (dlib HOG model)
|
|
- Face encoding (128-dimensional vectors)
|
|
- Reference face database management
|
|
- Video frame extraction via ffmpeg
|
|
|
|
2. **Move Module Integration** (`modules/move_module.py`)
|
|
- Integrated into file move workflow
|
|
- Checks after duplicate detection
|
|
- Routes to review queue on no-match
|
|
|
|
3. **Review API** (`web/backend/api.py`)
|
|
- `/api/review/list` - List review queue
|
|
- `/api/review/keep` - Move to destination
|
|
- `/api/review/delete` - Delete from queue
|
|
- `/api/review/add-reference` - Add as reference face
|
|
|
|
4. **Review UI** (`web/frontend/src/pages/Review.tsx`)
|
|
- Gallery view of unmatched media
|
|
- Single-file and batch operations
|
|
- Lightbox preview
|
|
- Action buttons: Keep, Add Reference, Delete
|
|
|
|
### Database Schema
|
|
|
|
```sql
|
|
CREATE TABLE face_recognition_references (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
person_name TEXT NOT NULL,
|
|
encoding_data TEXT NOT NULL, -- Base64 encoded pickle of numpy array
|
|
reference_image_path TEXT,
|
|
is_active INTEGER DEFAULT 1,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE INDEX idx_face_ref_person ON face_recognition_references(person_name, is_active);
|
|
```
|
|
|
|
## Workflow
|
|
|
|
```
|
|
┌─────────────────────┐
|
|
│ Download Media │
|
|
└──────────┬──────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────┐
|
|
│ Calculate Hash │ ──── Duplicate? ──→ Skip
|
|
└──────────┬──────────┘
|
|
│ New file
|
|
▼
|
|
┌─────────────────────┐
|
|
│ Detect Faces │
|
|
│ (Image: direct) │
|
|
│ (Video: extract │
|
|
│ frame @ 1s) │
|
|
└──────────┬──────────┘
|
|
│
|
|
▼
|
|
┌─────────────────────┐
|
|
│ Match Against │
|
|
│ Reference Faces │
|
|
│ (tolerance: 0.6) │
|
|
└──────────┬──────────┘
|
|
│
|
|
├─── Match (>60%) ──→ Move to Final Destination
|
|
│
|
|
└─── No Match ─────→ Move to /opt/immich/review
|
|
│
|
|
▼
|
|
┌─────────────────────┐
|
|
│ Review Queue (UI) │
|
|
│ - Keep │
|
|
│ - Add Reference │
|
|
│ - Delete │
|
|
└─────────────────────┘
|
|
```
|
|
|
|
## Configuration
|
|
|
|
### Settings (Web UI)
|
|
|
|
Face recognition settings can be configured via the **Configuration → Downloads** page in the web UI:
|
|
|
|
1. Navigate to http://your-server:5173/configuration
|
|
2. Click the **Downloads** tab
|
|
3. Scroll to the **Face Recognition** section
|
|
4. Configure settings:
|
|
- **Enabled**: Toggle face recognition on/off
|
|
- **Person Name**: Name used for matching reference faces (e.g., "Eva Longoria")
|
|
- **Tolerance**: Match sensitivity 0.0-1.0 (default: 0.6, lower = stricter)
|
|
- **Review Queue Path**: Directory for unmatched media (default: /opt/immich/review)
|
|
5. Click **Save Download Settings**
|
|
|
|
### Settings (Database)
|
|
|
|
Settings are stored in the database `settings` table:
|
|
|
|
```json
|
|
{
|
|
"enabled": true,
|
|
"tolerance": 0.6,
|
|
"person_name": "Eva Longoria",
|
|
"review_path": "/opt/immich/review"
|
|
}
|
|
```
|
|
|
|
**Parameters:**
|
|
- `enabled` (boolean): Enable/disable face recognition
|
|
- `tolerance` (float 0.0-1.0): Lower = stricter matching (default: 0.6)
|
|
- `person_name` (string): Default person name for references
|
|
- `review_path` (string): Directory for unmatched media
|
|
|
|
**Direct Database Access:**
|
|
```bash
|
|
sqlite3 /opt/media-downloader/database/media_downloader.db "SELECT key, value FROM settings WHERE key = 'face_recognition'"
|
|
```
|
|
|
|
### Supported Formats
|
|
|
|
**Images:**
|
|
- .jpg, .jpeg, .png, .gif, .bmp, .webp, .heic
|
|
|
|
**Videos:**
|
|
- .mp4, .mov, .avi, .mkv, .webm, .flv, .m4v
|
|
|
|
## Usage
|
|
|
|
### Training Reference Faces
|
|
|
|
Add reference faces from known good images:
|
|
|
|
```bash
|
|
/opt/media-downloader/venv/bin/python3 /opt/media-downloader/scripts/add_reference_face.py "Person Name" "/path/to/image.jpg"
|
|
```
|
|
|
|
**Best Practices:**
|
|
- Use 5-10 reference images per person
|
|
- Include variety: different angles, lighting, expressions
|
|
- Use high-quality, clear face images
|
|
- Avoid group photos (will use first detected face)
|
|
|
|
### Testing Face Recognition
|
|
|
|
Test an image/video against reference database:
|
|
|
|
```bash
|
|
/opt/media-downloader/venv/bin/python3 /opt/media-downloader/scripts/test_face_recognition.py "/path/to/test.jpg" [tolerance]
|
|
```
|
|
|
|
### Managing Review Queue
|
|
|
|
**Via Web UI:**
|
|
1. Navigate to `/review` page
|
|
2. View unmatched media in gallery
|
|
3. For each item or batch selection:
|
|
- **Keep**: Move to destination without adding as reference
|
|
- **Add Reference**: Add face to database + move to destination
|
|
- **Delete**: Remove from review queue
|
|
|
|
**Via CLI:**
|
|
```bash
|
|
# List review queue
|
|
ls -lh /opt/immich/review/
|
|
|
|
# Move to final destination manually
|
|
mv /opt/immich/review/file.jpg /opt/immich/md/destination/
|
|
|
|
# Add as reference then move
|
|
venv/bin/python3 scripts/add_reference_face.py "Name" "/opt/immich/review/file.jpg"
|
|
mv /opt/immich/review/file.jpg /opt/immich/md/destination/
|
|
```
|
|
|
|
### Batch Operations
|
|
|
|
**Web UI:**
|
|
1. Click "Select Multiple" button
|
|
2. Click images to select (blue ring + checkbox)
|
|
3. Use "Select All" for all items
|
|
4. Choose batch action:
|
|
- **Keep Selected** - Bulk move to destination
|
|
- **Add as Reference** - Bulk add faces + move
|
|
- **Delete Selected** - Bulk delete
|
|
|
|
## Performance
|
|
|
|
### Speed
|
|
- **Image Detection**: ~0.5-2s per image (HOG model)
|
|
- **Video Detection**: ~2-5s per video (frame extraction + detection)
|
|
- **Matching**: <0.1s per face against all references
|
|
|
|
### Accuracy
|
|
- **Same Person, Same Conditions**: 90-100% confidence
|
|
- **Same Person, Different Conditions**: 50-80% confidence
|
|
- **Different Person**: <40% confidence
|
|
- **Threshold**: 60% (tolerance: 0.6)
|
|
|
|
### Resource Usage
|
|
- **CPU**: Moderate (HOG model is CPU-based)
|
|
- **Memory**: ~200MB additional for face_recognition library
|
|
- **Disk**: Minimal (encodings are ~1KB each)
|
|
- **Temp Files**: Video frames auto-deleted after processing
|
|
|
|
## Troubleshooting
|
|
|
|
### No Faces Detected
|
|
|
|
**Causes:**
|
|
- Face too small in image/video
|
|
- Face obscured or at extreme angle
|
|
- Poor image quality
|
|
|
|
**Solutions:**
|
|
- Use higher quality source images
|
|
- For videos, try different timestamp (currently fixed at 1s)
|
|
- Check image isn't corrupted: `file /path/to/image.jpg`
|
|
|
|
### Low Confidence Matches
|
|
|
|
**Causes:**
|
|
- Insufficient reference faces
|
|
- References don't match current conditions (age, lighting, angle)
|
|
- Tolerance too strict
|
|
|
|
**Solutions:**
|
|
- Add more reference faces (5-10 recommended)
|
|
- Add references from similar conditions to target media
|
|
- Increase tolerance in settings (0.6 → 0.65)
|
|
|
|
### False Positives
|
|
|
|
**Causes:**
|
|
- Tolerance too loose
|
|
- Similar-looking people
|
|
- Insufficient reference diversity
|
|
|
|
**Solutions:**
|
|
- Decrease tolerance (0.6 → 0.55)
|
|
- Add negative examples to recognize differences
|
|
- Review reference faces for quality
|
|
|
|
### Video Frame Extraction Fails
|
|
|
|
**Causes:**
|
|
- ffmpeg not installed
|
|
- Video codec not supported
|
|
- Video shorter than 1 second
|
|
|
|
**Solutions:**
|
|
```bash
|
|
# Check ffmpeg
|
|
which ffmpeg
|
|
|
|
# Test frame extraction manually
|
|
ffmpeg -ss 1 -i video.mp4 -frames:v 1 test_frame.jpg
|
|
|
|
# Check video duration
|
|
ffmpeg -i video.mp4 2>&1 | grep Duration
|
|
```
|
|
|
|
## API Reference
|
|
|
|
### Face Recognition Module
|
|
|
|
```python
|
|
from modules.face_recognition_module import FaceRecognitionModule
|
|
from modules.unified_database import UnifiedDatabase
|
|
|
|
# Initialize
|
|
db = UnifiedDatabase()
|
|
face_module = FaceRecognitionModule(unified_db=db)
|
|
|
|
# Add reference face
|
|
face_module.add_reference_face("Person Name", "/path/to/image.jpg")
|
|
|
|
# Check image
|
|
result = face_module.check_image("/path/to/test.jpg", tolerance=0.6, is_video=False)
|
|
# Returns: {'has_match': bool, 'person_name': str, 'confidence': float, 'face_count': int, 'faces': list}
|
|
|
|
# Check video
|
|
result = face_module.check_image("/path/to/video.mp4", tolerance=0.6, is_video=True)
|
|
|
|
# Get reference faces
|
|
refs = face_module.get_reference_faces()
|
|
```
|
|
|
|
### Review API Endpoints
|
|
|
|
```javascript
|
|
// List review queue
|
|
GET /api/review/list?limit=50&offset=0
|
|
|
|
// Keep image (move to destination)
|
|
POST /api/review/keep
|
|
Body: { file_path: "/opt/immich/review/file.jpg", destination: "social media/instagram/posts" }
|
|
|
|
// Delete from review queue
|
|
DELETE /api/review/delete
|
|
Body: { file_path: "/opt/immich/review/file.jpg" }
|
|
|
|
// Add as reference + move
|
|
POST /api/review/add-reference
|
|
Body: {
|
|
file_path: "/opt/immich/review/file.jpg",
|
|
person_name: "Person Name",
|
|
destination: "social media/instagram/posts"
|
|
}
|
|
```
|
|
|
|
## Maintenance
|
|
|
|
### Regular Tasks
|
|
|
|
1. **Review Queue Cleanup** (Weekly)
|
|
- Process items in /opt/immich/review
|
|
- Keep: items that should have matched
|
|
- Delete: irrelevant items
|
|
- Add Reference: good quality faces to improve matching
|
|
|
|
2. **Reference Database Audit** (Monthly)
|
|
- Remove poor quality references
|
|
- Add new references from recent media
|
|
- Check reference count per person
|
|
|
|
3. **Performance Monitoring**
|
|
- Check review queue size: `ls /opt/immich/review | wc -l`
|
|
- Monitor match rate in logs
|
|
- Adjust tolerance if needed
|
|
|
|
### Database Queries
|
|
|
|
```sql
|
|
-- Count active references by person
|
|
SELECT person_name, COUNT(*) as count
|
|
FROM face_recognition_references
|
|
WHERE is_active = 1
|
|
GROUP BY person_name;
|
|
|
|
-- View recent references
|
|
SELECT person_name, reference_image_path, created_at
|
|
FROM face_recognition_references
|
|
WHERE is_active = 1
|
|
ORDER BY created_at DESC
|
|
LIMIT 10;
|
|
|
|
-- Disable a reference
|
|
UPDATE face_recognition_references
|
|
SET is_active = 0
|
|
WHERE id = ?;
|
|
```
|
|
|
|
## Security & Privacy
|
|
|
|
- **Face Encodings**: Stored as 128-dimensional vectors (not original images)
|
|
- **Local Processing**: All face detection happens locally, no cloud services
|
|
- **Access Control**: Review queue API requires authentication
|
|
- **Data Retention**: Reference faces kept indefinitely until manually removed
|
|
- **Audit Trail**: created_at/updated_at timestamps track reference changes
|
|
|
|
## Dependencies
|
|
|
|
- **face_recognition** (1.3.0): Face detection and recognition
|
|
- **dlib** (20.0.0): Machine learning toolkit (face detection models)
|
|
- **numpy** (2.3.4): Numerical computing (face encoding vectors)
|
|
- **ffmpeg**: Video frame extraction (system package)
|
|
|
|
## Future Enhancements
|
|
|
|
- [ ] Multi-person recognition (tag all people in image)
|
|
- [ ] Confidence threshold per person
|
|
- [ ] Face clustering for unknown faces
|
|
- [ ] GPU acceleration (dlib CNN model)
|
|
- [ ] Multiple frame extraction for videos
|
|
- [ ] Face detection quality scoring
|
|
- [ ] Auto-training from high-confidence matches
|
|
- [ ] REST API for external integrations
|
|
|
|
## Version History
|
|
|
|
**6.5.1** (2025-11-01)
|
|
- Added face recognition settings to Configuration page (Web UI)
|
|
- Settings now editable via Configuration → Downloads tab
|
|
- Real-time settings updates without editing database directly
|
|
|
|
**6.5.0** (2025-10-31)
|
|
- Initial face recognition implementation
|
|
- Image and video support
|
|
- Review queue with batch operations
|
|
- Reference face training
|
|
- Web UI integration
|