fxy0111 commited on
Commit
b41dbe3
·
verified ·
1 Parent(s): fb7a955

Upload EchMo-Vis: code, weights, sample data, images, readme

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +6 -35
  2. .gitignore +117 -0
  3. LICENSE +21 -0
  4. README.md +290 -0
  5. app.py +0 -0
  6. asset_paths.py +225 -0
  7. datasets/HiL-RED/barrage_narrow_jamming_-10dB/annotations/dense/2025090809332621314/range_doppler.npy +3 -0
  8. datasets/HiL-RED/barrage_narrow_jamming_-10dB/range_doppler_MTD/2025090809332621314.npy +3 -0
  9. datasets/HiL-RED/barrage_narrow_jamming_-10dB/range_doppler_echo/2025090809332621314.npy +3 -0
  10. datasets/HiL-RED/barrage_narrow_jamming_-10dB/transmit/transmitwave.npy +3 -0
  11. datasets/HiL-RED/barrage_narrow_jamming_-15dB/annotations/dense/202509082203273504/range_doppler.npy +3 -0
  12. datasets/HiL-RED/barrage_narrow_jamming_-15dB/range_doppler_MTD/202509082203273504.npy +3 -0
  13. datasets/HiL-RED/barrage_narrow_jamming_-15dB/range_doppler_echo/202509082203273504.npy +3 -0
  14. datasets/HiL-RED/barrage_narrow_jamming_-15dB/transmit/transmitwave.npy +3 -0
  15. datasets/HiL-RED/barrage_narrow_jamming_-20dB/annotations/dense/202509091239203879/range_doppler.npy +3 -0
  16. datasets/HiL-RED/barrage_narrow_jamming_-20dB/range_doppler_MTD/202509091239203879.npy +3 -0
  17. datasets/HiL-RED/barrage_narrow_jamming_-20dB/range_doppler_echo/202509091239203879.npy +3 -0
  18. datasets/HiL-RED/barrage_narrow_jamming_-20dB/transmit/transmit/transmitwave.npy +3 -0
  19. datasets/HiL-RED/barrage_wide_jamming_-10dB/annotations/dense/20250901111636100764/range_doppler.npy +3 -0
  20. datasets/HiL-RED/barrage_wide_jamming_-10dB/range_doppler_MTD/20250901111636100764.npy +3 -0
  21. datasets/HiL-RED/barrage_wide_jamming_-10dB/range_doppler_echo/20250901111636100764.npy +3 -0
  22. datasets/HiL-RED/barrage_wide_jamming_-10dB/transmit/transmitwave.npy +3 -0
  23. datasets/HiL-RED/barrage_wide_jamming_-15dB/annotations/dense/202509021530465441/range_doppler.npy +3 -0
  24. datasets/HiL-RED/barrage_wide_jamming_-15dB/range_doppler_MTD/202509021530465441.npy +3 -0
  25. datasets/HiL-RED/barrage_wide_jamming_-15dB/range_doppler_echo/202509021530465441.npy +3 -0
  26. datasets/HiL-RED/barrage_wide_jamming_-15dB/transmit/transmitwave.npy +3 -0
  27. datasets/HiL-RED/barrage_wide_jamming_-20dB/annotations/dense/202509031652503690/range_doppler.npy +3 -0
  28. datasets/HiL-RED/barrage_wide_jamming_-20dB/range_doppler_MTD/202509031652503690.npy +3 -0
  29. datasets/HiL-RED/barrage_wide_jamming_-20dB/range_doppler_echo/202509031652503690.npy +3 -0
  30. datasets/HiL-RED/barrage_wide_jamming_-20dB/transmit/transmitwave.npy +3 -0
  31. datasets/HiL-RED/coefs/s_tx.mat +0 -0
  32. datasets/HiL-RED/coefs/w_blackman.mat +0 -0
  33. datasets/HiL-RED/coefs/w_chebyshev.mat +0 -0
  34. datasets/HiL-RED/coefs/w_cosine.mat +0 -0
  35. datasets/HiL-RED/coefs/w_hamming.mat +0 -0
  36. datasets/HiL-RED/coefs/w_hanning.mat +0 -0
  37. datasets/HiL-RED/coefs/w_rectangular.mat +0 -0
  38. datasets/HiL-RED/coefs/w_taylor.mat +0 -0
  39. datasets/HiL-RED/data_seq_ref.json +107 -0
  40. datasets/HiL-RED/dataset_meta.json +9 -0
  41. datasets/HiL-RED/deceptive_dft_jammer_-10dB/annotations/dense/202509092208275264/range_doppler.npy +3 -0
  42. datasets/HiL-RED/deceptive_dft_jammer_-10dB/range_doppler_MTD/202509092208275264.npy +3 -0
  43. datasets/HiL-RED/deceptive_dft_jammer_-10dB/range_doppler_echo/202509092208275264.npy +3 -0
  44. datasets/HiL-RED/deceptive_dft_jammer_-10dB/transmit/transmitwave.npy +3 -0
  45. datasets/HiL-RED/deceptive_dft_jammer_-15dB/annotations/dense/202509102013124057/range_doppler.npy +3 -0
  46. datasets/HiL-RED/deceptive_dft_jammer_-15dB/range_doppler_MTD/202509102013124057.npy +3 -0
  47. datasets/HiL-RED/deceptive_dft_jammer_-15dB/range_doppler_echo/202509102013124057.npy +3 -0
  48. datasets/HiL-RED/deceptive_dft_jammer_-15dB/transmit/transmitwave.npy +3 -0
  49. datasets/HiL-RED/deceptive_dft_jammer_-20dB/annotations/dense/202509112218344171/range_doppler.npy +3 -0
  50. datasets/HiL-RED/deceptive_dft_jammer_-20dB/range_doppler_MTD/202509112218344171.npy +3 -0
