Overview

From crop types and illegal mining to building footprints and plant counts, I design deep-learning systems for satellite, aerial and drone imagery, and I judge them by how they perform in places they have never seen.

What you get

  • Segmentation, detection and classification models trained for your imagery and classes
  • Benchmarks against simple baselines, so the added complexity is justified
  • Spatially honest accuracy reports with uncertainty, not just a headline score
  • Inference pipelines from search to finished map, mask or dataset
  • Deployment artifacts: ONNX models, FastAPI / WebSocket inference servers, edge-ready exports

Who this helps

  • Agriculture & food security

    Crop-type maps, crop condition and plant counting for smallholder and commercial farms.

  • Forest & mining monitoring

    Detecting illegal mining, deforestation and land-cover change under persistent cloud.

  • Governments & NGOs

    Land-cover, building and change maps that stand up to scrutiny.

  • Teams with a model that fails in the field

    Diagnosing domain shift, label problems and leakage in existing models.

How I approach it

  1. 01

    Start from the decision, not the architecture

    Which map, at what resolution, with what error is acceptable, and who will act on it. That defines the classes, the metric and the validation design.

  2. 02

    Audit the data and labels

    Check sources, label noise and class balance; mining scars, for example, covered under 4% of the Atewa landscape. Where labels are scarce, bootstrap them from OpenStreetMap, building footprints, ESA WorldCover, Dynamic World, SAM or UAV imagery.

  3. 03

    Baseline first

    Train a ResNet-50 or U-Net baseline before reaching for foundation models. A complex model must beat a simple one on the same spatial split.

  4. 04

    Fit the model to the physics

    SAR–optical fusion for cloud-prone regions, multi-temporal stacks for crops, EO foundation models (Clay, Prithvi-EO-2.0, DINOv3) where they add value, and imbalance-aware losses such as focal, Tversky and OHEM with hard negative mining.

  5. 05

    Validate spatially

    Spatial-block or agro-ecological-zone cross-validation, held-out tiles and field re-validation. Random pixel splits overstate accuracy because neighbouring pixels are nearly identical.

  6. 06

    Deploy and keep watching

    Export to ONNX, serve through FastAPI with batch and WebSocket inference, and monitor drift, with Grad-CAM, SHAP and uncertainty estimates to explain predictions.

Evidence from my work

  • 82% / 0.79Recall / F1 for illegal-mining detection on held-out tiles
  • > 0.70F1 for 10 m crop types under spatial cross-validation
  • 95.8%In-domain score of a crop-disease CNN that failed on smallholder farms, diagnosed and fixed
  • 119+Architectures registered in pygeovision

The crop-disease model scored 95.8% in its training domain but close to zero on smallholder farms; geographically stratified data diversification and field re-validation resolved it.

Selected work

FlagshipLearned InSAR unwrapping

pyunwrap: Learned InSAR Phase Unwrapping

A network that predicts the integer 2π cycle count at every pixel, so it can never contradict the measured phase. 99.1% of pixels exact on easy test scenes, 96.6% on moderate.

View case study
SAR–Optical FusionYOLOv8

Atewa Illegal Mining Detector

Dual-stream U-Net + YOLOv8 fusing Sentinel-1 and Sentinel-2, trained on UAV-derived labels. Recall 82%, F1 0.79 on held-out tiles.

View case study
Foundation ModelsSentinel-2

Crop-Type Mapping with EO Foundation Models

Clay fine-tuned on multi-temporal Sentinel-2 stacks for 10 m crop types, benchmarked against ResNet-50; F1 above 0.70 under spatial cross-validation.

View case study

What sets my work apart

  • 1

    Spatial cross-validation by default

    Every reported score comes from areas the model did not train on.

  • 2

    I go looking for failure

    Domain shift, leakage and label noise are tested for directly, because that is where field deployments break.

  • 3

    Uncertainty is a feature

    Ensemble and Bayesian uncertainty flag the predictions that need a human look.

Tools & standards

  • PyTorch
  • PyTorch Geometric
  • TensorFlow
  • U-Net
  • SegFormer
  • Swin-UNETR
  • YOLOv8
  • Clay
  • Prithvi-EO-2.0
  • DINOv3
  • SAM
  • ONNX
  • Optuna
  • pygeovision

Common questions

How many labels do I need?

Often fewer than you think. Foundation models and automated labelling from open datasets reduce the annotation burden; I estimate the need after auditing your data and target classes.

Should we use a foundation model?

Sometimes. They help most when labels are scarce or regions vary widely. I benchmark them against a simple baseline on the same spatial split and recommend whichever performs better for the cost.

Can the model run offline or on the edge?

Yes. Models can be exported to ONNX and sized for edge hardware; the Urban Subsidence Watcher uses a deliberately small U-Net for this reason.