A desktop application for county assessors and title administrators to automatically classify and rename property photos. Select your role, point the app at a folder of photos, and it handles the rest.
Independent project. This is an independent project and is not an official product of the Gunnison County Assessor's Office or Gunnison County. Any county data it works with comes from publicly available assessor and GIS data, and results may contain errors or out-of-date information. Always verify against official county records.
- Extracts parcel number from the folder name
- Matches parcel number to account number via CSV lookup
- Classifies interior room photos (KITCHEN, BEDROOM, BATHROOM, etc.) using a CLIP-based ML classifier
- Renames files:
ACCOUNTNO - MLS - ROOMTYPE X.JPG
- Reads GPS coordinates from each photo's EXIF data
- Matches GPS to the nearest parcel using a local address shapefile (no internet required)
- Reads compass direction (GPSImgDirection) to determine which side of the building was photographed
- Classifies photos using Claude Vision AI — handles both interior and exterior shots in the same folder
- Interior:
ACCOUNTNO - KITCHEN 1 - YYYYMMDD.JPG - Exterior:
ACCOUNTNO - NE FRONT OF BUILDING 1 - YYYYMMDD.JPG - Photos with no GPS go to
processed/unresolved/
Exterior: FRONT OF BUILDING, BACK OF BUILDING, CORNER OF BUILDING, CORNER OF GARAGE, CORNER OF SHED, GARAGE, SHED, WINDOW, LAND, VIEW, DECK, BUILDING PROGRESS, DAMAGE, OTHER
Interior: KITCHEN, LIVING ROOM, BEDROOM, BATHROOM, DINING ROOM, LAUNDRY ROOM, OFFICE
- Python 3.11+
- An Anthropic API key (for Appraiser mode — set as
ANTHROPIC_API_KEYenvironment variable) - Address shapefile (
Address.dbf/.prj/.shp/.shx) placed inbackend/data/ - Parcel CSV (
Accounts_and_Parcel_Numbers.csv) — placed inbackend/data/or~/Downloads/
The county data files are not committed to this repository; see backend/data/README.md.
See backend/requirements.txt for Python dependencies.
git clone https://github.com/Eesterlein/Appraiser-Photo-Processor.git
cd Appraiser-Photo-Processor
cd backend
pip install -r requirements.txtcd backend
ANTHROPIC_API_KEY=your_key_here python app.pyOn Windows, set ANTHROPIC_API_KEY as a system environment variable so you don't need to pass it each time.
Appraiser-Photo-Processor/
├── backend/
│ ├── app.py # Entry point — loads models and launches GUI
│ ├── gui.py # tkinter GUI with role selector
│ ├── classifier.py # CLIP classifier (Title Admin) + Claude Vision classifier (Appraiser)
│ ├── appraiser_processor.py # Appraiser processing pipeline
│ ├── processor.py # Title Admin processing pipeline
│ ├── gps_resolver.py # GPS EXIF extraction + shapefile parcel matching
│ ├── matcher.py # CSV parcel-to-account lookup
│ ├── file_utils.py # File naming and copying utilities
│ ├── image_validator.py # Image validation
│ ├── folder_parser.py # Parcel number extraction from folder names
│ └── data/
│ ├── Address.dbf/.prj/.shp/.shx # Address shapefile (not committed — place manually)
│ └── Accounts_and_Parcel_Numbers.csv
├── TECHNICAL_OVERVIEW.md
└── README.md
pip install pyinstaller
python build.pyThe .exe will be in dist/. Set ANTHROPIC_API_KEY as a Windows system environment variable on the deployment machine.
Build a standalone .exe with PyInstaller:
pip install pyinstaller
python build.pyThe .exe is self-contained — no Python, no extra installs needed on the deployment machine.
Set the API key as a Windows system environment variable (not user-level):
- Open System Properties → Advanced → Environment Variables
- Under System variables, click New
- Name:
ANTHROPIC_API_KEY/ Value: your key - Restart the machine
If the API key is not set, the app falls back to a local CLIP model — still functional but less accurate.
- User Guide — step-by-step instructions for appraisers and title admins
- Technical Overview — architecture, data flow, and implementation details
- IT Security Overview — for county IT departments evaluating deployment
- GPS-to-parcel matching runs entirely locally via a bundled shapefile — no coordinates leave the machine
- Only photo content (resized to 1024px) is sent to the Anthropic API for classification
- The API key is never stored in any file — always read from a system environment variable
- Original photos are never modified or deleted
- See IT_SECURITY.md for the full security overview