.gitattributes CHANGED
@@ -1,35 +1,6 @@
1
- *.7z filter=lfs diff=lfs merge=lfs -text
2
- *.arrow filter=lfs diff=lfs merge=lfs -text
3
- *.bin filter=lfs diff=lfs merge=lfs -text
4
- *.bz2 filter=lfs diff=lfs merge=lfs -text
5
- *.ckpt filter=lfs diff=lfs merge=lfs -text
6
- *.ftz filter=lfs diff=lfs merge=lfs -text
7
- *.gz filter=lfs diff=lfs merge=lfs -text
8
- *.h5 filter=lfs diff=lfs merge=lfs -text
9
- *.joblib filter=lfs diff=lfs merge=lfs -text
10
- *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
- *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
- *.model filter=lfs diff=lfs merge=lfs -text
13
- *.msgpack filter=lfs diff=lfs merge=lfs -text
14
- *.npy filter=lfs diff=lfs merge=lfs -text
15
- *.npz filter=lfs diff=lfs merge=lfs -text
16
- *.onnx filter=lfs diff=lfs merge=lfs -text
17
- *.ot filter=lfs diff=lfs merge=lfs -text
18
- *.parquet filter=lfs diff=lfs merge=lfs -text
19
- *.pb filter=lfs diff=lfs merge=lfs -text
20
- *.pickle filter=lfs diff=lfs merge=lfs -text
21
- *.pkl filter=lfs diff=lfs merge=lfs -text
22
- *.pt filter=lfs diff=lfs merge=lfs -text
23
- *.pth filter=lfs diff=lfs merge=lfs -text
24
- *.rar filter=lfs diff=lfs merge=lfs -text
25
- *.safetensors filter=lfs diff=lfs merge=lfs -text
26
- saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
- *.tar.* filter=lfs diff=lfs merge=lfs -text
28
- *.tar filter=lfs diff=lfs merge=lfs -text
29
- *.tflite filter=lfs diff=lfs merge=lfs -text
30
- *.tgz filter=lfs diff=lfs merge=lfs -text
31
- *.wasm filter=lfs diff=lfs merge=lfs -text
32
- *.xz filter=lfs diff=lfs merge=lfs -text
33
- *.zip filter=lfs diff=lfs merge=lfs -text
34
- *.zst filter=lfs diff=lfs merge=lfs -text
35
- *tfevents* filter=lfs diff=lfs merge=lfs -text
 
