Upload EchMo-Vis: code, weights, sample data, images, readme
Browse filesThis view is limited to 50 files because it contains too many changes. See raw diff
- .gitattributes +6 -35
- .gitignore +117 -0
- LICENSE +21 -0
- README.md +290 -0
- app.py +0 -0
- asset_paths.py +225 -0
- datasets/HiL-RED/barrage_narrow_jamming_-10dB/annotations/dense/2025090809332621314/range_doppler.npy +3 -0
- datasets/HiL-RED/barrage_narrow_jamming_-10dB/range_doppler_MTD/2025090809332621314.npy +3 -0
- datasets/HiL-RED/barrage_narrow_jamming_-10dB/range_doppler_echo/2025090809332621314.npy +3 -0
- datasets/HiL-RED/barrage_narrow_jamming_-10dB/transmit/transmitwave.npy +3 -0
- datasets/HiL-RED/barrage_narrow_jamming_-15dB/annotations/dense/202509082203273504/range_doppler.npy +3 -0
- datasets/HiL-RED/barrage_narrow_jamming_-15dB/range_doppler_MTD/202509082203273504.npy +3 -0
- datasets/HiL-RED/barrage_narrow_jamming_-15dB/range_doppler_echo/202509082203273504.npy +3 -0
- datasets/HiL-RED/barrage_narrow_jamming_-15dB/transmit/transmitwave.npy +3 -0
- datasets/HiL-RED/barrage_narrow_jamming_-20dB/annotations/dense/202509091239203879/range_doppler.npy +3 -0
- datasets/HiL-RED/barrage_narrow_jamming_-20dB/range_doppler_MTD/202509091239203879.npy +3 -0
- datasets/HiL-RED/barrage_narrow_jamming_-20dB/range_doppler_echo/202509091239203879.npy +3 -0
- datasets/HiL-RED/barrage_narrow_jamming_-20dB/transmit/transmit/transmitwave.npy +3 -0
- datasets/HiL-RED/barrage_wide_jamming_-10dB/annotations/dense/20250901111636100764/range_doppler.npy +3 -0
- datasets/HiL-RED/barrage_wide_jamming_-10dB/range_doppler_MTD/20250901111636100764.npy +3 -0
- datasets/HiL-RED/barrage_wide_jamming_-10dB/range_doppler_echo/20250901111636100764.npy +3 -0
- datasets/HiL-RED/barrage_wide_jamming_-10dB/transmit/transmitwave.npy +3 -0
- datasets/HiL-RED/barrage_wide_jamming_-15dB/annotations/dense/202509021530465441/range_doppler.npy +3 -0
- datasets/HiL-RED/barrage_wide_jamming_-15dB/range_doppler_MTD/202509021530465441.npy +3 -0
- datasets/HiL-RED/barrage_wide_jamming_-15dB/range_doppler_echo/202509021530465441.npy +3 -0
- datasets/HiL-RED/barrage_wide_jamming_-15dB/transmit/transmitwave.npy +3 -0
- datasets/HiL-RED/barrage_wide_jamming_-20dB/annotations/dense/202509031652503690/range_doppler.npy +3 -0
- datasets/HiL-RED/barrage_wide_jamming_-20dB/range_doppler_MTD/202509031652503690.npy +3 -0
- datasets/HiL-RED/barrage_wide_jamming_-20dB/range_doppler_echo/202509031652503690.npy +3 -0
- datasets/HiL-RED/barrage_wide_jamming_-20dB/transmit/transmitwave.npy +3 -0
- datasets/HiL-RED/coefs/s_tx.mat +0 -0
- datasets/HiL-RED/coefs/w_blackman.mat +0 -0
- datasets/HiL-RED/coefs/w_chebyshev.mat +0 -0
- datasets/HiL-RED/coefs/w_cosine.mat +0 -0
- datasets/HiL-RED/coefs/w_hamming.mat +0 -0
- datasets/HiL-RED/coefs/w_hanning.mat +0 -0
- datasets/HiL-RED/coefs/w_rectangular.mat +0 -0
- datasets/HiL-RED/coefs/w_taylor.mat +0 -0
- datasets/HiL-RED/data_seq_ref.json +107 -0
- datasets/HiL-RED/dataset_meta.json +9 -0
- datasets/HiL-RED/deceptive_dft_jammer_-10dB/annotations/dense/202509092208275264/range_doppler.npy +3 -0
- datasets/HiL-RED/deceptive_dft_jammer_-10dB/range_doppler_MTD/202509092208275264.npy +3 -0
- datasets/HiL-RED/deceptive_dft_jammer_-10dB/range_doppler_echo/202509092208275264.npy +3 -0
- datasets/HiL-RED/deceptive_dft_jammer_-10dB/transmit/transmitwave.npy +3 -0
- datasets/HiL-RED/deceptive_dft_jammer_-15dB/annotations/dense/202509102013124057/range_doppler.npy +3 -0
- datasets/HiL-RED/deceptive_dft_jammer_-15dB/range_doppler_MTD/202509102013124057.npy +3 -0
- datasets/HiL-RED/deceptive_dft_jammer_-15dB/range_doppler_echo/202509102013124057.npy +3 -0
- datasets/HiL-RED/deceptive_dft_jammer_-15dB/transmit/transmitwave.npy +3 -0
- datasets/HiL-RED/deceptive_dft_jammer_-20dB/annotations/dense/202509112218344171/range_doppler.npy +3 -0
- datasets/HiL-RED/deceptive_dft_jammer_-20dB/range_doppler_MTD/202509112218344171.npy +3 -0
.gitattributes
CHANGED
|
@@ -1,35 +1,6 @@
|
|
| 1 |
-
*.
|
| 2 |
-
*.
|
| 3 |
-
*.
|
| 4 |
-
*.
|
| 5 |
-
*.
|
| 6 |
-
*.
|
| 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 |
+

|
| 10 |
+
|
| 11 |
+
# End-to-End Radar Echo Segmentation Visualization
|
| 12 |
+
|
| 13 |
+
[](https://gradio.app/)
|
| 14 |
+
[](https://pytorch.org/)
|
| 15 |
+
[](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 |
+

|
| 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 |
+

|
| 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
|