BRKMYR/ AI Builder Portfolio/ SAR Intelligence Pipeline

SAR Intelligence Pipeline

A five-notebook Sentinel-1 SAR workflow. From ordering satellite tiles through UP42, to change detection, ship detection with AIS fusion, InSAR-based damage assessment, and a fused GeoJSON intelligence product. Public ESA Copernicus data only, no restricted imagery.


Problem

Radar sees at night and through cloud. The tooling doesn't ship.

Synthetic aperture radar is the only earth-observation modality that works around the clock and through weather. That is why the last several years of open-source geospatial work have leaned into Sentinel-1. But the tooling to turn a raw SAR tile into a decision-ready intelligence product is scattered across academic notebooks and single-purpose research code. A product team that wants to answer "did anything change at this port between Tuesday and Friday" ends up gluing together six libraries and reading four papers before they get an answer.

The bar for a shippable pipeline is not novelty. It is that a single Sentinel-1 scene ID goes in and a shareable GeoJSON comes out, with the steps in between reviewable by a domain analyst.

Solution

Five notebooks, one direction of flow.

Each notebook is a link in the chain. Notebook 1 orders and prepares the SAR stack. Notebooks 2, 3, and 4 run the three main analytics (change detection, ship detection, InSAR damage). Notebook 5 fuses their outputs into an interactive map plus a structured GeoJSON feed. All inputs are Sentinel-1 tiles via the UP42 Python SDK; no restricted or licensed imagery is required.

Sentinel-1 SLC (UP42 SDK, PySTAC) ↓ radiometric calibration + terrain correction Analysis-ready stack (co-registered time series) ↓ ╚─ Notebook 2: NCCD + CCD + CFAR → change map ╚─ Notebook 3: land mask + CFAR + AIS → ship detections ╚─ Notebook 4: InSAR coherence + PWTT → damage classes ↓ Notebook 5: fuse layers → Folium map + GeoJSON

Notebooks

What is in each link of the chain.

01
data_acquisition
UP42 SDK v3 auth, Sentinel-1 archive search, Cloud Optimized GeoTIFF download, radiometric calibration, terrain correction, time series co-registration.
02
change_detection
Incoherent change detection (amplitude ratio), coherent change detection (phase coherence), CFAR thresholding, temporal heatmaps.
03
ship_detection
Land masking, two-parameter CFAR ship detector, chip extraction, CNN classification, AIS correlation for dark-vessel identification.
04
battle_damage_assessment
InSAR coherence baseline, coherence-drop monitoring, Pixel-Wise T-Test classifier, damage classes per OSM building footprint.
05
sensor_fusion_reporting
Combine all upstream outputs into a Folium interactive map, structured GeoJSON feed, and temporal summary stats.

Reference code

CFAR ship detector, from notebook 3.

Two-parameter constant-false-alarm-rate detector. Ships appear as bright targets against darker ocean; CFAR adapts to local sea clutter statistics so a fixed threshold does not miss subtle contacts or drown in swell.

def cfar_ship_detector(sar_image: np.ndarray,
                       guard: int = 5,
                       background: int = 15,
                       pfa: float = 1e-6) -> np.ndarray:
    """Two-parameter CFAR detector optimized for ship targets in SAR.

    Ships appear as bright targets against darker ocean background.
    CFAR adapts to local sea clutter statistics.
    """
    from scipy.ndimage import uniform_filter
    # ... local mean + variance from background ring,
    #     threshold from Gaussian tail at the specified pfa
    ...

Success criteria

When we'd call this "working."

Metrics, KPIs, evals

What a PM would measure.

KPITypeWhat it tells the PM
Ship-detection precision %, AIS-labeled Fraction of CFAR contacts that AIS says are vessels. Complements a dark-vessel score, which is the interesting cell.
Dark-vessel rate count Contacts with no AIS match. This is what the pipeline exists for: vessels the co-op tracking system does not know about.
Change-detection FAR 1/km² False-alarm rate per square kilometer at a fixed pfa. Analyst tunes to their attention budget.
Coherence baseline 0-1 Pre-event mean InSAR coherence. Sets the "quiet" baseline against which damage is a drop, not an absolute threshold.
Time-to-product minutes Wall time from scene ID to fused GeoJSON. Bounded by download speed; analysis is CPU-cheap once the stack is local.
Product size MB per scene GeoJSON + map tiles for one scene. Determines how many scenes a browser client can carry.
What we haven't shipped yet.
  • No live data-dependent runs on this page. UP42 credentials plus a Sentinel-1 order are required to execute end-to-end; the notebooks are scaffolded pipelines with real code, awaiting a captured run to attach here as reference imagery.
  • Ship-detection classifier: CFAR contact detection is coded; the CNN classification and AIS fusion steps are still to-do inside notebook 3.
  • Real-time ingest: pipeline is per-scene batch. Continuous ingest against the Copernicus data feed is next.
  • Scale-out: single-scene notebooks; a workflow orchestrator (Prefect or Dagster) would let the pipeline run over a rolling geographic window.