1
+ *.pt filter=lfs diff=lfs merge=lfs -text
2
+ *.pth filter=lfs diff=lfs merge=lfs -text
3
+ *.npy filter=lfs diff=lfs merge=lfs -text
4
+ *.png filter=lfs diff=lfs merge=lfs -text
5
+ *.jpg filter=lfs diff=lfs merge=lfs -text
6
+ *.jpeg filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
.gitignore ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *.so
5
+ .Python
6
+ build/
7
+ develop-eggs/
8
+ dist/
9
+ downloads/
10
+ eggs/
11
+ .eggs/
12
+ lib/
13
+ lib64/
14
+ parts/
15
+ sdist/
16
+ var/
17
+ wheels/
18
+ *.egg-info/
19
+ .installed.cfg
20
+ *.egg
21
+
22
+ # Virtual Environments
23
+ venv/
24
+ ENV/
25
+ env/
26
+ .venv/
27
+
28
+ # IDE
29
+ .vscode/
30
+ .idea/
31
+ *.swp
32
+ *.swo
33
+ *~
34
+ .DS_Store
35
+
36
+ # Jupyter Notebook
37
+ .ipynb_checkpoints/
38
+
39
+ # PyTorch
40
+ *.pt.tmp
41
+ *.ckpt
42
+ *.pth.tar
43
+ *.safetensors
44
+
45
+ # Training checkpoints are not shipped - the app only loads results/<model>.pt
46
+ latest_checkpoint.pt
47
+
48
+ # ============================================================
49
+ # Commit policy
50
+ # GitHub repo : code only - what is needed to run the app
51
+ # Download : pre-trained weights and the datasets are published
52
+ # separately (download link to be announced)
53
+ # ============================================================
54
+
55
+ # Old repository backup, kept locally only
56
+ .git.backup-*/
57
+
58
+ # Weights (~2.5 GB) and datasets never go through GitHub
59
+ ckpts/
60
+
61
+
62
+ # Onboarding notes / HF Space card, kept in the Hugging Face mirror
63
+ environment.yml
64
+ DEPLOY.md
65
+ HF_README.md
66
+
67
+ checkpoints/
68
+ pretrained/
69
+ weights/
70
+
71
+ # Data files (large files)
72
+ data/
73
+ *.mat
74
+ *.h5
75
+ *.hdf5
76
+ *.npz
77
+
78
+ # Exception: the logos are needed by the README and the app header
79
+ !logos/*.png
80
+ !logos/*.jpg
81
+
82
+ # Exception: the README screenshots ship with the repository
83
+ !images/*.png
84
+ !images/*.jpg
85
+
86
+ # Exception: transmit signals and window coefficients are tiny (KB) and required
87
+ # at runtime by the traditional-processing pipeline
88
+ !datasets/*/coefs/*.mat
89
+
90
+ # huggingface_hub 下载/上传时产生的本地缓存
91
+ .cache/
92
+
93
+ # Logs
94
+ *.log
95
+ logs/
96
+
97
+ # Temporary files
98
+ tmp/
99
+ temp/
100
+ *.tmp
101
+
102
+ # Backup files (e.g. the *.onehot.npy.bak produced by the annotation converter)
103
+ *.bak
104
+
105
+ # Environment variables
106
+ .env
107
+ .env.local
108
+
109
+ # Gradio cache
110
+ .gradio/
111
+ flagged/
112
+
113
+ # Archives
114
+ *.zip
115
+ *.tar.gz
116
+ *.rar
117
+ *.7z
LICENSE ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ MIT License
2
+
3
+ Copyright (c) 2024 End-to-End Radar Echo Segmentation
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
README.md CHANGED
@@ -1,3 +1,293 @@
1
  ---
2
  license: mit
 
 
 
 
3
  ---
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ---
2
  license: mit
3
+ tags:
4
+ - radar
5
+ - semantic-segmentation
6
+ - gradio
7
  ---
8
+
9
+ ![Perception & Cognition Laboratory (PeCoLab)](logos/peco-logo-banner-yellow.png)
10
+
11
+ # End-to-End Radar Echo Segmentation Visualization
12
+
13
+ [![Gradio](https://img.shields.io/badge/Gradio-6.0%2B-orange.svg)](https://gradio.app/)
14
+ [![PyTorch](https://img.shields.io/badge/PyTorch-2.0+-red.svg)](https://pytorch.org/)
15
+ [![License](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)
16
+
17
+ A comprehensive visualization tool for end-to-end radar echo segmentation, supporting multiple deep learning models and comparison with traditional signal processing methods.
18
+
19
+ ## Overview
20
+
21
+ This project provides an interactive web interface for radar echo data segmentation using state-of-the-art deep learning models. It allows users to:
22
+
23
+ - Visualize radar echo segmentation results from multiple models
24
+ - Compare deep learning approaches with traditional signal processing (LMF, MTI, MTD, CFAR)
25
+ - Perform side-by-side model comparisons
26
+
27
+ > **Data availability:** this repository ships **sample data only** — one frame per
28
+ > scenario for each dataset — so the app runs out of the box and every feature can be
29
+ > tried. The **full Syn-RED and HiL-RED datasets must be downloaded separately**;
30
+ > the download link will be published here once available. See
31
+ > [Datasets](#datasets) for details.
32
+
33
+ ## Screenshots
34
+
35
+ **EchMo vs. Traditional RSP** — the segmentation result (raw echo, ground truth,
36
+ EchMo + CFAR overlay) next to the EchMo intermediate features (LMF / MLDC / GDF) and the
37
+ traditional pipeline (LMF / MTI / MTD), shown for a HiL-RED deceptive-jamming sequence
38
+ with the "ALL 3D" view enabled.
39
+
40
+ ![EchMo vs. Traditional RSP tab](images/screenshot_echmo_vs_traditional.png)
41
+
42
+ **Model Comparison** — the same frame segmented by EchMo, TMVA-Net, DeepLabV3+, U-Net,
43
+ FCN-8s and ViT side by side, together with the raw echo, the MTD input and the ground truth.
44
+
45
+ ![Model Comparison tab](images/screenshot_model_comparison.png)
46
+
47
+ ## Supported Models
48
+
49
+ | Model | Description |
50
+ |-------|-------------|
51
+ | **EchMo** | End-to-end Complex-valued Hierarchical Model (proposed method) |
52
+ | **U-Net** | Classic convolutional encoder-decoder architecture |
53
+ | **DeepLabV3+** | DeepLabV3+ with ResNet-101 backbone |
54
+ | **FCN-8s** | Fully Convolutional Network with 8x upsampling |
55
+ | **TMVA-Net** | Temporal Multi-View Attention Network |
56
+ | **ViT** | Vision Transformer for semantic segmentation |
57
+
58
+ ## Datasets
59
+
60
+ > **This repository ships sample data only** — for Syn-RED one frame per
61
+ > distance/motion/SNR scenario, for HiL-RED one frame per jamming scenario — together
62
+ > with all pre-trained weights. This is enough to run the app end to end and to try
63
+ > every feature, but it is **not the full benchmark data**.
64
+ >
65
+ > **The full Syn-RED and HiL-RED datasets must be downloaded separately**; the
66
+ > download link will be published here as soon as it is available. Once downloaded,
67
+ > unpack the full datasets into `datasets/` (merging with the sample folders) — no
68
+ > code change is needed, new sequences and frames are discovered automatically.
69
+
70
+ The application supports the two echo datasets introduced in the paper,
71
+ **Syn-RED** and **HiL-RED**:
72
+
73
+ ### Syn-RED — Synthetic Radar Echo Dataset
74
+ Low-slow-small (LSS) target detection, built by precise electromagnetic simulation.
75
+
76
+ - Controlled target scenes with varying motion characteristics and SNRs
77
+ - Multiple distances (1000m, 3000m, 5000m)
78
+ - Motion types: Line, O-shape, S-shape (Hover scenarios exist in the raw data but are not exposed in the UI)
79
+ - SNR levels: 10 dB, 14 dB, 18 dB
80
+ - 2 annotated classes: background, target
81
+
82
+ ### HiL-RED — Hardware-in-the-Loop Radar Echo Dataset
83
+ Target-jammer recognition under active electronic countermeasures, captured on a
84
+ hardware-in-the-loop platform that incorporates radar interference types and JSR.
85
+
86
+ - Jamming types: Barrage (narrow/wide), Deceptive (DFT / ISR / SLI)
87
+ - Jamming intensities: -10 dB, -15 dB, -20 dB
88
+ - 7 annotated classes (background, target, DFTJ, ISRJ, SIJ, WJ, NJ); the networks are
89
+ trained with 9 output channels
90
+
91
+ Each dataset folder carries a `dataset_meta.json` that declares dataset-specific
92
+ behaviour (MTD `fftshift`, the MTD amplitude folder, the classes offered by the UI
93
+ filter). Adding a dataset means dropping in a folder — no code change needed.
94
+ Model runs are discovered from `models/<dataset>/*/config.json` (the folder must
95
+ contain `"model": "..."` and `results/<model>.pt`). When a dataset holds several
96
+ runs of the same model the alphabetically first one wins, and
97
+ `"run_overrides": {"model": "run_folder"}` in `dataset_meta.json` pins a specific
98
+ one - useful when e.g. a 7-class and a 9-class HiL-RED checkpoint coexist.
99
+
100
+ ## Features
101
+
102
+ ### Single Model Tab
103
+ - Visualize intermediate features from EchMo (LMF, MLDC, GDF)
104
+ - Compare with traditional RSP methods
105
+ - Display raw echo input, ground truth, and prediction masks
106
+
107
+ ### Model Comparison Tab
108
+ - Run inference with all 6 models simultaneously
109
+ - Side-by-side visualization of segmentation results
110
+ - Easy comparison of model performance
111
+
112
+ ## Download & Local Deployment
113
+
114
+ Everything needed to run the app is hosted in this repository: the code, the
115
+ pre-trained weights (~2 GB) and **sample data** for both datasets (one frame per
116
+ scenario — the full datasets will be distributed separately, see
117
+ [Datasets](#datasets)).
118
+
119
+ ### Step 1 — Download this repository
120
+
121
+ Option A — `huggingface_hub` (recommended, no Git required):
122
+
123
+ ```bash
124
+ pip install -U "huggingface_hub[cli]"
125
+ huggingface-cli download fxy0111/EchMo-Vis --local-dir EchMo-Vis
126
+ cd EchMo-Vis
127
+ ```
128
+
129
+ Option B — Git (requires [Git LFS](https://git-lfs.com); the weights and `.npy` data
130
+ are stored in LFS, a plain `git clone` without LFS only downloads pointer files):
131
+
132
+ ```bash
133
+ git lfs install
134
+ git clone https://huggingface.co/fxy0111/EchMo-Vis
135
+ cd EchMo-Vis
136
+ ```
137
+
138
+ > While the repository is **private**, authenticate first with a token from
139
+ > <https://huggingface.co/settings/tokens> (read permission is enough):
140
+ > `huggingface-cli login`. Once the repository is public, no login is needed.
141
+
142
+ The layout the app expects:
143
+
144
+ ```
145
+ <project root>/
146
+ ├── app.py
147
+ ├── models/<dataset>/<run_name>/config.json # layer/hyper-params
148
+ ├── models/<dataset>/<run_name>/results/<model>.pt # weights
149
+ └── datasets/<dataset>/
150
+ ├── light_dataset_frame_oriented.json # sequence / frame index
151
+ ├── dataset_meta.json # per-dataset behaviour
152
+ ├── coefs/s_tx.mat # transmit reference
153
+ └── <sequence>/range_doppler_echo/<frame>.npy # echo data
154
+ └── <sequence>/annotations/dense/<frame>/range_doppler.npy # ground truth
155
+ └── <sequence>/<mtd_amp_dir>/<frame>.npy # MTD amplitude (see dataset_meta.json)
156
+ ```
157
+ > **Heads-up:** model runs are discovered from `models/<dataset>/*/config.json` and
158
+ > datasets from `datasets/*/light_dataset_frame_oriented.json`. When something is missing the
159
+ > app does **not** raise: the dataset simply does not appear in the data-source dropdown, or a
160
+ > model is skipped in the comparison tab with only a console warning. Other errors surface only
161
+ > on Run ("Echo data not found", "Model file not found: ...") - so make sure Step 1 actually
162
+ > produced the layout above.
163
+
164
+ ### Note on the pre-trained weights (epoch-291 exports)
165
+
166
+ The weights under `models/` are a subset copy of the training artifacts kept in
167
+ `ckpts/`. Please be aware:
168
+
169
+ - For **HiL-RED**, the deeplabv3plus, unet, vit and fcn8s weights were exported
170
+ from **epoch 291** instead of the best epoch recorded in the training logs, so
171
+ the metrics these four models show in the app are **lower than the paper
172
+ values**. echmo and tmva_net_sv are not affected.
173
+ - For **Syn-RED**, the vit weight is likewise a slightly non-best export
174
+ (Δ0.007 mIoU).
175
+ - **The results reported in the paper are unaffected**: they were taken from the
176
+ best epoch of the TensorBoard logs, which are shipped under
177
+ `ckpts/<dataset>/<run>/boards/`.
178
+
179
+ The full run tables and TensorBoard logs live in the training repository under
180
+ `ckpts/<dataset>/<run>/boards/` (not shipped in this repository).
181
+
182
+ ### Step 2 — Install and run
183
+
184
+ ```bash
185
+ # Install dependencies
186
+ pip install -r requirements.txt
187
+
188
+ # Run the application
189
+ python app.py
190
+ ```
191
+
192
+ Then open `http://localhost:7860` in a browser (override the port with the `PORT`
193
+ environment variable). Inference runs on GPU automatically when CUDA is available,
194
+ otherwise on CPU.
195
+
196
+ ## File Structure
197
+
198
+ ```
199
+ .
200
+ ├── app.py # Main Gradio application
201
+ ├── asset_paths.py # single source of truth for dataset/model paths
202
+ ├── requirements.txt # Python dependencies
203
+ ├── README.md # This file
204
+ ├── logos/ # PeCoLab banner + header logo
205
+ │ ├── logo.jpg # app header logo (app.py: LOGO_PATH)
206
+ │ └── peco-logo-banner-yellow.png
207
+ ├── models/ # Model definitions + pre-trained weights
208
+ │ ├── echmo.py
209
+ │ ├── unet.py
210
+ │ ├── deeplabv3plus.py
211
+ │ ├── fcn8s.py
212
+ │ ├── tmva_net_sv.py
213
+ │ ├── vit.py
214
+ │ ├── Syn-RED/ # config.json + results/*.pt
215
+ │ └── HiL-RED/ # config.json + results/*.pt
216
+ └── datasets/ # demo subset of both datasets
217
+ ├── Syn-RED/
218
+ └── HiL-RED/
219
+ ```
220
+
221
+ `dataset_meta.json` declares the dataset-specific behaviour (MTD `fftshift`, the MTD
222
+ amplitude folder, the classes offered by the UI filter); `run_overrides` can pin a
223
+ specific model run when a dataset holds several of them.
224
+
225
+ ## Usage
226
+
227
+ ### Using Pre-loaded Datasets
228
+
229
+ 1. Select a **Data Source** (Syn-RED or HiL-RED)
230
+ 2. Choose a **Sequence** from the dropdown
231
+ 3. Select a **Frame** to visualize
232
+ 4. Click **Run** to see the results
233
+
234
+ ### Model Comparison
235
+
236
+ 1. Switch to the **Model Comparison** tab
237
+ 2. Select data source, sequence, and frame
238
+ 3. Click **Run** to compare all models side-by-side
239
+
240
+ ## Input Data Format
241
+
242
+ ### Transmit Signal (.mat or .npy)
243
+ - Complex-valued signal
244
+ - Shape: `(2, N)` or `(N,)` where N is signal length
245
+ - For .mat files: variable name should be `s_tx`, `st`, `transmit`, `tx_signal`, or `s`
246
+
247
+ ### Echo Signal (.npy)
248
+ - Complex-valued radar echo data
249
+ - Shape: `(2, Doppler, Range)` or `(Doppler, Range)`
250
+ - Channel 0: Real part, Channel 1: Imaginary part (if 3D)
251
+
252
+ ### Ground-truth Annotation (.npy)
253
+ Both layouts are accepted (see `annotation_to_label_map()` in `app.py`):
254
+
255
+ - **one-hot** `(C, Doppler, Range)`: every pixel has exactly one hot channel, the app
256
+ applies `argmax(axis=0)`. Syn-RED uses this (`C=2`, `uint8`).
257
+ - **label map** `(Doppler, Range)`: one integer class id per pixel, used as-is.
258
+ HiL-RED ships this form (`int8`), converted from the original 9-channel `float64`
259
+ one-hot (~72x smaller, lossless).
260
+
261
+ HiL-RED uses class ids **0-6** only; some checkpoints were trained with 9 output
262
+ channels (the last two are always empty), which is handled automatically because
263
+ `nb_classes` is read from each run's `config.json`.
264
+
265
+ ## Technical Details
266
+
267
+ ### EchMo Model Architecture
268
+
269
+ The EchMo model consists of three main components:
270
+
271
+ 1. **LMF (Learnable Matched Filter)** - Adaptive matched filtering
272
+ 2. **MLDC (Multi-Level Deep Convolution)** - Hierarchical feature extraction
273
+ 3. **GDF (Gated Doppler Fusion)** - Doppler-aware feature fusion
274
+
275
+ ### Traditional Signal Processing Pipeline
276
+
277
+ 1. **LMF** - Linear Matched Filtering
278
+ 2. **MTI** - Moving Target Indication (clutter suppression)
279
+ 3. **MTD** - Moving Target Detection (Doppler processing)
280
+ 4. **CFAR** - Constant False Alarm Rate detection
281
+
282
+ ## License
283
+
284
+ This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
285
+
286
+ ## Acknowledgments
287
+
288
+ - This work was developed for radar signal processing research
289
+ - Thanks to the open-source community for PyTorch, Gradio, and other tools
290
+
291
+ ## Contact
292
+
293
+ For questions or issues, please open an issue on GitHub or contact the authors.
app.py ADDED
The diff for this file is too large to render. See raw diff
 
