├── .dockerignore ├── .gitignore ├── CITATION ├── Dockerfile ├── LICENSE ├── README.md ├── environment.yml ├── s1denoise ├── __init__.py ├── denoising_parameters.json ├── scripts │ └── s1_correction.py ├── sentinel1image.py ├── tools.py └── utils.py ├── setup.py ├── training ├── README.md ├── collect_apg_data.py ├── convert_old_parameters.py ├── extra_scaling │ ├── analyze_experiment_extraScalingParameters.py │ └── run_experiment_extraScalingParameters.py ├── noise_scaling │ ├── Quick_start_Noise_scaling.ipynb │ ├── README.md │ └── analyze_experiment_noiseScalingParameters.py ├── power_balancing │ ├── Quick_start_Power_balancing.ipynb │ ├── README.md │ └── analyze_experiment_powerBalancingParameters.py ├── run_experiment.py ├── train_files │ ├── S1A_EW_GRDM_1SDH_noiseScaling.json │ ├── S1A_EW_GRDM_1SDH_powerBalancing.json │ ├── S1A_EW_GRDM_1SDV_noiseScaling.json │ ├── S1A_EW_GRDM_1SDV_powerBalancing.json │ ├── S1A_IW_GRDH_1SDH_noiseScaling.json │ ├── S1A_IW_GRDH_1SDH_powerBalancing.json │ ├── S1A_IW_GRDH_1SDV_noiseScaling.json │ ├── S1A_IW_GRDH_1SDV_powerBalancing.json │ ├── S1B_EW_GRDM_1SDH_noiseScaling.json │ ├── S1B_EW_GRDM_1SDH_powerBalancing.json │ ├── S1B_EW_GRDM_1SDV_noiseScaling.json │ ├── S1B_EW_GRDM_1SDV_powerBalancing.json │ ├── S1B_IW_GRDH_1SDH_noiseScaling.json │ ├── S1B_IW_GRDH_1SDH_powerBalancing.json │ ├── S1B_IW_GRDH_1SDV_noiseScaling.json │ └── S1B_IW_GRDH_1SDV_powerBalancing.json ├── update_apg_coefficients.py └── update_parameter_file.py └── validation ├── README.md ├── rqm_plot.py ├── rqm_tables.py └── run_qm_batch.py /.dockerignore: -------------------------------------------------------------------------------- 1 | *.SAFE 2 | *.tif 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | *.egg-info/ 24 | .installed.cfg 25 | *.egg 26 | 27 | # PyInstaller 28 | # Usually these files are written by a python script from a template 29 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 30 | *.manifest 31 | *.spec 32 | 33 | # Installer logs 34 | pip-log.txt 35 | pip-delete-this-directory.txt 36 | 37 | # Unit test / coverage reports 38 | htmlcov/ 39 | .tox/ 40 | .coverage 41 | .coverage.* 42 | .cache 43 | nosetests.xml 44 | coverage.xml 45 | *,cover 46 | .hypothesis/ 47 | 48 | # Translations 49 | *.mo 50 | *.pot 51 | 52 | # Django stuff: 53 | *.log 54 | 55 | # Sphinx documentation 56 | docs/_build/ 57 | 58 | # PyBuilder 59 | target/ 60 | 61 | #Ipython Notebook 62 | .ipynb_checkpoints 63 | #noise_scaling_coeff.py 64 | 65 | # OS generated files 66 | .DS_Store 67 | 68 | fit_on_one 69 | *png 70 | -------------------------------------------------------------------------------- /CITATION: -------------------------------------------------------------------------------- 1 | If you use Sentinel1Denoised in any academic work please cite the following papers: 2 | 3 | A. Korosov, D. Demchev, N. Miranda, N. Franceschi and J. -W. Park, "Thermal Denoising of Cross-Polarized Sentinel-1 Data in Interferometric and Extra Wide Swath Modes," in IEEE Transactions on Geoscience and Remote Sensing, vol. 60, pp. 1-11, 2022, Art no. 5218411, doi: 10.1109/TGRS.2021.3131036. 4 | 5 | @ARTICLE{9627699, 6 | author={Korosov, Anton and Demchev, Denis and Miranda, Nuno and Franceschi, Niccolò and Park, Jeong-Won}, 7 | journal={IEEE Transactions on Geoscience and Remote Sensing}, 8 | title={Thermal Denoising of Cross-Polarized Sentinel-1 Data in Interferometric and Extra Wide Swath Modes}, 9 | year={2022}, 10 | volume={60}, 11 | number={}, 12 | pages={1-11}, 13 | doi={10.1109/TGRS.2021.3131036}} 14 | 15 | Park, Jeong-Won; Korosov, Anton; Babiker, Mohamed; Sandven, Stein; and Won, Joong-Sun (2018): Efficient noise removal of Sentinel-1 TOPSAR cross-polarization channel, IEEE Transactions on Geoscience and Remote Sensing, doi:10.1109/TGRS.2017.2765248 16 | 17 | https://doi.org/10.1109/TGRS.2017.2765248 18 | 19 | In BibTeX format: 20 | 21 | @ARTICLE{8126233, 22 | author={J. {Park} and A. A. {Korosov} and M. {Babiker} and S. {Sandven} and J. {Won}}, 23 | journal={IEEE Transactions on Geoscience and Remote Sensing}, 24 | title={Efficient Thermal Noise Removal for Sentinel-1 TOPSAR Cross-Polarization Channel}, 25 | year={2018}, 26 | volume={56}, 27 | number={3}, 28 | pages={1555-1565}, 29 | keywords={backscatter;calibration;geophysical image processing;image denoising;radar imaging;remote sensing by radar;synthetic aperture radar;thermal noise;noise power subtraction;residual noise contributions;relatively narrow backscattering distribution;noise reduction;noise scaling;interswath power balancing;local residual noise power compensation;reconstructed noise field;efficient thermal noise removal;Sentinel-1 TOPSAR cross-polarization channel;Sentinel-1 Terrain Observation;Progressive Scans synthetic aperture radar image;additive thermal noise;European Space Agency;calibrated noise vectors;three-step correction process;azimuth descalloping;optimal correction coefficients;noise-uncorrelated gentle backscatter profile;Thermal noise;Azimuth;Synthetic aperture radar;Noise reduction;Antennas;Backscatter;Additives;Cross polarization;denoising;scalloping;Sentinel-1;Terrain Observation with Progressive Scans synthetic aperture radar (TOPSAR);thermal noise}, 30 | doi={10.1109/TGRS.2017.2765248}, 31 | ISSN={0196-2892}, 32 | month={March},} 33 | 34 | 35 | Park, Jeong-Won; Won, Joong-Sun; Korosov, Anton A.; Babiker, Mohamed; and Miranda, Nuno (2019), Textural Noise Correction for Sentinel-1 TOPSAR Cross-Polarization Channel Images, IEEE Transactions on Geoscience and Remote Sensing, doi:10.1109/TGRS.2018.2889381 36 | 37 | https://doi.org/10.1109/TGRS.2018.2889381 38 | 39 | In BibTeX format: 40 | 41 | @ARTICLE{8630667, 42 | author={J. {Park} and J. {Won} and A. A. {Korosov} and M. {Babiker} and N. {Miranda}}, 43 | journal={IEEE Transactions on Geoscience and Remote Sensing}, 44 | title={Textural Noise Correction for Sentinel-1 TOPSAR Cross-Polarization Channel Images}, 45 | year={2019}, 46 | volume={57}, 47 | number={6}, 48 | pages={4040-4049}, 49 | keywords={Thermal noise;Synthetic aperture radar;Signal to noise ratio;Additives;Noise reduction;Image reconstruction;Distortion;Cross polarization;image texture;Sentinel-1;synthetic aperture radar (SAR);terrain observation with progressive scans SAR (TOPSAR);thermal noise}, 50 | doi={10.1109/TGRS.2018.2889381}, 51 | ISSN={0196-2892}, 52 | month={June},} 53 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nansencenter/nansat 2 | LABEL maintainer="Anton Korosov " 3 | LABEL purpose="Python lib for removal thermal noise from Sentinel-1 TOPSAR" 4 | 5 | ENV CPL_ZIP_ENCODING=UTF-8 6 | 7 | COPY s1denoise /tmp/s1denoise 8 | COPY setup.py /tmp/ 9 | WORKDIR /tmp 10 | RUN python setup.py install \ 11 | && rm -rf * 12 | 13 | WORKDIR /src 14 | 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Sentinel1Denoised 2 | Thermal noise subtraction, scalloping correction, angular correction 3 | 4 | ## Citation 5 | 6 | If you use Sentinel1Denoised in any academic work please cite the following papers: 7 | 8 | A. Korosov, D. Demchev, N. Miranda, N. Franceschi and J. -W. Park, "Thermal Denoising of Cross-Polarized Sentinel-1 Data in Interferometric and Extra Wide Swath Modes," in IEEE Transactions on Geoscience and Remote Sensing, vol. 60, pp. 1-11, 2022, Art no. 5218411, doi: 10.1109/TGRS.2021.3131036. 9 | 10 | Park, Jeong-Won; Korosov, Anton; Babiker, Mohamed; Sandven, Stein; and Won, Joong-Sun (2018): Efficient noise removal of Sentinel-1 TOPSAR cross-polarization channel, IEEE Transactions on Geoscience and Remote Sensing, 56(3), 1555-1565, doi:10.1109/TGRS.2017.2765248 11 | 12 | Park, Jeong-Won; Won, Joong-Sun; Korosov, Anton A.; Babiker, Mohamed; and Miranda, Nuno (2019), Textural Noise Correction for Sentinel-1 TOPSAR Cross-Polarization Channel Images, IEEE Transactions on Geoscience and Remote Sensing, 57(6), 4040-4049, doi:10.1109/TGRS.2018.2889381 13 | 14 | 15 | See the CITATION file for more information. 16 | 17 | ## Installation 18 | The software is written in Python and requires 19 | [nansat](https://nansat.readthedocs.io/en/latest/source/installation.html) 20 | and [scipy](https://www.scipy.org/install.html) packages. A simple way to install these packages 21 | is to use [Anaconda](https://docs.conda.io/en/latest/miniconda.html). 22 | 23 | ```shell 24 | # create conda environment with key requirements 25 | conda env create -f environment.yml 26 | 27 | # activate environment 28 | conda activate s1denoise 29 | 30 | # install s1denoise 31 | pip install https://github.com/nansencenter/sentinel1denoised/archive/v1.4.0.tar.gz 32 | 33 | ``` 34 | 35 | Alternatively you can use [Docker](https://www.docker.com/): 36 | 37 | ```shell 38 | # build an image with eveything installed 39 | docker build . -t s1denoise 40 | 41 | # run Python in container 42 | docker run --rm -it -v /path/to/data:/path/to/data s1denoise python 43 | 44 | ``` 45 | 46 | ## Example 47 | 48 | Do processing inside Python environment: 49 | ```python 50 | from s1denoise import Sentinel1Image 51 | # open access to file with S1 data 52 | input_file = '/path/to/data/S1B_EW_GRDM_1SDH_INPUTFILE.zip' 53 | s1 = Sentinel1Image(input_file) 54 | 55 | # run thermal noise correction in HV polarisation with the default ESA algorithm 56 | s0hve = s1.remove_thermal_noise('HV', algorithm='ESA') 57 | 58 | # run thermal noise correction in HV polarisation with the default NERSC algorithm 59 | s0_hv = s1.remove_thermal_noise('HV') 60 | 61 | # run thermal noise correction in HV polarisation with the NERSC_TG algorithm applicable for old Sentinel-1 data 62 | s0_hv = s1.remove_thermal_noise('HV', algorithm='NERSC_TG') 63 | 64 | # run thermal and texture noise correction in HV polarisation 65 | s0_hv = s1.remove_texture_noise('HV') 66 | 67 | # High level function for processing both polarisations 68 | from s1denoise.tools import run_correction 69 | d = run_correction(input_file) 70 | 71 | ``` 72 | 73 | Process a single file with thermal, textural and angular correction and export in [dB] in a numpy file: 74 | 75 | `s1_correction.py INPUTFILE.zip OUTPUTFILE.npz` 76 | 77 | Process a single file and export as GeoTIFF (requires Nansat): 78 | 79 | `s1_correction.py INPUTFILE.zip OUTPUTFILE.npz -g` 80 | 81 | With option `-m` the script will also save landmask in Numpy format in a separate file with name `OUTPUTFILE.tif_mask.npz`: 82 | 83 | `s1_correction.py INPUTFILE.zip OUTPUTFILE.tif -m` 84 | 85 | Process a single file using Docker (replace `input_dir` and `output_dir` with actual directories): 86 | 87 | `docker run --rm -v /data_dir:/data_dir s1denoise s1_correction.py /data_dir/INPUTFILE.zip /data_dir/OUPUTFILE.tif` 88 | 89 | Note that for enabling the landmask functionality, you need to download and install the watermask: 90 | 91 | ```shell 92 | # Set the environment variable MOD44WPATH to a writable directory. It is also used by the script. 93 | export MOD44WPATH=/home/user/MOD44W 94 | 95 | # Download the landmask and extract: 96 | wget -nc -nv -P $MOD44WPATH https://github.com/nansencenter/mod44w/raw/master/MOD44W.tgz 97 | tar -xzf $MOD44WPATH/MOD44W.tgz -C $MOD44WPATH/ 98 | rm $MOD44WPATH/MOD44W.tgz 99 | 100 | ``` 101 | 102 | ## Experimental scripts 103 | 104 | Sub-directories in `s1denoise/training` and `s1denoise/validation` contain scripts for training and validation of the noise scaling and power balancing coefficients and extra scaling. See README files in these sub-dirs for details. 105 | 106 | ## License 107 | The project is licensed under the GNU general public license version 3. 108 | -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | name: s1denoise 2 | dependencies: 3 | - gdal 4 | - lxml 5 | - pip 6 | - pip: 7 | - beautifulsoup4 8 | - requests 9 | 10 | -------------------------------------------------------------------------------- /s1denoise/__init__.py: -------------------------------------------------------------------------------- 1 | from s1denoise.sentinel1image import Sentinel1Image 2 | __all__ = ['Sentinel1Image'] 3 | -------------------------------------------------------------------------------- /s1denoise/scripts/s1_correction.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import sys 3 | import argparse 4 | 5 | import numpy as np 6 | try: 7 | from nansat import Nansat 8 | except ImportError: 9 | NANSAT_AVAILABLE = False 10 | else: 11 | NANSAT_AVAILABLE = True 12 | 13 | from s1denoise.tools import run_correction 14 | 15 | def parse_args(args): 16 | ''' parse input arguments ''' 17 | parser = argparse.ArgumentParser( 18 | description="Correct Sentinel-1 TOPSAR EW GRDM for thermal and texture noise and angular dependence") 19 | parser.add_argument('ifile', type=str, help='Input Sentinel-1 file in SAFE or zip format') 20 | parser.add_argument('ofile', type=str, help='Output file') 21 | parser.add_argument('-a', '--algorithm', 22 | help='Name of the algorithm to use', 23 | type=str, 24 | default='NERSC', 25 | choices=['ESA', 'NERSC', 'NERSC_TG']) 26 | parser.add_argument('-g', '--geotiff', help='Export resulst as a GeoTIFF file', action='store_true') 27 | parser.add_argument('-m', '--mask', help='Also export land mask as a numpy file', action='store_true') 28 | return parser.parse_args(args) 29 | 30 | def export_geotiff(ifile, ofile, d): 31 | """ Use Nansat to export the arrays as a geotiff file with georeference as in the input dataset """ 32 | remove_metadata = ['dataType', 'PixelFunctionType', 'SourceBand', 'SourceFilename', 'colormap', 'minmax', 'units', 'wkv'] 33 | n_inp = Nansat(ifile) 34 | n_out = Nansat.from_domain(n_inp) 35 | for pol in d: 36 | parameters = n_inp.get_metadata(band_id='sigma0_%s' % pol) 37 | for i in remove_metadata: 38 | parameters.pop(i) 39 | n_out.add_band(array=d[pol], parameters=parameters) 40 | n_out.set_metadata(n_inp.get_metadata()) 41 | n_out.export(ofile, driver='GTiff') 42 | 43 | def export_mask(ifile, ofile): 44 | """ Export landmask as a numpy file """ 45 | n_inp = Nansat(ifile) 46 | wm = n_inp.watermask() 47 | np.savez_compressed(ofile + '_mask.npz', mask=wm[1]) 48 | 49 | if __name__ == '__main__': 50 | args = parse_args(sys.argv[1:]) 51 | if (args.geotiff or args.mask) and not NANSAT_AVAILABLE: 52 | raise ImportError(' Nansat is not installed and I can\'t export geotiff or landmask. ' 53 | ' Install Nansat or do not use "-g" and "-m". ') 54 | 55 | d = run_correction(args.ifile, algorithm=args.algorithm) 56 | if args.geotiff: 57 | export_geotiff(args.ifile, args.ofile, d) 58 | else: 59 | np.savez_compressed(args.ofile, **d) 60 | if args.mask: 61 | export_mask(args.ifile, args.ofile) 62 | -------------------------------------------------------------------------------- /s1denoise/tools.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import argparse 3 | import datetime 4 | import glob 5 | import json 6 | import os 7 | 8 | import numpy as np 9 | 10 | from s1denoise import Sentinel1Image 11 | 12 | def run_correction(ifile, 13 | angular_scale_copol=-0.2, 14 | angular_scale_crpol=-0.025, 15 | angular_offset=34.5, 16 | algorithm='NERSC', 17 | dtype=np.float32, 18 | **kwargs): 19 | """ Run thermal, textural and angular correction of input Sentinel-1 file 20 | 21 | Parameters 22 | ---------- 23 | ifile : str 24 | input file 25 | angular_scale_hh : float 26 | Scale for angular correction of sigma0 in HH or VV 27 | angular_scale_hv : float 28 | Scale for angular correction of sigma0 in HV or VH 29 | angular_offset : float 30 | Central angle for sigma0 normalization 31 | dtype : np.dtype 32 | Output datatype 33 | **kwargs : dict 34 | dummy keyword args for Sentinel1Image.remove_texture_noise() 35 | 36 | Returns 37 | -------- 38 | d : dict{np.array} 39 | dictionary with numpy array with corrected sigma0 in dB for both polarisations 40 | 41 | """ 42 | scale = { 43 | 'HH': angular_scale_copol, 44 | 'HV': angular_scale_crpol, 45 | 'VH': angular_scale_crpol, 46 | 'VV': angular_scale_copol, 47 | } 48 | 49 | s1 = Sentinel1Image(ifile) 50 | d = {} 51 | for pol in s1.pols: 52 | print('Correct %s band' % pol) 53 | inc = s1.get_geolocation_full_size(pol, 'incidenceAngle') 54 | d[pol] = s1.remove_texture_noise(pol, algorithm=algorithm, **kwargs) 55 | d[pol] = (10 * np.log10(d[pol]) - scale[pol] * (inc - angular_offset)).astype(dtype) 56 | return d 57 | 58 | 59 | class AnalyzeExperiment(): 60 | def parse_analyze_experiment_args(self): 61 | """ Parse input args for analyze_experiment_* scripts """ 62 | parser = argparse.ArgumentParser(description='Aggregate statistics from individual NPZ files') 63 | parser.add_argument('platform', choices=['S1A', 'S1B']) 64 | parser.add_argument('mode', choices=['EW', 'IW']) 65 | parser.add_argument('res', choices=['GRDM', 'GRDH']) 66 | parser.add_argument('pol', choices=['1SDH', '1SDV']) 67 | parser.add_argument('inp_dir') 68 | parser.add_argument('out_dir') 69 | return parser.parse_args() 70 | 71 | def __init__(self): 72 | """ Initialize """ 73 | self.args = self.parse_analyze_experiment_args() 74 | 75 | # dicts with sub-swaths number and polarization 76 | self.swaths_number = {'IW': 3, 'EW': 5}[self.args.mode] 77 | self.swath_names = ['%s%s' % (self.args.mode,iSW) for iSW in range(1, self.swaths_number+1)] 78 | self.polarisation = {'1SDH':'HV', '1SDV':'VH'}[self.args.pol] 79 | 80 | self.out_filename = os.path.join( 81 | self.args.out_dir, 82 | f'{self.args.platform}_{self.args.mode}_{self.args.res}_{self.args.pol}_{self.file_suffix}.json' 83 | ) 84 | 85 | npzFilesAll = sorted(glob.glob(os.path.join(self.args.inp_dir, 86 | f'{self.args.platform}_{self.args.mode}_{self.args.res}_{self.args.pol}_*_{self.file_suffix}.npz'))) 87 | 88 | # Check quality disclaimer #30 and #31 in https://qc.sentinel1.eo.esa.int/disclaimer/ 89 | self.npzFiles = [] 90 | for li, npzFile in enumerate(npzFilesAll): 91 | print(npzFile) 92 | startDateTime = datetime.datetime.strptime(os.path.basename(npzFile).split('/')[-1][17:32], "%Y%m%dT%H%M%S") 93 | endDateTime = datetime.datetime.strptime(os.path.basename(npzFile).split('/')[-1][33:48], "%Y%m%dT%H%M%S") 94 | if ( self.args.platform=='S1A' 95 | and startDateTime >= datetime.datetime(2018,3,13,1,0,42) 96 | and endDateTime <= datetime.datetime(2018,3,15,14,1,26) ): 97 | continue 98 | elif ( self.args.platform=='S1B' 99 | and startDateTime >= datetime.datetime(2018,3,13,2,43,5) 100 | and endDateTime <= datetime.datetime(2018,3,15,15,19,30) ): 101 | continue 102 | else: 103 | self.npzFiles.append(npzFile) 104 | 105 | def save(self, results): 106 | """ Save results in JSON file """ 107 | with open(self.out_filename, 'wt') as f: 108 | json.dump(results, f) 109 | -------------------------------------------------------------------------------- /s1denoise/utils.py: -------------------------------------------------------------------------------- 1 | from collections import defaultdict 2 | from datetime import datetime 3 | 4 | import numpy as np 5 | from scipy.stats import pearsonr 6 | from scipy.optimize import fminbound 7 | from scipy.ndimage.morphology import distance_transform_edt 8 | 9 | def cubic_hermite_interpolation(x,y,xi): 10 | ''' Get interpolated value for given time ''' 11 | return np.polynomial.hermite.hermval(xi, np.polynomial.hermite.hermfit(x,y,deg=3)) 12 | 13 | def cost(x, pix_valid, interp, y_ref): 14 | """ Cost function for finding noise LUT shift in Range """ 15 | y = interp(pix_valid+x) 16 | return 1 - pearsonr(y_ref, y)[0] 17 | 18 | def fit_noise_scaling_coeff(meanS0, meanN0, pixelIndex): 19 | """ Fit noise scaling coefficient on one vector of sigma0, nesz and pixel values """ 20 | # weight is proportional to gradient of sigma0, the areas where s0 varies the most 21 | weight = abs(np.gradient(meanN0)) 22 | weight = weight / weight.sum() * np.sqrt(len(weight)) 23 | # polyfit is used only to return error (second return param) when fitting func: 24 | # s0-k*no = f(A*x + B). Where: 25 | # s0 - sigma0 26 | # n0 - thermal noise 27 | # k - noise scaling (to be identified at later stage of fitting) 28 | # x - pixel index 29 | # A, B - just some polynom coeffs that are not used 30 | errFunc = lambda k,x,s0,n0,w: np.polyfit(x,s0-k*n0,w=w,deg=1,full=True)[1].item() 31 | # now with polynom fitting function in place, K (the noise scaling coefficient) 32 | # is fitted iteratively using fminbound 33 | scalingFactor = fminbound(errFunc, 0, 3, 34 | args=(pixelIndex,meanS0,meanN0,weight), disp=False).item() 35 | # correlatin between sigma0 and scaled noise 36 | correlationCoefficient = np.corrcoef(meanS0, scalingFactor * meanN0)[0,1] 37 | # error of fitting of the seclected scaling factor (K) 38 | fitResidual = np.polyfit(pixelIndex, meanS0 - scalingFactor * meanN0, 39 | w=weight, deg=1, full=True)[1].item() 40 | return scalingFactor, correlationCoefficient, fitResidual 41 | 42 | def fill_gaps(array, mask, distance=15): 43 | """ Fill gaps in input raster 44 | 45 | Parameters 46 | ---------- 47 | array : 2D numpy.array 48 | Ratser with deformation field 49 | mask : 2D numpy.array 50 | Where are gaps 51 | distance : int 52 | Minimum size of gap to fill 53 | 54 | Returns 55 | ------- 56 | arra : 2D numpy.array 57 | Ratser with gaps filled 58 | 59 | """ 60 | dist, indi = distance_transform_edt( 61 | mask, 62 | return_distances=True, 63 | return_indices=True) 64 | gpi = dist <= distance 65 | r,c = indi[:,gpi] 66 | array[gpi] = array[r,c] 67 | return array 68 | 69 | def skip_swath_borders(swath_ids, skip=1): 70 | swath_ids_skip = [] 71 | for swid in swath_ids: 72 | swid_skip = np.array(swid) 73 | for j in range(1,6): 74 | gpi = np.where(swid == j)[0] 75 | if gpi.size > 0: 76 | swid_skip[gpi[:skip]] = 0 77 | swid_skip[gpi[-skip:]] = 0 78 | swath_ids_skip.append(swid_skip) 79 | return swath_ids_skip 80 | 81 | def build_AY_matrix(swath_ids, sigma0hv, apg, incang, s0hv_max, s0hv_apg_corr_min): 82 | "HV = 1, IA, 1, APG1, 1, APG2, 1, APG3, 1, APG4, 1, APG5" 83 | 84 | A_123 = [] # [1] 85 | A_apg = defaultdict(list) # [APG scale and 1] 86 | Y = [] # [HV] 87 | 88 | for iswath in range(1,6): 89 | for swath_ids_v, sigma0hv_v, apg_v, incang_v in zip(swath_ids, sigma0hv, apg, incang): 90 | gpi = np.where((swath_ids_v == iswath) * (np.isfinite(sigma0hv_v*apg_v)))[0] 91 | # append only small enough values of HV 92 | if ( 93 | (np.nanmean(sigma0hv_v[gpi]) < s0hv_max[iswath]) and 94 | (pearsonr(sigma0hv_v[gpi], apg_v[gpi])[0] > s0hv_apg_corr_min[iswath]) 95 | ): 96 | A_123.append([ 97 | np.ones(gpi.size), 98 | incang_v[gpi], 99 | ]) 100 | A_apg[iswath].append(np.vstack([ 101 | np.ones(gpi.size), 102 | apg_v[gpi], 103 | ]).T) 104 | Y.append(sigma0hv_v[gpi]) 105 | 106 | if len(A_123) == 0: 107 | return None, None 108 | A_123 = np.hstack(A_123).T 109 | Y = np.hstack(Y)[None].T 110 | 111 | A = [] 112 | for iswath in A_apg: 113 | A_apg_stack = np.vstack(A_apg[iswath]) 114 | A_apg_all = np.zeros((A_apg_stack.shape[0], 10)) 115 | A_apg_all[:, int((iswath-1)*2):int((iswath-1)*2+2)] = A_apg_stack 116 | A.append(A_apg_all) 117 | 118 | A = np.hstack([np.vstack(A), A_123]) 119 | gpi = np.isfinite(A.sum(axis=1)) * np.isfinite(Y.flat) 120 | 121 | A = A[gpi] 122 | Y = Y[gpi] 123 | 124 | return A, Y 125 | 126 | def solve(A, Y): 127 | B = np.linalg.lstsq(A, Y, rcond=None) 128 | Y_rec = np.dot(A, B[0]) 129 | rmsd = np.sqrt(np.mean((Y - Y_rec)**2)) 130 | return B[0].flatten(), rmsd 131 | 132 | parse_azimuth_time = lambda x : datetime.strptime(x, '%Y-%m-%dT%H:%M:%S.%f') 133 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | setup( 4 | name='s1denoise', 5 | version='1.4.0', 6 | description='Thermal noise correction of Sentinel-1 TOPS GRDM EW products ', 7 | classifiers=[ 8 | 'Development Status :: 5 - Production/Stable', 9 | 'Environment :: Console', 10 | 'Intended Audience :: Information Technology', 11 | 'Intended Audience :: Science/Research', 12 | 'Natural Language :: English', 13 | 'Operating System :: OS Independent', 14 | 'Programming Language :: Python :: 3', 15 | 'Topic :: Scientific/Engineering', 16 | 'Topic :: Scientific/Engineering :: Information Analysis', 17 | 'Topic :: Utilities' 18 | ], 19 | keywords='thermal noise correction sentinel', 20 | author='Jeong-Won Park, Anton Korosov', 21 | author_email='jeong-won.park@nersc.no, anton.korosov@nersc.no', 22 | packages=find_packages(), 23 | scripts=[ 24 | 's1denoise/scripts/s1_correction.py', 25 | ], 26 | package_data={'s1denoise' :['denoising_parameters.json']}, 27 | install_requires=[ 28 | 'beautifulsoup4', 29 | 'gdal', 30 | 'lxml', 31 | 'numpy', 32 | 'requests', 33 | 'scipy', 34 | ], 35 | include_package_data=True, 36 | zip_safe=False) 37 | -------------------------------------------------------------------------------- /training/README.md: -------------------------------------------------------------------------------- 1 | The directory contains generic scripts for working with coefficiens. 2 | 3 | ## 1. Convert from old format (needed only once): 4 | 5 | `python convert_old_parameters.py` 6 | 7 | It converts from two JSON files for S1A and S1B in old format into one file in new format. 8 | In the new format the dict structure is quite flat. There are only two levels. The root key defines 9 | platform, mode, resolution, polarisation, type of coefficient and IPF (e.g. `S1B_EW_GRDM_HV_NS_3.1`). 10 | The 2nd level key defines sub-swath name (e.g. `EW1`). 11 | 12 | Coefficient can be accessed by: 13 | ```python 14 | import json 15 | with open('denoising_parameters.json') as f: 16 | par = json.load(f) 17 | 18 | ew1_ns = par['S1B_EW_GRDM_HV_NS_3.1']['EW1'] 19 | ew1_pb = par['S1B_EW_GRDM_HV_PB_3.1']['EW1'] 20 | ``` 21 | 22 | 23 | ## 2. Processing individual S1 GRD files with noise scaling and power balancing experiments 24 | 25 | The script 'run_experiment.py' loops over a set of S1 Level 1 GRD files to get statistics for 26 | each sub-block. Here is an example how to run it: 27 | 28 | ``` 29 | python run_experiment.py ns S1A VH /path/to/L1/GRD/files ./noiseScaling/ 30 | 31 | python run_experiment.py pb S1A VH /path/to/L1/GRD/files ./powerBalancing/ 32 | ``` 33 | where the arguments:\ 34 | 1st - type of experiment (ns/pb) 35 | 2st - platform (S1A/S1B)\ 36 | 3nd - polarization (VH/HV)\ 37 | 4nd - path to input training Level-1 GRD data\ 38 | 5th - path to output npz files with statistics in sub-blocks 39 | 40 | 41 | ## 3. Aggreagate statistics from individual NPZ files 42 | 43 | See noiseScaling and powerBalancing directories 44 | 45 | ## 4. Update the main denoising_parameters.json file with values from an experiment: 46 | 47 | Once you have aggregated statistics from many files you can update the main parameters JSON files: 48 | 49 | ``` 50 | python update_parameter_file.py powerBalancing/S1B_EW_GRDM_1SDH_powerBalancning.json ../denoising_parameters.json 51 | python update_parameter_file.py noiseScaling/S1B_EW_GRDM_1SDH_noiseScaling.json ../denoising_parameters.json 52 | ``` 53 | 54 | with the arguments: 55 | 1. name of input file with averaged values of power balancing coefficients (output from `analyze_experiment_powerBalancingParameters.py`) 56 | 1. name of the main parameters file 57 | 58 | It will take the averaged values from input file and put them into the main file. In addition it will 59 | create/update file `denoising_parameters_training_files.json` with lists of all training files sued in that experiment. 60 | 61 | Both updated files `denoising_parameters.json` and `denoising_parameters_training_files.json` should be added to git. 62 | -------------------------------------------------------------------------------- /training/collect_apg_data.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | """ This python script process individual S1 Level-1 GRD files to get values of antenna pattern gain (APG), sigma0, incidence angle for each noise vector 4 | 5 | run example: 6 | python collect_apg_data.py /path/to/L1/GRD/files /path/to/output/dir 7 | 8 | """ 9 | import argparse 10 | from collections import defaultdict 11 | from datetime import datetime 12 | import os 13 | from pathlib import Path 14 | 15 | from bs4 import BeautifulSoup 16 | import numpy as np 17 | from scipy.interpolate import InterpolatedUnivariateSpline 18 | 19 | from s1denoise import Sentinel1Image 20 | 21 | def get_processor_scaling_factor(soup): 22 | k_proc = {spp.swath.text: float(spp.processorscalingfactor.text) 23 | for spp in soup.find_all('swathprocparams')} 24 | return k_proc 25 | 26 | def get_relative_azimuth_time(s1, polarization, line): 27 | geolocationGridPoint = s1.import_geolocationGridPoint(polarization) 28 | xggp = np.unique(geolocationGridPoint['pixel']) 29 | yggp = np.unique(geolocationGridPoint['line']) 30 | 31 | azimuth_time = [ (t-s1.time_coverage_center).total_seconds() for t in geolocationGridPoint['azimuthTime'] ] 32 | azimuth_time = np.reshape(azimuth_time, (len(yggp), len(xggp))) 33 | at_interp = InterpolatedUnivariateSpline(yggp, azimuth_time[:,0]) 34 | azimuth_time = at_interp(line) 35 | return azimuth_time 36 | 37 | def get_pg_product(s1, soup, azimuth_time, pg_name='pgproductamplitude'): 38 | pg = defaultdict(dict) 39 | for pgpa in soup.find_all(pg_name): 40 | pg[pgpa.parent.parent.parent.swath.text][pgpa.parent.azimuthtime.text] = float(pgpa.text) 41 | 42 | pg_swaths = {} 43 | for swid in pg: 44 | rel_az_time = np.array([ 45 | (datetime.strptime(t, '%Y-%m-%dT%H:%M:%S.%f') - s1.time_coverage_center).total_seconds() 46 | for t in pg[swid]]) 47 | pgvec = np.array([pg[swid][i] for i in pg[swid]]) 48 | sortIndex = np.argsort(rel_az_time) 49 | pg_interp = InterpolatedUnivariateSpline(rel_az_time[sortIndex], pgvec[sortIndex], k=1) 50 | pg_vec = pg_interp(azimuth_time) 51 | pg_swaths[swid] = pg_vec 52 | return pg_swaths 53 | 54 | def get_noise_power_correction_factor(s1, soup, azimuth_time): 55 | npcf = defaultdict(dict) 56 | for i in soup.find_all('noisepowercorrectionfactor'): 57 | npcf[i.parent.swath.text][i.parent.azimuthtime.text] = float(i.text) 58 | 59 | npcf_swaths = {} 60 | for swid in npcf: 61 | rel_az_time = np.array([ 62 | (datetime.strptime(t, '%Y-%m-%dT%H:%M:%S.%f') - s1.time_coverage_center).total_seconds() 63 | for t in npcf[swid]]) 64 | npcfvec = np.array([npcf[swid][i] for i in npcf[swid]]) 65 | if npcfvec.size == 1: 66 | npcf_vec = np.ones(azimuth_time.size) * npcfvec[0] 67 | else: 68 | sortIndex = np.argsort(rel_az_time) 69 | npcf_interp = InterpolatedUnivariateSpline(rel_az_time[sortIndex], npcfvec[sortIndex], k=1) 70 | npcf_vec = npcf_interp(azimuth_time) 71 | npcf_swaths[swid] = npcf_vec 72 | return npcf_swaths 73 | 74 | def get_noise_calibration_factor(s1): 75 | eap_xml = s1.import_elevationAntennaPattern('HV') 76 | noise_ca_fa = {i: eap_xml[i]['noiseCalibrationFactor'] for i in eap_xml} 77 | return noise_ca_fa 78 | 79 | def parse_run_experiment_args(): 80 | """ Parse input args for run_experiment_* scripts """ 81 | parser = argparse.ArgumentParser(description='Process SAFE or ZIP files and collect APG related values') 82 | parser.add_argument('-o', '--out-dir', type=Path) 83 | parser.add_argument('-w', '--overwrite', action='store_true', help="Overwrite existing output files") 84 | parser.add_argument('-i', '--inp-files', type=Path, nargs='+') 85 | 86 | return parser.parse_args() 87 | 88 | def main(): 89 | polarization = 'HV' 90 | args = parse_run_experiment_args() 91 | print('Number of files queued:', len(args.inp_files)) 92 | 93 | for ifile in args.inp_files: 94 | ofile = os.path.join(args.out_dir, os.path.basename(ifile) + '_apg.npz') 95 | if os.path.exists(ofile) and not args.overwrite: 96 | print(ofile, 'exists') 97 | continue 98 | 99 | try: 100 | s1 = Sentinel1Image(str(ifile)) 101 | dn_hv = s1.get_GDALRasterBand('DN_HV').ReadAsArray().astype(float) 102 | except RuntimeError: 103 | print('GDAL cannot open ', ifile) 104 | continue 105 | print('Process ', ifile) 106 | annotation_soup = BeautifulSoup(s1.annotationXML[polarization].toxml()) 107 | k_proc = get_processor_scaling_factor(annotation_soup) 108 | line, pixel, noise = s1.get_noise_range_vectors(polarization) 109 | az_time = get_relative_azimuth_time(s1, polarization, line) 110 | pg_amplitude = get_pg_product(s1, annotation_soup, az_time, pg_name='pgproductamplitude') 111 | noise_po_co_fa = get_noise_power_correction_factor(s1, annotation_soup, az_time) 112 | noise_ca_fa = get_noise_calibration_factor(s1) 113 | 114 | swath_ids = s1.get_swath_id_vectors(polarization, line, pixel) 115 | eap, rsl = s1.get_eap_rsl_vectors(polarization, line, pixel, rsl_power=2.) 116 | ea_interpolator, ia_interpolator = s1.get_elevation_incidence_angle_interpolators(polarization) 117 | eleang, incang = s1.get_elevation_incidence_angle_vectors(ea_interpolator, ia_interpolator, line, pixel) 118 | cal_s0hv = s1.get_calibration_vectors(polarization, line, pixel) 119 | scall_hv = s1.get_noise_azimuth_vectors(polarization, line, pixel) 120 | 121 | dn_hv[dn_hv < 20] = np.nan 122 | dn_vectors = s1.get_raw_sigma0_vectors_from_full_size(line, pixel, swath_ids, dn_hv) 123 | 124 | ipf = s1.IPFversion 125 | 126 | np.savez( 127 | ofile, 128 | line=line, 129 | pixel=pixel, 130 | noise=noise, 131 | swath_ids=swath_ids, 132 | eap=eap, 133 | rsl=rsl, 134 | eleang=eleang, 135 | incang=incang, 136 | cal_s0hv=cal_s0hv, 137 | scall_hv=scall_hv, 138 | dn_vectors=dn_vectors, 139 | pg_amplitude=pg_amplitude, 140 | noise_po_co_fa=noise_po_co_fa, 141 | k_proc=k_proc, 142 | noise_ca_fa=noise_ca_fa, 143 | ipf=ipf, 144 | ) 145 | 146 | if __name__ == "__main__": 147 | main() 148 | -------------------------------------------------------------------------------- /training/convert_old_parameters.py: -------------------------------------------------------------------------------- 1 | """ Convert old JSON files to a new format (needed only once) """ 2 | 3 | import json 4 | 5 | param_types = { 6 | 'powerBalancingParameters': 'PB', 7 | 'noiseScalingParameters': 'NS', 8 | 'noiseVarianceParameters': 'NV', 9 | 'extraScalingParameters': 'ES', 10 | } 11 | 12 | swath2res = { 13 | 'IW': 'GRDH', 14 | 'EW': 'GRDM', 15 | } 16 | 17 | new_par = {} 18 | for platform in ['S1A', 'S1B']: 19 | ifile = f'denoising_parameters_{platform}.json' 20 | 21 | with open(ifile, 'rt') as f: 22 | old_par = json.load(f) 23 | 24 | for pol in old_par: 25 | for tp in old_par[pol]: 26 | param_type = param_types[tp] 27 | if param_type in ['NS', 'PB']: 28 | for swath in old_par[pol][tp]: 29 | for ipf in old_par[pol][tp][swath]: 30 | mode = swath[:2] 31 | res = swath2res[mode] 32 | new_key = f'{platform}_{mode}_{res}_{pol}_{param_type}_{ipf}' 33 | if new_key not in new_par: 34 | new_par[new_key] = {} 35 | new_par[new_key][swath] = old_par[pol][tp][swath][ipf] 36 | elif param_type in ['NV', 'ES']: 37 | ipf = '2.9' 38 | mode = 'EW' 39 | res = swath2res[mode] 40 | for swath in old_par[pol][tp]: 41 | new_key = f'{platform}_{mode}_{res}_{pol}_{param_type}_{ipf}' 42 | if new_key not in new_par: 43 | new_par[new_key] = {} 44 | new_par[new_key][swath] = old_par[pol][tp][swath] 45 | 46 | with open('../denoising_parameters_old.json', 'w') as f: 47 | json.dump(new_par, f) 48 | -------------------------------------------------------------------------------- /training/extra_scaling/analyze_experiment_extraScalingParameters.py: -------------------------------------------------------------------------------- 1 | import os, sys, glob, datetime 2 | import numpy as np 3 | from scipy.optimize import curve_fit 4 | 5 | 6 | platform = 'S1A' 7 | #platform = 'S1B' 8 | 9 | npzFilesAll = sorted(glob.glob('%s_EW_GRDM_1SDH_*_extraScaling.npz' % platform)) 10 | npzFiles = [] 11 | for li, npzFile in enumerate(npzFilesAll): 12 | startDateTime = datetime.datetime.strptime(npzFile.split('/')[-1][17:32], "%Y%m%dT%H%M%S") 13 | endDateTime = datetime.datetime.strptime(npzFile.split('/')[-1][33:48], "%Y%m%dT%H%M%S") 14 | if ( platform=='S1A' 15 | and startDateTime >= datetime.datetime(2018,3,13,1,0,42) 16 | and endDateTime <= datetime.datetime(2018,3,15,14,1,26) ): 17 | continue 18 | elif ( platform=='S1B' 19 | and startDateTime >= datetime.datetime(2018,3,13,2,43,5) 20 | and endDateTime <= datetime.datetime(2018,3,15,15,19,30) ): 21 | continue 22 | else: 23 | npzFiles.append(npzFile) 24 | # stack processed files 25 | npz = np.load(npzFiles[0]) 26 | snnrEdges = npz['snnrEdges'] 27 | nnsdEdges = npz['nnsdEdges'] 28 | dBsnnrEdges = npz['dBsnnrEdges'] 29 | esfEdges = npz['esfEdges'] 30 | windowSizes = npz['windowSizes'] 31 | nBins = len(snnrEdges)-1 32 | nnsdHist = {'EW%s' % li: np.zeros((len(windowSizes), nBins, nBins), dtype=np.int64) 33 | for li in range(1,6)} 34 | esfHist = {'EW%s' % li: np.zeros((len(windowSizes), nBins, nBins), dtype=np.int64) 35 | for li in range(1,6)} 36 | for li, npzFile in enumerate(npzFiles): 37 | sys.stdout.write('\rStacking ... %5d / %5d' % (li+1,len(npzFiles))) 38 | sys.stdout.flush() 39 | npz = np.load(npzFile) 40 | nnsdHistTmp = npz['noiseNormalizedStandardDeviationHistogram'].item() 41 | esfHistTmp = npz['extraScalingFactorHistogram'].item() 42 | for iSW in range(1,6): 43 | nnsdHist['EW%s' % iSW] += np.transpose(nnsdHistTmp['EW%s' % iSW], axes=(0,2,1)) 44 | esfHist['EW%s' % iSW] += np.transpose(esfHistTmp['EW%s' % iSW], axes=(0,2,1)) 45 | np.savez_compressed(platform+'_extraScaling.npz', windowSizes=windowSizes, 46 | snnrEdges=snnrEdges, nnsdEdges=nnsdEdges, nnsdHist=nnsdHist, 47 | dBsnnrEdges=dBsnnrEdges, esfEdges=esfEdges, esfHist=esfHist) 48 | 49 | # compute fit values 50 | npz = np.load(platform+'_extraScaling.npz') 51 | snnrEdges = npz['snnrEdges'] 52 | nnsdEdges = npz['nnsdEdges'] 53 | windowSizes = npz['windowSizes'] 54 | nBins = len(snnrEdges)-1 55 | fitValue = {'EW%s' % li:np.zeros(windowSizes.shape) for li in range(1,6)} 56 | fitRMSE = {'EW%s' % li:np.zeros(windowSizes.shape) for li in range(1,6)} 57 | modelCoeffs = {'EW%s' % li:[] for li in range(1,6)} 58 | modelFunctionString = "def modelFunction(x, a, b, c, d, g): return ( (a-d) / ( (1+( (x/c)** b )) **g) ) + d" 59 | exec(modelFunctionString) 60 | noiseVarianceParameters = {'EW%s' % li: {} for li in range(1,6)} 61 | for iSW in range(1,6): 62 | nnsdHist = npz['nnsdHist'].item()['EW%s' % iSW] 63 | for li, ws in enumerate(windowSizes): 64 | snnr = np.array(snnrEdges[:-1] + np.diff(snnrEdges)/2, ndmin=2) 65 | snnr = np.reshape(np.repeat(snnr, nBins, axis=0), nBins**2) 66 | nnsd = np.array(nnsdEdges[:-1] + np.diff(nnsdEdges)/2, ndmin=2) 67 | nnsd = np.reshape(np.repeat(nnsd, nBins, axis=1), nBins**2) 68 | weight = np.copy(nnsdHist[li]).reshape(nBins**2) 69 | snnr = snnr[weight!=0] 70 | nnsd = nnsd[weight!=0] 71 | weight = weight[weight!=0] 72 | fitMask = (snnr >= 1.0) * (snnr <= 2.0) 73 | x = snnr[fitMask] 74 | y = nnsd[fitMask] 75 | w = weight[fitMask]/snnr[fitMask] 76 | pfit = np.polyfit(x, y, w=w, deg=2, full=True) 77 | fitValue['EW%s' % iSW][li] = np.polyval(pfit[0], 1.0) 78 | fitRMSE['EW%s' % iSW][li] = np.sqrt(np.sum((w/w.sum())*(y-np.polyval(pfit[0], x))**2)) 79 | modelCoeffs['EW%s' % iSW], pcov = curve_fit( 80 | modelFunction, windowSizes, fitValue['EW%s' % iSW], sigma=fitRMSE['EW%s' % iSW], maxfev=100000) 81 | noiseVarianceParameters['EW%s' % iSW] = modelCoeffs['EW%s' % iSW][3] 82 | np.savez_compressed(platform+'_nnsd_results.npz', 83 | modelFunctionString=modelFunctionString, modelCoeffs=modelCoeffs, 84 | windowSizes=windowSizes, fitValue=fitValue, fitRMSE=fitRMSE) 85 | 86 | # compute fit values 87 | npz = np.load(platform+'_extraScaling.npz') 88 | dBsnnrEdges = npz['dBsnnrEdges'] 89 | esfEdges = npz['esfEdges'] 90 | windowSizes = npz['windowSizes'] 91 | nBins = len(dBsnnrEdges)-1 92 | extraScalingParameters = {'EW%s' % li:np.zeros(nBins) for li in range(1,6)} 93 | extraScalingParameters['SNNR'] = dBsnnrEdges[:-1] + np.diff(dBsnnrEdges)/2. 94 | fitValue = {'EW%s' % li:np.zeros((len(windowSizes),nBins)) for li in range(1,6)} 95 | fitRMSE = {'EW%s' % li:np.zeros(windowSizes.shape) for li in range(1,6)} 96 | modelCoeffs = {'EW%s' % li:[] for li in range(1,6)} 97 | def modelFunction(x, a, k, b, v, q, c): 98 | return a+( (k-a) / (c+q*np.exp(-b*x))**(1/v) ) 99 | for iSW in range(1,6): 100 | esfHist = npz['esfHist'].item()['EW%s' % iSW] 101 | for li, ws in enumerate(windowSizes): 102 | dBsnnr = np.array(dBsnnrEdges[:-1] + np.diff(dBsnnrEdges)/2, ndmin=2) 103 | dBsnnr = np.reshape(np.repeat(dBsnnr, nBins, axis=0), nBins**2) 104 | esf = np.array(esfEdges[:-1] + np.diff(esfEdges)/2, ndmin=2) 105 | esf = np.reshape(np.repeat(esf, nBins, axis=1), nBins**2) 106 | weight = np.copy(esfHist[li]).reshape(nBins**2) 107 | dBsnnr = dBsnnr[weight!=0] 108 | esf = esf[weight!=0] 109 | weight = weight[weight!=0] 110 | esf[dBsnnr>=3] = 1.0 111 | weight[dBsnnr<=-1] = 0 112 | fitMask = (weight >= 1) 113 | x = dBsnnr[fitMask] 114 | y = esf[fitMask] 115 | w = 1/weight[fitMask] 116 | popt, pcov = curve_fit(modelFunction, x, y, sigma=w, p0=[100,1,1,1,0.005,1], maxfev=10000) 117 | fittedCurve = modelFunction(extraScalingParameters['SNNR'] , *popt) 118 | fitValue['EW%s' % iSW][li] = fittedCurve - fittedCurve.min() + 1 119 | fitRMSE['EW%s' % iSW][li] = np.sqrt(np.sum((w/w.sum())*(y-modelFunction(x, *popt))**2)) 120 | extraScalingParameters['EW%s' % iSW] = np.sum( 121 | fitValue['EW%s' % iSW].T * (1/fitRMSE['EW%s' % iSW]) / sum(1/fitRMSE['EW%s' % iSW]),axis=1) 122 | np.savez_compressed(platform+'_esf_results.npz', extraScalingParameters=extraScalingParameters) 123 | -------------------------------------------------------------------------------- /training/extra_scaling/run_experiment_extraScalingParameters.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import glob 4 | import shutil 5 | from multiprocessing import Pool 6 | from s1denoise import Sentinel1Image 7 | 8 | # dir path to noise scaling training data 9 | inputPath = sys.argv[1] 10 | outputPath = sys.argv[2] 11 | 12 | def run_process(zipFile): 13 | outputFilename = zipFile.split('/')[-1].split('.')[0] + '_extraScaling.npz' 14 | print(outputFilename) 15 | 16 | if os.path.exists(outputPath + outputFilename): 17 | print('Processed data file already exists.') 18 | else: 19 | Sentinel1Image(zipFile).experiment_extraScaling('HV') 20 | shutil.move(outputFilename, outputPath) 21 | 22 | zipFilesAll = sorted(glob.glob('%s/S1?_EW_GRDM_1SDH_*.zip' % (inputPath)), reverse=True) 23 | 24 | zipFilesUnprocessed = [z for z in zipFilesAll 25 | if not os.path.exists(outputPath + os.path.basename(z).split('.')[0] + '_extraScaling.npz')] 26 | 27 | pool = Pool(2) 28 | pool.map(run_process, zipFilesUnprocessed) 29 | pool.close(); pool.terminate(); pool.join(); 30 | -------------------------------------------------------------------------------- /training/noise_scaling/Quick_start_Noise_scaling.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "# Modified: 25/10/2020 by DD\n", 10 | "#\n", 11 | "# In this quick start practical tutorial, you will learn how to get the noise scaling factors from\n", 12 | "# a number of S1 Level-1 GRD training files.\n", 13 | "# The processing comprises two stages. 1st is related to the method called 'experiment_noiseScaling'\n", 14 | "# of the 'Sentinel1Image' class to obtain statistics for each individual training file.\n", 15 | "# The aggregated statistics processing is the second stage of the method and implemnted as a\n", 16 | "# python script called 'analyze_experiment_noiseScalingParameters.py'.\n", 17 | "# In this tutorial we follow the mentioned implementation almost line by line." 18 | ] 19 | }, 20 | { 21 | "cell_type": "code", 22 | "execution_count": 2, 23 | "metadata": {}, 24 | "outputs": [], 25 | "source": [ 26 | "# Pre-requerments: It is assumed that you have downloaded and installed Sentinel1Denoised package:\n", 27 | "# https://github.com/nansencenter/sentinel1denoised/tree/master" 28 | ] 29 | }, 30 | { 31 | "cell_type": "code", 32 | "execution_count": 3, 33 | "metadata": {}, 34 | "outputs": [], 35 | "source": [ 36 | "########################################################################\n", 37 | "# Stage 1. Processing of individual training files (S1 Level-1 GRD) #\n", 38 | "########################################################################" 39 | ] 40 | }, 41 | { 42 | "cell_type": "code", 43 | "execution_count": 1, 44 | "metadata": {}, 45 | "outputs": [ 46 | { 47 | "name": "stderr", 48 | "output_type": "stream", 49 | "text": [ 50 | "05:08:08|40|nansat|_get_dataset_metadata|GDAL could not open /mnt/sverdrup-2/sat_auxdata/denoise/dolldrums/zip/S1A_IW_GRDH_1SDV_20200607T075151_20200607T075220_032908_03CFD7_9E14.zip, trying to read with Nansat mappers...\n" 51 | ] 52 | } 53 | ], 54 | "source": [ 55 | "# First you need to import Sentinel1Image class and open \n", 56 | "# a S1 Level1 GRD file (IW GRDH in our case, replace with yours)\n", 57 | "# Note: In our example we process the only one training file but in real data processing you need to use tens of files\n", 58 | "# in batch manner\n", 59 | "\n", 60 | "from s1denoise import Sentinel1Image\n", 61 | "import numpy as np\n", 62 | "from scipy.optimize import fminbound\n", 63 | "s1 = Sentinel1Image('/mnt/sverdrup-2/sat_auxdata/denoise/dolldrums/zip/S1A_IW_GRDH_1SDV_20200607T075151_20200607T075220_032908_03CFD7_9E14.zip')" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 8, 69 | "metadata": {}, 70 | "outputs": [], 71 | "source": [ 72 | "# We further go almost in line by line manner through the method called 'experiment_noiseScaling'" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 5, 78 | "metadata": {}, 79 | "outputs": [], 80 | "source": [ 81 | "# Clip size of side pixels, ~1km\n", 82 | "cPx = {'IW':100, 'EW':25}[s1.obsMode]\n", 83 | "# Define polarization of the data we want to process\n", 84 | "polarization = 'VH'" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 81, 90 | "metadata": {}, 91 | "outputs": [], 92 | "source": [ 93 | "# Call 'subswathIndexMap' method to get matrix with sub-swath numbers consistent with the data grid\n", 94 | "subswathIndexMap = s1.subswathIndexMap(polarization)" 95 | ] 96 | }, 97 | { 98 | "cell_type": "code", 99 | "execution_count": 82, 100 | "metadata": {}, 101 | "outputs": [ 102 | { 103 | "data": { 104 | "text/plain": [ 105 | "array([[1, 1, 1, ..., 0, 0, 0],\n", 106 | " [1, 1, 1, ..., 0, 0, 0],\n", 107 | " [1, 1, 1, ..., 0, 0, 0],\n", 108 | " ...,\n", 109 | " [1, 1, 1, ..., 3, 3, 3],\n", 110 | " [1, 1, 1, ..., 3, 3, 3],\n", 111 | " [1, 1, 1, ..., 3, 3, 3]], dtype=uint8)" 112 | ] 113 | }, 114 | "execution_count": 82, 115 | "metadata": {}, 116 | "output_type": "execute_result" 117 | } 118 | ], 119 | "source": [ 120 | "# Print out the matrix\n", 121 | "subswathIndexMap" 122 | ] 123 | }, 124 | { 125 | "cell_type": "code", 126 | "execution_count": 83, 127 | "metadata": {}, 128 | "outputs": [ 129 | { 130 | "data": { 131 | "text/plain": [ 132 | "" 133 | ] 134 | }, 135 | "execution_count": 83, 136 | "metadata": {}, 137 | "output_type": "execute_result" 138 | }, 139 | { 140 | "data": { 141 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAVsAAAD8CAYAAADZoQcPAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi40LCBodHRwOi8vbWF0cGxvdGxpYi5vcmcv7US4rQAAFDpJREFUeJzt3WusndWd3/Hvr3a4TmAIl8i1PcUEJxKg1hNbLlWaKBWdwUHV2OlAa14MVEVyQkGa9CIVmhdBlSyVaTNIqAqRUxAQpVwGwuAX0AkDo0GVHMgh43CNw+Eyw4kt3GQQsciYqZ1/X+x1oo29fck5x2ufc/r9SFt77f/zrOesxTY/P2ftZ/tJVSFJOrH+zrgHIEn/PzBsJakDw1aSOjBsJakDw1aSOjBsJamDeRO2STYk2ZVkMslN4x6PJM2lzIfrbJMsAX4E/BYwBXwPuLqqXh7rwCRpjsyXM9v1wGRVvV5VfwvcD2wc85gkac4sHfcAmuXAW0Ovp4B/eOhOSbYAWwCy9KS1p/z6eX1Gpw9Y+pP3xj0EqZt9vPOTqjp3tseZL2GbEbXD1jeqahuwDeC0c1fWJ373357ocWmEc7btGPcQpG7+tB76y7k4znxZRpgCVg69XgHsHtNYJGnOzZew/R6wOsmqJCcBm4HtYx6TJM2ZebGMUFUHktwI/AmwBLirql4a87Akac7Mi7AFqKrHgMfGPQ5JOhHmyzKCJC1qhq0kdTBvlhG0MHxo0//h3U0XjnsYAs68YnLcQ9CvwDNbSerAsJWkDgxbSerAsJWkDgxbSerAsJWkDrz0S1qAvrvmIf+ppk6WLJub43hmK0kdGLaS1IFhK0kdGLaS1IFhK0kdGLaS1IFhK0kdGLaS1IFhK0kdzDhsk6xM8mdJXknyUpLfb/Vbkvw4yc72uGKoz81JJpPsSnL5UH1tkhfattuTZHbTkqT5ZTZf1z0A/Puq+n6SDwPPJXmibbutqv7b8M5JLmJwi/KLgb8L/GmSj1fVQeAOYAvwXQY3fdwAPD6LsUnSvDLjM9uq2lNV32/tfcArwPKjdNkI3F9V71fVG8AksD7JMuCMqtpRVQXcC2ya6bgkaT6akzXbJOcDvwk800o3Jnk+yV1Jzmq15cBbQ92mWm15ax9aH/VztiSZSDJxYP97czF0Sepi1mGb5NeAh4EvVdXPGCwJfAxYA+wBvjq964judZT64cWqbVW1rqrWLT3l9NkOXZK6mVXYJvkQg6D9VlV9G6Cq3q6qg1X1C+AbwPq2+xSwcqj7Cgb/SNxUax9al6RFYzZXIwS4E3ilqv5wqD78rz9+HnixtbcDm5OcnGQVsBp4tqr2APuSXNqOeQ3w6EzHJUnz0WyuRvgU8HvAC0l2ttp/Aq5OsobBUsCbwBcAquqlJA8CLzO4kuGGdiUCwPXA3cCpDK5C8EoESYvKjMO2qv43o9dbHztKn63A1hH1CeCSmY5FkuY7v0EmSR0YtpLUgWErSR0YtpLUgWErSR0YtpLUgWErSR0YtpLUgWErSR0YtpLUgWErSR0YtpLUgWErSR0YtpLUgWErSR0YtpLUgWErSR0YtpLUgWErSR3M9lbmbyZ5IcnOJBOt9pEkTyR5tT2fNbT/zUkmk+xKcvlQfW07zmSS29tddiVp0ZiLM9t/UlVrqmpde30T8GRVrQaebK9JchGwGbgY2AB8LcmS1ucOYAuD25uvbtsladE4EcsIG4F7WvseYNNQ/f6qer+q3gAmgfVJlgFnVNWOqirg3qE+krQozDZsC/hOkueSbGm1j1bVHoD2fF6rLwfeGuo71WrLW/vQ+mGSbEkykWTiwP73Zjl0Sepn6Sz7f6qqdic5D3giyQ+Psu+oddg6Sv3wYtU2YBvAaeeuHLmPJM1Hszqzrard7Xkv8AiwHni7LQ3Qnve23aeAlUPdVwC7W33FiLokLRozDtskpyf58HQb+G3gRWA7cG3b7Vrg0dbeDmxOcnKSVQw+CHu2LTXsS3JpuwrhmqE+krQozGYZ4aPAI+0qraXA/6yq/5Xke8CDSa4D/gq4CqCqXkryIPAycAC4oaoOtmNdD9wNnAo83h6StGjMOGyr6nXgH4yo/xS47Ah9tgJbR9QngEtmOhZJmu/8BpkkdWDYSlIHhq0kdWDYSlIHhq0kdWDYSlIHhq0kdWDYSlIHhq0kdWDYSlIHhq0kdWDYSlIHhq0kdWDYSlIHhq0kdWDYSlIHhq0kdWDYSlIHhq0kdTCbu+t+IsnOocfPknwpyS1JfjxUv2Koz81JJpPsSnL5UH1tkhfattvbXXYladGYcdhW1a6qWlNVa4C1wM+BR9rm26a3VdVjAEkuAjYDFwMbgK8lWdL2vwPYwuD25qvbdklaNOZqGeEy4LWq+suj7LMRuL+q3q+qN4BJYH2SZcAZVbWjqgq4F9g0R+OSpHlhrsJ2M3Df0Osbkzyf5K4kZ7XacuCtoX2mWm15ax9aP0ySLUkmkkwc2P/eHA1dkk68WYdtkpOA3wH+qJXuAD4GrAH2AF+d3nVE9zpK/fBi1baqWldV65aecvqsxi1JPc3Fme3ngO9X1dsAVfV2VR2sql8A3wDWt/2mgJVD/VYAu1t9xYi6JC0acxG2VzO0hNDWYKd9HnixtbcDm5OcnGQVgw/Cnq2qPcC+JJe2qxCuAR6dg3FJ0ryxdDadk5wG/BbwhaHyHyRZw2Ap4M3pbVX1UpIHgZeBA8ANVXWw9bkeuBs4FXi8PSRp0ZhV2FbVz4GzD6n93lH23wpsHVGfAC6ZzVgkaT7zG2SS1IFhK0kdGLaS1IFhK0kdGLaS1IFhK0kdGLaS1IFhK0kdGLaS1IFhK0kdGLaS1IFhK0kdGLaS1IFhK0kdGLaS1IFhK0kdGLaS1IFhK0kdHDNsk9yVZG+SF4dqH0nyRJJX2/NZQ9tuTjKZZFeSy4fqa5O80Lbd3m7uSLsB5AOt/kyS8+d2ipI0fsdzZns3sOGQ2k3Ak1W1GniyvSbJRcBm4OLW52tJlrQ+dwBbGNxVd/XQMa8D3qmqC4HbgFtnOhlJmq+OGbZV9TTw14eUNwL3tPY9wKah+v1V9X5VvQFMAuvb7c3PqKodVVXAvYf0mT7WQ8Bl02e9krRYzHTN9qNVtQegPZ/X6suBt4b2m2q15a19aP0DfarqAPAuh9yxV5IWurn+gGzUGWkdpX60PocfPNmSZCLJxIH9781wiJLU30zD9u22NEB73tvqU8DKof1WALtbfcWI+gf6JFkKnMnhyxYAVNW2qlpXVeuWnnL6DIcuSf3NNGy3A9e29rXAo0P1ze0Kg1UMPgh7ti017EtyaVuPveaQPtPHuhJ4qq3rStKisfRYOyS5D/gscE6SKeArwH8BHkxyHfBXwFUAVfVSkgeBl4EDwA1VdbAd6noGVzacCjzeHgB3At9MMsngjHbznMxMkuaRY4ZtVV19hE2XHWH/rcDWEfUJ4JIR9f20sJakxcpvkElSB4atJHVg2EpSB4atJHVg2EpSB4atJHVg2EpSB4atJHVg2EpSB4atJHVg2EpSB4atJHVg2EpSB4atJHVg2EpSB4atJHVg2EpSB4atJHVg2EpSB8cM2yR3Jdmb5MWh2n9N8sMkzyd5JMmvt/r5Sf4myc72+PpQn7VJXkgymeT2dpdd2p14H2j1Z5KcP/fTlKTxOp4z27uBDYfUngAuqaq/D/wIuHlo22tVtaY9vjhUvwPYwuD25quHjnkd8E5VXQjcBtz6K89Ckua5Y4ZtVT3N4Bbjw7XvVNWB9vK7wIqjHSPJMuCMqtpRVQXcC2xqmzcC97T2Q8Bl02e9krRYzMWa7b8GHh96vSrJXyT58ySfbrXlwNTQPlOtNr3tLYAW4O8CZ4/6QUm2JJlIMnFg/3tzMHRJ6mPpbDon+TJwAPhWK+0BfqOqfppkLfDHSS4GRp2p1vRhjrLtg8WqbcA2gNPOXTlyH0maj2YctkmuBf4ZcFlbGqCq3gfeb+3nkrwGfJzBmezwUsMKYHdrTwErgakkS4EzOWTZQpIWuhktIyTZAPxH4Heq6udD9XOTLGntCxh8EPZ6Ve0B9iW5tK3HXgM82rptB65t7SuBp6bDW5IWi2Oe2Sa5D/gscE6SKeArDK4+OBl4on2W9d125cFngP+c5ABwEPhiVU2fpV7P4MqGUxms8U6v894JfDPJJIMz2s1zMjNJmkeOGbZVdfWI8p1H2Pdh4OEjbJsALhlR3w9cdaxxSNJC5jfIJKkDw1aSOjBsJakDw1aSOjBsJakDw1aSOjBsJakDw1aSOjBsJakDw1aSOjBsJakDw1aSOjBsJakDw1aSOjBsJakDw1aSOjBsJakDw1aSOjBsJamDY4ZtkruS7E3y4lDtliQ/TrKzPa4Y2nZzkskku5JcPlRfm+SFtu32dpddkpyc5IFWfybJ+XM7RUkav+M5s70b2DCifltVrWmPxwCSXMTg7rgXtz5fm761OXAHsIXB7c1XDx3zOuCdqroQuA24dYZzkaR565hhW1VPM7jF+PHYCNxfVe9X1RvAJLA+yTLgjKraUVUF3AtsGupzT2s/BFw2fdYrSYvFbNZsb0zyfFtmOKvVlgNvDe0z1WrLW/vQ+gf6VNUB4F3g7FE/MMmWJBNJJg7sf28WQ5ekvmYatncAHwPWAHuAr7b6qDPSOkr9aH0OL1Ztq6p1VbVu6Smn/2ojlqQxmlHYVtXbVXWwqn4BfANY3zZNASuHdl0B7G71FSPqH+iTZClwJse/bCFJC8KMwratwU77PDB9pcJ2YHO7wmAVgw/Cnq2qPcC+JJe29dhrgEeH+lzb2lcCT7V1XUlaNJYea4ck9wGfBc5JMgV8BfhskjUMft1/E/gCQFW9lORB4GXgAHBDVR1sh7qewZUNpwKPtwfAncA3k0wyOKPdPBcTk6T55JhhW1VXjyjfeZT9twJbR9QngEtG1PcDVx1rHJK0kPkNMknqwLCVpA4MW0nqwLCVpA4MW0nqwLCVpA4MW0nqwLCVpA4MW0nqwLCVpA4MW0nqwLCVpA4MW0nqwLCVpA4MW0nqwLCVpA4MW0nqwLCVpA4MW0nq4Jhhm+SuJHuTvDhUeyDJzvZ4M8nOVj8/yd8Mbfv6UJ+1SV5IMpnk9naXXdqdeB9o9WeSnD/305Sk8TqeM9u7gQ3Dhar6l1W1pqrWAA8D3x7a/Nr0tqr64lD9DmALg9ubrx465nXAO1V1IXAbcOuMZiJJ89gxw7aqnmZwi/HDtLPTfwHcd7RjJFkGnFFVO6qqgHuBTW3zRuCe1n4IuGz6rFeSFovZrtl+Gni7ql4dqq1K8hdJ/jzJp1ttOTA1tM9Uq01vewugqg4A7wJnj/phSbYkmUgycWD/e7McuiT1s3SW/a/mg2e1e4DfqKqfJlkL/HGSi4FRZ6rVno+27YPFqm3ANoDTzl05ch9Jmo9mHLZJlgL/HFg7Xauq94H3W/u5JK8BH2dwJrtiqPsKYHdrTwErgal2zDM5wrKFJC1Us1lG+KfAD6vql8sDSc5NsqS1L2DwQdjrVbUH2Jfk0rYeew3waOu2Hbi2ta8EnmrrupK0aBzPpV/3ATuATySZSnJd27SZwz8Y+wzwfJIfMPiw64tVNX2Wej3wP4BJ4DXg8Va/Ezg7ySTw74CbZjEfSZqXjrmMUFVXH6H+r0bUHmZwKdio/SeAS0bU9wNXHWsckrSQ+Q0ySerAsJWkDgxbSerAsJWkDgxbSerAsJWkDgxbSerAsJWkDgxbSerAsJWkDgxbSerAsJWkDgxbSerAsJWkDgxbSerAsJWkDgxbSeogC/V2X0n2AbvGPY4T6BzgJ+MexAmymOcGzm8hGzW3v1dV5872wLO9lfk47aqqdeMexImSZGKxzm8xzw2c30J2IufmMoIkdWDYSlIHCzlst417ACfYYp7fYp4bOL+F7ITNbcF+QCZJC8lCPrOVpAXDsJWkDhZk2CbZkGRXkskkN417PMcryZtJXkiyM8lEq30kyRNJXm3PZw3tf3Ob464klw/V17bjTCa5PUnGNJ+7kuxN8uJQbc7mk+TkJA+0+jNJzh/z3G5J8uP2/u1McsUCndvKJH+W5JUkLyX5/VZfLO/dkeY33vevqhbUA1gCvAZcAJwE/AC4aNzjOs6xvwmcc0jtD4CbWvsm4NbWvqjN7WRgVZvzkrbtWeAfAQEeBz43pvl8Bvgk8OKJmA/wb4Cvt/Zm4IExz+0W4D+M2HehzW0Z8MnW/jDwozaHxfLeHWl+Y33/FuKZ7Xpgsqper6q/Be4HNo55TLOxEbinte8BNg3V76+q96vqDWASWJ9kGXBGVe2owTt971CfrqrqaeCvDynP5XyGj/UQcFmvs/gjzO1IFtrc9lTV91t7H/AKsJzF894daX5H0mV+CzFslwNvDb2e4uj/IeeTAr6T5LkkW1rto1W1BwZ/SIDzWv1I81ze2ofW54u5nM8v+1TVAeBd4OwTNvLjc2OS59syw/Sv2Qt2bu3X398EnmERvneHzA/G+P4txLAd9bfHQrl+7VNV9Ungc8ANST5zlH2PNM+FOv+ZzGe+zfUO4GPAGmAP8NVWX5BzS/JrwMPAl6rqZ0fbdURtIc5vrO/fQgzbKWDl0OsVwO4xjeVXUlW72/Ne4BEGSyJvt19XaM972+5HmudUax9any/mcj6/7JNkKXAmx/+r/Zyrqrer6mBV/QL4BoP3Dxbg3JJ8iEEQfauqvt3Ki+a9GzW/cb9/CzFsvwesTrIqyUkMFqe3j3lMx5Tk9CQfnm4Dvw28yGDs17bdrgUebe3twOb2qecqYDXwbPv1bl+SS9sa0TVDfeaDuZzP8LGuBJ5qa2djMR1EzecZvH+wwObWxnIn8EpV/eHQpkXx3h1pfmN//3p9QjiXD+AKBp8wvgZ8edzjOc4xX8DgE88fAC9Nj5vBOs+TwKvt+SNDfb7c5riLoSsOgHXtD8prwH+nfRNwDHO6j8GvY/+Xwd/0183lfIBTgD9i8IHFs8AFY57bN4EXgOfb/2zLFujc/jGDX3mfB3a2xxWL6L070vzG+v75dV1J6mAhLiNI0oJj2EpSB4atJHVg2EpSB4atJHVg2EpSB4atJHXw/wBvlZlvdc5BhQAAAABJRU5ErkJggg==\n", 142 | "text/plain": [ 143 | "
" 144 | ] 145 | }, 146 | "metadata": { 147 | "needs_background": "light" 148 | }, 149 | "output_type": "display_data" 150 | } 151 | ], 152 | "source": [ 153 | "# Lets visualize the sub-swath numbers\n", 154 | "# Color corresponds to different sub-swath. In our case:\n", 155 | "# blue - 1, green - 2, yellow - 3, black - no data\n", 156 | "import matplotlib.pyplot as plt\n", 157 | "plt.clf()\n", 158 | "plt.imshow(subswathIndexMap)" 159 | ] 160 | }, 161 | { 162 | "cell_type": "code", 163 | "execution_count": 8, 164 | "metadata": {}, 165 | "outputs": [], 166 | "source": [ 167 | "# To mask areas over land, we call 'landmask'\n", 168 | "landmask = s1.landmask(skipGCP=4)" 169 | ] 170 | }, 171 | { 172 | "cell_type": "code", 173 | "execution_count": 10, 174 | "metadata": {}, 175 | "outputs": [], 176 | "source": [ 177 | "# Get matrices of calibrated raw sigma zero and NESZ from ESA-provided annotaion files\n", 178 | "sigma0 = s1.rawSigma0Map(polarization)\n", 179 | "noiseEquivalentSigma0 = s1.rawNoiseEquivalentSigma0Map(polarization, lutShift=True) " 180 | ] 181 | }, 182 | { 183 | "cell_type": "code", 184 | "execution_count": 11, 185 | "metadata": {}, 186 | "outputs": [], 187 | "source": [ 188 | "# Get the line indexes where we have data for the each element in range ditrection\n", 189 | "import numpy as np\n", 190 | "validLineIndices = np.argwhere(np.sum(subswathIndexMap!=0,axis=1)==s1.shape()[1])" 191 | ] 192 | }, 193 | { 194 | "cell_type": "code", 195 | "execution_count": 12, 196 | "metadata": {}, 197 | "outputs": [], 198 | "source": [ 199 | "# Define number of lines to averge (block height), in our case 1000 px\n", 200 | "# and calculate the block bounds\n", 201 | "numberOfLinesToAverage = 1000\n", 202 | "blockBounds = np.arange(validLineIndices.min(), validLineIndices.max(),\n", 203 | " numberOfLinesToAverage, dtype='uint')" 204 | ] 205 | }, 206 | { 207 | "cell_type": "code", 208 | "execution_count": 13, 209 | "metadata": {}, 210 | "outputs": [ 211 | { 212 | "data": { 213 | "text/plain": [ 214 | "array([ 1367, 2367, 3367, 4367, 5367, 6367, 7367, 8367, 9367,\n", 215 | " 10367, 11367, 12367, 13367, 14367, 15367, 16367, 17367, 18367,\n", 216 | " 19367], dtype=uint64)" 217 | ] 218 | }, 219 | "execution_count": 13, 220 | "metadata": {}, 221 | "output_type": "execute_result" 222 | } 223 | ], 224 | "source": [ 225 | "# Print out block bounds coordinates (pixel indexes)\n", 226 | "blockBounds" 227 | ] 228 | }, 229 | { 230 | "cell_type": "code", 231 | "execution_count": 84, 232 | "metadata": {}, 233 | "outputs": [], 234 | "source": [ 235 | "# Prepare a dictonary for results for each sub-block in each sub-swath\n", 236 | "# sigma0 is a vector that is mean range profile\n", 237 | "# noiseEquivalentSigma0 is a vector with ESA-provided mean range noise profile\n", 238 | "# scalingFactor is a value with intermediate noise scaling factor\n", 239 | "# correlationCoefficient is a value with correlation coefficient between raw sigma0 and scaled nosie\n", 240 | "# fitResidual is a value with error of fitting of the seclected scaling factor (K)\n", 241 | "results = { '%s%s' % (s1.obsMode, li):\n", 242 | " { 'sigma0':[],\n", 243 | " 'noiseEquivalentSigma0':[],\n", 244 | " 'scalingFactor':[],\n", 245 | " 'correlationCoefficient':[],\n", 246 | " 'fitResidual':[] }\n", 247 | " for li in range(1, {'IW':3, 'EW':5}[s1.obsMode]+1) }" 248 | ] 249 | }, 250 | { 251 | "cell_type": "code", 252 | "execution_count": 85, 253 | "metadata": {}, 254 | "outputs": [], 255 | "source": [ 256 | "# Loop over blocks\n", 257 | "for iBlk in range(len(blockBounds)-1):\n", 258 | " # Check if there is no pixels over land areas\n", 259 | " if landmask[blockBounds[iBlk]:blockBounds[iBlk+1]].sum() != 0:\n", 260 | " continue\n", 261 | " \n", 262 | " # Slicing 2D arrays for each block\n", 263 | " # sigma0\n", 264 | " blockS0 = sigma0[blockBounds[iBlk]:blockBounds[iBlk+1],:] \n", 265 | " # raw ESA noise\n", 266 | " blockN0 = noiseEquivalentSigma0[blockBounds[iBlk]:blockBounds[iBlk+1],:]\n", 267 | " # Sub-swath indices for the block\n", 268 | " blockSWI = subswathIndexMap[blockBounds[iBlk]:blockBounds[iBlk+1],:]\n", 269 | " \n", 270 | " # An arbitrary empirical adjustment.\n", 271 | " # When the number of valid range pixels is too small, it is hard to get reliable estimation.\n", 272 | " # By allowing the use of some pixels with negative values, the number of range pixels to be used \n", 273 | " # for fitting increases.\n", 274 | " # In short, it can be any value but we set it as 0.5 for no special reason.\n", 275 | " pixelValidity = (np.nanmean(blockS0 - blockN0 * 0.5, axis=0) > 0) \n", 276 | "\n", 277 | " fitCoefficients = []\n", 278 | " \n", 279 | " # Loop over sub-blocks in sub-swaths\n", 280 | " for iSW in range(1, {'IW': 3, 'EW': 5}[s1.obsMode]+1):\n", 281 | " subswathID = '%s%s' % (s1.obsMode, iSW)\n", 282 | " # Get valid pixel indices based on 'pixelValidity'\n", 283 | " pixelIndex = np.nonzero((blockSWI==iSW).sum(axis=0) * pixelValidity)[0][cPx:-cPx]\n", 284 | " if pixelIndex.sum()==0:\n", 285 | " continue\n", 286 | " \n", 287 | " # Compute mean range profiles for sub-block by averaging in azimuth direction\n", 288 | " meanS0 = np.nanmean(np.where(blockSWI==iSW, blockS0, np.nan), axis=0)[pixelIndex]\n", 289 | " meanN0 = np.nanmean(np.where(blockSWI==iSW, blockN0, np.nan), axis=0)[pixelIndex]\n", 290 | " \n", 291 | " # Calculate weight that is proportional to gradient of sigma0 that takes account of sigma0 varying\n", 292 | " weight = abs(np.gradient(meanN0))\n", 293 | " # Normilize the weight\n", 294 | " weight = weight / weight.sum() * np.sqrt(len(weight))\n", 295 | " \n", 296 | " # Polyfit is used only to return error (second return param) when fitting func:\n", 297 | " # s0-k*no = f(A*x + B). Where:\n", 298 | " # s0 - sigma0\n", 299 | " # n0 - ESA-provided thermal noise\n", 300 | " # k - noise scaling (to be identified at later stage of fitting)\n", 301 | " # x - pixel index\n", 302 | " # A, B - just some polynom coeffs that are not used\n", 303 | " errFunc = lambda k,x,s0,n0,w: np.polyfit(x,s0-k*n0,w=w,deg=1,full=True)[1].item()\n", 304 | " \n", 305 | " # Now with polynom fitting function in place, K (the noise scaling coefficient)\n", 306 | " # is fitted iteratively using 'fminbound' method from NumPy for the interval of 0 to 3dB\n", 307 | " scalingFactor = fminbound(errFunc, 0, 3,\n", 308 | " args=(pixelIndex,meanS0,meanN0,weight), disp=False).item()\n", 309 | " # Value of correlation coefficient between sigma0 and scaled noise\n", 310 | " correlationCoefficient = np.corrcoef(meanS0, scalingFactor * meanN0)[0,1]\n", 311 | " # Value of error of the fitting of the selected scaling factor (K)\n", 312 | " fitResidual = np.polyfit(pixelIndex, meanS0 - scalingFactor * meanN0,\n", 313 | " w=weight, deg=1, full=True)[1].item()\n", 314 | "\n", 315 | " # Append results to the list\n", 316 | " results[subswathID]['sigma0'].append(meanS0)\n", 317 | " results[subswathID]['noiseEquivalentSigma0'].append(meanN0)\n", 318 | " results[subswathID]['scalingFactor'].append(scalingFactor)\n", 319 | " results[subswathID]['correlationCoefficient'].append(correlationCoefficient)\n", 320 | " results[subswathID]['fitResidual'].append(fitResidual)\n", 321 | " \n", 322 | "# Save the results for individual file in NPZ format\n", 323 | "np.savez(s1.name.split('.')[0] + '_noiseScaling.npz', **results)\n", 324 | "\n", 325 | "# At this point we obtained statistics for many files and ready to the 2nd stage that is\n", 326 | "# aggregated statistics processing" 327 | ] 328 | }, 329 | { 330 | "cell_type": "code", 331 | "execution_count": null, 332 | "metadata": {}, 333 | "outputs": [], 334 | "source": [] 335 | }, 336 | { 337 | "cell_type": "code", 338 | "execution_count": 86, 339 | "metadata": {}, 340 | "outputs": [], 341 | "source": [ 342 | "################################################\n", 343 | "# Stage 2. Processing of aggregated statistics #\n", 344 | "################################################" 345 | ] 346 | }, 347 | { 348 | "cell_type": "code", 349 | "execution_count": 87, 350 | "metadata": {}, 351 | "outputs": [], 352 | "source": [ 353 | "# Once we have statistics for the training files we may start stage 2 to get final results on the noise scaling" 354 | ] 355 | }, 356 | { 357 | "cell_type": "code", 358 | "execution_count": 89, 359 | "metadata": {}, 360 | "outputs": [], 361 | "source": [ 362 | "# Initialize empty lists for aggregated results for each sub-swath from each npz file\n", 363 | "powerDifference = {'%s%s' % (s1.obsMode, li): [] for li in range(1, ({'IW':3, 'EW':5}[s1.obsMode]+1))}\n", 364 | "scalingFactor = {'%s%s' % (s1.obsMode, li): [] for li in range(1, ({'IW':3, 'EW':5}[s1.obsMode]+1))}\n", 365 | "correlationCoefficient = {'%s%s' % (s1.obsMode, li): [] for li in range(1, ({'IW':3, 'EW':5}[s1.obsMode]+1))}\n", 366 | "fitResidual = {'%s%s' % (s1.obsMode, li): [] for li in range(1, ({'IW':3, 'EW':5}[s1.obsMode]+1))}" 367 | ] 368 | }, 369 | { 370 | "cell_type": "code", 371 | "execution_count": 90, 372 | "metadata": {}, 373 | "outputs": [ 374 | { 375 | "name": "stdout", 376 | "output_type": "stream", 377 | "text": [ 378 | "importing S1A_IW_GRDH_1SDV_20200607T075151_20200607T075220_032908_03CFD7_9E14_noiseScaling.npz\n" 379 | ] 380 | } 381 | ], 382 | "source": [ 383 | "# Get the list of npz files with individual statistics\n", 384 | "import glob\n", 385 | "npzFiles = glob.glob('*noiseScaling*.npz')\n", 386 | "\n", 387 | "# Loop over the files\n", 388 | "for npzFile in npzFiles:\n", 389 | " print('importing %s' % npzFile)\n", 390 | " npz = np.load(npzFile)\n", 391 | " npz.allow_pickle = True\n", 392 | " \n", 393 | " for iSW in range(1, ({'IW': 3, 'EW': 5}[s1.obsMode])+1): \n", 394 | " # Get number of sub-blocks\n", 395 | " numberOfSubblocks = np.unique([\n", 396 | " len(npz['%s%s' % (s1.obsMode,iSW)].item()[key])\n", 397 | " for key in ['scalingFactor', 'correlationCoefficient', 'fitResidual']])\n", 398 | " \n", 399 | " # Check if the number of sub-blocks is consistent for all parameters\n", 400 | " if numberOfSubblocks.size != 1:\n", 401 | " print('*** numberOfSubblocks are not consistent for all estimations.')\n", 402 | " continue\n", 403 | " # Unpack the number of sub-blocks\n", 404 | " numberOfSubblocks = numberOfSubblocks.item()\n", 405 | " \n", 406 | " # Calculate a value of intermediate sigma0 value for each sub-block\n", 407 | " powerDifference['%s%s' % (s1.obsMode,iSW)].append([\n", 408 | " np.nanmean(10*np.log10(npz['%s%s' % (s1.obsMode,iSW)].item()['sigma0'][li]))\n", 409 | " - np.nanmean(10*np.log10(npz['%s%s' % (s1.obsMode,iSW)].item()['noiseEquivalentSigma0'][li]))\n", 410 | " for li in range(numberOfSubblocks) ])\n", 411 | " \n", 412 | " # Collect a set of values of scaling factors, correlation coefficients and residuals for each sub-block\n", 413 | " scalingFactor['%s%s' % (s1.obsMode,iSW)].append(npz['%s%s' % (s1.obsMode,iSW)].item()['scalingFactor'])\n", 414 | " correlationCoefficient['%s%s' % (s1.obsMode,iSW)].append(npz['%s%s' % (s1.obsMode,iSW)].item()['correlationCoefficient'])\n", 415 | " fitResidual['%s%s' % (s1.obsMode,iSW)].append(npz['%s%s' % (s1.obsMode,iSW)].item()['fitResidual'])" 416 | ] 417 | }, 418 | { 419 | "cell_type": "code", 420 | "execution_count": null, 421 | "metadata": {}, 422 | "outputs": [], 423 | "source": [] 424 | }, 425 | { 426 | "cell_type": "code", 427 | "execution_count": 78, 428 | "metadata": {}, 429 | "outputs": [], 430 | "source": [ 431 | "# Initialize lists for noise scaling parameters and their confidence intervals for final results\n", 432 | "noiseScalingParameters = {'%s%s' % (s1.obsMode, li): {} for li in range(1, ({'IW':3, 'EW':5}[s1.obsMode]+1))}\n", 433 | "noiseScalingParametersRMSE = {'%s%s' % (s1.obsMode, li): {} for li in range(1, ({'IW':3, 'EW':5}[s1.obsMode]+1))}\n", 434 | "\n", 435 | "# Loop over sub-swaths to obtain final noise scaling factors for each sub-swath\n", 436 | "for iSW in range(1, ({'IW': 3, 'EW': 5}[s1.obsMode])+1): \n", 437 | " # Open agregated lists of parameters as NumPy vector for sub-swath\n", 438 | " # Vector of intermediate sigma0\n", 439 | " pd = np.hstack(powerDifference['%s%s' % (s1.obsMode,iSW)])\n", 440 | " # Vector of of noise scaling factor\n", 441 | " sf = np.hstack(scalingFactor['%s%s' % (s1.obsMode,iSW)])\n", 442 | " # vector of correaltion coefficient between raw sigma0 and scaled nosie\n", 443 | " cc = np.hstack(correlationCoefficient['%s%s' % (s1.obsMode,iSW)])\n", 444 | " # Vector of errors of fitting of the scaling factor (K)\n", 445 | " fr = np.hstack(fitResidual['%s%s' % (s1.obsMode,iSW)])\n", 446 | "\n", 447 | " # Calculate vector with weights for fitting: higher weights for high correlation and low RMSE from K-fitting\n", 448 | " w = cc / fr\n", 449 | " \n", 450 | " # Note: Fitting of K to powerDifference with degree=0\n", 451 | " # Here we find optimal value of K (just one value since degree of fitted polynom is 0).\n", 452 | " # That optimal value corresponds to:\n", 453 | " # * high density of powerDifference values: This high density appears where powerDifference\n", 454 | " # is low. I.e. where signal is low (low wind conditions).\n", 455 | " # * high weights: where correlation is high and rmse is low\n", 456 | " # y using this fitting we avoid neccesity to choose scenes with low wind manualy.\n", 457 | " fitResults = np.polyfit(pd, sf, deg=0, w=w)\n", 458 | "\n", 459 | " # Results\n", 460 | " # Noise scaling coefficient\n", 461 | " noiseScalingParameters['%s%s' % (s1.obsMode,iSW)] = fitResults[0]\n", 462 | " # Confidence interval\n", 463 | " noiseScalingParametersRMSE['%s%s' % (s1.obsMode,iSW)] = np.sqrt(np.sum((fitResults[0]-sf)**2 * w) / np.sum(w))" 464 | ] 465 | }, 466 | { 467 | "cell_type": "code", 468 | "execution_count": 99, 469 | "metadata": {}, 470 | "outputs": [ 471 | { 472 | "name": "stdout", 473 | "output_type": "stream", 474 | "text": [ 475 | "Noise scaling parameters for each sub-swath:\n", 476 | "{'IW1': 1.0525003487515774, 'IW2': 1.003359997763131, 'IW3': 1.0945965379679081}\n", 477 | "\n", 478 | "Confidence intervals:\n", 479 | "{'IW1': 0.03060775683092379, 'IW2': 0.00967053603311147, 'IW3': 0.009314693037954078}\n" 480 | ] 481 | } 482 | ], 483 | "source": [ 484 | "# Now we obtained noise scaling factors for each sub-swath as well as\n", 485 | "# their confident intervals and may print it out\n", 486 | "\n", 487 | "print('Noise scaling parameters for each sub-swath:\\n%s' % noiseScalingParameters)\n", 488 | "print('\\nConfidence intervals:\\n%s' % noiseScalingParametersRMSE)" 489 | ] 490 | }, 491 | { 492 | "cell_type": "code", 493 | "execution_count": null, 494 | "metadata": {}, 495 | "outputs": [], 496 | "source": [ 497 | "\n" 498 | ] 499 | } 500 | ], 501 | "metadata": { 502 | "kernelspec": { 503 | "display_name": "Python 3", 504 | "language": "python", 505 | "name": "python3" 506 | }, 507 | "language_info": { 508 | "codemirror_mode": { 509 | "name": "ipython", 510 | "version": 3 511 | }, 512 | "file_extension": ".py", 513 | "mimetype": "text/x-python", 514 | "name": "python", 515 | "nbconvert_exporter": "python", 516 | "pygments_lexer": "ipython3", 517 | "version": "3.7.6" 518 | } 519 | }, 520 | "nbformat": 4, 521 | "nbformat_minor": 4 522 | } 523 | -------------------------------------------------------------------------------- /training/noise_scaling/README.md: -------------------------------------------------------------------------------- 1 | The directory contains scripts for the noise scaling training. It is highly reccomended that the 2 | training should be performed over tens of Sentinel-1 Level 1 GRD files. Due to the antenna gain 3 | differences of S-1A and S-1B, the training should be performed for the platforms separately. 4 | 5 | ## Step 1. Individual file processing 6 | 7 | See ../run_experiment.py 8 | 9 | 10 | ## Step 2. Statistical aggregation 11 | 12 | Once you have statistics for many files you can obtain statistically aggregated noise scaling 13 | factors for each sub-swath by scrpit called 'analyze_experiment_noiseScalingParameters.py': 14 | 15 | ``` 16 | python analyze_experiment_noiseScalingParameters.py S1A IW GRDH 1SDV /path/to/npz /path/to/output/file 17 | ``` 18 | 19 | where the arguments:\ 20 | 1st - platform (S1A/S1B)\ 21 | 2nd - mode (EW/IW)\ 22 | 3d - polarization mode (1SDH/1SDV)\ 23 | 4th - path to input training npz files from the first step\ 24 | 5th - path to output file 25 | 26 | All steps are described in a Python's notebook in line by line manner: 27 | 28 | ```python 29 | Quick_start_Noise_scaling.ipynb 30 | ``` 31 | -------------------------------------------------------------------------------- /training/noise_scaling/analyze_experiment_noiseScalingParameters.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """ Process aggregated statistics from individual npz files to obtain final results in noise scaling stage 3 | 4 | run example: 5 | python analyze_experiment_noiseScalingParameters.py S1A IW GRDH 1SDV /path/to/npz/files /out/path 6 | """ 7 | import datetime 8 | import glob 9 | import os 10 | import sys 11 | 12 | import numpy as np 13 | 14 | from s1denoise.utils import AnalyzeExperiment 15 | 16 | 17 | class AnalyzeNoseScaling(AnalyzeExperiment): 18 | file_suffix = 'noiseScaling_new' 19 | 20 | def process(self): 21 | # stack processed files 22 | IPFversion = {'%s' % li: [] for li in self.swath_names} 23 | powerDifference = {'%s' % li: [] for li in self.swath_names} 24 | scalingFactor = {'%s' % li: [] for li in self.swath_names} 25 | correlationCoefficient = {'%s' % li: [] for li in self.swath_names} 26 | fitResidual = {'%s' % li: [] for li in self.swath_names} 27 | acqDate = {'%s' % li: [] for li in self.swath_names} 28 | npz_files_per_block = [] 29 | for npzFile in self.npzFiles: 30 | print('importing %s' % npzFile) 31 | npz = np.load(npzFile) 32 | npz.allow_pickle=True 33 | 34 | for iSW in self.swath_names: 35 | numberOfSubblocks = np.unique([ 36 | len(npz[iSW].item()[key]) 37 | for key in ['scalingFactor', 'correlationCoefficient', 'fitResidual'] ]) 38 | if numberOfSubblocks.size != 1: 39 | print('*** numberOfSubblocks are not consistent for all estimations.') 40 | continue 41 | numberOfSubblocks = numberOfSubblocks.item() 42 | powerDifference[iSW].append([ 43 | np.nanmean(10*np.log10(npz[iSW].item()['sigma0'][li])) 44 | - np.nanmean(10*np.log10(npz[iSW].item()['noiseEquivalentSigma0'][li])) 45 | for li in range(numberOfSubblocks) ]) 46 | scalingFactor[iSW].append(npz[iSW].item()['scalingFactor']) 47 | correlationCoefficient[iSW].append(npz[iSW].item()['correlationCoefficient']) 48 | fitResidual[iSW].append(npz[iSW].item()['fitResidual']) 49 | dummy = [ IPFversion[iSW].append(npz['IPFversion']) for li in range(numberOfSubblocks)] 50 | dummy = [ acqDate[iSW].append(datetime.datetime.strptime(os.path.basename(npzFile).split('_')[4], '%Y%m%dT%H%M%S')) 51 | for li in range(numberOfSubblocks) ] 52 | for li in range(numberOfSubblocks): 53 | npz_files_per_block.append(os.path.basename(npzFile)) 54 | 55 | # compute fit values 56 | noiseScalingParameters = {'%s' % li: {} for li in self.swath_names} 57 | noiseScalingParametersRMSE = {'%s' % li: {} for li in self.swath_names} 58 | ns_params = {} 59 | ns_key = f'{self.args.platform}_{self.args.mode}_{self.args.res}_{self.polarisation}_NS' 60 | for IPFv in np.arange(2.4, 4.0, 0.1): 61 | ipf_str = '%.1f' % IPFv 62 | ipf_key = f'{ns_key}_{ipf_str}' 63 | for iSW in self.swath_names: 64 | if IPFv==2.7 and self.args.platform=='S1B': 65 | valid = np.logical_and(np.array(IPFversion['%s' % iSW])==2.72, 66 | np.array(acqDate['%s' % iSW]) < datetime.datetime(2017,1,16,13,42,34) ) 67 | else: 68 | valid = np.isclose((np.trunc(np.array(IPFversion[iSW])*10)/10.), IPFv, atol=0.01) 69 | if valid.sum()==0: 70 | continue 71 | 72 | pd = np.hstack(powerDifference[iSW])[valid] 73 | sf = np.hstack(scalingFactor[iSW])[valid] 74 | cc = np.hstack(correlationCoefficient[iSW])[valid] 75 | fr = np.hstack(fitResidual[iSW])[valid] 76 | 77 | # weight for fitting: higher weights for high correlation and low RMSE from K-fitting 78 | w = cc / fr 79 | # VERY COMPLEX: fitting of K to powerDifference with degree=0 80 | # Here we find optimal value of K (just one value since degree of fitted polynom is 0). 81 | # That optimal value corresponds to: 82 | # * high density of powerDifference values: This high density appears where powerDifference 83 | # is low. I.e. where signal is low (low wind conditions). 84 | # * high weights: where correlation is high and rmse is low 85 | # y using this fitting we avoid neccesity to choose scenes with low wind manualy. 86 | fitResults = np.polyfit(pd, sf, deg=0, w=w) 87 | 88 | # Results 89 | if ipf_key not in ns_params: 90 | ns_params[ipf_key] = {'mean': {}, 'rmse': {}} 91 | ns_params[ipf_key]['mean'][iSW] = fitResults[0] 92 | ns_params[ipf_key]['rmse'][iSW] = np.sqrt(np.sum((fitResults[0]-sf)**2 * w) / np.sum(w)) 93 | try: 94 | valid_npz_files = list(set([npz_files_per_block[i] for i in np.where(valid)[0]])) 95 | ns_params[ipf_key]['files'] = valid_npz_files 96 | except: 97 | pass 98 | 99 | noiseScalingParameters[iSW]['%.1f' % IPFv] = fitResults[0] 100 | noiseScalingParametersRMSE[iSW]['%.1f' % IPFv] = np.sqrt(np.sum((fitResults[0]-sf)**2 * w) / np.sum(w)) 101 | 102 | self.save(ns_params) 103 | 104 | if __name__ == "__main__": 105 | ans = AnalyzeNoseScaling() 106 | ans.process() 107 | -------------------------------------------------------------------------------- /training/power_balancing/README.md: -------------------------------------------------------------------------------- 1 | The directory contains scripts for the power balancing training. It is highly recommended that the 2 | training should be performed over tens of Sentinel-1 Level 1 GRD files. Due to the antenna gain 3 | differences of S-1A and S-1B, the training should be performed for the platforms separately. 4 | 5 | ## Step 1. Individual file processing 6 | 7 | See ../run_experiment.py 8 | 9 | 10 | ## Step 2. Statistical aggregation 11 | 12 | Once you have statistics for many files you can obtain statistically aggregated power balancing 13 | factors for each sub-swath by scrpit called 'analyze_experiment_powerBalancingParameters.py': 14 | 15 | ``` 16 | python analyze_experiment_powerBalancingParameters.py S1A IW GRDH 1SDV /path/to/npz /path/to/output/file 17 | ``` 18 | 19 | where the arguments:\ 20 | 1st - platform (S1A/S1B)\ 21 | 2nd - mode (EW/IW)\ 22 | 3rd - polarization mode (1SDH/1SDV)\ 23 | 4th - path to input training npz files from the first step\ 24 | 5th - path to output file 25 | 26 | All steps are described in a Python's notebook in line by line manner: 27 | 28 | ```python 29 | Quick_start_Power_balancing.ipynb 30 | ``` 31 | -------------------------------------------------------------------------------- /training/power_balancing/analyze_experiment_powerBalancingParameters.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """ Process aggregated statistics from individual npz files to obtain final results in power balancing stage 3 | 4 | run example: 5 | python analyze_experiment_powerBalancingParameters.py S1A IW GRDH 1SDV /path/to/npz/files /out/path 6 | """ 7 | 8 | import json 9 | import datetime 10 | import glob 11 | import os 12 | import sys 13 | 14 | import numpy as np 15 | 16 | from s1denoise.utils import AnalyzeExperiment 17 | 18 | 19 | class AnalyzePowerBalancing(AnalyzeExperiment): 20 | file_suffix = 'powerBalancing_new' 21 | 22 | def process(self): 23 | # stack data from pre-processed files 24 | IPFversion = [] 25 | powerDifference = [] 26 | balancingPower = [] 27 | correlationCoefficient = [] 28 | fitResidual = [] 29 | acqDate = [] 30 | npz_files_per_block = [] 31 | for npzFile in self.npzFiles: 32 | print('importing %s' % npzFile) 33 | npz = np.load(npzFile) 34 | npz.allow_pickle = True 35 | 36 | numberOfSubblocks = np.unique([ len(npz[iSW].item()['balancingPower']) 37 | for iSW in self.swath_names]) 38 | if numberOfSubblocks.size != 1: 39 | print('*** numberOfSubblocks are not consistent for all subswaths.') 40 | continue 41 | numberOfSubblocks = numberOfSubblocks.item() 42 | 43 | for li in range(numberOfSubblocks): 44 | powerDifference.append([ 45 | np.nanmean(10*np.log10(npz[iSW].item()['sigma0'][li])) 46 | - np.nanmean(10*np.log10(npz[iSW].item()['noiseEquivalentSigma0'][li])) 47 | for iSW in self.swath_names]) 48 | balancingPower.append([ 49 | npz[iSW].item()['balancingPower'][li] 50 | for iSW in self.swath_names]) 51 | correlationCoefficient.append([ 52 | npz[iSW].item()['correlationCoefficient'][li] 53 | for iSW in self.swath_names]) 54 | fitResidual.append([ 55 | npz[iSW].item()['fitResidual'][li] 56 | for iSW in self.swath_names]) 57 | IPFversion.append(npz['IPFversion']) 58 | acqDate.append(datetime.datetime.strptime(os.path.basename(npzFile).split('_')[4], '%Y%m%dT%H%M%S')) 59 | npz_files_per_block.append(os.path.basename(npzFile)) 60 | 61 | powerDifference = np.array(powerDifference) 62 | balancingPower = np.array(balancingPower) 63 | correlationCoefficient = np.array(correlationCoefficient) 64 | fitResidual = np.array(fitResidual) 65 | IPFversion = np.array(IPFversion) 66 | acqDate = np.array(acqDate) 67 | 68 | # compute fit values 69 | pb_params = {} 70 | pb_key = f'{self.args.platform}_{self.args.mode}_{self.args.res}_{self.polarisation}_PB' 71 | for IPFv in np.arange(2.4, 4.0, 0.1): 72 | if IPFv==2.7 and self.args.platform=='S1B': 73 | valid = np.logical_and( IPFversion==2.72, 74 | acqDate < datetime.datetime(2017,1,16,13,42,34) ) 75 | else: 76 | valid = np.isclose((np.trunc(IPFversion*10)/10.), IPFv, atol=0.01) 77 | 78 | if valid.sum()==0: 79 | continue 80 | 81 | pd = np.mean(powerDifference[valid], axis=1) 82 | cc = np.min(correlationCoefficient[valid], axis=1) 83 | fr = np.max(fitResidual[valid], axis=1) 84 | w = cc / fr 85 | ipf_str = '%.1f' % IPFv 86 | ipf_key = f'{pb_key}_{ipf_str}' 87 | pb_params[ipf_key] = {'mean': {}, 'rmse': {}} 88 | for iSW in range(0, self.swaths_number): 89 | bp = balancingPower[valid][:,iSW] 90 | fitResults = np.polyfit(pd, bp, deg=0, w=w) 91 | pb_params[ipf_key]['mean'][self.swath_names[iSW]] = fitResults[0] 92 | pb_params[ipf_key]['rmse'][self.swath_names[iSW]] = np.sqrt(np.sum((fitResults[0]-bp)**2 * w) / np.sum(w)) 93 | valid_npz_files = list(set([npz_files_per_block[i] for i in np.where(valid)[0]])) 94 | pb_params[ipf_key]['files'] = valid_npz_files 95 | 96 | self.save(pb_params) 97 | 98 | if __name__ == "__main__": 99 | apb = AnalyzePowerBalancing() 100 | apb.process() 101 | -------------------------------------------------------------------------------- /training/run_experiment.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | """ This python script process individual S1 Level-1 GRD files 4 | to get statistics for each sub-block 5 | 6 | run example: 7 | python run_experiment.py ns S1A VH /path/to/L1/GRD/files /path/to/output/dir 8 | python run_experiment.py pb S1A VH /path/to/L1/GRD/files /path/to/output/dir 9 | 10 | """ 11 | import argparse 12 | import os 13 | import sys 14 | import glob 15 | import shutil 16 | from multiprocessing import Pool 17 | from pathlib import Path 18 | 19 | from s1denoise import Sentinel1Image 20 | 21 | out_dir = None 22 | pol = None 23 | exp_name = None 24 | force = False 25 | 26 | exp_names = { 27 | 'ns': 'noiseScaling', 28 | 'pb': 'powerBalancing', 29 | } 30 | 31 | 32 | def main(): 33 | """ Find zip files and launch (multi)processing """ 34 | global out_dir, pol, exp_name, force 35 | args = parse_run_experiment_args() 36 | 37 | exp_name = exp_names[args.experiment] 38 | out_dir = args.out_dir 39 | pol = args.polarization 40 | force = args.force 41 | 42 | # find files for processing 43 | zip_files = sorted(args.inp_dir.glob(f'{args.platform}*.zip')) 44 | # make directory for output npz files 45 | args.out_dir.mkdir(exist_ok=True) 46 | 47 | # launch proc in parallel 48 | with Pool(args.cores) as pool: 49 | pool.map(run_process, zip_files) 50 | # run_process(zip_files[0]) 51 | 52 | def parse_run_experiment_args(): 53 | """ Parse input args for run_experiment_* scripts """ 54 | parser = argparse.ArgumentParser(description='Aggregate statistics from individual NPZ files') 55 | parser.add_argument('experiment', choices=['ns', 'pb']) 56 | parser.add_argument('platform', choices=['S1A', 'S1B']) 57 | parser.add_argument('polarization', choices=['HV', 'VH']) 58 | parser.add_argument('inp_dir', type=Path) 59 | parser.add_argument('out_dir', type=Path) 60 | parser.add_argument('-c', '--cores', default=2, type=int, 61 | help='Number of cores for parallel computation') 62 | parser.add_argument('--force', action='store_true', help="Force overwrite existing output") 63 | 64 | return parser.parse_args() 65 | 66 | def run_process(zipFile): 67 | """ Process individual file with experiment_ """ 68 | global out_dir, pol, exp_name, force 69 | 70 | default_output = zipFile.parent / (zipFile.stem + f'_{exp_name}.npz') 71 | desired_output = out_dir / default_output.name 72 | if desired_output.exists() and not force: 73 | print(f'{desired_output} already exists.') 74 | else: 75 | s1 = Sentinel1Image(zipFile.as_posix()) 76 | func = getattr(s1, 'experiment_' + exp_name) 77 | func(pol) 78 | print(f'Done! Moving file to {desired_output}') 79 | with open(desired_output, 'wb') as handle: 80 | handle.write(default_output.read_bytes()) 81 | default_output.unlink() 82 | 83 | 84 | if __name__ == "__main__": 85 | main() 86 | -------------------------------------------------------------------------------- /training/train_files/S1A_EW_GRDM_1SDH_noiseScaling.json: -------------------------------------------------------------------------------- 1 | {"S1A_EW_GRDM_HV_NS_3.1": {"mean": {"EW1": 1.0192729363822497, "EW2": 0.9852981966719958, "EW3": 0.9777714040014476, "EW4": 1.0607721665226377, "EW5": 1.0332263820020957}, "rmse": {"EW1": 0.026593856001513923, "EW2": 0.053794374210483845, "EW3": 0.03592680589251713, "EW4": 0.036061334535459184, "EW5": 0.06745134804419457}, "files": ["S1A_EW_GRDM_1SDH_20190707T055115_20190707T055215_028007_0329AA_21C6_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190706T065050_20190706T065149_027993_03293E_A548_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190711T065805_20190711T065905_028066_032B69_ACD1_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190714T072146_20190714T072246_028110_032CB6_89B1_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190717T060745_20190717T060845_028153_032E08_E7FA_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190713T064239_20190713T064338_028095_032C48_B67A_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190720T063225_20190720T063325_028197_032F6E_9188_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190701T064139_20190701T064239_027920_0326FA_F408_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190702T072145_20190702T072245_027935_03276A_30CA_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190702T072245_20190702T072345_027935_03276A_C701_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190721T071535_20190721T071635_028212_032FE0_C49C_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190709T071534_20190709T071634_028037_032A9B_A31A_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190725T180128_20190725T180232_028277_0331C9_7BA2_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190706T180944_20190706T181048_028000_032975_89C4_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190721T071335_20190721T071435_028212_032FE0_3A5D_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190714T072446_20190714T072546_028110_032CB6_AD2C_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190711T070005_20190711T070104_028066_032B69_07E5_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190704T070846_20190704T070946_027964_032855_90C2_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190718T064851_20190718T064951_028168_032E86_B3C0_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190723T065706_20190723T065806_028241_0330B2_4844_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190718T181049_20190718T181149_028175_032EBB_6E66_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190725T064040_20190725T064140_028270_033190_AE91_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190706T064850_20190706T064950_027993_03293E_A5C6_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190708T063225_20190708T063325_028022_032A27_58D6_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190714T072346_20190714T072446_028110_032CB6_5411_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190704T070522_20190704T070622_027964_032853_2631_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190718T065051_20190718T065150_028168_032E86_5297_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190713T064039_20190713T064139_028095_032C48_ADB9_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190704T070622_20190704T070656_027964_032853_E06C_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190713T180231_20190713T180331_028102_032C7D_F92B_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190725T064240_20190725T064339_028270_033190_764E_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190716T070623_20190716T070656_028139_032DA1_150E_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190706T064950_20190706T065050_027993_03293E_C95D_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190713T180127_20190713T180231_028102_032C7D_F61D_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190725T180232_20190725T180332_028277_0331C9_4F1B_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190709T071334_20190709T071434_028037_032A9B_B661_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190721T071635_20190721T071735_028212_032FE0_CA4A_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190725T064140_20190725T064240_028270_033190_09A4_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190723T065906_20190723T070006_028241_0330B2_A4CC_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190704T070742_20190704T070846_027964_032855_FC70_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190718T064951_20190718T065051_028168_032E86_5D3A_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190724T055931_20190724T060034_028255_033114_9668_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190712T055930_20190712T060033_028080_032BCB_5935_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190706T181048_20190706T181148_028000_032975_A327_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190705T060744_20190705T060844_027978_0328BA_5C0C_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190702T072345_20190702T072445_027935_03276A_CC95_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190709T071434_20190709T071534_028037_032A9B_059F_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190715T062411_20190715T062511_028124_032D22_675A_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190709T071634_20190709T071734_028037_032A9B_0ADA_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190711T065705_20190711T065805_028066_032B69_4FCA_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190711T065905_20190711T070005_028066_032B69_B029_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190714T072246_20190714T072346_028110_032CB6_9F98_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190721T071435_20190721T071535_028212_032FE0_E9E2_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190723T070006_20190723T070105_028241_0330B2_D07A_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190701T064039_20190701T064139_027920_0326FA_1AC8_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190715T062511_20190715T062538_028124_032D22_C56E_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190703T062410_20190703T062510_027949_0327D6_33C2_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190716T070847_20190716T070947_028139_032DA3_2A69_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190701T064239_20190701T064337_027920_0326FA_B888_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190713T064139_20190713T064239_028095_032C48_64F1_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190716T070523_20190716T070623_028139_032DA1_AF6F_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190718T180945_20190718T181049_028175_032EBB_1862_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190716T070742_20190716T070847_028139_032DA3_85A9_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190723T065806_20190723T065906_028241_0330B2_84E4_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190703T062510_20190703T062537_027949_0327D6_CF6E_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190719T055116_20190719T055216_028182_032EF0_860D_noiseScaling.npz", "S1A_EW_GRDM_1SDH_20190702T072445_20190702T072545_027935_03276A_E351_noiseScaling.npz"]}} -------------------------------------------------------------------------------- /training/train_files/S1A_EW_GRDM_1SDH_powerBalancing.json: -------------------------------------------------------------------------------- 1 | {"S1A_EW_GRDM_HV_PB_3.1": {"mean": {"EW1": 6.356005834071703e-05, "EW2": 8.931004602422138e-06, "EW3": 1.2383778799706712e-05, "EW4": -1.6531586397057598e-05, "EW5": -2.221272187752646e-05}, "rmse": {"EW1": 7.633133410734286e-05, "EW2": 4.577796125867345e-05, "EW3": 2.8069261369011227e-05, "EW4": 2.9817162585092354e-05, "EW5": 5.5800637116806254e-05}, "files": ["S1A_EW_GRDM_1SDH_20190706T180944_20190706T181048_028000_032975_89C4_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190706T064850_20190706T064950_027993_03293E_A5C6_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190716T070847_20190716T070947_028139_032DA3_2A69_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190718T180945_20190718T181049_028175_032EBB_1862_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190709T071334_20190709T071434_028037_032A9B_B661_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190711T070005_20190711T070104_028066_032B69_07E5_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190716T070523_20190716T070623_028139_032DA1_AF6F_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190718T064951_20190718T065051_028168_032E86_5D3A_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190721T071435_20190721T071535_028212_032FE0_E9E2_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190716T070623_20190716T070656_028139_032DA1_150E_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190709T071534_20190709T071634_028037_032A9B_A31A_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190712T055930_20190712T060033_028080_032BCB_5935_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190719T055116_20190719T055216_028182_032EF0_860D_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190725T180232_20190725T180332_028277_0331C9_4F1B_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190703T062410_20190703T062510_027949_0327D6_33C2_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190705T060744_20190705T060844_027978_0328BA_5C0C_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190725T064240_20190725T064339_028270_033190_764E_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190713T064139_20190713T064239_028095_032C48_64F1_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190713T064039_20190713T064139_028095_032C48_ADB9_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190716T070742_20190716T070847_028139_032DA3_85A9_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190723T070006_20190723T070105_028241_0330B2_D07A_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190704T070622_20190704T070656_027964_032853_E06C_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190708T063225_20190708T063325_028022_032A27_58D6_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190725T180128_20190725T180232_028277_0331C9_7BA2_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190704T070846_20190704T070946_027964_032855_90C2_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190713T180127_20190713T180231_028102_032C7D_F61D_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190717T060745_20190717T060845_028153_032E08_E7FA_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190702T072145_20190702T072245_027935_03276A_30CA_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190721T071335_20190721T071435_028212_032FE0_3A5D_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190713T064239_20190713T064338_028095_032C48_B67A_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190715T062511_20190715T062538_028124_032D22_C56E_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190723T065706_20190723T065806_028241_0330B2_4844_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190724T055931_20190724T060034_028255_033114_9668_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190718T064851_20190718T064951_028168_032E86_B3C0_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190704T070522_20190704T070622_027964_032853_2631_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190723T065806_20190723T065906_028241_0330B2_84E4_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190702T072245_20190702T072345_027935_03276A_C701_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190701T064139_20190701T064239_027920_0326FA_F408_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190707T055115_20190707T055215_028007_0329AA_21C6_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190720T063225_20190720T063325_028197_032F6E_9188_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190721T071535_20190721T071635_028212_032FE0_C49C_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190704T070742_20190704T070846_027964_032855_FC70_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190706T181048_20190706T181148_028000_032975_A327_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190706T065050_20190706T065149_027993_03293E_A548_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190706T064950_20190706T065050_027993_03293E_C95D_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190701T064239_20190701T064337_027920_0326FA_B888_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190701T064039_20190701T064139_027920_0326FA_1AC8_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190709T071434_20190709T071534_028037_032A9B_059F_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190711T065705_20190711T065805_028066_032B69_4FCA_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190711T065905_20190711T070005_028066_032B69_B029_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190718T065051_20190718T065150_028168_032E86_5297_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190721T071635_20190721T071735_028212_032FE0_CA4A_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190702T072345_20190702T072445_027935_03276A_CC95_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190714T072346_20190714T072446_028110_032CB6_5411_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190725T064040_20190725T064140_028270_033190_AE91_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190725T064140_20190725T064240_028270_033190_09A4_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190714T072246_20190714T072346_028110_032CB6_9F98_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190702T072445_20190702T072545_027935_03276A_E351_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190703T062510_20190703T062537_027949_0327D6_CF6E_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190711T065805_20190711T065905_028066_032B69_ACD1_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190715T062411_20190715T062511_028124_032D22_675A_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190709T071634_20190709T071734_028037_032A9B_0ADA_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190714T072146_20190714T072246_028110_032CB6_89B1_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190713T180231_20190713T180331_028102_032C7D_F92B_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190718T181049_20190718T181149_028175_032EBB_6E66_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190723T065906_20190723T070006_028241_0330B2_A4CC_powerBalancing.npz", "S1A_EW_GRDM_1SDH_20190714T072446_20190714T072546_028110_032CB6_AD2C_powerBalancing.npz"]}} -------------------------------------------------------------------------------- /training/train_files/S1A_EW_GRDM_1SDV_noiseScaling.json: -------------------------------------------------------------------------------- 1 | {"S1A_EW_GRDM_VH_NS_3.1": {"mean": {"EW1": 0.9067564820921421, "EW2": 0.8436815229237992, "EW3": 0.8288756172222169, "EW4": 0.9266705579402829, "EW5": 0.9199626126135767}, "rmse": {"EW1": 0.014609610697211341, "EW2": 0.029565344176081466, "EW3": 0.0240717402499219, "EW4": 0.022049490379255618, "EW5": 0.04316884293405574}, "files": ["S1A_EW_GRDM_1SDV_20190814T072503_20190814T072603_028562_033AF4_5CA0_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190725T193155_20190725T193255_028278_0331CF_4FC1_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190720T192350_20190720T192450_028205_032FA7_8A6D_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190713T193155_20190713T193255_028103_032C83_AD1A_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190825T192452_20190825T192552_028730_0340BF_F040_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190704T071548_20190704T071652_027964_032858_D34B_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190727T081159_20190727T081304_028300_033281_B8D5_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190901T191531_20190901T191631_028832_034455_5813_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190819T073208_20190819T073312_028635_033D6A_322F_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190820T191730_20190820T191826_028657_033E3B_6388_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190826T072400_20190826T072504_028737_0340FE_ECF9_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190809T071654_20190809T071754_028489_033865_D005_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190821T071551_20190821T071655_028664_033E7E_541E_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190901T191631_20190901T191731_028832_034455_C934_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190801T192551_20190801T192624_028380_0334FD_27DC_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190808T191630_20190808T191730_028482_03382A_303C_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190725T193355_20190725T193426_028278_0331CF_9686_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190901T081202_20190901T081306_028825_034409_AA86_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190715T191728_20190715T191824_028132_032D6E_9ACD_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190725T193255_20190725T193355_028278_0331CF_AD21_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190830T193257_20190830T193357_028803_034350_203E_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190720T192450_20190720T192550_028205_032FA7_9477_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190703T191627_20190703T191727_027957_032822_DFF7_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190704T071652_20190704T071752_027964_032858_4E80_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190716T071653_20190716T071753_028139_032DA6_6BF4_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190728T071654_20190728T071754_028314_0332FD_D4BB_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190716T071549_20190716T071653_028139_032DA6_24AA_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190820T191630_20190820T191730_028657_033E3B_F287_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190702T073309_20190702T073409_027935_03276B_0DE7_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190825T192252_20190825T192352_028730_0340BF_0589_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190814T072359_20190814T072503_028562_033AF4_2F43_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190831T073312_20190831T073412_028810_03438A_A4B4_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190801T192251_20190801T192351_028380_0334FD_041C_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190727T191629_20190727T191729_028307_0332C5_E17D_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190819T073312_20190819T073412_028635_033D6A_4E31_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190713T193255_20190713T193355_028103_032C83_2CE7_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190708T192549_20190708T192622_028030_032A61_C63E_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190720T192550_20190720T192623_028205_032FA7_B668_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190702T073204_20190702T073309_027935_03276B_68C8_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190813T192452_20190813T192552_028555_033AB4_202A_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190721T072502_20190721T072602_028212_032FE1_0219_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190807T073207_20190807T073311_028460_03375E_2F95_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190813T192552_20190813T192625_028555_033AB4_C554_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190727T191529_20190727T191629_028307_0332C5_1F92_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190720T192250_20190720T192350_028205_032FA7_2B58_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190825T192352_20190825T192452_028730_0340BF_AA18_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190709T072356_20190709T072501_028037_032A9C_AA0E_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190818T193157_20190818T193257_028628_033D2C_C381_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190901T191731_20190901T191826_028832_034455_EE2A_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190709T072501_20190709T072601_028037_032A9C_53A9_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190801T192451_20190801T192551_028380_0334FD_A937_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190807T073311_20190807T073411_028460_03375E_DC82_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190703T191527_20190703T191627_027957_032822_98CF_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190806T193256_20190806T193356_028453_033726_FC80_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190830T193357_20190830T193428_028803_034350_3F5F_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190821T071655_20190821T071755_028664_033E7E_D825_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190808T081200_20190808T081305_028475_0337DE_49DA_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190806T193356_20190806T193427_028453_033726_8FC4_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190802T072358_20190802T072502_028387_033536_49F7_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190727T191729_20190727T191824_028307_0332C5_316E_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190708T192449_20190708T192549_028030_032A61_4054_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190714T073309_20190714T073409_028110_032CB7_11CA_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190825T192552_20190825T192625_028730_0340BF_D3B5_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190801T192351_20190801T192451_028380_0334FD_346A_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190818T193357_20190818T193427_028628_033D2C_7F89_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190726T073310_20190726T073410_028285_033206_2739_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190820T191530_20190820T191630_028657_033E3B_B555_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190715T191528_20190715T191628_028132_032D6E_BD90_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190808T191530_20190808T191630_028482_03382A_127C_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190701T193354_20190701T193424_027928_032737_2D30_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190703T081158_20190703T081302_027950_0327DE_F8A1_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190726T073206_20190726T073310_028285_033206_5833_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190830T193157_20190830T193257_028803_034350_583F_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190802T072502_20190802T072602_028387_033536_4B99_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190715T191628_20190715T191728_028132_032D6E_4C94_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190703T191727_20190703T191823_027957_032822_3C55_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190714T073205_20190714T073309_028110_032CB7_EE3F_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190701T193154_20190701T193254_027928_032737_B13A_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190808T191730_20190808T191825_028482_03382A_978C_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190708T192349_20190708T192449_028030_032A61_047D_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190809T071550_20190809T071654_028489_033865_5424_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190831T073208_20190831T073312_028810_03438A_C4ED_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190708T192249_20190708T192349_028030_032A61_3C8E_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190813T192252_20190813T192352_028555_033AB4_10C4_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190713T193355_20190713T193425_028103_032C83_5A13_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190701T193254_20190701T193354_027928_032737_F24A_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190806T193156_20190806T193256_028453_033726_CAD3_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190721T072357_20190721T072502_028212_032FE1_608A_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190818T193257_20190818T193357_028628_033D2C_E6AC_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190715T081159_20190715T081303_028125_032D2A_1B22_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190813T192352_20190813T192452_028555_033AB4_FD69_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190826T072504_20190826T072604_028737_0340FE_0C76_noiseScaling.npz", "S1A_EW_GRDM_1SDV_20190728T071549_20190728T071654_028314_0332FD_8C03_noiseScaling.npz"]}} -------------------------------------------------------------------------------- /training/train_files/S1A_EW_GRDM_1SDV_powerBalancing.json: -------------------------------------------------------------------------------- 1 | {"S1A_EW_GRDM_VH_PB_3.1": {"mean": {"EW1": 0.00014946003543597509, "EW2": 0.00017363882421723344, "EW3": 0.00014402775896797256, "EW4": 0.0001063158491424791, "EW5": 0.00010671751279543661}, "rmse": {"EW1": 7.20915819722712e-05, "EW2": 3.921157059510226e-05, "EW3": 2.2215456832139513e-05, "EW4": 2.237675337384223e-05, "EW5": 4.1604545960952734e-05}, "files": ["S1A_EW_GRDM_1SDV_20190808T191730_20190808T191825_028482_03382A_978C_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190813T192352_20190813T192452_028555_033AB4_FD69_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190716T071549_20190716T071653_028139_032DA6_24AA_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190725T193155_20190725T193255_028278_0331CF_4FC1_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190806T193356_20190806T193427_028453_033726_8FC4_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190709T072501_20190709T072601_028037_032A9C_53A9_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190701T193354_20190701T193424_027928_032737_2D30_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190701T193254_20190701T193354_027928_032737_F24A_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190703T191627_20190703T191727_027957_032822_DFF7_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190727T081159_20190727T081304_028300_033281_B8D5_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190720T192350_20190720T192450_028205_032FA7_8A6D_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190808T191630_20190808T191730_028482_03382A_303C_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190818T193157_20190818T193257_028628_033D2C_C381_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190713T193355_20190713T193425_028103_032C83_5A13_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190721T072502_20190721T072602_028212_032FE1_0219_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190809T071654_20190809T071754_028489_033865_D005_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190702T073309_20190702T073409_027935_03276B_0DE7_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190802T072502_20190802T072602_028387_033536_4B99_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190808T191530_20190808T191630_028482_03382A_127C_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190720T192550_20190720T192623_028205_032FA7_B668_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190825T192352_20190825T192452_028730_0340BF_AA18_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190901T191531_20190901T191631_028832_034455_5813_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190818T193357_20190818T193427_028628_033D2C_7F89_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190819T073208_20190819T073312_028635_033D6A_322F_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190704T071548_20190704T071652_027964_032858_D34B_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190728T071549_20190728T071654_028314_0332FD_8C03_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190802T072358_20190802T072502_028387_033536_49F7_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190703T191727_20190703T191823_027957_032822_3C55_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190807T073207_20190807T073311_028460_03375E_2F95_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190901T191731_20190901T191826_028832_034455_EE2A_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190708T192549_20190708T192622_028030_032A61_C63E_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190721T072357_20190721T072502_028212_032FE1_608A_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190830T193157_20190830T193257_028803_034350_583F_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190728T071654_20190728T071754_028314_0332FD_D4BB_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190714T073309_20190714T073409_028110_032CB7_11CA_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190715T081159_20190715T081303_028125_032D2A_1B22_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190830T193357_20190830T193428_028803_034350_3F5F_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190714T073205_20190714T073309_028110_032CB7_EE3F_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190801T192451_20190801T192551_028380_0334FD_A937_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190713T193255_20190713T193355_028103_032C83_2CE7_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190809T071550_20190809T071654_028489_033865_5424_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190806T193156_20190806T193256_028453_033726_CAD3_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190801T192351_20190801T192451_028380_0334FD_346A_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190701T193154_20190701T193254_027928_032737_B13A_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190825T192252_20190825T192352_028730_0340BF_0589_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190801T192551_20190801T192624_028380_0334FD_27DC_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190708T192249_20190708T192349_028030_032A61_3C8E_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190901T191631_20190901T191731_028832_034455_C934_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190720T192450_20190720T192550_028205_032FA7_9477_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190726T073310_20190726T073410_028285_033206_2739_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190820T191730_20190820T191826_028657_033E3B_6388_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190831T073312_20190831T073412_028810_03438A_A4B4_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190801T192251_20190801T192351_028380_0334FD_041C_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190820T191630_20190820T191730_028657_033E3B_F287_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190813T192452_20190813T192552_028555_033AB4_202A_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190703T191527_20190703T191627_027957_032822_98CF_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190725T193255_20190725T193355_028278_0331CF_AD21_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190821T071655_20190821T071755_028664_033E7E_D825_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190715T191728_20190715T191824_028132_032D6E_9ACD_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190808T081200_20190808T081305_028475_0337DE_49DA_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190826T072504_20190826T072604_028737_0340FE_0C76_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190708T192349_20190708T192449_028030_032A61_047D_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190807T073311_20190807T073411_028460_03375E_DC82_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190727T191729_20190727T191824_028307_0332C5_316E_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190830T193257_20190830T193357_028803_034350_203E_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190813T192552_20190813T192625_028555_033AB4_C554_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190704T071652_20190704T071752_027964_032858_4E80_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190713T193155_20190713T193255_028103_032C83_AD1A_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190715T191628_20190715T191728_028132_032D6E_4C94_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190806T193256_20190806T193356_028453_033726_FC80_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190708T192449_20190708T192549_028030_032A61_4054_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190831T073208_20190831T073312_028810_03438A_C4ED_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190703T081158_20190703T081302_027950_0327DE_F8A1_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190901T081202_20190901T081306_028825_034409_AA86_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190819T073312_20190819T073412_028635_033D6A_4E31_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190818T193257_20190818T193357_028628_033D2C_E6AC_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190716T071653_20190716T071753_028139_032DA6_6BF4_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190821T071551_20190821T071655_028664_033E7E_541E_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190727T191629_20190727T191729_028307_0332C5_E17D_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190725T193355_20190725T193426_028278_0331CF_9686_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190826T072400_20190826T072504_028737_0340FE_ECF9_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190702T073204_20190702T073309_027935_03276B_68C8_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190720T192250_20190720T192350_028205_032FA7_2B58_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190820T191530_20190820T191630_028657_033E3B_B555_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190813T192252_20190813T192352_028555_033AB4_10C4_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190727T191529_20190727T191629_028307_0332C5_1F92_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190825T192552_20190825T192625_028730_0340BF_D3B5_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190715T191528_20190715T191628_028132_032D6E_BD90_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190814T072503_20190814T072603_028562_033AF4_5CA0_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190825T192452_20190825T192552_028730_0340BF_F040_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190709T072356_20190709T072501_028037_032A9C_AA0E_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190726T073206_20190726T073310_028285_033206_5833_powerBalancing.npz", "S1A_EW_GRDM_1SDV_20190814T072359_20190814T072503_028562_033AF4_2F43_powerBalancing.npz"]}} -------------------------------------------------------------------------------- /training/train_files/S1A_IW_GRDH_1SDH_noiseScaling.json: -------------------------------------------------------------------------------- 1 | {"S1A_IW_GRDH_HV_NS_3.1": {"mean": {"IW1": 1.0336345160083245, "IW2": 0.9970096731470423, "IW3": 1.1270269021667458}, "rmse": {"IW1": 0.1012497738730145, "IW2": 0.055145671434740966, "IW3": 0.029191222378508026}, "files": ["S1A_IW_GRDH_1SDH_20190714T090921_20190714T090946_028111_032CBE_7AEA_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190817T092550_20190817T092615_028607_033C69_BF72_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190922T092616_20190922T092641_029132_034E99_9D3D_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190922T092641_20190922T092710_029132_034E99_C286_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20191006T090925_20191006T090950_029336_0355A9_64F6_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190924T090925_20190924T090950_029161_034F9E_49C0_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190707T091735_20190707T091757_028009_0329BC_2911_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20191004T092551_20191004T092616_029307_03549E_4FB5_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190805T092639_20190805T092707_028432_033681_8E64_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20191016T092551_20191016T092616_029482_035AA9_E5AB_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20191028T092641_20191028T092710_029657_0360AF_FF91_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20191028T092616_20191028T092641_029657_0360AF_E9F2_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20191016T092616_20191016T092641_029482_035AA9_16C4_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190712T092612_20190712T092637_028082_032BDE_AA42_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190805T092614_20190805T092639_028432_033681_F9A6_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190724T092548_20190724T092613_028257_033127_AB52_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190910T092616_20190910T092641_028957_0348A4_01E1_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190917T091739_20190917T091801_029059_034C30_3DE1_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190812T091738_20190812T091800_028534_0339F5_39C2_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190712T092637_20190712T092706_028082_032BDE_CB01_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190829T092550_20190829T092615_028782_03428D_79F5_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190829T092615_20190829T092640_028782_03428D_11D8_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190905T091739_20190905T091801_028884_03461A_6879_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190910T092551_20190910T092616_028957_0348A4_A857_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190912T090924_20190912T090949_028986_0349A5_2271_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190805T092549_20190805T092614_028432_033681_0A85_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190922T092551_20190922T092616_029132_034E99_B130_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190817T092640_20190817T092708_028607_033C69_ED49_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190929T091740_20190929T091802_029234_03522F_A74C_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190731T091737_20190731T091759_028359_03345C_731F_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20191030T090925_20191030T090950_029686_0361C7_97C9_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190817T092615_20190817T092640_028607_033C69_7B16_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190719T091736_20190719T091758_028184_032F02_A802_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20191004T092616_20191004T092641_029307_03549E_C716_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20191011T091740_20191011T091802_029409_035831_FF4B_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190724T092613_20190724T092638_028257_033127_5381_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190724T092638_20190724T092706_028257_033127_442B_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190819T090923_20190819T090949_028636_033D74_7203_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20191023T091740_20191023T091802_029584_035E30_C966_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190910T092641_20190910T092709_028957_0348A4_595D_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20191028T092551_20191028T092616_029657_0360AF_E43A_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190831T090924_20190831T090949_028811_034393_2DEF_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20191004T092641_20191004T092710_029307_03549E_3CF3_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190829T092640_20190829T092708_028782_03428D_D660_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190702T090920_20190702T090945_027936_032772_CE7A_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190726T090921_20190726T090947_028286_03320E_2EFD_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190712T092547_20190712T092612_028082_032BDE_5159_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20191016T092641_20191016T092710_029482_035AA9_1064_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20191018T090925_20191018T090950_029511_035BAE_6315_noiseScaling.npz", "S1A_IW_GRDH_1SDH_20190807T090922_20190807T090948_028461_033767_116C_noiseScaling.npz"]}} -------------------------------------------------------------------------------- /training/train_files/S1A_IW_GRDH_1SDH_powerBalancing.json: -------------------------------------------------------------------------------- 1 | {"S1A_IW_GRDH_HV_PB_3.1": {"mean": {"IW1": 0.00014981161058604596, "IW2": -9.615879554188944e-06, "IW3": -0.00020909284291665422}, "rmse": {"IW1": 0.00013099324696212047, "IW2": 4.437583123083823e-05, "IW3": 4.972307290195301e-05}, "files": ["S1A_IW_GRDH_1SDH_20190817T092550_20190817T092615_028607_033C69_BF72_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20191028T092641_20191028T092710_029657_0360AF_FF91_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190731T091737_20190731T091759_028359_03345C_731F_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190829T092640_20190829T092708_028782_03428D_D660_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190929T091740_20190929T091802_029234_03522F_A74C_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190712T092547_20190712T092612_028082_032BDE_5159_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190831T090924_20190831T090949_028811_034393_2DEF_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190922T092641_20190922T092710_029132_034E99_C286_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190805T092614_20190805T092639_028432_033681_F9A6_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190829T092550_20190829T092615_028782_03428D_79F5_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190829T092615_20190829T092640_028782_03428D_11D8_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190917T091739_20190917T091801_029059_034C30_3DE1_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190924T090925_20190924T090950_029161_034F9E_49C0_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190805T092639_20190805T092707_028432_033681_8E64_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190724T092613_20190724T092638_028257_033127_5381_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20191016T092616_20191016T092641_029482_035AA9_16C4_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190910T092641_20190910T092709_028957_0348A4_595D_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190712T092637_20190712T092706_028082_032BDE_CB01_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20191018T090925_20191018T090950_029511_035BAE_6315_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190910T092616_20190910T092641_028957_0348A4_01E1_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190712T092612_20190712T092637_028082_032BDE_AA42_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190817T092615_20190817T092640_028607_033C69_7B16_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20191028T092551_20191028T092616_029657_0360AF_E43A_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20191030T090925_20191030T090950_029686_0361C7_97C9_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190702T090920_20190702T090945_027936_032772_CE7A_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190912T090924_20190912T090949_028986_0349A5_2271_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190707T091735_20190707T091757_028009_0329BC_2911_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20191011T091740_20191011T091802_029409_035831_FF4B_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190817T092640_20190817T092708_028607_033C69_ED49_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190726T090921_20190726T090947_028286_03320E_2EFD_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20191004T092551_20191004T092616_029307_03549E_4FB5_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190910T092551_20190910T092616_028957_0348A4_A857_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190819T090923_20190819T090949_028636_033D74_7203_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190714T090921_20190714T090946_028111_032CBE_7AEA_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190812T091738_20190812T091800_028534_0339F5_39C2_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20191004T092641_20191004T092710_029307_03549E_3CF3_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190724T092638_20190724T092706_028257_033127_442B_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20191028T092616_20191028T092641_029657_0360AF_E9F2_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20191016T092641_20191016T092710_029482_035AA9_1064_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190805T092549_20190805T092614_028432_033681_0A85_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190807T090922_20190807T090948_028461_033767_116C_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20191016T092551_20191016T092616_029482_035AA9_E5AB_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190922T092551_20190922T092616_029132_034E99_B130_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190724T092548_20190724T092613_028257_033127_AB52_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190719T091736_20190719T091758_028184_032F02_A802_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20191004T092616_20191004T092641_029307_03549E_C716_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20191023T091740_20191023T091802_029584_035E30_C966_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20191006T090925_20191006T090950_029336_0355A9_64F6_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190922T092616_20190922T092641_029132_034E99_9D3D_powerBalancing.npz", "S1A_IW_GRDH_1SDH_20190905T091739_20190905T091801_028884_03461A_6879_powerBalancing.npz"]}} -------------------------------------------------------------------------------- /training/train_files/S1A_IW_GRDH_1SDV_noiseScaling.json: -------------------------------------------------------------------------------- 1 | {"S1A_IW_GRDH_VH_NS_3.1": {"mean": {"IW1": 1.0491463915745205, "IW2": 0.9843444656899601, "IW3": 1.0787269813793199}, "rmse": {"IW1": 0.03921432397367467, "IW2": 0.023550541414188282, "IW3": 0.01934397271169244}, "files": ["S1A_IW_GRDH_1SDV_20190705T075727_20190705T075752_027979_0328C6_0875_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190707T074206_20190707T074231_028008_0329B3_64AB_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190701T065057_20190701T065122_027920_0326FB_A565_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190706T070003_20190706T070032_027993_032940_93F9_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190701T065007_20190701T065032_027920_0326FB_09A4_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190707T184302_20190707T184327_028015_0329F2_4C6B_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190702T183703_20190702T183728_027942_0327A4_F7F2_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190707T184507_20190707T184534_028015_0329F2_D956_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190707T074116_20190707T074141_028008_0329B3_620F_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190702T183638_20190702T183703_027942_0327A4_4F04_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190705T185943_20190705T190008_027986_032902_1690_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190706T194046_20190706T194111_028001_03297B_DBB8_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190707T073932_20190707T074001_028008_0329B3_EE42_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190707T074001_20190707T074026_028008_0329B3_F320_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190701T065212_20190701T065237_027920_0326FB_C808_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190701T065147_20190701T065212_027920_0326FB_4A2C_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190707T184237_20190707T184302_028015_0329F2_89CB_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190707T184327_20190707T184352_028015_0329F2_77BD_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190707T184442_20190707T184507_028015_0329F2_CEF7_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190705T075543_20190705T075612_027979_0328C6_50C1_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190705T075752_20190705T075817_027979_0328C6_99D0_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190704T195645_20190704T195710_027972_032892_5F98_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190706T194201_20190706T194220_028001_03297B_7072_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190705T075817_20190705T075842_027979_0328C6_3106_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190707T074051_20190707T074116_028008_0329B3_5C6F_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190705T185918_20190705T185943_027986_032902_D7FF_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190706T194111_20190706T194136_028001_03297B_2DDB_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190705T075702_20190705T075727_027979_0328C6_949F_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190701T065237_20190701T065302_027920_0326FB_F6C1_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190707T184212_20190707T184237_028015_0329F2_F550_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190701T064942_20190701T065007_027920_0326FB_51FA_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190706T193956_20190706T194021_028001_03297B_37DB_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190701T065122_20190701T065147_027920_0326FB_7FA2_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190706T194136_20190706T194201_028001_03297B_9332_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190705T190008_20190705T190022_027986_032902_D613_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190705T075637_20190705T075702_027979_0328C6_8B01_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190707T184417_20190707T184442_028015_0329F2_016E_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190706T194021_20190706T194046_028001_03297B_9C00_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190706T070057_20190706T070122_027993_032940_4F0B_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190707T074026_20190707T074051_028008_0329B3_7AE4_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190705T185853_20190705T185918_027986_032902_9688_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190701T065032_20190701T065057_027920_0326FB_19CF_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190704T195616_20190704T195645_027972_032892_AFD2_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190706T070032_20190706T070057_027993_032940_D175_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190707T184352_20190707T184417_028015_0329F2_9C89_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190707T074141_20190707T074206_028008_0329B3_CD49_noiseScaling.npz", "S1A_IW_GRDH_1SDV_20190705T075612_20190705T075637_027979_0328C6_64D6_noiseScaling.npz"]}} -------------------------------------------------------------------------------- /training/train_files/S1A_IW_GRDH_1SDV_powerBalancing.json: -------------------------------------------------------------------------------- 1 | {"S1A_IW_GRDH_VH_PB_3.1": {"mean": {"IW1": 1.6380019058311914e-05, "IW2": 2.128343412572047e-05, "IW3": -0.00010323897376191746}, "rmse": {"IW1": 4.968162101132938e-05, "IW2": 1.994298292894046e-05, "IW3": 2.3347205295554003e-05}, "files": ["S1A_IW_GRDH_1SDV_20190706T193956_20190706T194021_028001_03297B_37DB_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190705T075817_20190705T075842_027979_0328C6_3106_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190706T194111_20190706T194136_028001_03297B_2DDB_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190701T065032_20190701T065057_027920_0326FB_19CF_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190707T073932_20190707T074001_028008_0329B3_EE42_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190702T183703_20190702T183728_027942_0327A4_F7F2_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190707T074001_20190707T074026_028008_0329B3_F320_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190707T184302_20190707T184327_028015_0329F2_4C6B_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190706T070003_20190706T070032_027993_032940_93F9_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190705T075702_20190705T075727_027979_0328C6_949F_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190706T194201_20190706T194220_028001_03297B_7072_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190701T065147_20190701T065212_027920_0326FB_4A2C_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190707T074026_20190707T074051_028008_0329B3_7AE4_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190705T075752_20190705T075817_027979_0328C6_99D0_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190705T185943_20190705T190008_027986_032902_1690_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190706T070057_20190706T070122_027993_032940_4F0B_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190704T195645_20190704T195710_027972_032892_5F98_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190706T194046_20190706T194111_028001_03297B_DBB8_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190707T184212_20190707T184237_028015_0329F2_F550_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190707T184417_20190707T184442_028015_0329F2_016E_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190704T195616_20190704T195645_027972_032892_AFD2_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190707T184237_20190707T184302_028015_0329F2_89CB_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190705T075543_20190705T075612_027979_0328C6_50C1_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190701T065212_20190701T065237_027920_0326FB_C808_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190705T190008_20190705T190022_027986_032902_D613_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190705T075612_20190705T075637_027979_0328C6_64D6_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190707T184352_20190707T184417_028015_0329F2_9C89_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190701T065007_20190701T065032_027920_0326FB_09A4_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190705T185853_20190705T185918_027986_032902_9688_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190706T194021_20190706T194046_028001_03297B_9C00_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190707T074141_20190707T074206_028008_0329B3_CD49_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190707T074206_20190707T074231_028008_0329B3_64AB_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190707T074051_20190707T074116_028008_0329B3_5C6F_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190701T065122_20190701T065147_027920_0326FB_7FA2_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190705T185918_20190705T185943_027986_032902_D7FF_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190707T074116_20190707T074141_028008_0329B3_620F_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190707T184507_20190707T184534_028015_0329F2_D956_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190701T064942_20190701T065007_027920_0326FB_51FA_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190706T194136_20190706T194201_028001_03297B_9332_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190702T183638_20190702T183703_027942_0327A4_4F04_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190705T075637_20190705T075702_027979_0328C6_8B01_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190701T065057_20190701T065122_027920_0326FB_A565_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190705T075727_20190705T075752_027979_0328C6_0875_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190706T070032_20190706T070057_027993_032940_D175_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190701T065237_20190701T065302_027920_0326FB_F6C1_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190707T184327_20190707T184352_028015_0329F2_77BD_powerBalancing.npz", "S1A_IW_GRDH_1SDV_20190707T184442_20190707T184507_028015_0329F2_CEF7_powerBalancing.npz"]}} -------------------------------------------------------------------------------- /training/train_files/S1B_EW_GRDM_1SDH_noiseScaling.json: -------------------------------------------------------------------------------- 1 | {"S1B_EW_GRDM_HV_NS_3.1": {"mean": {"EW1": 0.9078292088346851, "EW2": 0.8695947387864499, "EW3": 0.8301467063621799, "EW4": 0.8894946878921138, "EW5": 0.8876375734045323}, "rmse": {"EW1": 0.023991378526066184, "EW2": 0.04561819584986901, "EW3": 0.031275727043785985, "EW4": 0.030194059274216253, "EW5": 0.056380931022126074}, "files": ["S1B_EW_GRDM_1SDH_20190721T062606_20190721T062619_017228_020668_9646_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190722T070431_20190722T070531_017243_0206E3_1845_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190710T070805_20190710T070905_017068_0201CE_D25C_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190710T070530_20190710T070617_017068_0201CC_D3AF_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190705T051841_20190705T051915_016994_01FF98_43FB_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190703T071342_20190703T071442_016966_01FEC2_F95F_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190719T064128_20190719T064228_017199_020584_1F11_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190715T165700_20190715T165801_017147_02041E_D3AE_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190724T065037_20190724T065059_017272_0207BD_C47A_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190716T173813_20190716T173913_017162_020490_A820_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190709T062405_20190709T062505_017053_020153_87DA_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190707T180118_20190707T180223_017031_0200A5_4D32_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190714T175307_20190714T175412_017133_0203AF_940A_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190713T055125_20190713T055152_017111_020313_77FC_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190703T165700_20190703T165800_016972_01FEF5_9076_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190717T051841_20190717T051916_017169_0204BE_CBA2_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190705T065648_20190705T065748_016995_01FF9E_3AF1_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190703T071242_20190703T071342_016966_01FEC2_ABA7_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190714T063317_20190714T063417_017126_02037C_8A45_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190708T072356_20190708T072456_017039_0200E2_6225_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190705T065848_20190705T065913_016995_01FF9E_168A_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190701T055125_20190701T055151_016936_01FDEB_8978_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190712T065036_20190712T065058_017097_0202A8_08BD_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190708T072256_20190708T072356_017039_0200E2_DDCA_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190710T164854_20190710T164925_017074_020202_8702_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190719T064028_20190719T064128_017199_020584_1EE0_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190725T171247_20190725T171329_017293_020857_EE4A_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190719T064228_20190719T064247_017199_020584_87C6_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190712T051030_20190712T051104_017096_0202A4_C4B6_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190710T070430_20190710T070530_017068_0201CC_A6AF_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190712T064936_20190712T065036_017097_0202A8_6082_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190710T070700_20190710T070805_017068_0201CE_37A0_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190724T180931_20190724T181035_017279_0207FB_9B19_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190718T172046_20190718T172116_017191_020554_E3D0_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190715T071442_20190715T071542_017141_0203EC_FBA0_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190704T173708_20190704T173813_016987_01FF66_405C_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190716T173709_20190716T173813_017162_020490_784D_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190722T164855_20190722T164925_017249_020718_945B_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190717T065648_20190717T065748_017170_0204C4_8E7C_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190703T071542_20190703T071642_016966_01FEC2_C792_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190712T064836_20190712T064936_017097_0202A8_44CA_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190707T050215_20190707T050252_017023_020065_CB9C_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190719T180119_20190719T180223_017206_0205BF_0C91_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190705T181659_20190705T181803_017002_01FFD0_42AE_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190717T065848_20190717T065913_017170_0204C4_5E5B_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190701T171240_20190701T171322_016943_01FE1B_C3FA_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190722T070531_20190722T070618_017243_0206E3_AFFB_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190707T064028_20190707T064128_017024_02006A_F84A_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190708T072156_20190708T072256_017039_0200E2_A5FC_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190708T072056_20190708T072156_017039_0200E2_294A_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190707T064228_20190707T064247_017024_02006A_B834_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190714T175412_20190714T175512_017133_0203AF_4786_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190714T063417_20190714T063433_017126_02037C_4CCF_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190722T070805_20190722T070905_017243_0206E5_1778_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190705T065748_20190705T065848_016995_01FF9E_7F48_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190702T175411_20190702T175511_016958_01FE86_143A_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190723T060746_20190723T060822_017257_020756_248B_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190715T071342_20190715T071442_017141_0203EC_017B_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190724T064937_20190724T065037_017272_0207BD_35E8_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190720T072154_20190720T072305_017214_0205FA_ABF0_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190715T071242_20190715T071342_017141_0203EC_B321_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190703T071442_20190703T071542_016966_01FEC2_3FC2_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190724T051030_20190724T051105_017271_0207B9_005D_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190720T072054_20190720T072154_017214_0205FA_FFA2_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190702T175307_20190702T175411_016958_01FE86_24E3_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190704T173813_20190704T173913_016987_01FF66_F547_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190714T063217_20190714T063317_017126_02037C_A08C_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190707T064128_20190707T064228_017024_02006A_E500_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190719T050215_20190719T050253_017198_02057F_86F1_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190711T060745_20190711T060821_017082_02023E_C9E6_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190721T062406_20190721T062506_017228_020668_6954_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190715T071542_20190715T071642_017141_0203EC_8951_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190709T062505_20190709T062605_017053_020153_D635_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190722T070701_20190722T070805_017243_0206E5_28CC_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190713T171240_20190713T171304_017118_020343_F070_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190721T062506_20190721T062606_017228_020668_8DAE_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190706T172045_20190706T172115_017016_020036_0D11_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190724T064837_20190724T064937_017272_0207BD_2A93_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190717T181659_20190717T181803_017177_0204F6_7810_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190712T180930_20190712T181034_017104_0202E5_FB48_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190717T065748_20190717T065848_017170_0204C4_DBFA_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190725T055126_20190725T055153_017286_020827_AA3E_noiseScaling.npz", "S1B_EW_GRDM_1SDH_20190709T062605_20190709T062618_017053_020153_B468_noiseScaling.npz"]}} -------------------------------------------------------------------------------- /training/train_files/S1B_EW_GRDM_1SDH_powerBalancing.json: -------------------------------------------------------------------------------- 1 | {"S1B_EW_GRDM_HV_PB_3.1": {"mean": {"EW1": 0.00023246115717218618, "EW2": 0.00012558119721288184, "EW3": 0.00011540462205820958, "EW4": 7.833583407586546e-05, "EW5": 7.062990133940932e-05}, "rmse": {"EW1": 6.507118811121469e-05, "EW2": 3.907141106753145e-05, "EW3": 2.4792089556491528e-05, "EW4": 2.549727707926515e-05, "EW5": 4.568610025588676e-05}, "files": ["S1B_EW_GRDM_1SDH_20190714T175307_20190714T175412_017133_0203AF_940A_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190710T070805_20190710T070905_017068_0201CE_D25C_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190725T171247_20190725T171329_017293_020857_EE4A_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190707T180118_20190707T180223_017031_0200A5_4D32_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190701T055125_20190701T055151_016936_01FDEB_8978_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190717T065648_20190717T065748_017170_0204C4_8E7C_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190710T070530_20190710T070617_017068_0201CC_D3AF_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190724T065037_20190724T065059_017272_0207BD_C47A_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190724T051030_20190724T051105_017271_0207B9_005D_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190723T060746_20190723T060822_017257_020756_248B_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190712T051030_20190712T051104_017096_0202A4_C4B6_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190706T172045_20190706T172115_017016_020036_0D11_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190704T173813_20190704T173913_016987_01FF66_F547_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190712T180930_20190712T181034_017104_0202E5_FB48_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190701T171240_20190701T171322_016943_01FE1B_C3FA_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190717T051841_20190717T051916_017169_0204BE_CBA2_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190708T072156_20190708T072256_017039_0200E2_A5FC_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190721T062606_20190721T062619_017228_020668_9646_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190716T173813_20190716T173913_017162_020490_A820_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190708T072356_20190708T072456_017039_0200E2_6225_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190704T173708_20190704T173813_016987_01FF66_405C_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190712T064936_20190712T065036_017097_0202A8_6082_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190719T064028_20190719T064128_017199_020584_1EE0_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190703T071342_20190703T071442_016966_01FEC2_F95F_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190717T065748_20190717T065848_017170_0204C4_DBFA_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190705T065648_20190705T065748_016995_01FF9E_3AF1_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190724T064937_20190724T065037_017272_0207BD_35E8_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190719T180119_20190719T180223_017206_0205BF_0C91_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190725T055126_20190725T055153_017286_020827_AA3E_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190707T064028_20190707T064128_017024_02006A_F84A_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190709T062605_20190709T062618_017053_020153_B468_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190714T063417_20190714T063433_017126_02037C_4CCF_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190721T062506_20190721T062606_017228_020668_8DAE_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190722T070805_20190722T070905_017243_0206E5_1778_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190702T175307_20190702T175411_016958_01FE86_24E3_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190719T064128_20190719T064228_017199_020584_1F11_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190722T070531_20190722T070618_017243_0206E3_AFFB_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190713T171240_20190713T171304_017118_020343_F070_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190718T172046_20190718T172116_017191_020554_E3D0_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190722T164855_20190722T164925_017249_020718_945B_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190703T165700_20190703T165800_016972_01FEF5_9076_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190720T072154_20190720T072305_017214_0205FA_ABF0_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190720T072054_20190720T072154_017214_0205FA_FFA2_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190724T064837_20190724T064937_017272_0207BD_2A93_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190703T071442_20190703T071542_016966_01FEC2_3FC2_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190708T072056_20190708T072156_017039_0200E2_294A_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190709T062505_20190709T062605_017053_020153_D635_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190705T051841_20190705T051915_016994_01FF98_43FB_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190713T055125_20190713T055152_017111_020313_77FC_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190715T071542_20190715T071642_017141_0203EC_8951_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190705T065848_20190705T065913_016995_01FF9E_168A_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190714T175412_20190714T175512_017133_0203AF_4786_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190722T070701_20190722T070805_017243_0206E5_28CC_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190721T062406_20190721T062506_017228_020668_6954_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190705T181659_20190705T181803_017002_01FFD0_42AE_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190707T064128_20190707T064228_017024_02006A_E500_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190712T064836_20190712T064936_017097_0202A8_44CA_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190719T050215_20190719T050253_017198_02057F_86F1_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190714T063317_20190714T063417_017126_02037C_8A45_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190724T180931_20190724T181035_017279_0207FB_9B19_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190715T165700_20190715T165801_017147_02041E_D3AE_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190715T071242_20190715T071342_017141_0203EC_B321_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190717T181659_20190717T181803_017177_0204F6_7810_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190715T071342_20190715T071442_017141_0203EC_017B_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190710T164854_20190710T164925_017074_020202_8702_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190717T065848_20190717T065913_017170_0204C4_5E5B_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190707T064228_20190707T064247_017024_02006A_B834_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190705T065748_20190705T065848_016995_01FF9E_7F48_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190702T175411_20190702T175511_016958_01FE86_143A_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190722T070431_20190722T070531_017243_0206E3_1845_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190709T062405_20190709T062505_017053_020153_87DA_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190719T064228_20190719T064247_017199_020584_87C6_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190716T173709_20190716T173813_017162_020490_784D_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190703T071242_20190703T071342_016966_01FEC2_ABA7_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190708T072256_20190708T072356_017039_0200E2_DDCA_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190707T050215_20190707T050252_017023_020065_CB9C_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190715T071442_20190715T071542_017141_0203EC_FBA0_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190710T070700_20190710T070805_017068_0201CE_37A0_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190710T070430_20190710T070530_017068_0201CC_A6AF_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190711T060745_20190711T060821_017082_02023E_C9E6_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190712T065036_20190712T065058_017097_0202A8_08BD_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190714T063217_20190714T063317_017126_02037C_A08C_powerBalancing.npz", "S1B_EW_GRDM_1SDH_20190703T071542_20190703T071642_016966_01FEC2_C792_powerBalancing.npz"]}} -------------------------------------------------------------------------------- /training/train_files/S1B_EW_GRDM_1SDV_noiseScaling.json: -------------------------------------------------------------------------------- 1 | {"S1B_EW_GRDM_VH_NS_3.1": {"mean": {"EW1": 0.9156215353496956, "EW2": 0.8817625479428431, "EW3": 0.846375723587585, "EW4": 0.9504725744698451, "EW5": 1.0044985595625695}, "rmse": {"EW1": 0.026011667157778036, "EW2": 0.043744356741464215, "EW3": 0.03016947913777286, "EW4": 0.025943120263665593, "EW5": 0.056403032070229064}, "files": ["S1B_EW_GRDM_1SDV_20190826T191449_20190826T191549_017761_0216C5_1CE4_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190721T191647_20190721T191742_017236_0206AF_8AB4_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190815T071509_20190815T071613_017593_021182_2552_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190709T191446_20190709T191546_017061_02019C_94D9_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190901T072422_20190901T072522_017841_021931_010B_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190731T193250_20190731T193344_017382_020AF7_7BBA_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190831T192301_20190831T192401_017834_0218FF_0A4E_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190702T192458_20190702T192541_016959_01FE8E_868D_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190814T191548_20190814T191648_017586_02114B_5897_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190714T192459_20190714T192541_017134_0203B7_2B01_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190714T192359_20190714T192459_017134_0203B7_A3CA_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190727T072316_20190727T072420_017316_020903_3C95_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190827T071509_20190827T071613_017768_0216FE_10B5_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190801T073229_20190801T073329_017389_020B2B_E9E6_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190824T193252_20190824T193346_017732_0215CA_6C68_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190708T073228_20190708T073328_017039_0200E3_52F3_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190721T191547_20190721T191647_017236_0206AF_38D9_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190726T192359_20190726T192459_017309_0208CC_33AC_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190819T192501_20190819T192543_017659_02138C_7A02_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190812T193051_20190812T193151_017557_021053_7FB0_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190719T193050_20190719T193150_017207_0205C5_EE57_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190819T192301_20190819T192401_017659_02138C_7961_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190825T073230_20190825T073330_017739_021608_89C9_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190710T071611_20190710T071711_017068_0201CF_9264_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190719T193150_20190719T193250_017207_0205C5_2171_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190720T073124_20190720T073228_017214_0205FB_C3EB_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190727T072420_20190727T072520_017316_020903_1679_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190709T081117_20190709T081221_017054_02015F_197D_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190802T081118_20190802T081222_017404_020BAB_F473_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190721T191447_20190721T191547_017236_0206AF_53DC_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190715T072420_20190715T072520_017141_0203ED_A856_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190726T192259_20190726T192359_017309_0208CC_7799_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190819T192401_20190819T192501_017659_02138C_5D9F_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190703T072315_20190703T072419_016966_01FEC3_63A0_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190707T193249_20190707T193343_017032_0200AB_F824_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190703T072419_20190703T072519_016966_01FEC3_70FF_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190726T192459_20190726T192542_017309_0208CC_8245_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190707T193049_20190707T193149_017032_0200AB_F650_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190807T192500_20190807T192543_017484_020E16_4F66_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190824T193152_20190824T193252_017732_0215CA_952D_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190808T072317_20190808T072421_017491_020E4A_5341_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190721T081117_20190721T081222_017229_020672_1EE6_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190813T073125_20190813T073230_017564_02108F_015C_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190831T192401_20190831T192501_017834_0218FF_FF4C_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190808T072421_20190808T072521_017491_020E4A_3BEF_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190807T192400_20190807T192500_017484_020E16_8806_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190714T192259_20190714T192359_017134_0203B7_D9DF_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190807T192300_20190807T192400_017484_020E16_A5CE_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190731T193150_20190731T193250_017382_020AF7_9289_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190802T191547_20190802T191647_017411_020BEC_9770_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190707T193149_20190707T193249_017032_0200AB_51D1_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190702T192258_20190702T192358_016959_01FE8E_2B52_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190715T072315_20190715T072420_017141_0203ED_055E_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190814T191448_20190814T191548_017586_02114B_22E4_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190812T193151_20190812T193251_017557_021053_C6BE_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190709T191546_20190709T191646_017061_02019C_CEAD_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190826T191549_20190826T191649_017761_0216C5_B042_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190802T191647_20190802T191743_017411_020BEC_74BB_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190731T193050_20190731T193150_017382_020AF7_D5CE_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190803T071508_20190803T071612_017418_020C25_A796_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190722T071507_20190722T071611_017243_0206E6_BAEF_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190801T073124_20190801T073229_017389_020B2B_49C1_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190815T071613_20190815T071713_017593_021182_AFC1_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190720T073228_20190720T073328_017214_0205FB_CAC6_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190708T073123_20190708T073228_017039_0200E3_4B1E_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190719T193250_20190719T193344_017207_0205C5_B0FC_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190824T193052_20190824T193152_017732_0215CA_EAA9_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190802T191447_20190802T191547_017411_020BEC_C3D8_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190814T081119_20190814T081223_017579_021107_D2C8_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190820T072317_20190820T072422_017666_0213C1_ACD5_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190831T192501_20190831T192544_017834_0218FF_655A_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190722T071611_20190722T071711_017243_0206E6_1AF9_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190825T073126_20190825T073230_017739_021608_FAF3_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190827T071613_20190827T071713_017768_0216FE_AC18_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190710T071507_20190710T071611_017068_0201CF_D064_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190814T191648_20190814T191744_017586_02114B_59BA_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190813T073230_20190813T073330_017564_02108F_D27E_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190709T191646_20190709T191742_017061_02019C_540F_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190812T193251_20190812T193345_017557_021053_80F4_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190702T192358_20190702T192458_016959_01FE8E_E40E_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190820T072422_20190820T072522_017666_0213C1_38EC_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190826T081119_20190826T081224_017754_021684_4EBB_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190803T071612_20190803T071712_017418_020C25_C6E8_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190901T072318_20190901T072422_017841_021931_0861_noiseScaling.npz", "S1B_EW_GRDM_1SDV_20190826T191649_20190826T191744_017761_0216C5_393E_noiseScaling.npz"]}} -------------------------------------------------------------------------------- /training/train_files/S1B_EW_GRDM_1SDV_powerBalancing.json: -------------------------------------------------------------------------------- 1 | {"S1B_EW_GRDM_VH_PB_3.1": {"mean": {"EW1": 0.00019688949734920628, "EW2": 0.00013018478528655438, "EW3": 9.036219842634698e-05, "EW4": 5.8282778521685055e-05, "EW5": 5.914795037992601e-05}, "rmse": {"EW1": 6.0353213712238075e-05, "EW2": 3.131046261254578e-05, "EW3": 1.7147995183029084e-05, "EW4": 1.9265893600855857e-05, "EW5": 3.0415129224814317e-05}, "files": ["S1B_EW_GRDM_1SDV_20190824T193052_20190824T193152_017732_0215CA_EAA9_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190802T081118_20190802T081222_017404_020BAB_F473_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190710T071507_20190710T071611_017068_0201CF_D064_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190720T073228_20190720T073328_017214_0205FB_CAC6_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190722T071611_20190722T071711_017243_0206E6_1AF9_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190901T072318_20190901T072422_017841_021931_0861_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190731T193150_20190731T193250_017382_020AF7_9289_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190721T081117_20190721T081222_017229_020672_1EE6_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190807T192400_20190807T192500_017484_020E16_8806_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190827T071613_20190827T071713_017768_0216FE_AC18_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190814T081119_20190814T081223_017579_021107_D2C8_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190719T193150_20190719T193250_017207_0205C5_2171_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190820T072317_20190820T072422_017666_0213C1_ACD5_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190726T192359_20190726T192459_017309_0208CC_33AC_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190702T192258_20190702T192358_016959_01FE8E_2B52_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190703T072419_20190703T072519_016966_01FEC3_70FF_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190819T192301_20190819T192401_017659_02138C_7961_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190726T192459_20190726T192542_017309_0208CC_8245_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190819T192401_20190819T192501_017659_02138C_5D9F_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190719T193050_20190719T193150_017207_0205C5_EE57_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190702T192458_20190702T192541_016959_01FE8E_868D_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190801T073229_20190801T073329_017389_020B2B_E9E6_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190710T071611_20190710T071711_017068_0201CF_9264_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190813T073125_20190813T073230_017564_02108F_015C_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190707T193249_20190707T193343_017032_0200AB_F824_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190709T081117_20190709T081221_017054_02015F_197D_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190825T073230_20190825T073330_017739_021608_89C9_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190715T072420_20190715T072520_017141_0203ED_A856_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190812T193251_20190812T193345_017557_021053_80F4_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190812T193051_20190812T193151_017557_021053_7FB0_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190831T192301_20190831T192401_017834_0218FF_0A4E_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190709T191646_20190709T191742_017061_02019C_540F_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190720T073124_20190720T073228_017214_0205FB_C3EB_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190826T191649_20190826T191744_017761_0216C5_393E_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190714T192359_20190714T192459_017134_0203B7_A3CA_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190831T192401_20190831T192501_017834_0218FF_FF4C_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190826T081119_20190826T081224_017754_021684_4EBB_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190812T193151_20190812T193251_017557_021053_C6BE_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190703T072315_20190703T072419_016966_01FEC3_63A0_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190715T072315_20190715T072420_017141_0203ED_055E_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190827T071509_20190827T071613_017768_0216FE_10B5_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190803T071612_20190803T071712_017418_020C25_C6E8_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190702T192358_20190702T192458_016959_01FE8E_E40E_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190708T073123_20190708T073228_017039_0200E3_4B1E_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190731T193250_20190731T193344_017382_020AF7_7BBA_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190826T191549_20190826T191649_017761_0216C5_B042_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190721T191647_20190721T191742_017236_0206AF_8AB4_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190714T192259_20190714T192359_017134_0203B7_D9DF_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190727T072420_20190727T072520_017316_020903_1679_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190808T072317_20190808T072421_017491_020E4A_5341_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190814T191548_20190814T191648_017586_02114B_5897_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190802T191547_20190802T191647_017411_020BEC_9770_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190815T071613_20190815T071713_017593_021182_AFC1_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190814T191448_20190814T191548_017586_02114B_22E4_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190814T191648_20190814T191744_017586_02114B_59BA_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190707T193149_20190707T193249_017032_0200AB_51D1_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190726T192259_20190726T192359_017309_0208CC_7799_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190719T193250_20190719T193344_017207_0205C5_B0FC_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190808T072421_20190808T072521_017491_020E4A_3BEF_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190731T193050_20190731T193150_017382_020AF7_D5CE_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190714T192459_20190714T192541_017134_0203B7_2B01_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190721T191447_20190721T191547_017236_0206AF_53DC_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190820T072422_20190820T072522_017666_0213C1_38EC_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190709T191546_20190709T191646_017061_02019C_CEAD_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190807T192500_20190807T192543_017484_020E16_4F66_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190802T191447_20190802T191547_017411_020BEC_C3D8_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190825T073126_20190825T073230_017739_021608_FAF3_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190826T191449_20190826T191549_017761_0216C5_1CE4_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190801T073124_20190801T073229_017389_020B2B_49C1_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190824T193152_20190824T193252_017732_0215CA_952D_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190727T072316_20190727T072420_017316_020903_3C95_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190824T193252_20190824T193346_017732_0215CA_6C68_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190901T072422_20190901T072522_017841_021931_010B_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190709T191446_20190709T191546_017061_02019C_94D9_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190819T192501_20190819T192543_017659_02138C_7A02_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190802T191647_20190802T191743_017411_020BEC_74BB_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190803T071508_20190803T071612_017418_020C25_A796_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190708T073228_20190708T073328_017039_0200E3_52F3_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190807T192300_20190807T192400_017484_020E16_A5CE_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190813T073230_20190813T073330_017564_02108F_D27E_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190722T071507_20190722T071611_017243_0206E6_BAEF_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190721T191547_20190721T191647_017236_0206AF_38D9_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190831T192501_20190831T192544_017834_0218FF_655A_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190707T193049_20190707T193149_017032_0200AB_F650_powerBalancing.npz", "S1B_EW_GRDM_1SDV_20190815T071509_20190815T071613_017593_021182_2552_powerBalancing.npz"]}} -------------------------------------------------------------------------------- /training/train_files/S1B_IW_GRDH_1SDH_noiseScaling.json: -------------------------------------------------------------------------------- 1 | {"S1B_IW_GRDH_HV_NS_3.1": {"mean": {"IW1": 0.9659684326707487, "IW2": 0.9369043201985305, "IW3": 1.0444934189848722}, "rmse": {"IW1": 0.06149039406464872, "IW2": 0.04822513945953027, "IW3": 0.02610997781036494}, "files": ["S1B_IW_GRDH_1SDH_20190718T092545_20190718T092610_017186_020531_2EA2_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20191022T092459_20191022T092524_018586_02304B_8313_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190706T092544_20190706T092609_017011_020012_117D_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190801T090840_20190801T090905_017390_020B36_E093_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190823T092522_20190823T092547_017711_021529_C2F6_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190928T092458_20190928T092523_018236_02256C_A7C0_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190906T090842_20190906T090908_017915_021B79_B990_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190916T092458_20190916T092523_018061_022008_8011_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190930T090843_20190930T090909_018265_022657_0C80_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190811T092559_20190811T092631_017536_020FB3_74B3_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190823T092457_20190823T092522_017711_021529_80F7_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190706T092454_20190706T092519_017011_020012_DA3C_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20191010T092548_20191010T092613_018411_022AE9_AC77_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20191024T090843_20191024T090909_018615_023127_060E_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20191022T092524_20191022T092549_018586_02304B_A8C3_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190916T092523_20190916T092548_018061_022008_7C2A_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190706T092519_20190706T092544_017011_020012_C88D_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190708T090839_20190708T090904_017040_0200EC_44B7_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190811T092509_20190811T092534_017536_020FB3_4FC3_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20191022T092549_20191022T092614_018586_02304B_C379_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20191010T092458_20191010T092523_018411_022AE9_8AB9_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20191012T090843_20191012T090909_018440_022BD4_1FBF_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190811T092534_20190811T092559_017536_020FB3_385D_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190904T092547_20190904T092612_017886_021A94_ED2A_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190904T092457_20190904T092522_017886_021A94_4C70_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190718T092520_20190718T092545_017186_020531_8C84_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190916T092548_20190916T092613_018061_022008_536C_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190813T090841_20190813T090906_017565_021099_0AC1_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190928T092548_20190928T092613_018236_02256C_C559_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190718T092455_20190718T092520_017186_020531_2E9F_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190904T092522_20190904T092547_017886_021A94_13F1_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190825T090841_20190825T090907_017740_021612_B33D_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190918T090843_20190918T090908_018090_0220F3_2413_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190720T090839_20190720T090905_017215_020604_2B69_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190928T092523_20190928T092548_018236_02256C_C3DC_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20190823T092547_20190823T092612_017711_021529_BEB2_noiseScaling.npz", "S1B_IW_GRDH_1SDH_20191010T092523_20191010T092548_018411_022AE9_C064_noiseScaling.npz"]}} -------------------------------------------------------------------------------- /training/train_files/S1B_IW_GRDH_1SDH_powerBalancing.json: -------------------------------------------------------------------------------- 1 | {"S1B_IW_GRDH_HV_PB_3.1": {"mean": {"IW1": 0.00017387301797000245, "IW2": -1.6034622720946086e-06, "IW3": -0.00019366891433002188}, "rmse": {"IW1": 9.492525536573223e-05, "IW2": 2.6810374972952956e-05, "IW3": 3.069389338455997e-05}, "files": ["S1B_IW_GRDH_1SDH_20190904T092457_20190904T092522_017886_021A94_4C70_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190706T092454_20190706T092519_017011_020012_DA3C_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20191010T092523_20191010T092548_018411_022AE9_C064_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190916T092548_20190916T092613_018061_022008_536C_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20191022T092549_20191022T092614_018586_02304B_C379_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20191022T092524_20191022T092549_018586_02304B_A8C3_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190811T092559_20190811T092631_017536_020FB3_74B3_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190708T090839_20190708T090904_017040_0200EC_44B7_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190930T090843_20190930T090909_018265_022657_0C80_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190706T092544_20190706T092609_017011_020012_117D_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20191010T092548_20191010T092613_018411_022AE9_AC77_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190718T092520_20190718T092545_017186_020531_8C84_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190718T092545_20190718T092610_017186_020531_2EA2_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190801T090840_20190801T090905_017390_020B36_E093_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190811T092534_20190811T092559_017536_020FB3_385D_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20191024T090843_20191024T090909_018615_023127_060E_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190720T090839_20190720T090905_017215_020604_2B69_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190823T092522_20190823T092547_017711_021529_C2F6_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190823T092547_20190823T092612_017711_021529_BEB2_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20191022T092459_20191022T092524_018586_02304B_8313_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190916T092523_20190916T092548_018061_022008_7C2A_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190906T090842_20190906T090908_017915_021B79_B990_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190823T092457_20190823T092522_017711_021529_80F7_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20191012T090843_20191012T090909_018440_022BD4_1FBF_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190813T090841_20190813T090906_017565_021099_0AC1_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190718T092455_20190718T092520_017186_020531_2E9F_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190825T090841_20190825T090907_017740_021612_B33D_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190904T092547_20190904T092612_017886_021A94_ED2A_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190811T092509_20190811T092534_017536_020FB3_4FC3_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190928T092548_20190928T092613_018236_02256C_C559_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190928T092458_20190928T092523_018236_02256C_A7C0_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20191010T092458_20191010T092523_018411_022AE9_8AB9_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190916T092458_20190916T092523_018061_022008_8011_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190904T092522_20190904T092547_017886_021A94_13F1_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190928T092523_20190928T092548_018236_02256C_C3DC_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190918T090843_20190918T090908_018090_0220F3_2413_powerBalancing.npz", "S1B_IW_GRDH_1SDH_20190706T092519_20190706T092544_017011_020012_C88D_powerBalancing.npz"]}} -------------------------------------------------------------------------------- /training/train_files/S1B_IW_GRDH_1SDV_noiseScaling.json: -------------------------------------------------------------------------------- 1 | {"S1B_IW_GRDH_VH_NS_3.1": {"mean": {"IW1": 0.9854355962303176, "IW2": 0.9880535882006505, "IW3": 1.1000176989490251}, "rmse": {"IW1": 0.03513482229077566, "IW2": 0.02591749076937106, "IW3": 0.023657444777965737}, "files": ["S1B_IW_GRDH_1SDV_20190705T070620_20190705T070645_016995_01FFA0_5556_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190705T194901_20190705T194926_017003_01FFD6_7E55_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190701T074032_20190701T074057_016937_01FDF4_6E8E_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190701T184338_20190701T184403_016944_01FE22_9C8D_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190706T074904_20190706T074929_017010_02000A_9ADC_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190701T073848_20190701T073917_016937_01FDF4_5A2B_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190705T070710_20190705T070735_016995_01FFA0_1BF8_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190704T190623_20190704T190648_016988_01FF6B_6DDE_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190705T070800_20190705T070825_016995_01FFA0_AB58_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190701T184158_20190701T184223_016944_01FE22_AC52_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190707T065002_20190707T065027_017024_02006B_687D_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190706T185031_20190706T185056_017017_02003B_BB7C_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190705T194717_20190705T194746_017003_01FFD6_FBBC_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190706T074749_20190706T074814_017010_02000A_FADB_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190707T065117_20190707T065142_017024_02006B_AD11_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190705T070735_20190705T070800_016995_01FFA0_7BB4_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190706T184941_20190706T185006_017017_02003B_D7C3_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190701T184133_20190701T184158_016944_01FE22_0A26_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190701T184223_20190701T184248_016944_01FE22_92EC_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190705T070645_20190705T070710_016995_01FFA0_80C5_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190701T074122_20190701T074147_016937_01FDF4_50AC_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190701T074057_20190701T074122_016937_01FDF4_7DB2_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190706T185056_20190706T185121_017017_02003B_4BD6_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190707T065142_20190707T065207_017024_02006B_8412_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190707T065207_20190707T065232_017024_02006B_03DF_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190706T074724_20190706T074749_017010_02000A_CD08_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190701T184403_20190701T184428_016944_01FE22_6816_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190707T065027_20190707T065052_017024_02006B_6178_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190704T080339_20190704T080404_016981_01FF37_71AA_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190704T080404_20190704T080429_016981_01FF37_8DEB_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190705T070526_20190705T070555_016995_01FFA0_2832_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190705T070825_20190705T070850_016995_01FFA0_9506_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190705T194811_20190705T194836_017003_01FFD6_D72D_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190705T194836_20190705T194901_017003_01FFD6_A361_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190701T184248_20190701T184313_016944_01FE22_455C_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190707T064912_20190707T064937_017024_02006B_CC4B_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190707T064937_20190707T065002_017024_02006B_1FE1_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190704T190648_20190704T190713_016988_01FF6B_0009_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190705T194746_20190705T194811_017003_01FFD6_F50F_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190706T074839_20190706T074904_017010_02000A_C41E_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190706T074814_20190706T074839_017010_02000A_D1FA_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190707T065052_20190707T065117_017024_02006B_91E8_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190704T080310_20190704T080339_016981_01FF37_D7B6_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190706T074929_20190706T074954_017010_02000A_65E2_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190706T185121_20190706T185148_017017_02003B_A8EE_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190705T070555_20190705T070620_016995_01FFA0_35D7_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190706T185006_20190706T185031_017017_02003B_D4FC_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190706T074655_20190706T074724_017010_02000A_4ADD_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190704T190713_20190704T190741_016988_01FF6B_6EEE_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190701T184428_20190701T184453_016944_01FE22_8355_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190701T073942_20190701T074007_016937_01FDF4_9690_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190701T074007_20190701T074032_016937_01FDF4_FB2E_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190701T184313_20190701T184338_016944_01FE22_BA3D_noiseScaling.npz", "S1B_IW_GRDH_1SDV_20190701T073917_20190701T073942_016937_01FDF4_187D_noiseScaling.npz"]}} -------------------------------------------------------------------------------- /training/train_files/S1B_IW_GRDH_1SDV_powerBalancing.json: -------------------------------------------------------------------------------- 1 | {"S1B_IW_GRDH_VH_PB_3.1": {"mean": {"IW1": 6.12148863331148e-05, "IW2": 1.1930866550091356e-05, "IW3": -0.00011182451896724408}, "rmse": {"IW1": 4.995379626340016e-05, "IW2": 2.4358470444692604e-05, "IW3": 2.8886144262253105e-05}, "files": ["S1B_IW_GRDH_1SDV_20190701T184338_20190701T184403_016944_01FE22_9C8D_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190705T194901_20190705T194926_017003_01FFD6_7E55_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190701T184248_20190701T184313_016944_01FE22_455C_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190705T070825_20190705T070850_016995_01FFA0_9506_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190707T065117_20190707T065142_017024_02006B_AD11_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190701T073942_20190701T074007_016937_01FDF4_9690_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190701T073917_20190701T073942_016937_01FDF4_187D_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190701T184158_20190701T184223_016944_01FE22_AC52_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190706T074904_20190706T074929_017010_02000A_9ADC_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190707T064912_20190707T064937_017024_02006B_CC4B_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190705T194836_20190705T194901_017003_01FFD6_A361_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190701T184313_20190701T184338_016944_01FE22_BA3D_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190704T080404_20190704T080429_016981_01FF37_8DEB_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190704T080310_20190704T080339_016981_01FF37_D7B6_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190706T074655_20190706T074724_017010_02000A_4ADD_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190706T074929_20190706T074954_017010_02000A_65E2_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190701T184223_20190701T184248_016944_01FE22_92EC_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190705T070710_20190705T070735_016995_01FFA0_1BF8_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190706T074749_20190706T074814_017010_02000A_FADB_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190707T065052_20190707T065117_017024_02006B_91E8_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190706T185056_20190706T185121_017017_02003B_4BD6_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190705T070800_20190705T070825_016995_01FFA0_AB58_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190706T074724_20190706T074749_017010_02000A_CD08_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190706T185031_20190706T185056_017017_02003B_BB7C_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190704T190713_20190704T190741_016988_01FF6B_6EEE_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190705T070735_20190705T070800_016995_01FFA0_7BB4_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190701T184428_20190701T184453_016944_01FE22_8355_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190705T070620_20190705T070645_016995_01FFA0_5556_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190706T185006_20190706T185031_017017_02003B_D4FC_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190705T070526_20190705T070555_016995_01FFA0_2832_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190704T080339_20190704T080404_016981_01FF37_71AA_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190707T065142_20190707T065207_017024_02006B_8412_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190701T184403_20190701T184428_016944_01FE22_6816_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190701T074032_20190701T074057_016937_01FDF4_6E8E_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190707T065002_20190707T065027_017024_02006B_687D_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190707T064937_20190707T065002_017024_02006B_1FE1_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190707T065027_20190707T065052_017024_02006B_6178_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190704T190648_20190704T190713_016988_01FF6B_0009_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190701T184133_20190701T184158_016944_01FE22_0A26_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190705T070645_20190705T070710_016995_01FFA0_80C5_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190701T074057_20190701T074122_016937_01FDF4_7DB2_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190704T190623_20190704T190648_016988_01FF6B_6DDE_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190705T194746_20190705T194811_017003_01FFD6_F50F_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190701T074007_20190701T074032_016937_01FDF4_FB2E_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190701T074122_20190701T074147_016937_01FDF4_50AC_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190705T194717_20190705T194746_017003_01FFD6_FBBC_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190706T184941_20190706T185006_017017_02003B_D7C3_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190706T074814_20190706T074839_017010_02000A_D1FA_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190707T065207_20190707T065232_017024_02006B_03DF_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190701T073848_20190701T073917_016937_01FDF4_5A2B_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190705T070555_20190705T070620_016995_01FFA0_35D7_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190706T185121_20190706T185148_017017_02003B_A8EE_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190706T074839_20190706T074904_017010_02000A_C41E_powerBalancing.npz", "S1B_IW_GRDH_1SDV_20190705T194811_20190705T194836_017003_01FFD6_D72D_powerBalancing.npz"]}} -------------------------------------------------------------------------------- /training/update_apg_coefficients.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | """ This python script collects values of antenna pattern gain (APG), sigma0, incidence angle, etc from pre-processed files. 4 | Then it computes coefficient B for equation: 5 | Y = X B 6 | 7 | Where Y is sigma0_HV, and X is a mtrix with the following columns: 8 | [1, incidence_angel, apg_ew1, 1, apg_ew2, 1, apg_ew3, 1, apg_ew4, 1, apg_ew5, 1] 9 | The first two columns have values for all rows, other columns have values only for correposning sub-swaths, or zeros for other subswaths. 10 | 11 | Coefficient B is computed for each combination of platform, polarisation, mode, IPF 12 | The results are saved in denoising_parameters.json 13 | 14 | run example: 15 | python process_apg_data.py /path/to/APG-files 16 | 17 | """ 18 | import argparse 19 | from collections import defaultdict 20 | import glob 21 | import json 22 | import os 23 | from pathlib import Path 24 | 25 | import numpy as np 26 | import matplotlib.pyplot as plt 27 | 28 | from s1denoise.utils import skip_swath_borders, build_AY_matrix, solve 29 | from update_parameter_file import safe_load 30 | 31 | array_names = [ 32 | 'line', 33 | 'pixel', 34 | 'noise', 35 | 'swath_ids', 36 | 'eap', 37 | 'rsl', 38 | 'eleang', 39 | 'incang', 40 | 'cal_s0hv', 41 | 'scall_hv', 42 | 'dn_vectors', 43 | ] 44 | 45 | item_names = [ 46 | 'pg_amplitude', 47 | 'noise_po_co_fa', 48 | 'k_proc', 49 | 'noise_ca_fa', 50 | 'ipf', 51 | ] 52 | 53 | polarization = 'HV' 54 | scale_APG = 1e21 55 | scale_HV = 1000 56 | s0hv_max = [None, 3.0, 1.3, 1.0, 0.9, 0.8] 57 | s0hv_apg_corr_min = [None, 0.96, 0.89, 0.89, 0.95, 0.80] 58 | IPF_mapping = { 59 | 2.36 : 2.36, 60 | 2.40 : 2.43, # extra 61 | 2.43 : 2.43, 62 | 2.45 : 2.45, 63 | 2.50 : 2.51, # extra 64 | 2.51 : 2.51, 65 | 2.52 : 2.52, 66 | 2.53 : 2.53, 67 | 2.60 : 2.60, 68 | 2.70 : 2.71, # extra 69 | 2.71 : 2.71, 70 | 2.72 : 2.72, 71 | 2.82 : 2.82, 72 | 2.84 : 2.84, 73 | 2.90 : 2.91, # extra 74 | 2.91 : 2.91, 75 | 3.10 : 3.10, 76 | 3.20 : 3.31, # extra 77 | 3.30 : 3.31, # extra 78 | 3.31 : 3.31, 79 | 3.40 : 3.52, # extra 80 | 3.51 : 3.52, # extra 81 | 3.52 : 3.52, 82 | 3.61 : 3.61, 83 | } 84 | 85 | def get_uid_mapping(uids): 86 | uid_mapping = {} 87 | for platform in ['S1A', 'S1B']: 88 | ipf2uid = {float(uid.split('_')[-1]): uid for uid in uids if uid.startswith(platform)} 89 | for dst_ipf in IPF_mapping: 90 | src_ipf = IPF_mapping[dst_ipf] 91 | if src_ipf in ipf2uid: 92 | src_uid = ipf2uid[src_ipf] 93 | dst_uid = '_'.join(src_uid.split('_')[:-1] + [f'{dst_ipf:04.2f}']) 94 | uid_mapping[dst_uid] = src_uid 95 | return uid_mapping 96 | 97 | def parse_run_experiment_args(): 98 | """ Parse input args for run_experiment_* scripts """ 99 | parser = argparse.ArgumentParser(description='Process SAFE or ZIP files and collect APG related values') 100 | parser.add_argument('inp_dir', type=Path) 101 | parser.add_argument('out_file', type=Path) 102 | return parser.parse_args() 103 | 104 | 105 | args = parse_run_experiment_args() 106 | ifiles = sorted(glob.glob(f'{args.inp_dir}/S1*_apg.npz')) 107 | # good files 108 | gfiles = [] 109 | 110 | l = defaultdict(list) 111 | for ifile in ifiles: 112 | print('Read', ifile) 113 | # load data 114 | ds = np.load(ifile, allow_pickle=True) 115 | # 5: remove files withouth noise power correction factor (probably nrt-3h?) 116 | # Fewer files in IPFs 2.36, 2.43, 2.45, 2.51, 2.52 (slightly better quality here), 2.53, 2.60, 117 | #if len(ds["noise_po_co_fa"].item().keys()) == 0: 118 | # continue 119 | gfiles.append(ifile) 120 | d = {n: ds[n] for n in array_names} 121 | d.update({n: ds[n].item() for n in item_names}) 122 | 123 | # compute values 124 | sigma0hv = d['dn_vectors'] ** 2 / d['cal_s0hv'] ** 2 125 | g_tots = [] 126 | for i, (jjj, eee, rrr, sss, ccc) in enumerate(zip(d['swath_ids'], d['eap'], d['rsl'], d['scall_hv'], d['cal_s0hv'])): 127 | # 0: original 128 | # g_tot = sss / eee ** 2 / rrr ** 1.5 / ccc ** 2 129 | # 1: better correspondence 130 | g_tot = sss / eee ** 2 / rrr ** 2 / ccc ** 2 131 | for j in range(1,6): 132 | gpi = jjj == j 133 | key = f'EW{j}' 134 | # 2: add k_proc (same as #1) 135 | #g_tot[gpi] *= d['k_proc'][key] 136 | # 3: add noise calibration factor (2.36 and 2.51 became much worse / unusable, other IPFs - same) 137 | #g_tot[gpi] *= d['noise_ca_fa'][key] 138 | # 4. add pg product amplitude (2.52 became a bit better but 2.36 and 2.51 are still anusable) 139 | #g_tot[gpi] *= d['pg_amplitude'][key][i] 140 | # 6. add noise power correction factor 141 | # (2.36 much better, other IPFs not much different from 5. Some a slightly better. Some are slightly worse.) 142 | #g_tot[gpi] *= d['noise_po_co_fa'][key][i] 143 | # 7. only pg product amplitude (without kproc, noise_ca_fa, noise_po_co_fa, filtering by noise_po_co_fa presence) 144 | # (almost the same as #1; some IPFs are a bit better; some a abit worse; number of usable files - the same) 145 | g_tot[gpi] *= d['pg_amplitude'][key][i] 146 | g_tots.append(g_tot) 147 | 148 | l['ipf'].append(d['ipf']) 149 | l['apg'].append(np.array(g_tots[1:-1])) 150 | l['sigma0hv'].append(sigma0hv[1:-1]) 151 | l['swath_ids'].append(d['swath_ids'][1:-1]) 152 | l['incang'].append(d['incang'][1:-1]) 153 | 154 | apg_all = np.hstack([np.hstack(i) for i in l['apg']]) 155 | sigma0_all = np.hstack([np.hstack(i) for i in l['sigma0hv']]) 156 | 157 | nanmean_apg = np.nanmean(apg_all) 158 | nanmean_s0hv = np.nanmean(sigma0_all) 159 | scale_APG = 2 / nanmean_apg 160 | print(f'\{nanmean_apg} {nanmean_s0hv} {scale_APG}') 161 | print(f'{(nanmean_apg * scale_APG)} {(nanmean_s0hv * scale_HV)}\n') 162 | 163 | 164 | ll = defaultdict(list) 165 | for ipf, apg, sigma0hv, swath_ids, incang, ifile in zip(l['ipf'], l['apg'], l['sigma0hv'], l['swath_ids'], l['incang'], gfiles): 166 | print('Build', ifile) 167 | name_parts = os.path.basename(ifile).split('_') 168 | platform, mode, resolution, pol = name_parts[0], name_parts[1], name_parts[2], name_parts[3] 169 | uid = f'{platform}_{mode}_{resolution}_{pol}_APG_{ipf:04.2f}' 170 | swath_ids_skip = skip_swath_borders(swath_ids, skip=2) 171 | sigma0hv_s = [i * scale_HV for i in sigma0hv] 172 | apg_s = [i * scale_APG for i in apg] 173 | A, Y = build_AY_matrix(swath_ids_skip, sigma0hv_s, apg_s, incang, s0hv_max, s0hv_apg_corr_min) 174 | if A is not None: 175 | ll['a'].append(A) 176 | ll['y'].append(Y) 177 | ll['uid'].append(uid) 178 | 179 | uids, uid_inverse = np.unique(ll['uid'], return_inverse=True) 180 | B = {} 181 | rmsd = {} 182 | 183 | for i, uid in enumerate(uids): 184 | print('Solve', uid) 185 | uid_indices = np.where(uid_inverse == i)[0] 186 | A = [ll['a'][uid_idx] for uid_idx in uid_indices] 187 | Y = [ll['y'][uid_idx] for uid_idx in uid_indices] 188 | A = np.vstack(A) 189 | Y = np.vstack(Y) 190 | B[uid], rmsd[uid] = solve(A, Y) 191 | Yrec = np.dot(A, B[uid]) 192 | plt.plot(Y.flat, Yrec, 'k.', alpha=0.1) 193 | plt.plot(Y.flat, Y.flat, 'r-') 194 | plt.title(f'{uid} {uid_indices.size} {rmsd[uid]:1.2f}') 195 | plt.xlim([0, 6]) 196 | plt.ylim([0, 6]) 197 | plt.gca().set_aspect('equal') 198 | plt.savefig(f'{uid}_quality_pg7.png') 199 | plt.close() 200 | 201 | uid_mapping = get_uid_mapping(uids) 202 | 203 | p = safe_load(args.out_file) 204 | for uid in uid_mapping: 205 | print(f'Save {uid} ({uid_mapping[uid]})') 206 | p[uid] = dict( 207 | Y_SCALE = scale_HV, 208 | A_SCALE = scale_APG, 209 | B = B[uid_mapping[uid]].tolist(), 210 | RMSD = rmsd[uid_mapping[uid]], 211 | ) 212 | 213 | with open(args.out_file, "w") as f: 214 | json.dump(p, f) 215 | -------------------------------------------------------------------------------- /training/update_parameter_file.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """ Copy noise scaling or power balancing coefficients to the main JSON file 3 | 4 | python update_parameter_file.py powerBalancing/S1B_EW_GRDM_1SDH_power_balancning.json ../denoising_parameters.json 5 | python update_parameter_file.py noiseScaling/S1B_EW_GRDM_1SDH_noise_scaling.json ~/s1denoise/parameters.json 6 | """ 7 | 8 | import argparse 9 | import json 10 | import os 11 | 12 | import numpy as np 13 | 14 | def restricted_float(x): 15 | try: 16 | x = float(x) 17 | except ValueError: 18 | raise argparse.ArgumentTypeError("%r not a floating-point literal" % (x,)) 19 | 20 | if x < 0.0 or x > 100.0: 21 | raise argparse.ArgumentTypeError("%r not in range [0.0, 100.0]"%(x,)) 22 | return x 23 | 24 | def parse_args(): 25 | """ Parse input args for analyze_experiment_* scripts """ 26 | parser = argparse.ArgumentParser(description='Copy coefficients to central JSON file') 27 | parser.add_argument('inp_file') 28 | parser.add_argument('out_file') 29 | parser.add_argument('-d', '--dst_ipf', type=restricted_float, 30 | help='Additional destination IPF ver. to copy the results') 31 | return parser.parse_args() 32 | 33 | def safe_load(input_file): 34 | """ Load JSON file or make empty dict """ 35 | try: 36 | with open(input_file, 'rt') as f: 37 | result = json.load(f) 38 | except: 39 | print(f'Invalid data in {input_file}') 40 | result = {} 41 | return result 42 | 43 | def main(): 44 | args = parse_args() 45 | out_file2 = args.out_file.replace('.json', '_training_files.json') 46 | ifiles = [args.inp_file, args.out_file, out_file2] 47 | inp_par, out_par, out_files = [safe_load(ifile) for ifile in ifiles] 48 | 49 | for ipf_key in inp_par: 50 | if ipf_key not in out_par: 51 | out_par[ipf_key] = {} 52 | if args.dst_ipf is not None: 53 | dst_ipf_key = ipf_key.replace(ipf_key.split('_')[-1], str(args.dst_ipf)) 54 | out_par[dst_ipf_key] = {} 55 | if ipf_key not in out_files: 56 | out_files[ipf_key] = {} 57 | if args.dst_ipf is not None: 58 | out_files[dst_ipf_key] = {} 59 | for swath in inp_par[ipf_key]['mean']: 60 | #print(ipf_key, swath, inp_par[ipf_key]['mean'][swath], out_par[ipf_key][swath]) 61 | out_par[ipf_key][swath] = inp_par[ipf_key]['mean'][swath] 62 | out_files[ipf_key] = inp_par[ipf_key]['files'] 63 | if args.dst_ipf is not None: 64 | #print(args.dst_ipf, swath, inp_par[ipf_key]['mean'][swath], out_par[ipf_key][swath]) 65 | out_par[dst_ipf_key][swath] = inp_par[ipf_key]['mean'][swath] 66 | out_files[dst_ipf_key] = inp_par[ipf_key]['files'] 67 | 68 | with open(args.out_file, 'w') as f: 69 | json.dump(out_par, f) 70 | 71 | with open(out_file2, 'w') as f: 72 | json.dump(out_files, f) 73 | 74 | if __name__ == "__main__": 75 | main() 76 | -------------------------------------------------------------------------------- /validation/README.md: -------------------------------------------------------------------------------- 1 | # Quality assessment of thermal noise removal in range and azimuth directions for multi-swath S1 images 2 | 3 | This directory contain scripts for quality assessment of thermal noise removal from S1-A/B Level-1 GRD images. The quality assessment comprises the proposed quality metric calculation for range and azimuth directions. The range quality metric (RQM) is based on Fisher's criteria and allows to estimate how a noise removal algorithm reduce discontinuities in sub-swaths for multi-swath acquisition - the less value of RQM means more successful noise removal. 4 |
The azimuth quality metric (AQM) is based on periodicity detection in the signal i azimuth direction using the auto-correlation function and a simple indication of the existence of a prominent scalloping effect. 5 | 6 | To perform the validation you need: 7 | 8 | 1. Run the script ``` python run_qm_batch.py rqm/aqm /path/to/L1/GRD/files /path/to/output/dir ``` to caclulate RQM/AQM for individual files 9 | 2. Run the script ``` python rqm_plot.py input/npz/path output/path ``` to plot the averaged statistics for each region as an aggregated bar plot 10 | 3. Run the script ``` python rqm_tables.py input/npz/path output/path ``` to generate latex-tables of the obtained statistics 11 | -------------------------------------------------------------------------------- /validation/rqm_plot.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """ Range quality metric plotting and averaging for each sensing mode 3 | for both platforms [S1A/S1B] from individual npz files 4 | 5 | run example: 6 | run rqm_plot.py input/npz/path output/path 7 | 8 | output: 9 | PNG figures with RQM mean values, STD and mean signed difference between the algorithms 10 | 11 | """ 12 | 13 | import argparse 14 | import glob 15 | import os 16 | import matplotlib 17 | matplotlib.use('agg') 18 | import matplotlib.pyplot as plt 19 | import numpy as np 20 | 21 | def parse_run_experiment_args(): 22 | """ Parse input args for run_experiment_* scripts """ 23 | parser = argparse.ArgumentParser(description='Plotting aggregated statistics on RQM from individual npz files') 24 | parser.add_argument('in_path') 25 | parser.add_argument('out_path') 26 | parser.add_argument('y_min') 27 | parser.add_argument('y_max') 28 | parser.add_argument('-c', '--cores', default=2, type=int, 29 | help='Number of cores for parallel computation') 30 | return parser.parse_args() 31 | 32 | def plot_results(d_plot, out_path): 33 | plt.clf() 34 | plt.rcParams['xtick.labelsize'] = 8 35 | fig = plt.figure() 36 | ax = fig.add_subplot(111) 37 | color_list = ['#459EB0', '#B0459E', '#9EB045'] 38 | gap = 0.25 39 | x = np.arange(len(d_plot.keys())+1) 40 | 41 | esa_data = [] 42 | nersc_data = [] 43 | diff_data = [] 44 | 45 | for key in d_plot.keys(): 46 | esa_data.append((d_plot[key]['Mean_ESA'], d_plot[key]['STD_ESA'])) 47 | nersc_data.append((d_plot[key]['Mean_NERSC'], d_plot[key]['STD_NERSC'])) 48 | diff_data.append((d_plot[key]['Mean_Diff'], d_plot[key]['STD_Diff'])) 49 | 50 | try: 51 | esa_m = np.nanmean(np.array(esa_data)[:, 0]) 52 | esa_std = np.nanstd(np.array(esa_data)[:, 1]) 53 | esa_data.append((esa_m, esa_std)) 54 | 55 | nersc_m = np.nanmean(np.array(nersc_data)[:, 0]) 56 | nersc_std = np.nanstd(np.array(nersc_data)[:, 1]) 57 | nersc_data.append((nersc_m, nersc_std)) 58 | 59 | diff_m = np.nanmean(np.array(diff_data)[:, 0]) 60 | diff_std = np.nanstd(np.array(diff_data)[:, 1]) 61 | diff_data.append((diff_m, diff_std)) 62 | 63 | print(np.array(esa_data)[:,0]) 64 | print(np.array(nersc_data)[:, 0]) 65 | 66 | ax.bar(x, np.array(esa_data)[:,0], 67 | width=gap, 68 | color=color_list[0], yerr=np.array(esa_data)[:,1]) 69 | 70 | ax.bar(x+gap, np.array(nersc_data)[:,0], 71 | width=gap, 72 | color=color_list[1], yerr=np.array(nersc_data)[:,1]) 73 | 74 | ax.bar(x+gap*2, np.array(diff_data)[:,0], 75 | width=gap, 76 | color=color_list[2], yerr=np.array(diff_data)[:,1]) 77 | 78 | ax.set_xticks(x+gap) 79 | labels = list(d_plot.keys()) 80 | labels.append('Mean') 81 | ax.set_xticklabels(labels) 82 | ax.set_ylabel('RQM') 83 | ax.set_ylim(float(args.y_min), float(args.y_max)) 84 | ax.set_title('RQM: %s %s %s' % (platform, mode[0], mode[1])) 85 | ax.legend(('ESA', 'NERSC', 'Diff.')) 86 | except: 87 | pass 88 | 89 | plt.savefig(out_path, bbox_inches='tight', dpi=300) 90 | 91 | def get_mean_std(pref, data): 92 | res_ll = [] 93 | for key in data.keys(): 94 | if pref in key: 95 | res_ll.append(data[key]) 96 | print(data[key]) 97 | return np.nanmean(np.concatenate(res_ll)), np.nanstd(np.concatenate(res_ll)), np.concatenate(res_ll) 98 | 99 | def get_unique_regions(file_list): 100 | ''' Get unique combinations of mode, polarization and polarization mode ''' 101 | ll = [] 102 | for ifile in file_list: 103 | ll.append(os.path.basename(ifile).split('_')[-2]) 104 | return list(set(ll)) 105 | 106 | pol_mode = { 107 | 'VH': '1SDV', 108 | 'HV': '1SDH', 109 | } 110 | 111 | args = parse_run_experiment_args() 112 | os.makedirs(args.out_path, exist_ok=True) 113 | 114 | platforms = ['S1A', 'S1B'] 115 | 116 | modes = [['IW','HV'], 117 | ['IW','VH'], 118 | ['EW','HV'], 119 | ['EW','VH']] 120 | 121 | for platform in platforms: 122 | for mode in modes: 123 | npz_list = glob.glob('%s/*%s*%s*%s*.npz' % (args.in_path, platform, mode[0], pol_mode[mode[1]])) 124 | unq_file_masks = sorted(get_unique_regions(npz_list)) 125 | d_plot = {} 126 | 127 | for fmask in unq_file_masks: 128 | print('\n###%s###\n' % fmask) 129 | npz_list = glob.glob('%s/*%s*%s*%s*_%s*.npz' % (args.in_path, platform, mode[0], pol_mode[mode[1]], fmask)) 130 | print(npz_list) 131 | print('###\n') 132 | total_esa_data = [] 133 | total_nersc_data = [] 134 | total_diff_data = [] 135 | res_d = {} 136 | 137 | a = npz_list[0] 138 | a = np.load(a) 139 | d_npz = dict(zip((k for k in a), (a[k] for k in a))) 140 | 141 | for key in d_npz.keys(): 142 | res_d['%s_ll' % key] = [] 143 | 144 | for key in d_npz.keys(): 145 | for npz in npz_list: 146 | f_npz = np.load(npz) 147 | d_npz = dict(zip((k for k in f_npz), (f_npz[k] for k in f_npz))) 148 | var_name = '%s_ll' % key 149 | res_d[var_name].append(d_npz[key]) 150 | arr = np.concatenate(res_d[var_name]) 151 | res_d[var_name] = arr 152 | 153 | d_plot[fmask] = {} 154 | d_plot[fmask]['Num_images'] = len(npz_list) 155 | d_plot[fmask]['Image_IDs'] = [os.path.basename(il).split('.')[0] for il in npz_list] 156 | 157 | m_esa, std_esa, data_esa = get_mean_std('ESA', res_d) 158 | d_plot[fmask]['Mean_ESA'] = m_esa 159 | d_plot[fmask]['STD_ESA'] = std_esa 160 | 161 | m_nersc, std_nersc, data_nersc = get_mean_std('NERSC', res_d) 162 | d_plot[fmask]['Mean_NERSC'] = m_nersc 163 | d_plot[fmask]['STD_NERSC'] = std_nersc 164 | 165 | diff = data_esa - data_nersc 166 | m_diff = np.nanmean(diff) 167 | std_diff = np.nanstd(diff) 168 | d_plot[fmask]['Mean_Diff'] = m_diff 169 | d_plot[fmask]['STD_Diff'] = std_diff 170 | 171 | plot_results(d_plot, '%s/%s_%s_%s_agg_plot.png' % (args.out_path, platform, mode[0], mode[1])) 172 | -------------------------------------------------------------------------------- /validation/rqm_tables.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """ This script generate latex tables with statistics on RQM for 3 | each polarization and mode combination for the both platforms [S1A/S1B]. 4 | 5 | run example: 6 | run rqm_tables.py input/npz/path output/path 7 | 8 | output: 9 | Text files with latex formatting of the results ('ALGORITHM_PLATFORM.txt') 10 | 11 | """ 12 | 13 | import argparse 14 | import glob 15 | import os 16 | import numpy as np 17 | from tabulate import tabulate 18 | from texttable import Texttable 19 | 20 | def parse_run_experiment_args(): 21 | """ Parse input args for run_experiment_* scripts """ 22 | parser = argparse.ArgumentParser(description='Generate latex tables from RQM data') 23 | parser.add_argument('in_path') 24 | parser.add_argument('out_path') 25 | parser.add_argument('-c', '--cores', default=2, type=int, 26 | help='Number of cores for parallel computation') 27 | return parser.parse_args() 28 | 29 | def get_mean_std(pref, data): 30 | res_ll = [] 31 | for key in data.keys(): 32 | if pref in key: 33 | res_ll.append(data[key]) 34 | #print(data[key]) 35 | return np.nanmean(np.concatenate(res_ll)), np.nanstd(np.concatenate(res_ll)), np.concatenate(res_ll) 36 | 37 | def get_unique_regions(file_list): 38 | ''' Get unique combinations of mode, polarization and polarization mode ''' 39 | ll = [] 40 | for ifile in file_list: 41 | ll.append(os.path.basename(ifile).split('_')[-2]) 42 | return list(set(ll)) 43 | 44 | def make_tbl(d_tbl, alg): 45 | for platform in platforms: 46 | print('\n%s %s' % (platform, alg)) 47 | ll_name = 'rows_%s' % platform 48 | vars()[ll_name] = [] 49 | vars()[ll_name].append(modes_ll) 50 | 51 | for key_region in regions: #d_tbl[platform][modes_ll[2]].keys(): 52 | try: 53 | iw_hv = '%.3f/%.3f' % (d_tbl[platform][modes_ll[1]][key_region]['Mean_%s' % alg], 54 | d_tbl[platform][modes_ll[1]][key_region]['STD_%s' % alg]) 55 | except: 56 | iw_hv = '-' 57 | 58 | try: 59 | iw_vh = '%.3f/%.3f' % (d_tbl[platform][modes_ll[2]][key_region]['Mean_%s' % alg], 60 | d_tbl[platform][modes_ll[2]][key_region]['STD_%s' % alg]) 61 | except: 62 | iw_vh = '-' 63 | 64 | try: 65 | ew_hv = '%.3f/%.3f' % (d_tbl[platform][modes_ll[3]][key_region]['Mean_%s' % alg], 66 | d_tbl[platform][modes_ll[3]][key_region]['STD_%s' % alg]) 67 | except: 68 | ew_hv = '-' 69 | 70 | try: 71 | ew_vh = '%.3f/%.3f' % (d_tbl[platform][modes_ll[4]][key_region]['Mean_%s' % alg], 72 | d_tbl[platform][modes_ll[4]][key_region]['STD_%s' % alg]) 73 | except: 74 | ew_vh = '-' 75 | 76 | vars()[ll_name].append([key_region, 77 | iw_vh, iw_hv, ew_hv, ew_vh]) 78 | 79 | tbl = Texttable() 80 | tbl.set_cols_align(["c"] * 5) 81 | tbl.set_deco(Texttable.HEADER | Texttable.VLINES) 82 | tbl.set_cols_align(['l', 'c', 'c', 'c', 'c']) 83 | tbl.add_rows(vars()[ll_name]) 84 | 85 | # Print table in readable form 86 | print(tbl.draw()) 87 | 88 | tbl_body = tabulate(vars()[ll_name], headers='firstrow', tablefmt='latex') 89 | tbl_body = tbl_body.replace('{tabular}{lllll}', """{longtable}{lcccc} \\caption{RQM %s: %s}""" % (platform, alg)).replace('{tabular}','{longtable}') 90 | 91 | with open('%s/%s_%s_tbl.txt' % (args.out_path, alg, platform), 'w') as f: 92 | f.write(tbl_body) 93 | 94 | def make_tbl_file_list(d_tbl): 95 | ''' Fuction to generate latex-formatted file lists from validation folders ''' 96 | rows = [] 97 | for platform in platforms: 98 | print('\n%s\n' % platform) 99 | for key in d_tbl[platform].keys(): 100 | for key_region in regions: 101 | rows.append(['', '']) 102 | rows.append(['', '']) 103 | rows.append(['', '%s %s %s' % (platform, key, key_region)]) 104 | rows.append(['Num.', 'Scene ID']) 105 | try: 106 | f_list = d_tbl[platform][key][key_region]['Image_IDs'] 107 | for i, ifile in enumerate(f_list): 108 | rows.append([i+1, ifile.split('_%s' % key_region)[0]]) 109 | except: 110 | pass 111 | 112 | tbl = Texttable() 113 | tbl.set_cols_align(["c"] * 2) 114 | #tbl.set_deco(Texttable.HEADER | Texttable.VLINES) 115 | tbl.set_cols_align(['r', 'l']) 116 | tbl.add_rows(rows) 117 | 118 | # Print table in readable form 119 | print(tbl.draw()) 120 | 121 | tbl_body = tabulate(rows, tablefmt='latex') 122 | tbl_body = tbl_body.replace('{tabular}{ll}', """{longtable}{rl} \\caption{File list}""").replace('{tabular}','{longtable}') 123 | 124 | with open('%s/file_lists.txt' % args.out_path, 'w') as f: 125 | f.write(tbl_body) 126 | 127 | pol_mode = { 128 | 'VH': '1SDV', 129 | 'HV': '1SDH', 130 | } 131 | 132 | args = parse_run_experiment_args() 133 | os.makedirs(args.out_path, exist_ok=True) 134 | 135 | platforms = ['S1A', 'S1B'] 136 | 137 | modes = [['IW','HV'], 138 | ['IW','VH'], 139 | ['EW','HV'], 140 | ['EW','VH']] 141 | 142 | regions = ['ANTARCTIC', 'ARCTIC', 'DESERT', 'DOLLDRUMS', 'OCEAN'] 143 | 144 | d_plot = {} 145 | 146 | for platform in platforms: 147 | d_plot[platform] = {} 148 | for imode in modes: 149 | imode_name = '%s_%s' % (imode[0], imode[1]) 150 | d_plot[platform][imode_name] = {} 151 | npz_list = glob.glob('%s/*%s*%s*%s*.npz' % (args.in_path, platform, imode[0], pol_mode[imode[1]])) 152 | unq_file_masks = sorted(get_unique_regions(npz_list)) 153 | 154 | for fmask in unq_file_masks: 155 | npz_list = glob.glob('%s/*%s*%s*%s*_%s*.npz' % (args.in_path, platform, imode[0], pol_mode[imode[1]], fmask)) 156 | 157 | total_esa_data = [] 158 | total_nersc_data = [] 159 | total_diff_data = [] 160 | 161 | res_d = {} 162 | 163 | # Create lists based on keys names 164 | a = npz_list[0] 165 | a = np.load(a) 166 | d_npz = dict(zip((k for k in a), (a[k] for k in a))) 167 | 168 | for key in d_npz.keys(): 169 | res_d['%s_ll' % key] = [] 170 | 171 | # Collect data for each margin 172 | for key in d_npz.keys(): 173 | for npz in npz_list: 174 | f_npz = np.load(npz) 175 | d_npz = dict(zip((k for k in f_npz), (f_npz[k] for k in f_npz))) 176 | var_name = '%s_ll' % key 177 | res_d[var_name].append(d_npz[key]) 178 | arr = np.concatenate(res_d[var_name]) 179 | res_d[var_name] = arr 180 | 181 | d_plot[platform][imode_name][fmask] = {} 182 | d_plot[platform][imode_name][fmask]['Num_images'] = len(npz_list) 183 | d_plot[platform][imode_name][fmask]['Image_IDs'] = [os.path.basename(il).split('.')[0] for il in npz_list] 184 | 185 | m_esa, std_esa, data_esa = get_mean_std('ESA', res_d) 186 | d_plot[platform][imode_name][fmask]['Mean_ESA'] = m_esa 187 | d_plot[platform][imode_name][fmask]['STD_ESA'] = std_esa 188 | 189 | m_nersc, std_nersc, data_nersc = get_mean_std('NERSC', res_d) 190 | d_plot[platform][imode_name][fmask]['Mean_NERSC'] = m_nersc 191 | d_plot[platform][imode_name][fmask]['STD_NERSC'] = std_nersc 192 | 193 | diff = data_esa - data_nersc 194 | m_diff = np.nanmean(diff) 195 | std_diff = np.nanstd(diff) 196 | d_plot[platform][imode_name][fmask]['Mean_Diff'] = m_diff 197 | d_plot[platform][imode_name][fmask]['STD_Diff'] = std_diff 198 | 199 | # Make tables from results 200 | modes_ll = ['Validation site','IW_HV', 'IW_VH', 'EW_HV', 'EW_VH'] 201 | 202 | make_tbl(d_plot, 'ESA') 203 | make_tbl(d_plot, 'NERSC') 204 | make_tbl_file_list(d_plot) -------------------------------------------------------------------------------- /validation/run_qm_batch.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """ This python script process individual S1 Level-1 GRD files 3 | to get thermal noise removal quality assessment 4 | (the range quality metric (RQM) and the azimuth quality metric(AQM)) 5 | for individual files in batch mode (each platform and sensing mode). 6 | The script produces npz files. 7 | 8 | run example: 9 | python run_qm.py rqm /path/to/L1/GRD/files /path/to/output/dir 10 | python run_qm.py aqm /path/to/L1/GRD/files /path/to/output/dir 11 | 12 | """ 13 | import argparse 14 | import os 15 | import glob 16 | from multiprocessing import Pool 17 | import numpy as np 18 | from s1denoise import Sentinel1Image 19 | 20 | out_dir = None 21 | pol = None 22 | exp_name = None 23 | 24 | exp_names = { 25 | 'rqm': 'range_quality_metric', 26 | 'aqm': 'azimuth_quality_metric', 27 | } 28 | 29 | def main(): 30 | """ Find zip files and launch (multi)processing """ 31 | global out_dir, pol, qm_name, qm_prefix 32 | args = parse_run_experiment_args() 33 | 34 | grd_mode = { 35 | 'IW': 'GRDH', 36 | 'EW': 'GRDM', 37 | } 38 | 39 | args = parse_run_experiment_args() 40 | os.makedirs(args.out_dir, exist_ok=True) 41 | 42 | platforms = ['S1A', 'S1B'] 43 | regions = ['ARCTIC', 'ANTARCTIC', 'DESERT', 'DOLLDRUMS', 'OCEAN'] 44 | 45 | modes = [['IW', 'HV'], 46 | ['IW', 'VH'], 47 | ['EW', 'HV'], 48 | ['EW', 'VH']] 49 | 50 | qm_name = exp_names[args.quality_metric] 51 | 52 | out_dir = args.out_dir 53 | 54 | for platform in platforms: 55 | print('Processing %s' % platform) 56 | for mode in modes: 57 | pol = mode[1] 58 | for region in regions: 59 | qm_prefix = '%s_%s_%s' % (os.path.basename(args.inp_dir).split('_')[-1], region, 60 | args.quality_metric.upper()) 61 | # find files for processing 62 | zip_files = sorted(glob.glob('%s/%s/%s/%s_%s_%s_%s_%s/*.zip' % 63 | (args.inp_dir, region, platform, 64 | mode[1], mode[0], grd_mode[mode[0]], platform, region))) 65 | # make directory for output npz files 66 | os.makedirs(args.out_dir, exist_ok=True) 67 | # launch proc in parallel 68 | with Pool(args.cores) as pool: 69 | pool.map(run_process, zip_files) 70 | 71 | def parse_run_experiment_args(): 72 | """ Parse input args for run_experiment_* scripts """ 73 | parser = argparse.ArgumentParser(description='Batch quality assessment from individual S1 Level-1 GRD files') 74 | parser.add_argument('quality_metric', choices=['rqm', 'aqm']) 75 | parser.add_argument('inp_dir') 76 | parser.add_argument('out_dir') 77 | parser.add_argument('-c', '--cores', default=2, type=int, 78 | help='Number of cores for parallel computation') 79 | return parser.parse_args() 80 | 81 | def run_process(zipFile): 82 | """ Process individual file with get_quality_metric """ 83 | out_basename = os.path.basename(zipFile).split('.')[0] + f'_{qm_prefix}.npz' 84 | out_fullname = os.path.join(out_dir, out_basename) 85 | 86 | if os.path.exists(out_fullname): 87 | print(f'{out_fullname} already exists.') 88 | else: 89 | s1 = Sentinel1Image(zipFile) 90 | func = getattr(s1, 'get_' + qm_name) 91 | res_qam = func(pol) 92 | print(res_qam) 93 | np.savez(out_fullname, **res_qam) 94 | 95 | if __name__ == "__main__": 96 | main() --------------------------------------------------------------------------------