PSI · MiaplPy
PSInSAR (PSI) is a technique that selects only Persistent Scatterers — points whose phase stays stable over time — and extracts mm/yr displacement at full resolution, the exact inverse philosophy of SBAS, which multilooks (averages) neighboring pixels. Running on MiaplPy (which operates atop an ISCE2 stack), the downtown Jukjeon PSI was carried end-to-end, ingesting 108,690 points into the dashboard. The most expensive phase_linking stage was cut from five hours to six minutes (~15x) by fixing BLAS thread over-subscription.
PSI vs SBAS — opposite philosophies
- Both diverge from the same coregistered SLC stack, but SBAS multilooks neighboring pixels for areal displacement — a Distributed Scatterer approach.
- PSI selects only phase-stable points and keeps full resolution, so it excels in urban settings such as buildings and man-made structures.
- Urban precision belongs to PSI and wide-area coverage to coarse SBAS; reclaimed land and waterfront fill are PSI territory too — at Songdo, PSI succeeded with 29,929 points while SBAS was unusable at temporal coherence 0.17.
| SBAS | PSI | |
|---|---|---|
| Scatterer | Distributed (multilook avg) | Persistent (point selection) |
| Resolution | Sacrificed by multilook (10–55m) | Full resolution kept |
| Strong terrain | Areal, flatland, mountains | Urban, man-made structures |
The MiaplPy pipeline
- Unlike SBAS, the input is un-multilooked full-resolution SLC, reusing the r6 downtown coregistration result (87 coreg_secondarys).
- The merged SLC/geom existed only as VRT (virtual), so a preprocessing step materialized them into the physical binaries (.full) MiaplPy requires (~74GB).
- The final timeseries_correction applies ERA5/demErr corrections, converts to velocity, then geocodes.
phase_linking thread trap — 5h → 6min
- The costliest PSI stage: the default num_worker=4 spawns ~16 BLAS threads per worker, over-subscribing 64 cores into thread-barrier spin — us=100% but spinning idle (~5h total).
- The 87×87 EMI small matrices scale poorly under multithreaded BLAS, so the fix is pinning threads to 3 and raising process parallelism above the patch count.
- As a result 21 patches run in a single parallel wave at 3–5 min/patch (~6 min total), and patches with a flag.npy are auto-skipped, making interruption and restart safe.
QA results — downtown Jukjeon end-to-end
- In radar coordinates 609×1393, true PS (maskPS) selected 56,975 of 848,337 points (6.7%).
- Temporal coherence averaged 0.485 with 25.6% at ≥0.7 (normal for an urban area), and corrected LOS velocity was mean +0.20, std 0.94 mm/yr.
- Finally, 108,690 points (re-geocoded to 10m) were ingested into the dashboard as stack_id=3 'jukjeon_psi_r6'.
The dashboard counts 'trusted points' via SBAS's unwrap-validation metric (conncomp_ok), but PSI has no connComp so it becomes NULL — toggling 'trusted points only' yields zero. Forcing conncomp_ok=true would be dishonest; the honest fix is for the dashboard to support a separate temporalCoherence confidence grade for PSI stacks. Also, even the 108,690 ingested points must never be cited as single PS — read them only as per-building (n_PS≥10), complex, or AOI averages.