36 KiB
PunimTag CLI - Minimal Photo Face Tagger
A simple command-line tool for automatic face recognition and photo tagging. No web interface, no complex dependencies - just the essentials.
📋 System Requirements
Minimum Requirements
- Python: 3.7 or higher
- Operating System: Linux, macOS, or Windows
- RAM: 2GB+ (4GB+ recommended for large photo collections)
- Storage: 100MB for application + space for photos and database
- Display: X11 display server (Linux) or equivalent for image viewing
Supported Platforms
- ✅ Ubuntu/Debian (fully supported with automatic dependency installation)
- ✅ macOS (manual dependency installation required)
- ✅ Windows (with WSL or manual setup)
- ⚠️ Other Linux distributions (manual dependency installation required)
What Gets Installed Automatically (Ubuntu/Debian)
The setup script automatically installs these system packages:
- Build tools:
cmake,build-essential - Math libraries:
libopenblas-dev,liblapack-dev(for face recognition) - GUI libraries:
libx11-dev,libgtk-3-dev,libboost-python-dev - Image viewer:
feh(for face identification interface)
🚀 Quick Start
# 1. Setup (one time only) - installs all dependencies including image viewer
git clone <your-repo>
cd PunimTag
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
python3 setup.py # Installs system deps + Python packages
# 2. Scan photos
python3 photo_tagger.py scan /path/to/your/photos
# 3. Process faces
python3 photo_tagger.py process
# 4. Identify faces with visual display
python3 photo_tagger.py identify --show-faces
# 5. Auto-match faces across photos (with improved algorithm)
python3 photo_tagger.py auto-match --show-faces
# 6. View and modify identified faces (NEW!)
python3 photo_tagger.py modifyidentified
# 7. View statistics
python3 photo_tagger.py stats
📦 Installation
Automatic Setup (Recommended)
# Clone and setup
git clone <your-repo>
cd PunimTag
# Create virtual environment (IMPORTANT!)
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Run setup script
python3 setup.py
⚠️ IMPORTANT: Always activate the virtual environment before running any commands:
source venv/bin/activate # Run this every time you open a new terminal
Manual Setup (Alternative)
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
python3 photo_tagger.py stats # Creates database
🎯 Commands
Scan for Photos
# Scan a folder
python3 photo_tagger.py scan /path/to/photos
# Scan recursively (recommended)
python3 photo_tagger.py scan /path/to/photos --recursive
Process Photos for Faces (with Quality Scoring)
# Process 50 photos (default) - now includes face quality scoring
python3 photo_tagger.py process
# Process 20 photos with CNN model (more accurate)
python3 photo_tagger.py process --limit 20 --model cnn
# Process with HOG model (faster)
python3 photo_tagger.py process --limit 100 --model hog
🔬 Quality Scoring Features:
- Automatic Assessment - Each face gets a quality score (0.0-1.0) based on multiple factors
- Smart Filtering - Only faces above quality threshold (≥0.2) are used for matching
- Quality Metrics - Evaluates sharpness, brightness, contrast, size, aspect ratio, and position
- Verbose Output - Use
--verboseto see quality scores during processing
Identify Faces (GUI-Enhanced!)
# Identify with GUI interface and face display (RECOMMENDED)
python3 photo_tagger.py identify --show-faces --batch 10
# GUI mode without face crops (coordinates only)
python3 photo_tagger.py identify --batch 10
# Auto-match faces across photos with GUI (NEW!)
python3 photo_tagger.py auto-match --show-faces
# Auto-identify high-confidence matches
python3 photo_tagger.py auto-match --auto --show-faces
🎯 New GUI-Based Identification Features:
- 🖼️ Visual Face Display - See individual face crops in the GUI
- 📝 Separate Name Fields - Dedicated text input fields for first name, last name, middle name, and maiden name
- 🎯 Direct Field Storage - Names are stored directly in separate fields for maximum reliability
- 🔤 Last Name Autocomplete - Smart autocomplete for last names with live filtering as you type
- ⭐ Required Field Indicators - Red asterisks (*) mark required fields (first name, last name, date of birth)
- ☑️ Compare with Similar Faces - Compare current face with similar unidentified faces
- 🎨 Modern Interface - Clean, intuitive GUI with buttons and input fields
- 💾 Window Size Memory - Remembers your preferred window size
- 🚫 No Terminal Input - All interaction through the GUI interface
- ⬅️ Back Navigation - Go back to previous faces (shows images and identification status)
- 🔄 Re-identification - Change identifications by going back and re-identifying
- 💾 Auto-Save - All identifications are saved immediately (no need to save manually)
- ☑️ Select All/Clear All - Bulk selection buttons for similar faces (enabled only when Compare is active)
- ⚠️ Smart Navigation Warnings - Prevents accidental loss of selected similar faces
- 💾 Quit Confirmation - Saves pending identifications when closing the application
- ⚡ Performance Optimized - Pre-fetched data for faster similar faces display
- 🎯 Clean Database Storage - Names are stored as separate first_name and last_name fields without commas
- 🔧 Improved Data Handling - Fixed field restoration and quit confirmation logic for better reliability
- 🧩 Unique Faces Only Filter (NEW)
- Checkbox in the Date Filters section: "Unique faces only (hide duplicates with high/medium confidence)"
- Applies only to the main face list (left/navigation); the Similar Faces panel (right) remains unfiltered
- Groups faces with ≥60% confidence matches (Medium/High/Very High) and shows only one representative
- Takes effect immediately when toggled (no need to click Apply Filter); Apply Filter is only for date filters
- Uses existing database encodings for fast, non-blocking filtering
🎯 New Auto-Match GUI Features:
- 📊 Person-Centric View - Shows matched person on left, all their unidentified faces on right
- ☑️ Checkbox Selection - Select which unidentified faces to identify with this person
- 📈 Confidence Percentages - Color-coded match confidence levels
- 🖼️ Side-by-Side Layout - Matched person on left, unidentified faces on right
- 📜 Scrollable Matches - Handle many potential matches easily
- 🎮 Enhanced Controls - Back, Next, or Quit buttons (navigation only)
- 💾 Smart Save Button - "Save changes for [Person Name]" button in left panel
- 🔄 State Persistence - Checkbox selections preserved when navigating between people
- 🚫 Smart Navigation - Next button disabled on last person, Back button disabled on first
- 💾 Bidirectional Changes - Can both identify and unidentify faces in the same session
- ⚡ Optimized Performance - Efficient database queries and streamlined interface
- 🔍 Last Name Search - Filter matched people by last name (case-insensitive) in the left panel
- 🎯 Filter-Aware Navigation - Auto-selects the first match; Back/Next respect the filtered list
View & Modify Identified Faces (NEW)
# Open the Modify Identified Faces interface
python3 photo_tagger.py modifyidentified
This GUI lets you quickly review all identified people, rename them, and temporarily unmatch faces before committing.
Left Panel (People):
- 🔍 Last Name Search - Search box to filter people by last name (case-insensitive)
- 🔎 Search Button - Apply filter to show only matching people
- 🧹 Clear Button - Reset filter to show all people
- 👥 People List - Shows all identified people with face counts in full name format including middle names, maiden names, and birth dates
- 🖱️ Clickable Names - Click to select a person (selected name is bold)
- ✏️ Edit Name Icon - Comprehensive person editing with all fields; tooltip shows "Update name"
- 📝 Complete Person Fields - Edit with dedicated fields for:
- First Name and Last Name (required)
- Middle Name and Maiden Name (optional)
- Date of Birth with visual calendar picker (required)
- 💡 Smart Validation - Save button only enabled when all required fields are filled
- 📅 Calendar Integration - Click 📅 button to open visual date picker
- 🎨 Enhanced Layout - Organized grid layout with labels directly under each field
Right Panel (Faces):
- 🧩 Person Faces - Thumbnails of all faces identified as the selected person
- ❌ X on Each Face - Temporarily unmatch a face (does not save yet)
- ↶ Undo Changes - Restores unmatched faces for the current person only
- 🔄 Responsive Grid - Faces wrap to the next line when the panel is narrow
Bottom Controls:
- 💾 Save changes - Commits all pending unmatched faces across all people to the database
- ❌ Quit - Closes the window (unsaved temporary changes are discarded)
Performance Features:
- ⚡ Optimized Database Access - Loads all people data once when opening, saves only when needed
- 🚫 No Database Queries During Editing - All editing operations use pre-loaded data
- 💾 Immediate Person Saves - Person information saved directly to database when clicking save
- 🔄 Real-time Validation - Save button state updates instantly as you type
- 📅 Visual Calendar - Professional date picker with month/year navigation
Notes:
- Person Information: Saved immediately to database when clicking the 💾 save button in edit mode
- Face Unmatching: Changes are temporary until you click "Save changes" at the bottom
- Validation: Save button only enabled when first name, last name, and date of birth are all provided
- Calendar: Date picker opens to existing date when editing, defaults to 25 years ago for new entries
- Undo: Restores only the currently viewed person's unmatched faces
- Data Storage: All person fields stored separately (first_name, last_name, middle_name, maiden_name, date_of_birth)
🧠 Advanced Algorithm Features
🎯 Intelligent Face Matching Engine:
- 🔍 Face Quality Scoring - Automatically evaluates face quality based on sharpness, brightness, contrast, size, and position
- 📊 Adaptive Tolerance - Adjusts matching strictness based on face quality (higher quality = stricter matching)
- 🚫 Quality Filtering - Only processes faces above minimum quality threshold (≥0.2) for better accuracy
- 🎯 Smart Matching - Uses multiple quality factors to determine the best matches
- ⚡ Performance Optimized - Efficient database queries with quality-based indexing
🔬 Quality Assessment Metrics:
- Sharpness Detection - Uses Laplacian variance to detect blurry faces
- Brightness Analysis - Prefers faces with optimal lighting conditions
- Contrast Evaluation - Higher contrast faces score better for recognition
- Size Optimization - Larger, clearer faces get higher quality scores
- Aspect Ratio - Prefers square face crops for better recognition
- Position Scoring - Centered faces in photos score higher
📈 Confidence Levels:
- 🟢 Very High (80%+) - Almost Certain match
- 🟡 High (70%+) - Likely Match
- 🟠 Medium (60%+) - Possible Match
- 🔴 Low (50%+) - Questionable
- ⚫ Very Low (<50%) - Unlikely
GUI Interactive Elements:
- Person Name Dropdown - Select from known people or type new names
- Compare Checkbox - Compare with similar unidentified faces (persistent setting)
- Identify Button - Confirm the identification (saves immediately)
- Back Button - Go back to previous face (shows image and identification status)
- Next Button - Move to next face
- Quit Button - Exit application (all changes already saved)
Add Tags
# Tag photos matching pattern
python3 photo_tagger.py tag --pattern "vacation"
# Tag any photos
python3 photo_tagger.py tag
Search
# Find photos with a person
python3 photo_tagger.py search "John"
# Find photos with partial name match
python3 photo_tagger.py search "Joh"
Statistics
# View database statistics
python3 photo_tagger.py stats
📊 Enhanced Example Workflow
# ALWAYS activate virtual environment first!
source venv/bin/activate
# 1. Scan your photo collection
python3 photo_tagger.py scan ~/Pictures --recursive
# 2. Process photos for faces (start with small batch)
python3 photo_tagger.py process --limit 20
# 3. Check what we found
python3 photo_tagger.py stats
# 4. Identify faces with GUI interface (ENHANCED!)
python3 photo_tagger.py identify --show-faces --batch 10
# 5. Auto-match faces across photos with GUI (NEW!)
python3 photo_tagger.py auto-match --show-faces
# 6. Search for photos of someone
python3 photo_tagger.py search "Alice"
# 7. Add some tags
python3 photo_tagger.py tag --pattern "birthday"
🗃️ Database
The tool uses SQLite database (data/photos.db by default) with these tables:
Core Tables
- photos - Photo file paths and processing status
- people - Known people with separate first_name, last_name, and date_of_birth fields
- faces - Face encodings, locations, and quality scores
- tags - Custom tags for photos
- person_encodings - Face encodings for each person (for matching)
Database Schema Improvements
- Clean Name Storage - People table uses separate
first_nameandlast_namefields - Date of Birth Integration - People table includes
date_of_birthcolumn for complete identification - Unique Constraint - Prevents duplicate people with same name and birth date combination
- No Comma Issues - Names are stored without commas, displayed as "Last, First" format
- Quality Scoring - Faces table includes quality scores for better matching
- Optimized Queries - Efficient indexing and query patterns for fast performance
- Data Integrity - Proper foreign key relationships and constraints
⚙️ Configuration
Face Detection Models
- hog - Faster, good for CPU-only systems
- cnn - More accurate, requires more processing power
Database Location
# Use custom database file
python3 photo_tagger.py scan /photos --db /path/to/my.db
🔧 System Requirements
Required System Packages (Ubuntu/Debian)
sudo apt update
sudo apt install -y cmake build-essential libopenblas-dev liblapack-dev libx11-dev libgtk-3-dev python3-dev python3-venv
Python Dependencies
face-recognition- Face detection and recognitiondlib- Machine learning librarypillow- Image processingnumpy- Numerical operationsclick- Command line interfacesetuptools- Package management
📁 File Structure
PunimTag/
├── photo_tagger.py # Main CLI tool
├── setup.py # Setup script
├── run.sh # Convenience script (auto-activates venv)
├── requirements.txt # Python dependencies
├── README.md # This file
├── gui_config.json # GUI window size preferences (created automatically)
├── venv/ # Virtual environment (created by setup)
├── data/
│ └── photos.db # Database (created automatically)
├── data/ # Additional data files
└── logs/ # Log files
🚨 Troubleshooting
"externally-managed-environment" Error
Solution: Always use a virtual environment!
python3 -m venv venv
source venv/bin/activate
python3 setup.py
Virtual Environment Not Active
Problem: Commands fail or use wrong Python Solution: Always activate the virtual environment:
source venv/bin/activate
# You should see (venv) in your prompt
Image Viewer Not Opening During Identify
Problem: Face crops are saved but don't open automatically
Solution: The setup script installs feh (image viewer) automatically on Ubuntu/Debian. For other systems:
- Ubuntu/Debian:
sudo apt install feh - macOS:
brew install feh - Windows: Install a Linux subsystem or use WSL
- Alternative: Use
--show-facesflag without auto-opening - face crops will be saved to/tmp/for manual viewing
GUI Interface Issues
Problem: GUI doesn't appear or has issues Solution: The tool now uses tkinter for all identification interfaces:
- Ubuntu/Debian:
sudo apt install python3-tk(usually pre-installed) - macOS: tkinter is included with Python
- Windows: tkinter is included with Python
- Fallback: If GUI fails, the tool will show error messages and continue
Common GUI Issues:
- Window appears in corner: The GUI centers itself automatically on first run
- Window size not remembered: Check that
gui_config.jsonis writable - "destroy" command error: Fixed in latest version - window cleanup is now safe
- GUI freezes: Use Ctrl+C to interrupt, then restart the command
dlib Installation Issues
# Ubuntu/Debian - install system dependencies first
sudo apt-get install build-essential cmake libopenblas-dev
# Then retry setup
source venv/bin/activate
python3 setup.py
"Please install face_recognition_models" Warning
This warning is harmless - the application still works correctly. It's a known issue with Python 3.13.
Memory Issues
- Use
--model hogfor faster processing - Process in smaller batches with
--limit 10 - Close other applications to free memory
No Faces Found
- Check image quality and lighting
- Ensure faces are clearly visible
- Try
--model cnnfor better detection
🎨 GUI Interface Guide
Face Identification GUI
When you run python3 photo_tagger.py identify --show-faces, you'll see:
Left Panel:
- 📁 Photo Info - Shows filename and face location
- 🖼️ Face Image - Individual face crop for easy identification
- ✅ Identification Status - Shows if face is already identified and by whom
Right Panel:
- 📝 Person Name Fields - Text input fields for:
- First name (required)
- Last name (required)
- Middle name (optional)
- Maiden name (optional)
- 📅 Date of Birth - Required date field with calendar picker (📅 button)
- ☑️ Compare Checkbox - Compare with similar unidentified faces (persistent across navigation)
- ☑️ Select All/Clear All Buttons - Bulk selection controls (enabled only when Compare is active)
- 📜 Similar Faces List - Scrollable list of similar unidentified faces with:
- ☑️ Individual Checkboxes - Select specific faces to identify together
- 📈 Confidence Percentages - Color-coded match quality
- 🖼️ Face Images - Thumbnail previews of similar faces
- 🎮 Control Buttons:
- ✅ Identify - Confirm the identification (saves immediately) - requires first name, last name, and date of birth
- ⬅️ Back - Go back to previous face (shows image and status, repopulates fields)
- ➡️ Next - Move to next face (clears date of birth, middle name, and maiden name fields)
- ❌ Quit - Exit application (saves complete identifications only)
Auto-Match GUI (Enhanced with Smart Algorithm)
When you run python3 photo_tagger.py auto-match --show-faces, you'll see an improved interface with:
🧠 Smart Algorithm Features:
- Quality-Based Matching - Only high-quality faces are processed for better accuracy
- Adaptive Tolerance - Matching strictness adjusts based on face quality
- Confidence Scoring - Color-coded confidence levels (🟢 Very High, 🟡 High, 🟠 Medium, 🔴 Low, ⚫ Very Low)
- Performance Optimized - Faster processing with quality-based filtering
Interface Layout:
Left Panel:
- 👤 Matched Person - The already identified person with complete information
- 🖼️ Person Face Image - Individual face crop of the matched person
- 📁 Detailed Person Info - Shows:
- Full Name with middle and maiden names (if available)
- Date of Birth (if available)
- Photo filename and face location
- 💾 Save Button - "Save changes for [Person Name]" - saves all checkbox selections
Right Panel:
- ☑️ Unidentified Faces - All unidentified faces that match this person (sorted by confidence):
- ☑️ Checkboxes - Select which faces to identify with this person (pre-selected if previously identified)
- 📈 Confidence Percentages - Color-coded match quality (highest confidence at top)
- 🖼️ Face Images - Face crops of unidentified faces
- 📜 Scrollable - Handle many matches easily
- 🎯 Smart Ordering - Highest confidence matches appear first for easy selection
Bottom Controls (Navigation Only):
- ⏮️ Back - Go back to previous person (disabled on first person)
- ⏭️ Next - Move to next person (disabled on last person)
- ❌ Quit - Exit auto-match process
Compare with Similar Faces Workflow
The Compare feature in the Identify GUI works seamlessly with the main identification process:
- Enable Compare: Check "Compare with similar faces" to see similar unidentified faces
- View Similar Faces: Right panel shows all similar faces with confidence percentages and thumbnails
- Select Faces: Use individual checkboxes or Select All/Clear All buttons to choose faces
- Enter Person Name: Type the person's name in the text input fields
- Identify Together: Click Identify to identify the current face and all selected similar faces at once
- Smart Navigation: System warns if you try to navigate away with selected faces but no name
- Quit Protection: When closing, system offers to save any pending identifications
Key Benefits:
- Bulk Identification: Identify multiple similar faces with one action
- Visual Confirmation: See exactly which faces you're identifying together
- Smart Warnings: Prevents accidental loss of work
- Performance Optimized: Instant loading of similar faces
Unique Faces Only Filter
- Location: in the "Date Filters" bar at the top of the Identify GUI.
- Behavior:
- Filters the main navigation list on the left to avoid showing near-duplicate faces of the same person.
- The Similar Faces panel on the right is NOT filtered and continues to show all similar faces for comparison.
- Confidence rule: faces that match at ≥60% (Medium/High/Very High) are grouped; only one shows in the main list.
- Interaction:
- Takes effect immediately when toggled. You do NOT need to press Apply Filter.
- Apply Filter continues to control the date filters only (Taken/Processed ranges).
- Filtering uses precomputed encodings from the database, so it is fast and non-blocking.
Auto-Match Workflow
The auto-match feature now works in a person-centric way:
- Group by Person: Faces are grouped by already identified people (not unidentified faces)
- Show Matched Person: Left side shows the identified person and their face
- Show Unidentified Faces: Right side shows all unidentified faces that match this person
- Select and Save: Check the faces you want to identify with this person, then click "Save Changes"
- Navigate: Use Back/Next to move between different people
- Correct Mistakes: Go back and uncheck faces to unidentify them
- Pre-selected Checkboxes: Previously identified faces are automatically checked when you go back
Key Benefits:
- 1-to-Many: One person can have multiple unidentified faces matched to them
- Visual Confirmation: See exactly what you're identifying before saving
- Easy Corrections: Go back and fix mistakes by unchecking faces
- Smart Tracking: Previously identified faces are pre-selected for easy review
- Fast Performance: Optimized database queries and streamlined interface
📅 Calendar Interface Guide
When you click the 📅 calendar button, you'll see:
Calendar Features:
- Visual Grid Layout - Traditional 7x7 calendar with clickable dates
- Month/Year Navigation - Use << >> < > buttons to navigate
- Date Selection - Click any date to select it
- Visual Feedback - Selected dates highlighted in bright blue, today's date in orange
- Smart Pre-population - Opens to existing date when editing previous identifications
- Smooth Operation - Opens centered without flickering
Calendar Navigation:
- << >> - Jump by year (limited to 1900-current year)
- < > - Navigate by month
- Click Date - Select any visible date
- Select Button - Confirm your date choice
- Cancel Button - Close without selecting
GUI Tips
- Window Resizing: Resize the window - it remembers your size preference
- Keyboard Shortcuts: Press Enter in the name field to identify
- Back Navigation: Use Back button to return to previous faces - images and identification status are preserved
- Re-identification: Go back to any face and change the identification - all fields are pre-filled
- Auto-Save: All identifications are saved immediately - no need to manually save
- Compare Mode: Enable Compare checkbox to see similar unidentified faces - setting persists across navigation
- Bulk Selection: Use Select All/Clear All buttons to quickly select or clear all similar faces
- Smart Buttons: Select All/Clear All buttons are only enabled when Compare mode is active
- Navigation Warnings: System warns if you try to navigate away with selected faces but no person name
- Quit Confirmation: When closing, system asks if you want to save pending identifications
- Consistent Results: Compare mode shows the same faces as auto-match with identical confidence scoring
- Multiple Matches: In auto-match, you can select multiple faces to identify with one person
- Smart Navigation: Back/Next buttons are disabled appropriately (Back disabled on first, Next disabled on last)
- State Persistence: Checkbox selections are preserved when navigating between people
- Per-Person States: Each person's selections are completely independent
- Save Button Location: Save button is in the left panel with the person's name for clarity
- Performance: Similar faces load instantly thanks to pre-fetched data optimization
- Bidirectional Changes: You can both identify and unidentify faces in the same session
- Field Requirements: First name, last name, and date of birth must be filled to identify (middle name and maiden name are optional)
- Navigation Memory: Date field clears on forward navigation, repopulates on back navigation
- Confidence Colors:
- 🟢 80%+ = Very High (Almost Certain)
- 🟡 70%+ = High (Likely Match)
- 🟠 60%+ = Medium (Possible Match)
- 🔴 50%+ = Low (Questionable)
- ⚫ <50% = Very Low (Unlikely)
🆕 Recent Improvements
Auto-Match UX Enhancements (Latest)
- 💾 Smart Save Button: "Save changes for [Person Name]" button moved to left panel for better UX
- 🔄 State Persistence: Checkbox selections now preserved when navigating between people
- 🚫 Smart Navigation: Next button disabled on last person, Back button disabled on first
- 🎯 Per-Person States: Each person's checkbox selections are completely independent
- ⚡ Real-time Saving: Checkbox states saved immediately when changed
Consistent Face-to-Face Comparison System
- 🔄 Unified Logic: Both auto-match and identify now use the same face comparison algorithm
- 📊 Consistent Results: Identical confidence scoring and face matching across both modes
- 🎯 Same Tolerance: Both functionalities respect the same tolerance settings
- ⚡ Performance: Eliminated code duplication for better maintainability
- 🔧 Refactored: Single reusable function for face filtering and sorting
Compare Checkbox Enhancements
- 🌐 Global Setting: Compare checkbox state persists when navigating between faces
- 🔄 Auto-Update: Similar faces automatically refresh when using Back/Next buttons
- 👥 Consistent Display: Compare mode shows the same faces as auto-match
- 📈 Smart Filtering: Only shows faces with 40%+ confidence (same as auto-match)
- 🎯 Proper Sorting: Faces sorted by confidence (highest first)
Back Navigation & Re-identification
- ⬅️ Back Button: Navigate back to previous faces with full image display
- 🔄 Re-identification: Change any identification by going back and re-identifying
- 📝 Pre-filled Names: Name field shows current identification for easy changes
- ✅ Status Display: Shows who each face is identified as when going back
Improved Cleanup & Performance
- 🧹 Better Cleanup: Proper cleanup of temporary files and resources
- 💾 Auto-Save: All identifications save immediately (removed redundant Save & Quit)
- 🔄 Code Reuse: Eliminated duplicate functions for better maintainability
- ⚡ Optimized: Faster navigation and better memory management
Enhanced User Experience
- 🖼️ Image Preservation: Face images show correctly when navigating back
- 🎯 Smart Caching: Face crops are properly cached and cleaned up
- 🔄 Bidirectional Changes: Can both identify and unidentify faces in same session
- 💾 Window Memory: Remembers window size and position preferences
🎯 What This Tool Does
✅ Simple: Single Python file, minimal dependencies
✅ Fast: Efficient face detection and recognition
✅ Private: Everything runs locally, no cloud services
✅ Flexible: Batch processing, interactive identification
✅ Lightweight: No web interface overhead
✅ GUI-Enhanced: Modern interface for face identification
✅ User-Friendly: Back navigation, re-identification, and auto-save
📈 Performance Tips
- Always use virtual environment to avoid conflicts
- Start with small batches (
--limit 20) to test - Use
hogmodel for speed,cnnfor accuracy - Process photos in smaller folders first
- Identify faces in batches to avoid fatigue
🤝 Contributing
This is now a minimal, focused tool. Key principles:
- Keep it simple and fast
- GUI-enhanced interface for identification
- Minimal dependencies
- Clear, readable code
- Always use python3 commands
🆕 Recent Improvements (Latest Version)
🔧 Data Storage & Reliability Improvements (NEW!)
- ✅ Eliminated Redundant Storage - Removed unnecessary combined name field for cleaner data structure
- ✅ Direct Field Access - Names stored and accessed directly without parsing/combining logic
- ✅ Fixed Quit Confirmation - Proper detection of pending identifications when quitting
- ✅ Improved Error Handling - Better type consistency prevents runtime errors
- ✅ Enhanced Performance - Eliminated string manipulation overhead for faster operations
🔄 Field Navigation & Preservation Fixes
- ✅ Fixed Name Field Confusion - First and last names now stay in correct fields during navigation
- ✅ Enhanced Data Storage - Individual field tracking prevents name swapping issues
- ✅ Date of Birth Preservation - Date of birth now preserved even when entered alone (without names)
- ✅ Consistent Field Handling - All navigation (Next/Back) uses unified field management logic
- ✅ Smart Field Population - Fields correctly repopulate based on original input context
📅 Date of Birth Integration
- ✅ Required Date of Birth - All face identifications now require date of birth
- ✅ Visual Calendar Picker - Interactive calendar widget for easy date selection
- ✅ Smart Pre-population - Calendar opens to existing date when editing
- ✅ Database Schema Update - People table now includes date_of_birth column
- ✅ Unique Constraint - Prevents duplicate people with same first name, last name, middle name, maiden name, and birth date
- ✅ Field Validation - First name, last name, and date of birth required; middle name and maiden name optional
- ✅ Navigation Memory - Date field clears on forward navigation, repopulates on back navigation
🎨 Enhanced Calendar Interface
- ✅ Visual Calendar Grid - Traditional 7x7 calendar layout with clickable dates
- ✅ Month/Year Navigation - Easy navigation with << >> < > buttons
- ✅ Prominent Selection - Selected dates highlighted in bright blue
- ✅ Today Highlighting - Current date shown in orange when visible
- ✅ Smooth Positioning - Calendar opens centered without flickering
- ✅ Isolated Styling - Calendar styles don't affect other dialog buttons
🔄 Smart Field Management
- ✅ Forward Navigation - Date of birth, middle name, and maiden name fields clear when moving to next face
- ✅ Backward Navigation - All fields repopulate with previously entered data
🆕 Enhanced Person Information (LATEST!)
- ✅ Middle Name Field - Optional middle name input field added to person identification
- ✅ Maiden Name Field - Optional maiden name input field added to person identification
- ✅ Simplified Interface - Removed dropdown functionality for cleaner, faster data entry
- ✅ Optimized Field Layout - Date of birth positioned before maiden name for better workflow
- ✅ Enhanced Database Schema - People table now includes middle_name and maiden_name columns
- ✅ Unique Constraint Update - Prevents duplicate people with same combination of all five fields
- ✅ Streamlined Data Entry - All name fields are now simple text inputs for faster typing
🎨 Enhanced Modify Identified Interface (NEW!)
- ✅ Complete Person Information - Shows full names with middle names, maiden names, and birth dates
- ✅ Last Name Search - Filter people by last name with case-insensitive search
- ✅ Auto-Selection - Automatically selects first person in filtered results
- ✅ Comprehensive Editing - Edit all person fields: first, last, middle, maiden names, and date of birth
- ✅ Visual Calendar Integration - Professional date picker with month/year navigation
- ✅ Smart Validation - Save button only enabled when all required fields (first name, last name, date of birth) are filled
- ✅ Real-time Feedback - Button state updates instantly as you type or clear fields
- ✅ Enhanced Layout - Organized grid layout with labels directly under each input field
- ✅ Immediate Database Saves - Person information saved directly to database when clicking save
- ✅ Visual Button States - Disabled save button clearly grayed out when validation fails
Name Handling & Database
- ✅ Fixed Comma Issues - Names are now stored cleanly without commas in database
- ✅ Separate Name Fields - First name and last name are stored in separate database columns
- ✅ Smart Parsing - Supports "Last, First" input format that gets properly parsed
- ✅ Optimized Database Access - Single load/save operations for better performance
GUI Enhancements
- ✅ Improved Edit Interface - Separate text boxes for first and last names with help text
- ✅ Better Layout - Help text positioned below input fields for clarity
- ✅ Tooltips - Edit buttons show helpful tooltips
- ✅ Responsive Design - Face grids adapt to window size
Performance & Reliability
- ✅ Efficient Database Operations - Pre-loads data, saves only when needed
- ✅ Fixed Virtual Environment - Run script now works properly with dependencies
- ✅ Clean Code Structure - Improved error handling and state management
Total project size: ~3,800 lines of Python code Dependencies: 6 essential packages Setup time: ~5 minutes Perfect for: Batch processing personal photo collections with modern GUI interface
🔄 Common Commands Cheat Sheet
# Setup (one time)
python3 -m venv venv && source venv/bin/activate && python3 setup.py
# Daily usage - Option 1: Use run script (automatic venv activation)
./run.sh scan ~/Pictures --recursive
./run.sh process --limit 50
./run.sh identify --show-faces --batch 10
./run.sh auto-match --show-faces
./run.sh modifyidentified
./run.sh stats
# Daily usage - Option 2: Manual venv activation (GUI-ENHANCED)
source venv/bin/activate
python3 photo_tagger.py scan ~/Pictures --recursive
python3 photo_tagger.py process --limit 50
python3 photo_tagger.py identify --show-faces --batch 10 # Opens GUI
python3 photo_tagger.py auto-match --show-faces # Opens GUI
python3 photo_tagger.py modifyidentified # Opens GUI to view/modify
python3 photo_tagger.py stats