# 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 ```bash # 1. Setup (one time only) - installs all dependencies including image viewer git clone 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) ```bash # Clone and setup git clone 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: ```bash source venv/bin/activate # Run this every time you open a new terminal ``` ### Manual Setup (Alternative) ```bash python3 -m venv venv source venv/bin/activate pip install -r requirements.txt python3 photo_tagger.py stats # Creates database ``` ## ๐ŸŽฏ Commands ### Scan for Photos ```bash # 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) ```bash # 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 `--verbose` to see quality scores during processing ### Identify Faces (GUI-Enhanced!) ```bash # 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 - โ˜‘๏ธ **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 **๐ŸŽฏ 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 ### View & Modify Identified Faces (NEW) ```bash # 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):** - ๐Ÿ‘ฅ **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 ```bash # Tag photos matching pattern python3 photo_tagger.py tag --pattern "vacation" # Tag any photos python3 photo_tagger.py tag ``` ### Search ```bash # Find photos with a person python3 photo_tagger.py search "John" # Find photos with partial name match python3 photo_tagger.py search "Joh" ``` ### Statistics ```bash # View database statistics python3 photo_tagger.py stats ``` ## ๐Ÿ“Š Enhanced Example Workflow ```bash # 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_name` and `last_name` fields - **Date of Birth Integration** - People table includes `date_of_birth` column 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 ```bash # Use custom database file python3 photo_tagger.py scan /photos --db /path/to/my.db ``` ## ๐Ÿ”ง System Requirements ### Required System Packages (Ubuntu/Debian) ```bash 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 recognition - `dlib` - Machine learning library - `pillow` - Image processing - `numpy` - Numerical operations - `click` - Command line interface - `setuptools` - 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! ```bash 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: ```bash 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-faces` flag 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.json` is 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 ```bash # 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 hog` for 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 cnn` for 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: 1. **Enable Compare**: Check "Compare with similar faces" to see similar unidentified faces 2. **View Similar Faces**: Right panel shows all similar faces with confidence percentages and thumbnails 3. **Select Faces**: Use individual checkboxes or Select All/Clear All buttons to choose faces 4. **Enter Person Name**: Type the person's name in the text input fields 5. **Identify Together**: Click Identify to identify the current face and all selected similar faces at once 6. **Smart Navigation**: System warns if you try to navigate away with selected faces but no name 7. **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 ### Auto-Match Workflow The auto-match feature now works in a **person-centric** way: 1. **Group by Person**: Faces are grouped by already identified people (not unidentified faces) 2. **Show Matched Person**: Left side shows the identified person and their face 3. **Show Unidentified Faces**: Right side shows all unidentified faces that match this person 4. **Select and Save**: Check the faces you want to identify with this person, then click "Save Changes" 5. **Navigate**: Use Back/Next to move between different people 6. **Correct Mistakes**: Go back and uncheck faces to unidentify them 7. **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 `hog` model for speed, `cnn` for 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 - โœ… **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 ```bash # 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 ```