asset_paths.py ADDED
@@ -0,0 +1,225 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """
2
+ Central asset path resolution for the EchMo radar echo segmentation app.
3
+
4
+ Why this module exists
5
+ ----------------------
6
+ Model weights and datasets are not stored in the code repository; they are
7
+ pulled from Hugging Face. Those paths used to be hard-coded in `app.py`
8
+ (a `MODEL_PATHS` dict plus several `if dataset_name == ...` branches), so any
9
+ retrain that renamed a run directory -- or any new dataset -- required editing
10
+ the application code.
11
+
12
+ Now everything dataset-specific is *discovered from disk*:
13
+
14
+ models/<dataset>/<run>/config.json -> run folder + "model" field
15
+ models/<dataset>/<run>/results/<model>.pt -> weights (filename == model)
16
+ datasets/<dataset>/dataset_meta.json -> per-dataset behaviour
17
+
18
+ `datasets/<dataset>/dataset_meta.json` fields (all optional)
19
+ -----------------------------------------------------------
20
+ display_name str label shown in the UI (default: folder name)
21
+ full_name str paper abbreviation / expansion (informational)
22
+ scenario str short description (informational)
23
+ order int sort order of the dataset dropdown
24
+ mtd_fftshift bool apply fftshift after the Doppler FFT in MTD
25
+ mtd_amp_dir str sequence sub-folder holding the MTD amplitude .npy
26
+ valid_classes list classes offered by the class filter in the UI
27
+ run_overrides dict {"model": "run_folder"} to pin a specific run when a
28
+ dataset contains several runs of the same model
29
+
30
+ IMPORTANT: `valid_classes` is *not* `nb_classes`. `nb_classes` comes from the
31
+ model `config.json` and is the number of output channels used for the
32
+ segmentation colour scale. HiL-RED, for instance, trains with 9 channels while
33
+ only classes 0-6 actually occur in the annotations.
34
+
35
+ This module uses the standard library only, so it can be imported by scripts
36
+ without pulling in torch/gradio.
37
+ """
38
+
39
+ from __future__ import annotations
40
+
41
+ import json
42
+ import os
43
+
44
+ # Pseudo dataset used by the "upload your own data" mode. It is not a real
45
+ # folder under datasets/ and must never be treated as one.
46
+ CUSTOM_DATASET = "Custom Data"
47
+
48
+ DATASETS_ROOT = "datasets"
49
+ MODELS_ROOT = "models"
50
+
51
+ INDEX_FILENAME = "light_dataset_frame_oriented.json"
52
+ META_FILENAME = "dataset_meta.json"
53
+ COEFS_DIRNAME = "coefs"
54
+ TRANSMIT_FILENAME = "s_tx.mat"
55
+
56
+ DEFAULT_META = {
57
+ "mtd_fftshift": True,
58
+ "mtd_amp_dir": "range_doppler_MTD",
59
+ "valid_classes": [0, 1],
60
+ "run_overrides": {},
61
+ }
62
+
63
+ _meta_cache: dict[str, dict] = {}
64
+
65
+
66
+ # --------------------------------------------------------------------------
67
+ # helpers
68
+ # --------------------------------------------------------------------------
69
+ def read_json(path: str, default=None):
70
+ # utf-8-sig reads plain UTF-8 unchanged and additionally strips a leading BOM.
71
+ # Without it a BOM (editors and Excel-like tools add one happily) makes
72
+ # json.load raise, the file is silently ignored and every setting falls back to
73
+ # DEFAULT_META - that is how HiL-RED once ended up with valid_classes [0, 1].
74
+ try:
75
+ with open(path, "r", encoding="utf-8-sig") as handle:
76
+ return json.load(handle)
77
+ except (OSError, ValueError):
78
+ return default
79
+
80
+
81
+ # --------------------------------------------------------------------------
82
+ # datasets
83
+ # --------------------------------------------------------------------------
84
+ def dataset_dir(dataset: str) -> str:
85
+ return os.path.join(DATASETS_ROOT, dataset)
86
+
87
+
88
+ def index_path(dataset: str) -> str:
89
+ return os.path.join(dataset_dir(dataset), INDEX_FILENAME)
90
+
91
+
92
+ def meta_path(dataset: str) -> str:
93
+ return os.path.join(dataset_dir(dataset), META_FILENAME)
94
+
95
+
96
+ def coefs_dir(dataset: str) -> str:
97
+ return os.path.join(dataset_dir(dataset), COEFS_DIRNAME)
98
+
99
+
100
+ def transmit_signal_path(dataset: str) -> str:
101
+ return os.path.join(coefs_dir(dataset), TRANSMIT_FILENAME)
102
+
103
+
104
+ def load_dataset_meta(dataset: str) -> dict:
105
+ """Merged dataset_meta.json (cached). Unknown datasets fall back to defaults."""
106
+ if dataset not in _meta_cache:
107
+ meta = dict(DEFAULT_META)
108
+ loaded = read_json(meta_path(dataset), {})
109
+ if isinstance(loaded, dict):
110
+ meta.update(loaded)
111
+ meta.setdefault("display_name", dataset)
112
+ _meta_cache[dataset] = meta
113
+ return _meta_cache[dataset]
114
+
115
+
116
+ def clear_meta_cache() -> None:
117
+ _meta_cache.clear()
118
+
119
+
120
+ def available_datasets() -> list[str]:
121
+ """Dataset folders that actually have a frame index, in display order."""
122
+ if not os.path.isdir(DATASETS_ROOT):
123
+ return []
124
+ found = []
125
+ for name in os.listdir(DATASETS_ROOT):
126
+ if name == CUSTOM_DATASET or not os.path.isdir(dataset_dir(name)):
127
+ continue
128
+ if not os.path.isfile(index_path(name)):
129
+ continue # without the index the dataset cannot be shown at all
130
+ found.append((load_dataset_meta(name).get("order", 10_000), name))
131
+ found.sort(key=lambda item: (item[0], item[1]))
132
+ return [name for _, name in found]
133
+
134
+
135
+ def load_dataset_index(dataset: str) -> dict:
136
+ """{sequence: [frames]} -- {} when missing or not valid strict JSON."""
137
+ data = read_json(index_path(dataset), None)
138
+ return data if isinstance(data, dict) else {}
139
+
140
+
141
+ def get_sequences(dataset: str) -> list[str]:
142
+ if dataset == CUSTOM_DATASET:
143
+ return []
144
+ return list(load_dataset_index(dataset).keys())
145
+
146
+
147
+ def get_frames(dataset: str, sequence: str) -> list:
148
+ if dataset == CUSTOM_DATASET or not sequence:
149
+ return []
150
+ return load_dataset_index(dataset).get(sequence, [])
151
+
152
+
153
+ def echo_path(dataset: str, sequence: str, frame: str) -> str:
154
+ return os.path.join(dataset_dir(dataset), sequence, "range_doppler_echo", f"{frame}.npy")
155
+
156
+
157
+ def annotation_path(dataset: str, sequence: str, frame: str) -> str:
158
+ return os.path.join(dataset_dir(dataset), sequence, "annotations", "dense", frame, "range_doppler.npy")
159
+
160
+
161
+ def mtd_amp_path(dataset: str, sequence: str, frame: str) -> str:
162
+ return os.path.join(dataset_dir(dataset), sequence, load_dataset_meta(dataset)["mtd_amp_dir"], f"{frame}.npy")
163
+
164
+
165
+ # --------------------------------------------------------------------------
166
+ # models
167
+ # --------------------------------------------------------------------------
168
+ def runs_dir(dataset: str) -> str:
169
+ return os.path.join(MODELS_ROOT, dataset)
170
+
171
+
172
+ def run_dir(dataset: str, run_folder: str) -> str:
173
+ return os.path.join(runs_dir(dataset), run_folder)
174
+
175
+
176
+ def run_config_path(dataset: str, run_folder: str) -> str:
177
+ return os.path.join(run_dir(dataset, run_folder), "config.json")
178
+
179
+
180
+ def run_weights_path(dataset: str, run_folder: str, filename: str) -> str:
181
+ return os.path.join(run_dir(dataset, run_folder), "results", filename)
182
+
183
+
184
+ def load_run_config(dataset: str, run_folder: str) -> dict:
185
+ data = read_json(run_config_path(dataset, run_folder), None)
186
+ return data if isinstance(data, dict) else {}
187
+
188
+
189
+ def discover_runs(dataset: str) -> dict[str, tuple[str, str]]:
190
+ """
191
+ {model_name: (run_folder, weights_filename)} discovered from disk.
192
+
193
+ A run folder qualifies when its config.json declares `"model"` and
194
+ `results/<model>.pt` exists. When several runs train the same model the
195
+ alphabetically first folder wins, unless `run_overrides` in
196
+ dataset_meta.json pins a specific one.
197
+ """
198
+ runs: dict[str, tuple[str, str]] = {}
199
+ if not os.path.isdir(runs_dir(dataset)):
200
+ return runs
201
+
202
+ for folder in sorted(os.listdir(runs_dir(dataset))):
203
+ if not os.path.isdir(run_dir(dataset, folder)):
204
+ continue
205
+ cfg = load_run_config(dataset, folder)
206
+ model = cfg.get("model") or cfg.get("model_name")
207
+ if not model:
208
+ continue
209
+ filename = f"{model}.pt"
210
+ if not os.path.isfile(run_weights_path(dataset, folder, filename)):
211
+ continue
212
+ runs.setdefault(model, (folder, filename))
213
+
214
+ for model, folder in (load_dataset_meta(dataset).get("run_overrides") or {}).items():
215
+ filename = f"{model}.pt"
216
+ if os.path.isfile(run_weights_path(dataset, folder, filename)):
217
+ runs[model] = (folder, filename)
218
+ else:
219
+ print(f"[warn] run_overrides: '{folder}' for model '{model}' in '{dataset}' is not usable")
220
+
221
+ return runs
222
+
223
+
224
+ def model_names(dataset: str) -> list[str]:
225
+ return sorted(discover_runs(dataset))
datasets/HiL-RED/barrage_narrow_jamming_-10dB/annotations/dense/2025090809332621314/range_doppler.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:70ecf065fbac4a338dcaf36d00be9338d92758246197391490a10b2a98cece19
3
+ size 131200
datasets/HiL-RED/barrage_narrow_jamming_-10dB/range_doppler_MTD/2025090809332621314.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a46e58e8987890ad6f4e7bd699590cb27d6da378799a88d3704bdede55f341ea
3
+ size 2097280
datasets/HiL-RED/barrage_narrow_jamming_-10dB/range_doppler_echo/2025090809332621314.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:e496283afdbfb8fde85796edaedc5c07be412aa04281fab099b629d79671a772
3
+ size 2097280
datasets/HiL-RED/barrage_narrow_jamming_-10dB/transmit/transmitwave.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a116b381caa9593aba463f8b2052a9a697847ed712500926f0a87e5c5f846695
3
+ size 6528
datasets/HiL-RED/barrage_narrow_jamming_-15dB/annotations/dense/202509082203273504/range_doppler.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3a5c22060894811b53aac59e3d376dc3dc4785ec5c904a72ff00e82e7affa42c
3
+ size 131200
datasets/HiL-RED/barrage_narrow_jamming_-15dB/range_doppler_MTD/202509082203273504.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ac0dd560deb14e3223b0b1f698e4ad46065fddaf0bd0c16e56bc1c08a9d79fc3
3
+ size 2097280
datasets/HiL-RED/barrage_narrow_jamming_-15dB/range_doppler_echo/202509082203273504.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f87d2c4f27f413033e74750b2c16af2b83bf8e6c7e9836d2254fad8bd65e85f4
3
+ size 2097280
datasets/HiL-RED/barrage_narrow_jamming_-15dB/transmit/transmitwave.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a116b381caa9593aba463f8b2052a9a697847ed712500926f0a87e5c5f846695
3
+ size 6528
datasets/HiL-RED/barrage_narrow_jamming_-20dB/annotations/dense/202509091239203879/range_doppler.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:eb4b727489e41156e4d1817f744735a31e30cf929b0df8991775160fc7443605
3
+ size 131200
datasets/HiL-RED/barrage_narrow_jamming_-20dB/range_doppler_MTD/202509091239203879.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:306bbb96aada7bc0356d5450dfab41c109d379d7760b5d85c7dcc9656ec82af8
3
+ size 2097280
datasets/HiL-RED/barrage_narrow_jamming_-20dB/range_doppler_echo/202509091239203879.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:08a8424908e2e8c0a77c127bbf2eabecee048dba654b99d2c823fdc271bd00bb
3
+ size 2097280
datasets/HiL-RED/barrage_narrow_jamming_-20dB/transmit/transmit/transmitwave.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a116b381caa9593aba463f8b2052a9a697847ed712500926f0a87e5c5f846695
3
+ size 6528
datasets/HiL-RED/barrage_wide_jamming_-10dB/annotations/dense/20250901111636100764/range_doppler.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:57d1db4de8704d4e8d1fdbca064efb95ddf8e49931228432b52e84c0f565fd46
3
+ size 131200
datasets/HiL-RED/barrage_wide_jamming_-10dB/range_doppler_MTD/20250901111636100764.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:c5793d50ada7c56eefb74f33e99445522029366a4188552d29976299b0f3a1cf
3
+ size 2097280
datasets/HiL-RED/barrage_wide_jamming_-10dB/range_doppler_echo/20250901111636100764.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:30510581ef1d25324aea4763eefa0ac88476b5edffebc154ab72ad5aa1821f30
3
+ size 2097280
datasets/HiL-RED/barrage_wide_jamming_-10dB/transmit/transmitwave.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a116b381caa9593aba463f8b2052a9a697847ed712500926f0a87e5c5f846695
3
+ size 6528
datasets/HiL-RED/barrage_wide_jamming_-15dB/annotations/dense/202509021530465441/range_doppler.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:faba94c0fa8d4fca54195167788ba40dfdb3217f15ae0c13776d0162d29dccbf
3
+ size 131200
datasets/HiL-RED/barrage_wide_jamming_-15dB/range_doppler_MTD/202509021530465441.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:39c128493b83439b7d5a2525e6f16f4a4c2f43d511978c84f6b650a798b0b205
3
+ size 2097280
datasets/HiL-RED/barrage_wide_jamming_-15dB/range_doppler_echo/202509021530465441.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1052c81c1985ed7f272c091bf3b5077f2f0351d3c54499af5b0163087097cf30
3
+ size 2097280
datasets/HiL-RED/barrage_wide_jamming_-15dB/transmit/transmitwave.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a116b381caa9593aba463f8b2052a9a697847ed712500926f0a87e5c5f846695
3
+ size 6528
datasets/HiL-RED/barrage_wide_jamming_-20dB/annotations/dense/202509031652503690/range_doppler.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:86285a424c8d6fc828c492c7d6ae3a04f9ab9c224543207756a0a3cf03362135
3
+ size 131200
datasets/HiL-RED/barrage_wide_jamming_-20dB/range_doppler_MTD/202509031652503690.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:99fdb906b04ba369c849b1ff75d6888b912fe19fac37a6c8065f667584337fba
3
+ size 2097280
datasets/HiL-RED/barrage_wide_jamming_-20dB/range_doppler_echo/202509031652503690.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7a7259c589bdb9fc075a2374bf6b38317e64d96210d9737add52f97f127ff61e
3
+ size 2097280
datasets/HiL-RED/barrage_wide_jamming_-20dB/transmit/transmitwave.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a116b381caa9593aba463f8b2052a9a697847ed712500926f0a87e5c5f846695
3
+ size 6528
datasets/HiL-RED/coefs/s_tx.mat ADDED
Binary file (3.37 kB). View file
 
