File size: 22,876 Bytes
92ca429
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
# AI Change Detection β€” Architecture & Component Guide

## Overview

AI Change Detection is a full-stack web application that detects, classifies, and visualizes changes between two satellite or aerial images (before and after). It uses multi-signal image processing β€” combining color analysis, structural similarity, texture descriptors, and edge detection β€” to identify ground-level changes such as new buildings, deforestation, road construction, and more.

---

## System Architecture

```
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   Browser (SPA)                  β”‚
β”‚  index.html  +  style.css  +  app.js            β”‚
β”‚  Login / Register / Upload / Results / History   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                     β”‚  REST API (JSON + multipart)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              FastAPI Backend (main.py)            β”‚
β”‚  Auth routes  Β·  Detection route  Β·  History     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ auth.py  β”‚ models.pyβ”‚  detection_engine.py       β”‚
β”‚ JWT auth β”‚ ORM      β”‚  Image processing pipeline β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€                            β”‚
β”‚   database.py       β”‚  SQLite (local/HF Spaces)  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
```

---

## File-by-File Component Breakdown

### 1. `app/main.py` β€” API Server & Route Definitions

**Role:** The central FastAPI application. Defines all HTTP endpoints, wires together authentication, database, and the detection engine.

**Use cases solved:**
- **User registration & login** (`POST /api/auth/register`, `POST /api/auth/login`) β€” Creates accounts and issues JWT tokens stored as HTTP-only cookies.
- **Session management** (`POST /api/auth/logout`, `GET /api/me`) β€” Clears auth cookies; returns the current authenticated user.
- **Password reset** (`POST /api/auth/reset-password`) β€” Allows users to reset their password by email (no email verification β€” documented limitation).
- **Change detection** (`POST /api/detect`) β€” Accepts two images (before/after) plus configuration options, runs the full detection pipeline, saves the overlay image to disk, stores run metadata in the database, and returns results with a base64-encoded overlay for immediate display.
- **History** (`GET /api/history`, `DELETE /api/history/{id}`) β€” Lists past detection runs for the logged-in user; allows deletion of individual runs and their overlay files.
- **Static file serving** β€” Mounts the `static/` directory for CSS/JS and serves `templates/index.html` as the SPA entry point.
- **Upload size limiting** β€” Rejects images larger than 20 MB to prevent out-of-memory crashes.

---

### 2. `app/auth.py` β€” Authentication & Authorization

**Role:** Handles password hashing, JWT token creation/validation, and user lookup.

**Use cases solved:**
- **Secure password storage** β€” Uses bcrypt via `passlib` to hash passwords before storing them. Plaintext passwords never touch the database.
- **Stateless authentication** β€” Issues HS256 JWT tokens with a 7-day expiry. Tokens are sent as HTTP-only cookies (for browser requests) and also accepted as Bearer tokens in the Authorization header.
- **Multi-source token resolution** β€” `get_current_user()` checks three sources in order: Authorization header, HTTP cookie, then form field. This ensures authentication works for both API clients and browser multipart form submissions.

---

### 3. `app/models.py` β€” Database Models (ORM)

**Role:** Defines the SQLAlchemy ORM models that map to database tables.

**Tables:**
- **`users`** β€” Stores account data: email, bcrypt-hashed password, full name, and creation timestamp. Each user has a one-to-many relationship with detection runs.
- **`detection_runs`** β€” Stores metadata for each detection run: title, method used, pixel statistics (total, changed, percentage), region count, path to the saved overlay image, and a JSON blob of all classified regions with their sub-types and 3D analysis data.

**Use case solved:** Persistent storage of user accounts and detection history so users can revisit past results.

---

### 4. `app/database.py` β€” Database Connection & Session Management

**Role:** Configures the SQLAlchemy engine, session factory, and data directory paths.

**Use cases solved:**
- **Environment-aware storage** β€” Detects Hugging Face Spaces (via `SPACE_ID` env var) and uses a writable home directory; falls back to a local `data/` directory for development.
- **Database portability** β€” Defaults to SQLite for zero-config local development. Supports PostgreSQL via `DATABASE_URL` environment variable for production (with automatic `postgres://` β†’ `postgresql://` rewrite for SQLAlchemy 2.x compatibility).
- **Session lifecycle** β€” The `get_db()` generator provides request-scoped database sessions with automatic cleanup.

