Discontinuous aperture sampling leaves gaps in the SAR phase history and makes high-quality reconstruction difficult. In a bitemporal setting, reconstructing the two acquisitions independently can further disturb their shared structure and amplify phase errors, reducing the reliability of the differential phase used for change analysis.
DP-JMRNet addresses this problem by reconstructing both complex SAR images jointly. It combines the SAR observation model with a five-stage deep-unfolding network and selectively exchanges information between the two epochs. The interaction is reduced when the local observations do not provide reliable shared information, which helps preserve epoch-specific content while improving differential-phase reconstruction.
This repository provides the reconstruction model, a matrix-free wideband SAR operator, training and validation scripts, numerical tests, a small example dataset, and the code required to reproduce the complete simulated dataset.
The model takes two incomplete complex phase histories acquired at different epochs and reconstructs the corresponding complex SAR images together. The known SAR acquisition geometry and aperture sampling pattern are used directly in the reconstruction rather than being approximated by a generic image-degradation model.
Each of the five unfolding stages contains three main components:
- matrix-free data consistency based on the SAR forward and adjoint operators;
- a shared complex-valued image prior for the two epochs;
- coherence- and residual-aware selective interaction between the reconstructions.
Data consistency is applied both before the shared prior and after the selective interaction. The shared prior captures structures common to both acquisitions, while the interaction module determines where cross-epoch information is reliable enough to use. In regions with weak coherence or conflicting measurement evidence, the two reconstruction branches operate more independently to avoid transferring misleading information.
The network outputs two complex SAR images. Training considers complex reconstruction quality, amplitude fidelity, individual phase accuracy, and the differential phase between the two epochs. Exchanging the input epochs exchanges the corresponding outputs, so the result does not depend on an arbitrary ordering of the image pair.
.
├── configs/data/ simulated-dataset specification
├── data/simulated_dataset/ bundled 32/8/8 example dataset
├── scripts/generate_dataset.py complete dataset generator
├── scripts/train.py training entry point
├── scripts/validate.py checkpoint evaluation entry point
├── src/coherent_sar/ model, SAR operator, and data pipeline
├── tests/ numerical and architectural tests
├── config.json quick example configuration
└── config.full.json complete-dataset training configuration
Python 3.10 or newer is required. Install a PyTorch build suitable for your CPU or CUDA environment, then install the project:
python -m venv .venv
python -m pip install --upgrade pip
python -m pip install -e ".[test]"Run the tests to verify the installation:
python -m pytestThe bundled example dataset contains 32 training samples, 8 validation samples, and 8 held-out samples. It uses the same format as the complete dataset and is intended for testing the installation and training pipeline.
The complete simulated dataset contains 4,000 bitemporal samples:
| Split | Samples | Parent scenes |
|---|---|---|
| Train | 3,000 | 188 |
| Validation | 500 | 32 |
| Test | 500 | 32 |
Each sample contains two native 256 × 256 complex SAR images, wrapped differential-phase ground truth, phase-reliability weights, a validity mask, and generation metadata. Parent scenes are assigned to train, validation, and test before patches are cropped, preventing parent-scene overlap between splits.
Generate the complete dataset with:
python scripts/generate_dataset.py --mode fullThe output is written to data/final_sar_dataset_256/. The generator also creates manifests, split statistics, integrity checks, per-sample hashes, and deterministic noise-seed banks.
For a smaller generator check, run:
python scripts/generate_dataset.py --mode dryA custom output directory can be specified with --output:
python scripts/generate_dataset.py --mode full --output /path/to/datasetRun a one-step end-to-end check with the bundled example dataset:
python scripts/train.py --steps 1Standard example training:
python scripts/train.py --config config.jsonAfter generating the complete dataset, run the complete-data configuration with:
python scripts/train.py --config config.full.jsonTraining writes best.pt, last.pt, and metrics.json to the configured output directory. A CUDA-capable GPU is recommended for training the full five-stage 256 × 256 model.
Validate a checkpoint trained with the example configuration:
python scripts/validate.py --config config.json --checkpoint outputs/best.ptFor the complete-data configuration:
python scripts/validate.py --config config.full.json --checkpoint outputs/full_k104/best.ptThe validation script reports weighted differential-phase RMSE, amplitude NMSE, and complex NMSE.
- The dataset is generated from a versioned configuration and a fixed base seed.
- Train, validation, and test splits are separated at the parent-scene level.
- Manifests record the generation metadata and numerical truth hashes of every sample.
- Noise seeds are deterministic and stored independently for each split and epoch.
- The tests cover the complex adjoint relation, operator gradients, exchange equivariance, selective fallback, and model backpropagation.
The provided dataset is a controlled coherent complex SAR simulation intended for reproducible method development. Evaluation on independently acquired SAR data is still necessary when assessing performance across sensors, terrain types, and acquisition conditions.
Released under the MIT License.