datasets/HiL-RED/coefs/w_blackman.mat ADDED
Binary file (2.18 kB). View file
 
datasets/HiL-RED/coefs/w_chebyshev.mat ADDED
Binary file (2.17 kB). View file
 
datasets/HiL-RED/coefs/w_cosine.mat ADDED
Binary file (2.45 kB). View file
 
datasets/HiL-RED/coefs/w_hamming.mat ADDED
Binary file (2.18 kB). View file
 
datasets/HiL-RED/coefs/w_hanning.mat ADDED
Binary file (2.16 kB). View file
 
datasets/HiL-RED/coefs/w_rectangular.mat ADDED
Binary file (192 Bytes). View file
 
datasets/HiL-RED/coefs/w_taylor.mat ADDED
Binary file (2.17 kB). View file
 
datasets/HiL-RED/data_seq_ref.json ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "deceptive_sli_jammer_-15dB": {
3
+ "split": [
4
+ "Train",
5
+ "Validation",
6
+ "Test"
7
+ ]
8
+ },
9
+ "deceptive_sli_jammer_-20dB": {
10
+ "split": [
11
+ "Train",
12
+ "Validation",
13
+ "Test"
14
+ ]
15
+ },
16
+ "deceptive_dft_jammer_-10dB": {
17
+ "split": [
18
+ "Train",
19
+ "Validation",
20
+ "Test"
21
+ ]
22
+ },
23
+ "deceptive_isr_jammer_-15dB": {
24
+ "split": [
25
+ "Train",
26
+ "Validation",
27
+ "Test"
28
+ ]
29
+ },
30
+ "barrage_wide_jamming_-10dB": {
31
+ "split": [
32
+ "Train",
33
+ "Validation",
34
+ "Test"
35
+ ]
36
+ },
37
+ "deceptive_isr_jammer_-20dB": {
38
+ "split": [
39
+ "Train",
40
+ "Validation",
41
+ "Test"
42
+ ]
43
+ },
44
+ "deceptive_dft_jammer_-15dB": {
45
+ "split": [
46
+ "Train",
47
+ "Validation",
48
+ "Test"
49
+ ]
50
+ },
51
+ "barrage_narrow_jamming_-10dB": {
52
+ "split": [
53
+ "Train",
54
+ "Validation",
55
+ "Test"
56
+ ]
57
+ },
58
+ "barrage_narrow_jamming_-15dB": {
59
+ "split": [
60
+ "Train",
61
+ "Validation",
62
+ "Test"
63
+ ]
64
+ },
65
+ "barrage_wide_jamming_-20dB": {
66
+ "split": [
67
+ "Train",
68
+ "Validation",
69
+ "Test"
70
+ ]
71
+ },
72
+ "deceptive_dft_jammer_-20dB": {
73
+ "split": [
74
+ "Train",
75
+ "Validation",
76
+ "Test"
77
+ ]
78
+ },
79
+ "barrage_narrow_jamming_-20dB": {
80
+ "split": [
81
+ "Train",
82
+ "Validation",
83
+ "Test"
84
+ ]
85
+ },
86
+ "deceptive_sli_jammer_-10dB": {
87
+ "split": [
88
+ "Train",
89
+ "Validation",
90
+ "Test"
91
+ ]
92
+ },
93
+ "barrage_wide_jamming_-15dB": {
94
+ "split": [
95
+ "Train",
96
+ "Validation",
97
+ "Test"
98
+ ]
99
+ },
100
+ "deceptive_isr_jammer_-10dB": {
101
+ "split": [
102
+ "Train",
103
+ "Validation",
104
+ "Test"
105
+ ]
106
+ }
107
+ }
datasets/HiL-RED/dataset_meta.json ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "display_name": "HiL-RED",
3
+ "full_name": "Hardware-in-the-Loop Radar Echo Dataset",
4
+ "scenario": "Target-jammer recognition under active electronic countermeasures",
5
+ "order": 2,
6
+ "mtd_fftshift": true,
7
+ "mtd_amp_dir": "range_doppler_MTD",
8
+ "valid_classes": [0, 1, 2, 3, 4, 5, 6]
9
+ }
datasets/HiL-RED/deceptive_dft_jammer_-10dB/annotations/dense/202509092208275264/range_doppler.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b7b4beedcd2f094ca06da5f5834f47024358a3ad10e7f13216d3c702314afd36
3
+ size 131200
datasets/HiL-RED/deceptive_dft_jammer_-10dB/range_doppler_MTD/202509092208275264.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1fc43c56366f3e99a3891d9e5e1939211cfecbf9a393db7acc1e5011f921546c
3
+ size 2097280
datasets/HiL-RED/deceptive_dft_jammer_-10dB/range_doppler_echo/202509092208275264.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:983852934cdd8eeafe1b1653d35e51f2745fdf835ef33b42816b9625f5fc2b5b
3
+ size 2097280
datasets/HiL-RED/deceptive_dft_jammer_-10dB/transmit/transmitwave.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a116b381caa9593aba463f8b2052a9a697847ed712500926f0a87e5c5f846695
3
+ size 6528
datasets/HiL-RED/deceptive_dft_jammer_-15dB/annotations/dense/202509102013124057/range_doppler.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:52a1e70875b5d32ed657ea0414a4cb2736136b7837cf919c51dbfb58fbe36937
3
+ size 131200
datasets/HiL-RED/deceptive_dft_jammer_-15dB/range_doppler_MTD/202509102013124057.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a020d43a63d006c93a472a7217a6a21591002c57fca058decc3ea530e6dfd8e4
3
+ size 2097280
datasets/HiL-RED/deceptive_dft_jammer_-15dB/range_doppler_echo/202509102013124057.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:84fd1398de71cdce4cd8ca65d2c7acd8055eb62c9a0a5fa85b59328b53c8bb4d
3
+ size 2097280
datasets/HiL-RED/deceptive_dft_jammer_-15dB/transmit/transmitwave.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:a116b381caa9593aba463f8b2052a9a697847ed712500926f0a87e5c5f846695
3
+ size 6528
datasets/HiL-RED/deceptive_dft_jammer_-20dB/annotations/dense/202509112218344171/range_doppler.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:721dad995d4d8bd62abf8b30ed566546b90d24016c70fb99ffb37724871395bc
3
+ size 131200
datasets/HiL-RED/deceptive_dft_jammer_-20dB/range_doppler_MTD/202509112218344171.npy ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:81f258c2b7d3a184882af14848de3d7c22edddeef07ee9f60e6b185bd39ef1c3
3
+ size 2097280