---

### 5. `app/detection_engine.py` β€” Image Processing & Classification Pipeline

This is the core of the application. It contains all image analysis algorithms organized into a sequential pipeline.

#### 5a. Pre-processing (`preprocess_image`)

**Use case:** Normalizes input images to a consistent format before analysis.
- Converts grayscale or RGBA images to RGB.
- Downscales images larger than 2000px on any side to prevent memory issues while preserving enough detail for analysis.

#### 5b. Image Registration (`register_images`)

**Use case:** Aligns the "after" image to the "before" image so pixel-level comparison is meaningful.
- Uses ORB feature detection to find matching keypoints between both images.
- Applies Lowe's ratio test to filter spurious matches.
- Computes a RANSAC homography to warp the after image into alignment.
- Rejects bad alignments via inlier ratio threshold and homography determinant check (catches degenerate transforms).
- **Why it matters:** Without alignment, even a slight camera angle difference would cause the entire image to appear "changed."

#### 5c. Radiometric Normalization (`normalize_radiometry`)

**Use case:** Corrects brightness and contrast differences between the two images caused by different lighting conditions, seasons, or sensors.
- Performs histogram matching in LAB color space (perceptually uniform) so the "after" image has the same color distribution as the "before."
- Applies CLAHE (Contrast Limited Adaptive Histogram Equalization) symmetrically to both images to enhance local contrast without introducing bias.
- **Why it matters:** A cloudy day vs. a sunny day would otherwise create massive false-positive "changes" everywhere.

#### 5d. SSIM Change Map (`compute_ssim_change_map`)

**Use case:** Measures structural dissimilarity between corresponding regions of both images.
- Computes per-pixel Structural Similarity Index (SSIM) using Gaussian-weighted windows.
- Outputs a dissimilarity map where 0 = identical and 1 = completely different.
- Clamps variance values to prevent numerical instability from floating-point rounding.
- **Why it matters:** SSIM captures structural patterns (edges, textures) that simple color difference would miss.

#### 5e. Texture Features (`compute_lbp`, `compute_texture_change`)

**Use case:** Detects changes in surface texture (e.g., smooth road vs. rough construction rubble).
- Computes Local Binary Patterns (LBP) β€” a texture descriptor that encodes the relationship between each pixel and its neighbors.
- The absolute difference between before/after LBP maps highlights regions where surface texture changed.
- **Why it matters:** Two regions can have similar colors but very different textures (e.g., grass vs. artificial turf, bare soil vs. concrete).

#### 5f. Edge Change Detection (`compute_edge_change`)

**Use case:** Identifies new or removed structural boundaries.
- Uses Canny edge detection with adaptive thresholds based on median intensity.
- Dilates edges so nearby edges match (tolerates minor misalignment).
- Computes the absolute difference to find edges present in one image but not the other.
- **Why it matters:** New buildings, roads, and demolished structures introduce or remove strong edges.

#### 5g. Detection Methods (4 options)

| Method | Description | Best For |
|--------|-------------|----------|
| **Image Difference** | LAB color space Delta-E difference with Otsu thresholding | Fast, simple comparisons with clear color changes |
| **Feature-Based** | Multi-space (LAB + HSV) feature clustering via KMeans | Subtle, distributed changes across large areas |
| **AI-Based Deep Learning** | Multi-signal fusion (color + SSIM + texture + edge) with entropy-weighted adaptive combination | Highest accuracy; catches both color and structural changes |
| **Hybrid Approach** | Weighted blend of all three methods (20% difference + 30% feature + 50% AI) | Maximum coverage when unsure which method is best |

**Image Difference** (`image_difference_method`):
- Converts to LAB and computes a weighted Delta-E (CIE76) difference per pixel.
- Applies Otsu's automatic threshold to separate "changed" from "unchanged."
- Fast but only catches color changes β€” misses structural changes where color stays similar.

