Releases: ucam-eo/TEE
Releases · ucam-eo/TEE
v1.2.1
v1.2.1
Label Export/Import
- Vectorized export: pixel labels exported as polygons via d3-contour marching squares
- Shapefile import: JSZip extraction, point grouping by name, polygon rasterization fix
- Panel 6 delete fix: last label deletion now updates both panels
User Management
- Email field in user enrolment (UI, API, and CLI)
- Zulip welcome on first sign-in
- Restored Users tab UI (lost during earlier refactoring)
User Guide
- Complete rewrite for non-technical ecology audience
- Screenshots, Mermaid diagrams, TOC, numbered sections, PDF version
- Classification schemas, classifier parameters, spatial split documented
Labelling
- Store cluster pixel_coords on promote
- Multiple shapefile uploads with Clear button
- EUNIS habitat classification schema
Infrastructure
- Unified deploy-compute.sh
- Zarr support with chunked fetching
- 19 new validation tests
v1.2.0-beta
Beta 1.2.0
Label Export/Import
- Vectorized export: pixel labels are now exported as polygons (via d3-contour marching squares) instead of individual points — reduces 216K features to a handful of polygons per class
- Shapefile import fix: uses JSZip to extract .shp/.dbf from zip (was passing raw zip bytes)
- Import grouping: multiple points with same name are reconstituted as a single label with pixel_coords, centroid embedding, and threshold
- Panel 6 last-delete fix: deleting the last label now correctly clears the panel 6 mirror
Labelling
- Store cluster pixel_coords on promote for exact rebuild on show/hide
- Clear localStorage labels when viewport is deleted
- Fix panel 6 header hiding the auto/manual label dropdown
- Allow multiple shapefile uploads with explicit Clear button
Evaluation
- Create Map: GeoTIFF generation from classifier predictions
- EUNIS terrestrial habitat classification schema (6 groups, 35 level-2, 246 level-3)
- Zarr support with chunked fetching and coverage probing
- Shared zarr utilities (get_zarr, probe_zarr_coverage, read_region_chunked)
Infrastructure
- Unified deploy-compute.sh with --local flag (replaces restart.sh)
- Port 8001 for tunnel — no Django needed for evaluation
- Zarr-first viewport processing with NPY fallback
- 19 new validation tests for export/import pipeline
Beta 1.1.0 — Spatial evaluation, hyperparameter sweep
What's New
Spatial train/test split
- Draw train (blue), test (yellow), and map (green) bounding boxes on the satellite map
- Training points sampled from train areas only; test set is fixed from test areas
- Avoids spatial autocorrelation for more realistic accuracy estimates
- Bounding boxes saved in config files
- Warning when test set is too small (<100 pixels)
Hyperparameter sweep
- Click "+" next to any classifier's parameters to add variants
- Each variant gets its own learning curve (e.g., "MLP (v1)", "MLP (v2)")
- Config file supports list format:
"mlp": [{"hidden_layers": "64,32"}, {"hidden_layers": "256,128,64"}] - Variant-aware chart colors (lighter/darker shades) and labels
Performance improvements
- Vectorized point extraction from tiles (~100x faster per tile)
- GDF filtered by tile bbox before CRS reprojection (~40x faster)
- Max pixel samples now controls actual sampling budget
UI improvements
- Crosshair cursor when drawing rectangles
- Auto-draw: selecting area type starts drawing immediately
- Map dragging disabled while drawing (no pan/draw conflict)
- Config file includes inline documentation of choices
Bug fixes
- Spatial MLP IndexError: separate data pool for spatial classifiers
- UnboundLocalError for spatial_labels on cache hit
- Deploy script: kill -9 for reliable process termination
Deployment
# Hosted server
docker pull sk818/tee:stable
sudo ./manage.sh # option 7
# Compute server
./scripts/deploy-compute.sh gpu-boxBeta 1.0.0 — Large-area evaluation with GPU compute
What's New
Large-area evaluation
- Evaluate classifiers on country-scale shapefiles (tested on Austria: 42K features, 40 tiles)
- GeoTessera point sampling for pixel classifiers (k-NN, RF, XGBoost, MLP)
- Real tile-aligned 256×256 patches for U-Net and spatial MLP
- Configurable sampling strategies: equal, sqrt-proportional, proportional to area
Remote GPU compute
tee-computeserver for offloading ML to GPU boxes via SSH tunnel- Deploy script for easy server management
- OpenBLAS fix for servers with >128 CPU cores
- Server-side cancellation (cancel button stops backend computation)
U-Net improvements
- Pixel-aligned patches from real GeoTessera tiles (not point grids)
- 16× augmentation (4 rotations × 2 flips × 2 noise levels)
- GPU support via PyTorch with CUDA
UI improvements
- Unified learning curve x-axis: % of labelled pixels used for training (log scale)
- Scrolling progress log in validation panel
- Status button showing backend + compute hostnames
- Per-class polygon counts from full shapefile (not truncated GeoJSON)
- Sampling strategy dropdown (equal / sqrt-proportional / proportional)
- Max pixel samples and max patches controls
Data & caching
- Disk result cache: instant re-runs with same shapefile/field/year
- Single tile pass: point samples and patches extracted from same tiles
- Estimated total labelled pixels from polygon areas at upload
Example data
austria.zipincluded — Austrian INVEKOS crop field data (42,789 polygons, 17 crop classes)
Deployment
# Hosted server (tee.cl.cam.ac.uk)
docker pull sk818/tee:stable
sudo ./manage.sh # option 5
# GPU compute server
pip install -e packages/tessera-eval[server]
tee-compute --port 5050See the User Guide for full setup instructions.
Alpha 3.7.0
What's New
Label Sharing
- Private mode: share embedding+label pairs with the Tessera team (no locations)
- Public mode: share geolocated labels as ESRI Shapefile for other users to import
- Import button shows available shared labels with badge counter
New Built-in Schema
- HOTW (Habitats of the World) added alongside UKHab
Architecture Cleanup
- Removed GeoTIFF tile codepath — PNG-only pyramids
- Removed legacy label system (~600 lines of dead code)
- Removed Stage 2 satellite pipeline
- Renamed
maps.heatmap→maps.panel5,HEATMAP_LAYER_RULES→PANEL5_LAYER_RULES - Enforced embeddings (uint8) vs vectors (float32) naming convention
- Simplified progress system to single source of truth
- Upgraded shp-write to v0.4.3
Bug Fixes
- Polygon drawing: fixed cross-module bare calls, latlng unwrapping, completion dblclick
- Map sync: fixed missed panel5 renames in sync arrays
- Viewport re-creation: thorough cleanup of stale files, race conditions
- IndexedDB cache migration for .embeddings → .values rename
- Shapefile upload: read all .shp files in ZIP (points + polygons)
- OSM attribution compliance
- Safari fixes: Float32Array JSON serialization, shp-write MIME type
Documentation
- Comprehensive docs: architecture, frontend API, backend API, extension guide
- Schema file format documentation with examples
- Known technical debt documented (dual label systems, double quantization)
Viewport Creation
- Removed blocking GeoTessera registry check (was 28s delay)
- Granular progress: shows GeoTessera init time, download MB/speed
- GeoTessera availability check deferred to pipeline
Other
- Smaller polygon vertex markers (1/4 size)
- Panel titles: "Create labelled points", "Classification results"
tile_healthauto-discovers year directories
v3.5.0 — Django Auth Migration
What's changed
Replaces the custom /data/passwd + bcrypt authentication with Django's built-in contrib.auth backed by SQLite, following Anil Madhavapeddy's security review.
Highlights
- Django admin UI at
/admin/for managing users and quotas - Automatic passwd migration — existing
/data/passwdfiles are imported on first container boot (no manual steps) - Management commands:
tee_adduser,tee_removeuser,tee_listusers,tee_setquota,migrate_passwd - PBKDF2 password hashing (default) with BCrypt support for migrated hashes
- Session fixation protection via
session.cycle_key()on login - No frontend changes — API response shapes are identical
Upgrade
On the host VM:
sudo ./manage.sh # option 5 (Update container)
The container auto-runs migrate, collectstatic, and migrate_passwd --auto on startup.
Improved error messages
process_viewport.pynow shows friendlier retry/failure messages
v3.4.0
v3.4.0
Manual Labelling Mode
- Pin labels — Ctrl+click (or double-click) to place point labels with embedding capture
- Polygon labels — Ctrl+double-click to draw polygon boundaries, rasterized at 10m resolution
- Per-class similarity sliders — expand label coverage by adjusting embedding distance thresholds
- Classification — click Classify for full-viewport nearest-centroid classification in Panel 5
- Panel 4 integration — manual label classes colored in PCA/UMAP scatter plot
- Timeline — track label coverage across years with clock icon
- Schema support — UKHab v2 or custom JSON/CSV for standardized class names
Auto-label Improvements
- Rename promoted labels with pencil icon
- Eye icon replaces Hide/Show text, clock icon replaces Timeline text
- Fix: promoted cluster pixels no longer inflate after viewport switch
Validation
- Export Results and Download Models buttons moved to top header bar
- Spatial MLP (3×3 and 5×5) and U-Net (GPU) classifiers added
User Guide
- Comprehensive rewrite: documents all 4 viewer modes (Explore, Change Detection, Labelling, Validation) with per-panel descriptions
- Manual labelling guide: pins, polygons, thresholds, classification, Panel 4 coloring
- Export docs split for header vs manual label exports (JSON, GeoJSON, ESRI Shapefile ZIP)
Bug Fixes
- Fix Panel 4 colors disappearing on viewport return
- Restore threshold-gated classification (prevents marking all pixels)
- Set-active icon moved to leftmost position in label rows
v3.3.0 — Labelling UX improvements
What's new
- Polygon drawing fix — vertex clicks no longer create spurious point rows in the labels list
- Smooth similarity slider — debounced with
requestAnimationFrame; no DOM rebuild mid-drag - Label row layout — pixel count moved to right of slider; unified layout for polygon and point rows
- Scrollbar fix — labels list scrollbar no longer overlaps the delete button
- Toolbar cleanup — removed redundant "View Labels" and "Save as Label" buttons
- Satellite acquisition date — ESRI imagery date shown in Panel 2 header
v3.2.0
What's New
U-Net Classifier
- U-Net (GPU) classifier operating on the full 2D embedding grid
(1, 128, H, W)via PyTorch - Supports CUDA, MPS (Apple Silicon), and CPU
- Configurable epochs, learning rate, depth, and base filters
- 1 repeat per training size (vs 5 for sklearn classifiers)
- Trained models download as
.ptfiles - Greyed out in deployed mode (separate tile server)
- PyTorch imported lazily — not bundled in Docker image
Spatial MLP Improvements
- 4× flip augmentation for Spatial MLP (3×3) and (5×5) — horizontal, vertical, and both flips are label-preserving for land cover patches
Other
- TEE mosaic logo added to README
- Graceful handling of non-JSON server errors in the client
Full changelog: v3.1.0...v3.2.0
v3.1.0
What's New
Validation & Evaluation
- Spatial MLP (3×3) classifier with cancel button and sorted class table
- Spatial MLP (5×5) classifier with memory-efficient spatial feature gathering
- Streaming learning curves via NDJSON with per-classifier early finish
- Confusion matrix panel with metric toggle and CSV export
- Trained model download after validation runs
- Tunable hyperparameters for all classifiers
UI & UX
- Suggested labelling workflow in user guide
- Research disclaimer and acceptance checkbox on login
- Fixed mode-dependent panel visibility across all four viewer modes
- Fixed UMAP recomputing on every dropdown selection
- Fixed similarity search pins not clearing on subsequent double-clicks
- Fixed View Labels button not showing panel
- Removed 2017 from year selection (poor part-year Sentinel data)
Stability
- Restored fetch timeout and improved evaluation error messages
Full changelog: v3.0.0...v3.1.0