456 lines
14 KiB
Markdown
456 lines
14 KiB
Markdown
# PunimTag Web
|
|
|
|
**Modern Photo Management and Facial Recognition System**
|
|
|
|
A fast, simple, and modern web application for organizing and tagging photos using state-of-the-art DeepFace AI with ArcFace recognition model.
|
|
|
|
---
|
|
|
|
## 🎯 Features
|
|
|
|
- **🌐 Web-Based**: Modern React frontend with FastAPI backend
|
|
- **🔥 DeepFace AI**: State-of-the-art face detection with RetinaFace and ArcFace models
|
|
- **🎯 Superior Accuracy**: 512-dimensional embeddings (4x more detailed than face_recognition)
|
|
- **⚙️ Multiple Detectors**: Choose from RetinaFace, MTCNN, OpenCV, or SSD detectors
|
|
- **🎨 Flexible Models**: Select ArcFace, Facenet, Facenet512, or VGG-Face recognition models
|
|
- **👤 Person Identification**: Identify and tag people across your photo collection
|
|
- **🤖 Smart Auto-Matching**: Intelligent face matching with quality scoring and cosine similarity
|
|
- **📊 Confidence Calibration**: Empirical-based confidence scores for realistic match probabilities
|
|
- **🔍 Advanced Search**: Search by people, dates, tags, and folders
|
|
- **🏷️ Tag Management**: Organize photos with hierarchical tags
|
|
- **⚡ Batch Processing**: Process thousands of photos efficiently
|
|
- **🎯 Unique Faces Filter**: Hide duplicate faces to focus on unique individuals
|
|
- **🔄 Real-time Updates**: Live progress tracking and job status updates
|
|
- **🔒 Privacy-First**: All data stored locally, no cloud dependencies
|
|
|
|
---
|
|
|
|
## 🚀 Quick Start
|
|
|
|
### Prerequisites
|
|
|
|
- Python 3.12 or higher
|
|
- Node.js 18+ and npm
|
|
- Virtual environment (recommended)
|
|
|
|
### Installation
|
|
|
|
```bash
|
|
# Clone the repository
|
|
git clone <repository-url>
|
|
cd punimtag
|
|
|
|
# Create and activate virtual environment
|
|
python -m venv venv
|
|
source venv/bin/activate # On Windows: venv\Scripts\activate
|
|
|
|
# Install Python dependencies
|
|
pip install -r requirements.txt
|
|
|
|
# Install frontend dependencies
|
|
cd frontend
|
|
npm install
|
|
cd ..
|
|
```
|
|
|
|
### Database Setup
|
|
|
|
**Automatic Initialization:**
|
|
The database and all tables are automatically created on first startup. No manual migration is needed!
|
|
|
|
The web application will:
|
|
- Create the database file at `data/punimtag.db` (SQLite default) if it doesn't exist
|
|
- Create all required tables with the correct schema on startup
|
|
- Match the desktop version schema exactly for compatibility
|
|
|
|
**Manual Setup (Optional):**
|
|
If you need to reset the database or create it manually:
|
|
```bash
|
|
source venv/bin/activate
|
|
export PYTHONPATH=/home/ladmin/Code/punimtag
|
|
# Recreate all tables from models
|
|
python scripts/recreate_tables_web.py
|
|
```
|
|
|
|
**PostgreSQL (Production):**
|
|
Set the `DATABASE_URL` environment variable:
|
|
```bash
|
|
export DATABASE_URL=postgresql+psycopg2://user:password@host:port/database
|
|
```
|
|
|
|
**Database Schema:**
|
|
The web version uses the **exact same schema** as the desktop version for full compatibility:
|
|
- `photos` - Photo metadata (path, filename, date_taken, processed)
|
|
- `people` - Person records (first_name, last_name, middle_name, maiden_name, date_of_birth)
|
|
- `faces` - Face detections (encoding, location, quality_score, face_confidence, exif_orientation)
|
|
- `person_encodings` - Person face encodings for matching
|
|
- `tags` - Tag definitions
|
|
- `phototaglinkage` - Photo-tag relationships (with linkage_type)
|
|
|
|
### Running the Application
|
|
|
|
**Prerequisites:**
|
|
- Redis must be installed and running (for background jobs)
|
|
|
|
**Install Redis (if not installed):**
|
|
```bash
|
|
# On Ubuntu/Debian:
|
|
sudo apt update && sudo apt install -y redis-server
|
|
sudo systemctl start redis-server
|
|
sudo systemctl enable redis-server # Auto-start on boot
|
|
|
|
# On macOS with Homebrew:
|
|
brew install redis
|
|
brew services start redis
|
|
|
|
# Verify Redis is running:
|
|
redis-cli ping # Should respond with "PONG"
|
|
```
|
|
|
|
**Start Redis (if installed but not running):**
|
|
```bash
|
|
# On Linux:
|
|
sudo systemctl start redis-server
|
|
|
|
# Or run directly:
|
|
redis-server
|
|
```
|
|
|
|
**Terminal 2 - Backend API (automatically starts RQ worker):**
|
|
```bash
|
|
cd /home/ladmin/Code/punimtag
|
|
source venv/bin/activate
|
|
export PYTHONPATH=/home/ladmin/Code/punimtag
|
|
uvicorn src.web.app:app --host 127.0.0.1 --port 8000
|
|
```
|
|
|
|
You should see:
|
|
```
|
|
✅ RQ worker started in background subprocess (PID: ...)
|
|
INFO: Started server process
|
|
INFO: Uvicorn running on http://127.0.0.1:8000
|
|
```
|
|
|
|
**Note:** The RQ worker automatically starts in a background subprocess when the API starts. You'll see a confirmation message with the worker PID. If Redis isn't running, you'll see a warning message.
|
|
|
|
**Terminal 3 - Frontend:**
|
|
```bash
|
|
cd /home/ladmin/Code/punimtag/frontend
|
|
npm run dev
|
|
```
|
|
|
|
Then open your browser to **http://localhost:3000**
|
|
|
|
**Default Login:**
|
|
- Username: `admin`
|
|
- Password: `admin`
|
|
|
|
**Note:**
|
|
- The database and tables are **automatically created on first startup** - no manual setup needed!
|
|
- The RQ worker starts automatically in a background subprocess when the API server starts
|
|
- Make sure Redis is running first, or the worker won't start
|
|
- Worker names are unique to avoid conflicts when restarting
|
|
- Photo uploads are stored in `data/uploads` (configurable via `PHOTO_STORAGE_DIR` env var)
|
|
- **DeepFace models download automatically on first use** (can take 5-10 minutes)
|
|
- **If port 8000 is in use**, kill the process: `lsof -i :8000` then `kill <PID>` or `pkill -f "uvicorn.*app"`
|
|
|
|
---
|
|
|
|
## 📖 Documentation
|
|
|
|
- **[Architecture](docs/ARCHITECTURE.md)**: System design and technical details
|
|
|
|
|
|
*
|
|
|
|
## 🏗️ Project Structure
|
|
|
|
```
|
|
punimtag/
|
|
├── src/ # Source code
|
|
│ ├── web/ # Web backend
|
|
│ │ ├── api/ # API routers
|
|
│ │ ├── db/ # Database models and session
|
|
│ │ ├── schemas/ # Pydantic models
|
|
│ │ └── services/ # Business logic services
|
|
│ └── core/ # Legacy desktop business logic
|
|
├── frontend/ # React frontend
|
|
│ ├── src/
|
|
│ │ ├── api/ # API client
|
|
│ │ ├── components/ # React components
|
|
│ │ ├── context/ # React contexts (Auth)
|
|
│ │ ├── hooks/ # Custom hooks
|
|
│ │ └── pages/ # Page components
|
|
│ └── package.json
|
|
├── tests/ # Test suite
|
|
├── docs/ # Documentation
|
|
├── data/ # Application data (database, images)
|
|
├── alembic/ # Database migrations
|
|
└── deploy/ # Docker deployment configs
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Current Status
|
|
|
|
### Foundations
|
|
|
|
**Backend:**
|
|
- ✅ FastAPI application with CORS middleware
|
|
- ✅ Health, version, and metrics endpoints
|
|
- ✅ JWT authentication (login, refresh, user info)
|
|
- ✅ Job management endpoints (RQ/Redis integration)
|
|
- ✅ SQLAlchemy models for all entities
|
|
- ✅ Alembic migrations configured and applied
|
|
- ✅ Database initialized (SQLite default, PostgreSQL supported)
|
|
- ✅ RQ worker auto-start (starts automatically with API server)
|
|
|
|
**Frontend:**
|
|
- ✅ React + Vite + TypeScript setup
|
|
- ✅ Tailwind CSS configured
|
|
- ✅ Authentication flow with login page
|
|
- ✅ Protected routes with auth context
|
|
- ✅ Navigation layout (left sidebar + top bar)
|
|
- ✅ All page routes (Dashboard, Scan, Process, Search, Identify, Auto-Match, Tags, Settings)
|
|
|
|
**Database:**
|
|
- ✅ All tables created automatically on startup: `photos`, `faces`, `people`, `person_encodings`, `tags`, `phototaglinkage`
|
|
- ✅ Schema matches desktop version exactly for full compatibility
|
|
- ✅ Indices configured for performance
|
|
- ✅ SQLite database at `data/punimtag.db` (auto-created if missing)
|
|
|
|
### Image Ingestion & Processing
|
|
|
|
**Backend:**
|
|
- ✅ Photo import service with checksum computation
|
|
- ✅ EXIF date extraction and image metadata
|
|
- ✅ Folder scanning with recursive option
|
|
- ✅ File upload support
|
|
- ✅ Background job processing with RQ
|
|
- ✅ Real-time job progress via SSE (Server-Sent Events)
|
|
- ✅ Duplicate detection (by path and checksum)
|
|
- ✅ Photo storage configuration (`PHOTO_STORAGE_DIR`)
|
|
- ✅ **DeepFace pipeline integration**
|
|
- ✅ **Face detection (RetinaFace, MTCNN, OpenCV, SSD)**
|
|
- ✅ **Face embeddings computation (ArcFace, Facenet, Facenet512, VGG-Face)**
|
|
- ✅ **Face processing service with configurable detectors/models**
|
|
- ✅ **EXIF orientation handling**
|
|
- ✅ **Face quality scoring and validation**
|
|
- ✅ **Batch processing with progress tracking**
|
|
- ✅ **Job cancellation support**
|
|
|
|
**Frontend:**
|
|
- ✅ Scan tab UI with folder selection
|
|
- ✅ Drag-and-drop file upload
|
|
- ✅ Recursive scan toggle
|
|
- ✅ Real-time job progress with progress bar
|
|
- ✅ Job status monitoring (SSE integration)
|
|
- ✅ Results display (added/existing counts)
|
|
- ✅ Error handling and user feedback
|
|
- ✅ **Process tab UI with configuration controls**
|
|
- ✅ **Detector/model selection dropdowns**
|
|
- ✅ **Batch size configuration**
|
|
- ✅ **Start/Stop processing controls**
|
|
- ✅ **Processing progress display with photo count**
|
|
- ✅ **Results summary (faces detected, faces stored)**
|
|
- ✅ **Job cancellation support**
|
|
|
|
**Worker:**
|
|
- ✅ RQ worker auto-starts with API server
|
|
- ✅ Unique worker names to avoid conflicts
|
|
- ✅ Graceful shutdown handling
|
|
- ✅ **String-based function paths for reliable serialization**
|
|
|
|
### Identify Workflow & Auto-Match
|
|
|
|
**Backend:**
|
|
- ✅ Identify face endpoints with person creation
|
|
- ✅ Auto-match engine with similarity thresholds
|
|
- ✅ Unidentified faces management and filtering
|
|
- ✅ Person creation and linking
|
|
- ✅ Batch identification support
|
|
- ✅ Similar faces search with cosine similarity
|
|
- ✅ Confidence calibration system (empirical-based)
|
|
- ✅ Face unmatch/removal functionality
|
|
- ✅ Batch similarity calculations
|
|
|
|
**Frontend:**
|
|
- ✅ Identify page UI with face navigation
|
|
- ✅ Person creation and editing
|
|
- ✅ Similar faces panel with confidence display
|
|
- ✅ Auto-Match page with person-centric view
|
|
- ✅ Checkbox selection for batch identification
|
|
- ✅ Confidence percentages with color coding
|
|
- ✅ Unique faces filter (hide duplicates)
|
|
- ✅ Date filtering for faces
|
|
- ✅ Real-time face matching and display
|
|
|
|
### PSearch & Tags
|
|
|
|
**Backend:**
|
|
- ✅ Search endpoints with filters (people, dates, tags, folders)
|
|
- ✅ Tag management endpoints (create, update, delete)
|
|
- ✅ Photo-tag linkage system
|
|
- ✅ Advanced filtering and querying
|
|
- ✅ Photo grid endpoints with pagination
|
|
|
|
**Frontend:**
|
|
- ✅ Search page with advanced filters
|
|
- ✅ Tag management UI
|
|
- ✅ Photo grid with virtualized rendering
|
|
- ✅ Filter by people, dates, tags, and folders
|
|
- ✅ Search results display
|
|
|
|
---
|
|
|
|
## 🔧 Configuration
|
|
|
|
### Database
|
|
|
|
**SQLite (Default for Development):**
|
|
```bash
|
|
# Default location: data/punimtag.db
|
|
# No configuration needed
|
|
```
|
|
|
|
**PostgreSQL (Production):**
|
|
```bash
|
|
export DATABASE_URL=postgresql+psycopg2://user:password@host:port/database
|
|
```
|
|
|
|
### Environment Variables
|
|
|
|
```bash
|
|
# Database (optional, defaults to SQLite)
|
|
DATABASE_URL=sqlite:///data/punimtag.db
|
|
|
|
# JWT Secrets (change in production!)
|
|
SECRET_KEY=your-secret-key-here
|
|
|
|
# Single-user credentials (change in production!)
|
|
ADMIN_USERNAME=admin
|
|
ADMIN_PASSWORD=admin
|
|
|
|
# Photo storage directory (default: data/uploads)
|
|
PHOTO_STORAGE_DIR=data/uploads
|
|
```
|
|
|
|
---
|
|
|
|
|
|
---
|
|
|
|
### 🔄 Phase 5: Polish & Release (In Progress)
|
|
- Performance optimization
|
|
- Accessibility improvements
|
|
- Production deployment
|
|
- Documentation updates
|
|
|
|
---
|
|
|
|
## 🏗️ Architecture
|
|
|
|
**Backend:**
|
|
- **Framework**: FastAPI (Python 3.12+)
|
|
- **Database**: SQLite (dev), PostgreSQL (production)
|
|
- **ORM**: SQLAlchemy 2.0
|
|
- **Migrations**: Alembic
|
|
- **Jobs**: Redis + RQ
|
|
- **Auth**: JWT (python-jose)
|
|
|
|
**Frontend:**
|
|
- **Framework**: React 18 + TypeScript
|
|
- **Build Tool**: Vite
|
|
- **Styling**: Tailwind CSS
|
|
- **State**: React Query + Context API
|
|
- **Routing**: React Router
|
|
|
|
**Deployment:**
|
|
- Docker Compose for local development
|
|
- Containerized services for production
|
|
|
|
---
|
|
|
|
## 📦 Dependencies
|
|
|
|
**Backend:**
|
|
- `fastapi==0.115.0`
|
|
- `uvicorn[standard]==0.30.6`
|
|
- `pydantic==2.9.1`
|
|
- `SQLAlchemy==2.0.36`
|
|
- `alembic==1.13.2`
|
|
- `python-jose[cryptography]==3.3.0`
|
|
- `redis==5.0.8`
|
|
- `rq==1.16.2`
|
|
- `deepface>=0.0.79`
|
|
- `tensorflow>=2.13.0`
|
|
|
|
**Frontend:**
|
|
- `react==18.2.0`
|
|
- `react-router-dom==6.20.0`
|
|
- `@tanstack/react-query==5.8.4`
|
|
- `axios==1.6.2`
|
|
- `tailwindcss==3.3.5`
|
|
|
|
---
|
|
|
|
## 🔒 Security
|
|
|
|
- JWT-based authentication with refresh tokens
|
|
- Password hashing (to be implemented in production)
|
|
- CORS configured for development (restrict in production)
|
|
- SQL injection prevention via SQLAlchemy ORM
|
|
- Input validation via Pydantic schemas
|
|
|
|
**⚠️ Note**: Default credentials (`admin`/`admin`) are for development only. Change in production!
|
|
|
|
---
|
|
|
|
## 🐛 Known Limitations
|
|
|
|
- Single-user mode only (multi-user support planned)
|
|
- SQLite for development (PostgreSQL recommended for production)
|
|
- No password hashing yet (plain text comparison - fix before production)
|
|
- GPU acceleration not yet implemented (CPU-only for now)
|
|
- Large databases (>50K photos) may require optimization
|
|
- DeepFace model downloads on first use (can take 5-10 minutes, ~100MB)
|
|
- Face processing is CPU-intensive (~2-3x slower than face_recognition, but more accurate)
|
|
- First run is slower due to model downloads (subsequent runs are faster)
|
|
|
|
---
|
|
|
|
## 📝 License
|
|
|
|
[Add your license here]
|
|
|
|
---
|
|
|
|
## 👥 Authors
|
|
|
|
PunimTag Development Team
|
|
|
|
---
|
|
|
|
|
|
|
|
## 🙏 Acknowledgments
|
|
|
|
- **DeepFace** library by Sefik Ilkin Serengil - Modern face recognition framework
|
|
- **ArcFace** - Additive Angular Margin Loss for Deep Face Recognition
|
|
- **RetinaFace** - State-of-the-art face detection
|
|
- TensorFlow, React, FastAPI, and all open-source contributors
|
|
|
|
---
|
|
|
|
## 📧 Support
|
|
|
|
For questions or issues:
|
|
1. Check documentation in `docs/`
|
|
|
|
|
|
---
|
|
|
|
**Made with ❤️ for photo enthusiasts**
|
|
|
|
|