**Feature-Based** (`feature_based_method`):
- Extracts LAB and HSV difference features per pixel.
- Downsamples to 250K pixels for KMeans clustering (4 clusters), then maps labels back to full resolution.
- The cluster with the highest mean feature magnitude is labeled "change."
- Good at finding spatially distributed or gradual changes.

**AI-Based Deep Learning** (`ai_deep_learning_method`):
- Fuses four independent signals: multi-scale LAB color difference, SSIM structural dissimilarity, LBP texture change, and Canny edge change.
- Weights each channel by its information entropy (channels with more discriminative power get higher weight).
- Applies Otsu thresholding followed by bilateral filtering for edge-preserving smoothing.
- The most accurate method β€” captures color, structure, texture, and edge changes simultaneously.

**Hybrid** (`hybrid_method`):
- Runs all three methods and combines their masks with fixed weights.
- AI method gets the most weight (50%) as it's most reliable.

#### 5h. Post-processing (`_clean_mask`)

**Use case:** Cleans up raw change masks to remove noise and fill gaps.
- Morphological closing (fills small gaps inside detected regions).
- Morphological opening (removes small noise speckles).
- Contour-based hole filling (ensures detected regions are solid).
- Sensitivity parameter controls the aggressiveness of gap-filling.

#### 5i. Visualization (`visualize_changes`)

**Use case:** Creates the final overlay image showing detected changes.
- Draws a semi-transparent red overlay on all changed pixels in the "after" image.
- Draws white bounding boxes around each classified region.
- Annotates regions with labels showing sub-type, building stories, and construction stage.

#### 5j. Object Classification (`classify_object_type`, `classify_with_ensemble`)

**Use case:** Determines what kind of ground-level change each detected region represents.

**Feature extraction** (`extract_advanced_features`):
- Extracts 17 features per region: color stats (RGB, HSV, LAB means/stds), vegetation index (NDVI), texture (LBP variance, standard deviation), edges (density, orientation entropy), GLCM-like contrast, shape ratios, and color ratios.

**Transient object filtering** (`_is_transient_object`):
- Filters out non-permanent changes: people, vehicles, animals, shadows.
- Uses area, aspect ratio, edge density, and texture variance thresholds.

**Classification categories:**
| Category | Key Indicators |
|----------|---------------|
| New Construction/Building | Low orientation entropy, compact shape, moderate edges, low saturation |
| Demolition/Clearing | High texture variance, high entropy, bright, low vegetation |
| Vegetation Change | High NDVI, green ratio, medium texture, high saturation |
| Water Body Change | High blue ratio, low texture, smooth surface, specific hue range |
| Road/Pavement Change | Elongated shape, homogeneous color, low saturation, low entropy |
| Bare Land/Soil Change | High red ratio, low NDVI, low texture, earth-tone hue |

**Ensemble voting** (`classify_with_ensemble`):
- Classifies the full region plus 5 sub-regions (quadrants + center).
- Combines votes weighted by confidence.
- Boosts confidence when β‰₯60% of sub-regions agree.
- Only excludes a region as transient if a majority of sub-regions are flagged.

#### 5k. Vegetation Sub-Classification (`classify_vegetation_subtype`)

**Use case:** Provides detailed breakdown of vegetation changes by comparing the before and after region crops.

| Sub-Type | Detection Logic |
|----------|----------------|
| Deforestation/Tree Removal | Before was green (high NDVI), after is bare (NDVI dropped, brightness increased) |
| New Vegetation/Growth | Before was bare, after is green (NDVI increased, saturation up) |
| Crop/Agricultural Change | Regular texture patterns in either image, moderate NDVI shift, large area |
| Vegetation Health Decline | Both images green but NDVI and saturation slightly decreased (browning/drought) |
| Seasonal Variation | Mild color/texture shift, both images still green |

#### 5l. Structural Sub-Classification (`classify_structural_subtype`)

**Use case:** Provides detailed breakdown of structural and road changes by comparing before/after structure presence, edge density, and texture.

| Sub-Type | Detection Logic |
|----------|----------------|
| New Building | No structure before, structure detected after |
| Building Expansion | Structure in both images, but after has higher edge density |
| Renovation/Modification | Structure in both, similar density but different appearance (brightness/saturation shift) |
| Partial Demolition | Structure before, reduced edges after |
| Full Demolition | Structure before, bare/empty after |
| Infrastructure Change | Elongated shape with high geometric regularity |
| New Road/Pavement | No structure before, structure after (for road-type regions) |
| Road Widening | Structure in both, edge density increased |
| Road Resurfacing | Structure in both, similar edges but brightness changed |
| Road Deterioration | Texture increased, edges decreased (surface degradation) |

#### 5m. 3D Building Analysis

**Use case:** Estimates building height/stories and classifies construction stage for building-type regions.

**Shadow-based height estimation** (`estimate_building_height`):
- Detects new shadow pixels adjacent to the building by comparing brightness in the expanded bounding box area between before and after images.
- Measures shadow length as the maximum spatial extent of the shadow cluster.
- Combines shadow ratio, footprint geometry (compact = likely taller), and texture regularity to estimate story count.
- Assumes 3 meters per story.

**Construction stage classification** (`classify_construction_stage`):
| Stage | Visual Indicators |
|-------|------------------|
| Foundation | Low texture, low edges, homogeneous, soil/concrete colors |
| Structural | High edges, geometric regularity (low entropy), high GLCM contrast |
| Under Construction | Mixed materials, irregular texture, medium edge density |
| Complete | Uniform roof, clean edges, low entropy, consistent color |

---

### 6. `templates/index.html` β€” Frontend Structure

**Role:** Single-page application (SPA) with four views managed by JavaScript.

**Views:**
- **Login** β€” Email/password form with password visibility toggle and "Forgot password" link.
- **Register** β€” Account creation form with name, email, and password.
- **Forgot Password** β€” Email + new password form (simplified reset without email verification).
- **Dashboard** β€” The main workspace containing:
  - **Upload zone** β€” Drag-and-drop or click-to-browse for before/after images with live previews.
  - **Detection options** β€” Method selector, title input, image registration and radiometric normalization toggles.
  - **Results panel** β€” Statistics boxes (change %, changed pixels, total pixels, region count), before/after comparison slider, and a detailed regions table with columns for change type, sub-type, confidence, area, stories, height, construction stage, and center coordinates.
  - **History** β€” List of past detection runs with view and delete actions.

---

### 7. `static/css/style.css` β€” Visual Design

**Role:** Complete styling for the application using CSS custom properties and a gradient theme.

**Key design decisions:**
- **Color theme** β€” Linear gradient from `#2e33c5` (blue) to `#cf2040` (red) applied to the navbar, footer, buttons, and accent elements. White background for content areas.
- **Sticky navbar** β€” Full-viewport-width gradient bar that stays fixed at the top during scrolling.
- **Mobile responsive** β€” Grid layouts collapse to single columns on screens under 768px. Font sizes, padding, and table layouts adapt to small screens.
- **Glassmorphism dropdown** β€” User account menu uses a gradient background with subtle shadow for the avatar popup.
- **Compare slider** β€” Custom CSS for the before/after image comparison handle with gradient accents.
- **Stat boxes** β€” Responsive font sizing with `clamp()` and compact number formatting to prevent overflow.

---

### 8. `static/js/app.js` β€” Client-Side Logic

**Role:** All browser-side interactivity β€” authentication flow, file uploads, API communication, result rendering, and UI state management.

**Key responsibilities:**
- **Authentication** β€” Login, register, forgot-password form handlers that call the API and store JWT tokens in localStorage. Automatic session check on page load (`init()`).
- **File upload** β€” Drag-and-drop and click-to-browse handlers with live image previews.
- **Detection submission** β€” Builds a FormData payload with images and settings, sends to `/api/detect`, and renders results.
- **Result rendering** β€” Populates stat boxes with compact-formatted numbers, fills the regions table, sets up the before/after comparison slider, and scrolls to results.
- **History management** β€” Loads past runs, renders them with view/delete actions, and handles deletion with an animated confirmation modal.
- **UI utilities** β€” View switching, error/success alerts, avatar dropdown toggle, password visibility toggle, and HTML escaping.

---

### 9. `Dockerfile` β€” Container Configuration

**Role:** Defines the Docker image for deployment on Hugging Face Spaces.

**Key aspects:**
- Base image: `python:3.11-slim` with OpenCV system dependencies (`libgl1`, `libglib2.0-0`, etc.).
- Non-root user (`appuser`) as required by Hugging Face Spaces security policy.
- Runs Gunicorn with a single Uvicorn worker on port 7860 (HF Spaces default) with 120-second timeout for long detection runs.
- Single worker prevents SQLite write-lock race conditions.

---

### 10. `requirements.txt` β€” Python Dependencies

| Package | Purpose |
|---------|---------|
| `fastapi` | Web framework for the REST API |
| `uvicorn` | ASGI server (production via Gunicorn) |
| `gunicorn` | Process manager for production deployment |
| `python-multipart` | Handles multipart/form-data file uploads |
| `sqlalchemy` | ORM for database operations |
| `psycopg2-binary` | PostgreSQL driver (for production databases) |
| `python-jose` | JWT token encoding/decoding |
| `passlib` + `bcrypt` | Password hashing (bcrypt pinned to 4.0.1 for compatibility) |
| `pillow` | Image loading and format conversion |
| `numpy` | Numerical array operations for image processing |
| `opencv-python-headless` | Core image processing (registration, morphology, edge detection, color conversion) |
| `scikit-learn` | KMeans clustering for feature-based detection; StandardScaler for normalization |
| `scipy` | Scientific computing utilities |

---

## Data Flow: End-to-End Detection Run

```
1. User uploads before + after images via browser
       β”‚
2. POST /api/detect (multipart form with images + settings)
       β”‚
3. Authentication check (JWT from cookie/header/form)
       β”‚
4. Pre-processing
   β”œβ”€β”€ Convert to RGB, limit to 2000px
   β”‚
5. Image Registration (optional)
   β”œβ”€β”€ ORB keypoints β†’ ratio test β†’ RANSAC homography β†’ warp
   β”‚
6. Radiometric Normalization (optional)
   β”œβ”€β”€ LAB histogram matching + symmetric CLAHE
   β”‚
7. Change Detection (selected method)
   β”œβ”€β”€ Image Difference: LAB Delta-E + Otsu
   β”œβ”€β”€ Feature-Based: LAB/HSV features + KMeans clustering
   β”œβ”€β”€ AI-Based: Multi-signal fusion (color + SSIM + texture + edge)
   └── Hybrid: Weighted combination of all three
       β”‚
8. Post-processing
   β”œβ”€β”€ Morphological closing/opening + hole filling
       β”‚
9. Region Analysis
   β”œβ”€β”€ Connected components β†’ bounding boxes
   β”œβ”€β”€ Feature extraction (17 features per region)
   β”œβ”€β”€ Transient object filtering (remove people, cars, etc.)
   β”œβ”€β”€ Primary classification (6 ground-level categories)
   β”œβ”€β”€ Ensemble voting (full region + 5 sub-regions)
   β”‚
10. Sub-Classification
    β”œβ”€β”€ Vegetation: Deforestation / Growth / Crop / Health / Seasonal
    β”œβ”€β”€ Structural: New / Expansion / Renovation / Partial Demo / Full Demo / Infrastructure
    └── Road: New / Widening / Resurfacing / Deterioration
       β”‚
11. 3D Building Analysis (for construction/demolition regions)
    β”œβ”€β”€ Shadow detection β†’ height/stories estimation
    └── Construction stage classification
       β”‚
12. Visualization
    β”œβ”€β”€ Red overlay on changed pixels
    β”œβ”€β”€ Bounding boxes + annotation labels
       β”‚
13. Response
    β”œβ”€β”€ Save overlay to disk + database record
    └── Return JSON: stats, regions, base64 overlay image
```

---

## Deployment

- **Local development:** Run `uvicorn app.main:app --reload` from the project root. SQLite database is created in `data/satellite_app.db`.
- **Hugging Face Spaces:** Push to the linked HF repo. The Dockerfile builds and deploys automatically. Database is stored at `/home/appuser/data/` (ephemeral β€” resets on container restart).
- **Production with PostgreSQL:** Set `DATABASE_URL` environment variable to a PostgreSQL connection string. Set `SECRET_KEY` to a strong random value.