Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 5d1dcac

Browse files
committedAug 6, 2024
added documentation
1 parent d0b7237 commit 5d1dcac

13 files changed

+1967
-251
lines changed
 

‎.gitignore

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
*.yaml
99
*.txt
1010
*.json
11-
*.png
1211
*.mdb
1312
*-checkpoint.ipynb
1413
.DS_Store

‎poetry.lock

+1,648-15
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎pyproject.toml

+4-2
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,16 @@ python = "^3.10"
1010
scikit-image = "^0.22.0"
1111
matplotlib = "^3.8.3"
1212
numpy = "^1.26.4"
13-
opencv-python = "^4.9.0.80"
13+
opencv-python = "^4.8.0.74"
1414
scipy = "^1.12.0"
1515
zstandard = "^0.22.0"
1616
pyyaml = "^6.0.1"
1717
pillow = "^10.2.0"
1818
python-on-whales = "^0.69.0"
1919
sigmf = "^1.2.0"
20-
20+
tqdm = "^4.66.4"
21+
cupy = "^13.2.0"
22+
torchsig = {path = "../torchsig"}
2123

2224
[tool.poetry.group.dev.dependencies]
2325
jupyter = "^1.0.0"

‎rfml-dev/README.md

+71
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,74 @@
1+
# Preqs
2+
3+
## Poetry
4+
5+
## Torchsig
6+
7+
Download and install from [Github](https://github.com/TorchDSP/torchsig)
8+
9+
```
10+
git clone https://github.com/TorchDSP/torchsig.git
11+
cd torchsig
12+
sudo pip install .
13+
```
14+
15+
16+
17+
# Building a Model
18+
19+
20+
## Approach
21+
22+
Our current approach is to capture samples of the background RF environment and then also isolate signals of interest and capture samples of each of the signals. The same label will be applied to all of the signals present in the background environment samples. We use this to essentially teach the model to ignore those signals. For this to work, it is important that none of the signals of interest are present. Since it is really tough these days to find an RF free environment, we have build a mini-faraday cage enclosure by lining the inside of a pelican case with foil. There are lots of instructions, like [this one](https://mosequipment.com/blogs/blog/build-your-own-faraday-cage), available online if you want to build your own. With this, the signal will be very strong, so make sure you adjust the SDR's gain appropriately.
23+
24+
## Labeling IQ Data
25+
26+
The scripts in the [label_scripts](./label_scripts/) use signal processing to automatically label IQ data. The scripts looks at the signal power to detect when there is a signal present in the IQ data. When a signal is detected, the script will look at the frequencies for that set of samples and find the upper and lower bounds.
27+
28+
29+
30+
31+
### Annotation Explained
32+
33+
```python
34+
annotation_utils.annotate(
35+
f,
36+
label="mavic3_video", # This is the label that is applied to all of the matching annotations
37+
avg_window_len=256, # The number of samples over which to average signal power
38+
avg_duration=0.25, # The number of seconds, from the start of the recording to use to automatically calculate the SNR threshold, if it is None then all of the samples will be used
39+
debug=False,
40+
estimate_frequency=True, # Whether the frequency bounds for an annotation should be calculated. estimate_frequency needs to be enabled if you use min/max_bandwidth
41+
spectral_energy_threshold=0.95, # Percentage used to determine the upper and lower frequency bounds for an annotation
42+
force_threshold_db=-58, # Used to manually set the threshold used for detecting a signal and creating an annotation. If None, then the automatic threshold calcuation will be used instead.
43+
overwrite=False, # If True, any existing annotations in the .sigmf-meta file will be removed
44+
min_bandwidth=16e6, # The minimum bandwidth (in Hz) of a signal to annotate
45+
max_bandwidth=None, # The maximum bandwidth (in Hz) of a signal to annotate
46+
min_annotation_length=10000, # The minimum numbers of samples in length a signal needs to be in order for it to be annotated. This is directly related to the sample rate a signal was captured at and does not take into account bandwidth. So 10000 samples at 20,000,000 samples per second, would mean a minimum transmission length of 0.0005 seconds
47+
# max_annotations=500, # The maximum number of annotations to automatically add
48+
dc_block=True # De-emphasize the DC spike when trying to calculate the frequencies for a signal
49+
)
50+
```
51+
52+
### Configuring Annotation
53+
54+
#### Force Threshold dB
55+
![low threshold](./images/low_threshold.png)
56+
57+
If you see annotations where harmonics or lower power, unintentional signals are getting selected, try setting the `force_threshold_db`. The automatic threshold calculation maybe selecting a value that is too low. Find a value for `force_threshold_db` where it is selecting the intended signals and ignoring the low power ones.
58+
59+
#### Spectral Energy Threshold
60+
![spectral energy](./images/spectral_energy.png)
61+
62+
If the frequency bounds are not lining up with the top or bottom part of a signal, make the `spectral_energy_threshold` higher. Sometime a setting as high as 0.99 is required
63+
64+
#### Skipping "small" Signals
65+
![small signals](./images/min_annotation.png)
66+
67+
Some tuning is needed for signals that have a short transmission duration and/or limited bandwidth. Here are a couple things to try if they are getting skipped:
68+
- `min_annotation_length` is the minimum number of samples for an annotation. If the signal is has less samples than this, it will not be annotated. Try lowering this.
69+
- The `average_duration` setting maybe too long and the signal is getting averaged into the noise. Try lowering this.
70+
- `min_bandwidth` is the minimum bandwidth (in Hz) for a signal to be detected. If this value is too high, signals that have less bandiwdth will be ignored. Try lowering this.
71+
172

273
## Files
374

‎rfml-dev/annotation_utils.py

+57-49
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,13 @@
1313
from pathlib import Path
1414
from tqdm import tqdm
1515

16-
def moving_average(complex_iq, window_len):
16+
def moving_average(complex_iq, avg_window_len):
1717
return (
18-
np.convolve(np.abs(complex_iq) ** 2, np.ones(window_len), "valid") / window_len
18+
np.convolve(np.abs(complex_iq) ** 2, np.ones(avg_window_len), "valid") / avg_window_len
1919
)
2020

21-
def power_squelch(iq_samples, threshold, window):
22-
avg_pwr = moving_average(iq_samples, window)
21+
def power_squelch(iq_samples, threshold, avg_window_len):
22+
avg_pwr = moving_average(iq_samples, avg_window_len)
2323
avg_pwr_db = 10 * np.log10(avg_pwr)
2424

2525
good_samples = np.zeros(len(iq_samples))
@@ -39,11 +39,12 @@ def reset_annotations(data_obj):
3939

4040
def annotate_power_squelch(data_obj, threshold, avg_window_len, label=None, skip_validate=False, estimate_frequency=False, dry_run=False, min_annotation_length=400, spectral_energy_threshold=None, min_bandwidth=None, max_bandwidth=None, overwrite=True, max_annotations=None, dc_block=False, verbose=False):
4141
iq_samples = data_obj.get_samples()
42-
idx = power_squelch(iq_samples, threshold=threshold, window=avg_window_len)
42+
idx = power_squelch(iq_samples, threshold=threshold, avg_window_len=avg_window_len)
4343

4444
if overwrite:
4545
data_obj.sigmf_obj._metadata[data_obj.sigmf_obj.ANNOTATION_KEY] = []
4646
for start, stop in tqdm(idx[:max_annotations]):
47+
#print(f"{start=}, {stop=} {max_annotations=}")
4748
start, stop = int(start), int(stop)
4849
if min_annotation_length and (stop-start < min_annotation_length):
4950
continue
@@ -52,10 +53,13 @@ def annotate_power_squelch(data_obj, threshold, avg_window_len, label=None, skip
5253
freq_lower_edge, freq_upper_edge = get_occupied_bandwidth(iq_samples[start:stop], data_obj.metadata["global"]["core:sample_rate"], data_obj.metadata["captures"][0]["core:frequency"], spectral_energy_threshold=spectral_energy_threshold, dc_block=dc_block, verbose=verbose)
5354
bandwidth = freq_upper_edge - freq_lower_edge
5455
if min_bandwidth and bandwidth < min_bandwidth:
56+
if verbose:
57+
print(f"min_bandwidth - Skipping, {label}, {start=}, {stop=}, {bandwidth=}, {freq_upper_edge=}, {freq_lower_edge=}")
5558
# print(f"Skipping, {label}, {start=}, {stop=}, {bandwidth=}, {freq_upper_edge=}, {freq_lower_edge=}")
5659
continue
5760
if max_bandwidth and bandwidth > max_bandwidth:
58-
# print(f"Skipping, {label}, {start=}, {stop=}, {bandwidth=}, {freq_upper_edge=}, {freq_lower_edge=}")
61+
if verbose:
62+
print(f"max_bandwidth - Skipping, {label}, {start=}, {stop=}, {bandwidth=}, {freq_upper_edge=}, {freq_lower_edge=}")
5963
continue
6064

6165
else:
@@ -83,57 +87,58 @@ def annotate(filename, label, avg_window_len, avg_duration=-1, debug=False, dry_
8387

8488
data_obj = data_class.Data(filename)
8589

86-
# use a seconds worth of data to calculate threshold
87-
if avg_duration > -1:
88-
iq_samples = data_obj.get_samples(n_samples=int(data_obj.metadata["global"]["core:sample_rate"]*avg_duration))
89-
if iq_samples is None:
90-
iq_samples = data_obj.get_samples()
90+
91+
if force_threshold_db:
92+
threshold_db = force_threshold_db
9193
else:
92-
iq_samples = data_obj.get_samples()
93-
94-
avg_pwr = moving_average(iq_samples, avg_window_len)
95-
avg_pwr_db = 10*np.log10(avg_pwr)
96-
del(avg_pwr)
97-
del(iq_samples)
94+
# use a seconds worth of data to calculate threshold
95+
if avg_duration > -1:
96+
iq_samples = data_obj.get_samples(n_samples=int(data_obj.metadata["global"]["core:sample_rate"]*avg_duration))
97+
if iq_samples is None:
98+
iq_samples = data_obj.get_samples()
99+
else:
100+
iq_samples = data_obj.get_samples()
101+
102+
avg_pwr = moving_average(iq_samples, avg_window_len)
103+
avg_pwr_db = 10*np.log10(avg_pwr)
104+
del(avg_pwr)
105+
del(iq_samples)
98106

99107

100-
# current threshold in custom_handler
101-
guess_threshold_old = (np.max(avg_pwr_db) + np.mean(avg_pwr_db))/2
108+
# current threshold in custom_handler
109+
guess_threshold_old = (np.max(avg_pwr_db) + np.mean(avg_pwr_db))/2
102110

103-
# MAD estimator
104-
def median_absolute_deviation(series):
105-
mad = 1.4826 * np.median(np.abs(series - np.median(series)))
106-
# sci_mad = scipy.stats.median_abs_deviation(series, scale="normal")
107-
return np.median(series) + 6*mad
111+
# MAD estimator
112+
def median_absolute_deviation(series):
113+
mad = 1.4826 * np.median(np.abs(series - np.median(series)))
114+
# sci_mad = scipy.stats.median_abs_deviation(series, scale="normal")
115+
return np.median(series) + 6*mad
108116

109-
mad = median_absolute_deviation(avg_pwr_db)
117+
mad = median_absolute_deviation(avg_pwr_db)
110118

111-
if force_threshold_db:
112-
threshold_db = force_threshold_db
113-
else:
114119
threshold_db = mad
115120

116-
if debug:
117-
print(f"{np.max(avg_pwr_db)=}")
118-
print(f"{np.mean(avg_pwr_db)=}")
119-
print(f"median absolute deviation threshold = {mad}")
120-
print(f"using threshold = {threshold_db}")
121-
# print(f"{len(avg_pwr_db)=}")
122-
123-
plt.figure()
124-
db_plot = avg_pwr_db[int(0*20.48e6):int(avg_duration*20.48e6)]
125-
plt.plot(np.arange(len(db_plot))/data_obj.metadata["global"]["core:sample_rate"], db_plot)
126-
plt.axhline(y = guess_threshold_old, color = 'g', linestyle = '-', label="old threshold")
127-
plt.axhline(y = np.mean(avg_pwr_db), color = 'r', linestyle = '-', label="average")
128-
plt.axhline(y = mad, color = 'b', linestyle = '-', label="median absolute deviation threshold")
129-
if force_threshold_db:
130-
plt.axhline(y = force_threshold_db, color = 'yellow', linestyle = '-', label="force threshold db")
131-
plt.legend(loc="upper left")
132-
plt.ylabel("dB")
133-
plt.xlabel("time (seconds)")
134-
plt.title("Signal Power")
135-
plt.show()
136-
121+
if debug:
122+
print(f"{np.max(avg_pwr_db)=}")
123+
print(f"{np.mean(avg_pwr_db)=}")
124+
print(f"median absolute deviation threshold = {mad}")
125+
print(f"using threshold = {threshold_db}")
126+
# print(f"{len(avg_pwr_db)=}")
127+
128+
plt.figure()
129+
db_plot = avg_pwr_db[int(0*20.48e6):int(avg_duration*20.48e6)]
130+
plt.plot(np.arange(len(db_plot))/data_obj.metadata["global"]["core:sample_rate"], db_plot)
131+
plt.axhline(y = guess_threshold_old, color = 'g', linestyle = '-', label="old threshold")
132+
plt.axhline(y = np.mean(avg_pwr_db), color = 'r', linestyle = '-', label="average")
133+
plt.axhline(y = mad, color = 'b', linestyle = '-', label="median absolute deviation threshold")
134+
if force_threshold_db:
135+
plt.axhline(y = force_threshold_db, color = 'yellow', linestyle = '-', label="force threshold db")
136+
plt.legend(loc="upper left")
137+
plt.ylabel("dB")
138+
plt.xlabel("time (seconds)")
139+
plt.title("Signal Power")
140+
plt.show()
141+
print(f"Using dB threshold = {threshold_db} for detecting signals to annotate")
137142
annotate_power_squelch(data_obj, threshold_db, avg_window_len, label=label, skip_validate=True, estimate_frequency=estimate_frequency, spectral_energy_threshold=spectral_energy_threshold, min_bandwidth=min_bandwidth, max_bandwidth=max_bandwidth, dry_run=dry_run, min_annotation_length=min_annotation_length, overwrite=overwrite, max_annotations=max_annotations, dc_block=dc_block, verbose=verbose)
138143

139144
def get_occupied_bandwidth(samples, sample_rate, center_frequency, spectral_energy_threshold=None, dc_block=False, verbose=False):
@@ -174,6 +179,9 @@ def get_occupied_bandwidth(samples, sample_rate, center_frequency, spectral_ener
174179
if freq_power_normalized[lower_idx:upper_idx].sum() >= spectral_energy_threshold:
175180
break
176181

182+
if lower_idx == 0 and upper_idx == freq_power_normalized.shape[0]-1:
183+
print(f"Could not find spectral energy threshold - max was: {freq_power_normalized[lower_idx:upper_idx].sum()}")
184+
break
177185

178186
freq_upper_edge = center_frequency - (freq_power.shape[0]/2 - upper_idx)/freq_power.shape[0]*sample_rate
179187
freq_lower_edge = center_frequency - (freq_power.shape[0]/2 - lower_idx)/freq_power.shape[0]*sample_rate

‎rfml-dev/images/low_threshold.png

2.26 MB
Loading

‎rfml-dev/images/min_annotation.png

694 KB
Loading

‎rfml-dev/images/spectral_energy.png

745 KB
Loading

‎rfml-dev/label_scripts/label_all_blade.py

-23
This file was deleted.

‎rfml-dev/label_scripts/label_dji.py

+18-18
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,18 @@
22

33
from pathlib import Path
44
from tqdm import tqdm
5-
5+
import os
6+
import sys
7+
sys.path.insert(1, os.path.join(sys.path[0], '..'))
68
import annotation_utils
79
import data as data_class
810

911

1012

1113
data_globs = {
12-
# "mini2_video": [
13-
# "data/gamutrf/gamutrf-arl/01_30_23/mini2_iq_label/*.sigmf-meta",
14-
# ],
15-
"mini2_video": [
16-
# "data/gamutrf/gamutrf-birdseye-field-days/pdx_field_day_2022_05_26/test_iq_label/dji-mini2-200m-0deg-5735mhz-lp-50-gain_20p5Msps_craft_flying-1.raw.sigmf-meta",
17-
"data/gamutrf/gamutrf-birdseye-field-days/pdx_field_day_2022_05_26/test_iq_label/*.sigmf-meta",
14+
"dji_samples": [
15+
"/home/iqt/lberndt/gamutrf-depoly/data/samples/mavic-30db/samples_1722867361.666000_2408703998Hz_20480000sps.raw.sigmf-meta",
16+
"/home/iqt/lberndt/gamutrf-depoly/data/samples/mavic-0db/samples_1722883251.180000_2408703998Hz_20480000sps.raw.sigmf-meta"
1817
]
1918
}
2019

@@ -29,30 +28,31 @@
2928
annotation_utils.reset_annotations(data_obj)
3029
annotation_utils.annotate(
3130
f,
32-
label="mini2_video",
31+
label="mavic3_remoteid",
3332
avg_window_len=256,
34-
avg_duration=0.25,
33+
avg_duration=0.10,
3534
debug=False,
3635
estimate_frequency=True,
37-
spectral_energy_threshold=0.95,
38-
force_threshold_db=-58,
39-
overwrite=False,
40-
min_bandwidth=16e6,
41-
min_annotation_length=10000,
36+
spectral_energy_threshold=0.90,
37+
#force_threshold_db=-48,
38+
overwrite=True,
39+
min_bandwidth=1e5,
40+
max_bandwidth=2e6,
41+
min_annotation_length=500,
4242
# max_annotations=500,
4343
dc_block=True
4444
)
4545
annotation_utils.annotate(
4646
f,
47-
label="mini2_telem",
47+
label="mavic3_video",
4848
avg_window_len=256,
4949
avg_duration=0.25,
5050
debug=False,
5151
estimate_frequency=True,
52-
spectral_energy_threshold=0.95,
53-
force_threshold_db=-58,
52+
spectral_energy_threshold=0.99,
53+
force_threshold_db=-38,
5454
overwrite=False,
55-
max_bandwidth=16e6,
55+
min_bandwidth=8e6,
5656
min_annotation_length=10000,
5757
# max_annotations=500,
5858
dc_block=True

‎rfml-dev/label_scripts/label_env.py

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import glob
2+
3+
from pathlib import Path
4+
from tqdm import tqdm
5+
import os
6+
import sys
7+
sys.path.insert(1, os.path.join(sys.path[0], '..'))
8+
import annotation_utils
9+
import data as data_class
10+
11+
12+
13+
data_globs = {
14+
# "mini2_video": [
15+
# "data/gamutrf/gamutrf-arl/01_30_23/mini2_iq_label/*.sigmf-meta",
16+
# ],
17+
"mini2_video": [
18+
"/home/iqt/lberndt/gamutrf-depoly/data/samples/environment/samples_1722872733.648000_2408703998Hz_20480000sps.raw.sigmf-meta"
19+
#"/home/iqt/lberndt/gamutrf-depoly/data/samples/mavic-0db/samples_1722883251.180000_2408703998Hz_20480000sps.raw.sigmf-meta"
20+
]
21+
}
22+
23+
24+
25+
for label in data_globs:
26+
for data_glob in data_globs[label]:
27+
for f in tqdm(glob.glob(str(Path(data_glob)))):
28+
# annotation_utils.annotate(f, label=label, avg_window_len=256, avg_duration=0.25, debug=True, estimate_frequency=True, spectral_energy_threshold=0.99, force_threshold_db=-40)
29+
30+
data_obj = data_class.Data(f)
31+
annotation_utils.reset_annotations(data_obj)
32+
annotation_utils.annotate(
33+
f,
34+
label="environment",
35+
avg_window_len=256,
36+
avg_duration=0.10,
37+
debug=False,
38+
estimate_frequency=True,
39+
spectral_energy_threshold=0.90,
40+
#force_threshold_db=-48,
41+
overwrite=True,
42+
min_bandwidth=None,
43+
max_bandwidth=None,
44+
min_annotation_length=1000,
45+
# max_annotations=500,
46+
dc_block=True
47+
)
48+
49+

‎rfml-dev/label_scripts/label_nz_wifi.py

-23
This file was deleted.

‎rfml-dev/run_experiments.py

+120-120
Original file line numberDiff line numberDiff line change
@@ -10,129 +10,129 @@
1010
experiments = {
1111
"experiment_0": {
1212
"experiment_name": "experiment_0",
13-
"class_list": ["wifi","anom_wifi"],
14-
"train_dir": ["data/gamutrf/gamutrf-sd-gr-ieee-wifi/test_offline"],
13+
"class_list": ["mavic3_video","mavic3_remoteid","env"],
14+
"train_dir": ["/home/iqt/lberndt/gamutrf-depoly/data/samples/mavic-30db", "/home/iqt/lberndt/gamutrf-depoly/data/samples/mavic-0db", "/home/iqt/lberndt/gamutrf-depoly/data/samples/environment"],
1515
"iq_epochs": 10,
1616
"spec_epochs": 10,
17-
"notes": "TESTING"
18-
},
19-
"experiment_1": {
20-
"experiment_name": "experiment_1",
21-
"class_list": ["wifi","anom_wifi"],
22-
"train_dir": ["data/gamutrf/gamutrf-nz-anon-wifi", "data/gamutrf/gamutrf-nz-nonanon-wifi"],
23-
"iq_epochs": 40,
24-
"spec_epochs": 40,
25-
"notes": "Wi-Fi vs anomalous Wi-Fi, Ettus B200Mini, anarkiwi collect"
26-
},
27-
"experiment_2": {
28-
"experiment_name": "experiment_2",
29-
"class_list": ["mini2_video","mini2_telem"],
30-
"train_dir": ["dev_data/torchsig_train/samples"],
31-
"iq_epochs": 25,
32-
"spec_epochs": 50,
33-
"notes": "DJI Mini2, Ettus B200Mini RX, copy of lab collection gamutrf/gamutrf-arl/01_30_23/mini2"
34-
},
35-
"experiment_3": {
36-
"experiment_name": "experiment_3",
37-
"class_list": ["wifi","anom_wifi"],
38-
"train_dir": ["data/gamutrf/gamutrf-nz-anon-wifi", "data/gamutrf/gamutrf-nz-nonanon-wifi"],
39-
"val_dir": ["data/gamutrf/gamutrf-wifi-and-anom-bladerf"],
40-
"iq_epochs": 40,
41-
"spec_epochs": 70,
42-
"spec_skip_export": True, # USE WITH CAUTION (but speeds up large directories significantly): skip after first run if using separate train/val directories
43-
"notes": "Wi-Fi vs anomalous Wi-Fi, train on Ettus B200Mini RX/TX, validate on BladeRF TX & Ettus B200Mini RX, anarkiwi collect"
44-
},
45-
"experiment_4": {
46-
"experiment_name": "experiment_4",
47-
"class_list": ["wifi","anom_wifi"],
48-
"train_dir": ["data/gamutrf/gamutrf-nz-anon-wifi", "data/gamutrf/gamutrf-nz-nonanon-wifi"],
49-
"val_dir": ["data/gamutrf/gamutrf-nz-wifi"],
50-
"iq_epochs": 40,
51-
"spec_epochs": 100,
52-
"notes": "Wi-Fi vs anomalous Wi-Fi, train on Ettus B200Mini RX/TX, validate on real Wi-Fi AP TX & Ettus B200Mini RX, anarkiwi collect"
53-
},
54-
"experiment_5": {
55-
"experiment_name": "experiment_5",
56-
"class_list": ["mini2_video","mini2_telem"],
57-
"train_dir": ["dev_data/torchsig_train/samples"],
58-
"val_dir": ["data/gamutrf/gamutrf-birdseye-field-days/pdx_field_day_2022_05_26/test_iq_label"],
59-
"iq_epochs": 40,
60-
"spec_epochs": 100,
61-
"spec_force_yolo_label_larger": True,
62-
"notes": "DJI Mini2, Ettus B200Mini RX, train on copy of lab collection gamutrf/gamutrf-arl/01_30_23/mini2, validate on field collect gamutrf/gamutrf-birdseye-field-days/pdx_field_day_2022_05_26/test_iq_label"
63-
},
64-
"experiment_6": {
65-
"experiment_name": "experiment_6",
66-
"class_list": ["wifi","anom_wifi"],
67-
"train_dir": [
68-
"data/gamutrf/wifi-data-03082024/20msps/normal/train",
69-
"data/gamutrf/wifi-data-03082024/20msps/normal/test",
70-
"data/gamutrf/wifi-data-03082024/20msps/normal/inference",
71-
"data/gamutrf/wifi-data-03082024/20msps/mod/train",
72-
"data/gamutrf/wifi-data-03082024/20msps/mod/test",
73-
"data/gamutrf/wifi-data-03082024/20msps/mod/inference",
74-
],
75-
"val_dir": [
76-
"data/gamutrf/wifi-data-03082024/20msps/normal/validate",
77-
"data/gamutrf/wifi-data-03082024/20msps/mod/validate",
78-
],
79-
"iq_num_samples": 16*25,
80-
"iq_epochs": 10,
81-
"iq_batch_size": 16,
82-
"spec_batch_size": 32,
83-
"spec_epochs": 40,
84-
"spec_n_fft": 16,
85-
"spec_time_dim": 25,
86-
"notes": "Ettus B200Mini RX, emair collect"
87-
},
88-
"experiment_7": {
89-
"experiment_name": "experiment_7",
90-
"class_list": ["wifi","anom_wifi"],
91-
"train_dir": ["data/gamutrf/gamutrf-wifi-and-anom-bladerf"],
92-
"iq_epochs": 40,
93-
"spec_epochs": 40,
94-
"notes": "Wi-Fi vs anomalous Wi-Fi, BladeRF, anarkiwi collect"
95-
},
96-
"experiment_8": {
97-
"experiment_name": "experiment_8",
98-
"class_list": ["wifi","anom_wifi"],
99-
"train_dir": ["data/gamutrf/gamutrf-wifi-and-anom-bladerf"],
100-
"val_dir": ["data/gamutrf/gamutrf-nz-anon-wifi", "data/gamutrf/gamutrf-nz-nonanon-wifi"],
101-
"iq_epochs": 40,
102-
"spec_epochs": 70,
103-
"spec_skip_export": True, # USE WITH CAUTION (but speeds up large directories significantly): skip after first run if using separate train/val directories
104-
"notes": "Wi-Fi vs anomalous Wi-Fi, validate on BladeRF TX & Ettus B200Mini RX, train on Ettus B200Mini RX/TX, anarkiwi collect"
105-
},
106-
"experiment_9": {
107-
"experiment_name": "experiment_9",
108-
"class_list": ["mini2_video","mini2_telem"],
109-
"train_dir": ["dev_data/torchsig_train/samples"],
110-
"val_dir": ["data/gamutrf/gamutrf-birdseye-field-days/pdx_field_day_2022_05_26/test_iq_label"],
111-
"iq_epochs": 40,
112-
"spec_epochs": 200,
113-
"spec_yolo_augment": True,
114-
"notes": "DJI Mini2, Ettus B200Mini RX, train on copy of lab collection gamutrf/gamutrf-arl/01_30_23/mini2, validate on field collect gamutrf/gamutrf-birdseye-field-days/pdx_field_day_2022_05_26/test_iq_label"
115-
},
116-
"experiment_10": {
117-
"experiment_name": "experiment_10",
118-
"class_list": ["wifi","anom_wifi"],
119-
"train_dir": ["data/gamutrf/anom_wifi/train_gamutrf-nz-anon-wifi", "data/gamutrf/anom_wifi/train_gamutrf-nz-nonanon-wifi", "data/gamutrf/anom_wifi/train_gamutrf-wifi-and-anom-bladerf"],
120-
"val_dir": ["data/gamutrf/anom_wifi/val_gamutrf-nz-anon-wifi", "data/gamutrf/anom_wifi/val_gamutrf-nz-nonanon-wifi"],
121-
"iq_epochs": 40,
122-
"spec_epochs": 70,
123-
"spec_skip_export": True, # USE WITH CAUTION (but speeds up large directories significantly): skip after first run if using separate train/val directories
124-
"notes": "Wi-Fi vs anomalous Wi-Fi, train on both BladeRF TX & Ettus B200Mini RX and on Ettus B200Mini RX/TX, validate on Ettus B200Mini RX/TX, anarkiwi collect"
125-
},
126-
"experiment_11": {
127-
"experiment_name": "experiment_11",
128-
"class_list": ["wifi","anom_wifi"],
129-
"train_dir": ["data/gamutrf/anom_wifi/train_gamutrf-nz-anon-wifi", "data/gamutrf/anom_wifi/train_gamutrf-nz-nonanon-wifi", "data/gamutrf/anom_wifi/train_gamutrf-wifi-and-anom-bladerf"],
130-
"val_dir": ["data/gamutrf/anom_wifi/val_gamutrf-wifi-and-anom-bladerf"],
131-
"iq_epochs": 40,
132-
"spec_epochs": 70,
133-
"spec_skip_export": True, # USE WITH CAUTION (but speeds up large directories significantly): skip after first run if using separate train/val directories
134-
"notes": "Wi-Fi vs anomalous Wi-Fi, train on both BladeRF TX & Ettus B200Mini RX and on Ettus B200Mini RX/TX, validate on BladeRF TX, anarkiwi collect"
17+
"notes": "DJI Mavic3 Detection"
13518
},
19+
# "experiment_1": {
20+
# "experiment_name": "experiment_1",
21+
# "class_list": ["wifi","anom_wifi"],
22+
# "train_dir": ["data/gamutrf/gamutrf-nz-anon-wifi", "data/gamutrf/gamutrf-nz-nonanon-wifi"],
23+
# "iq_epochs": 40,
24+
# "spec_epochs": 40,
25+
# "notes": "Wi-Fi vs anomalous Wi-Fi, Ettus B200Mini, anarkiwi collect"
26+
# },
27+
# "experiment_2": {
28+
# "experiment_name": "experiment_2",
29+
# "class_list": ["mini2_video","mini2_telem"],
30+
# "train_dir": ["dev_data/torchsig_train/samples"],
31+
# "iq_epochs": 25,
32+
# "spec_epochs": 50,
33+
# "notes": "DJI Mini2, Ettus B200Mini RX, copy of lab collection gamutrf/gamutrf-arl/01_30_23/mini2"
34+
# },
35+
# "experiment_3": {
36+
# "experiment_name": "experiment_3",
37+
# "class_list": ["wifi","anom_wifi"],
38+
# "train_dir": ["data/gamutrf/gamutrf-nz-anon-wifi", "data/gamutrf/gamutrf-nz-nonanon-wifi"],
39+
# "val_dir": ["data/gamutrf/gamutrf-wifi-and-anom-bladerf"],
40+
# "iq_epochs": 40,
41+
# "spec_epochs": 70,
42+
# "spec_skip_export": True, # USE WITH CAUTION (but speeds up large directories significantly): skip after first run if using separate train/val directories
43+
# "notes": "Wi-Fi vs anomalous Wi-Fi, train on Ettus B200Mini RX/TX, validate on BladeRF TX & Ettus B200Mini RX, anarkiwi collect"
44+
# },
45+
# "experiment_4": {
46+
# "experiment_name": "experiment_4",
47+
# "class_list": ["wifi","anom_wifi"],
48+
# "train_dir": ["data/gamutrf/gamutrf-nz-anon-wifi", "data/gamutrf/gamutrf-nz-nonanon-wifi"],
49+
# "val_dir": ["data/gamutrf/gamutrf-nz-wifi"],
50+
# "iq_epochs": 40,
51+
# "spec_epochs": 100,
52+
# "notes": "Wi-Fi vs anomalous Wi-Fi, train on Ettus B200Mini RX/TX, validate on real Wi-Fi AP TX & Ettus B200Mini RX, anarkiwi collect"
53+
# },
54+
# "experiment_5": {
55+
# "experiment_name": "experiment_5",
56+
# "class_list": ["mini2_video","mini2_telem"],
57+
# "train_dir": ["dev_data/torchsig_train/samples"],
58+
# "val_dir": ["data/gamutrf/gamutrf-birdseye-field-days/pdx_field_day_2022_05_26/test_iq_label"],
59+
# "iq_epochs": 40,
60+
# "spec_epochs": 100,
61+
# "spec_force_yolo_label_larger": True,
62+
# "notes": "DJI Mini2, Ettus B200Mini RX, train on copy of lab collection gamutrf/gamutrf-arl/01_30_23/mini2, validate on field collect gamutrf/gamutrf-birdseye-field-days/pdx_field_day_2022_05_26/test_iq_label"
63+
# },
64+
# "experiment_6": {
65+
# "experiment_name": "experiment_6",
66+
# "class_list": ["wifi","anom_wifi"],
67+
# "train_dir": [
68+
# "data/gamutrf/wifi-data-03082024/20msps/normal/train",
69+
# "data/gamutrf/wifi-data-03082024/20msps/normal/test",
70+
# "data/gamutrf/wifi-data-03082024/20msps/normal/inference",
71+
# "data/gamutrf/wifi-data-03082024/20msps/mod/train",
72+
# "data/gamutrf/wifi-data-03082024/20msps/mod/test",
73+
# "data/gamutrf/wifi-data-03082024/20msps/mod/inference",
74+
# ],
75+
# "val_dir": [
76+
# "data/gamutrf/wifi-data-03082024/20msps/normal/validate",
77+
# "data/gamutrf/wifi-data-03082024/20msps/mod/validate",
78+
# ],
79+
# "iq_num_samples": 16*25,
80+
# "iq_epochs": 10,
81+
# "iq_batch_size": 16,
82+
# "spec_batch_size": 32,
83+
# "spec_epochs": 40,
84+
# "spec_n_fft": 16,
85+
# "spec_time_dim": 25,
86+
# "notes": "Ettus B200Mini RX, emair collect"
87+
# },
88+
# "experiment_7": {
89+
# "experiment_name": "experiment_7",
90+
# "class_list": ["wifi","anom_wifi"],
91+
# "train_dir": ["data/gamutrf/gamutrf-wifi-and-anom-bladerf"],
92+
# "iq_epochs": 40,
93+
# "spec_epochs": 40,
94+
# "notes": "Wi-Fi vs anomalous Wi-Fi, BladeRF, anarkiwi collect"
95+
# },
96+
# "experiment_8": {
97+
# "experiment_name": "experiment_8",
98+
# "class_list": ["wifi","anom_wifi"],
99+
# "train_dir": ["data/gamutrf/gamutrf-wifi-and-anom-bladerf"],
100+
# "val_dir": ["data/gamutrf/gamutrf-nz-anon-wifi", "data/gamutrf/gamutrf-nz-nonanon-wifi"],
101+
# "iq_epochs": 40,
102+
# "spec_epochs": 70,
103+
# "spec_skip_export": True, # USE WITH CAUTION (but speeds up large directories significantly): skip after first run if using separate train/val directories
104+
# "notes": "Wi-Fi vs anomalous Wi-Fi, validate on BladeRF TX & Ettus B200Mini RX, train on Ettus B200Mini RX/TX, anarkiwi collect"
105+
# },
106+
# "experiment_9": {
107+
# "experiment_name": "experiment_9",
108+
# "class_list": ["mini2_video","mini2_telem"],
109+
# "train_dir": ["dev_data/torchsig_train/samples"],
110+
# "val_dir": ["data/gamutrf/gamutrf-birdseye-field-days/pdx_field_day_2022_05_26/test_iq_label"],
111+
# "iq_epochs": 40,
112+
# "spec_epochs": 200,
113+
# "spec_yolo_augment": True,
114+
# "notes": "DJI Mini2, Ettus B200Mini RX, train on copy of lab collection gamutrf/gamutrf-arl/01_30_23/mini2, validate on field collect gamutrf/gamutrf-birdseye-field-days/pdx_field_day_2022_05_26/test_iq_label"
115+
# },
116+
# "experiment_10": {
117+
# "experiment_name": "experiment_10",
118+
# "class_list": ["wifi","anom_wifi"],
119+
# "train_dir": ["data/gamutrf/anom_wifi/train_gamutrf-nz-anon-wifi", "data/gamutrf/anom_wifi/train_gamutrf-nz-nonanon-wifi", "data/gamutrf/anom_wifi/train_gamutrf-wifi-and-anom-bladerf"],
120+
# "val_dir": ["data/gamutrf/anom_wifi/val_gamutrf-nz-anon-wifi", "data/gamutrf/anom_wifi/val_gamutrf-nz-nonanon-wifi"],
121+
# "iq_epochs": 40,
122+
# "spec_epochs": 70,
123+
# "spec_skip_export": True, # USE WITH CAUTION (but speeds up large directories significantly): skip after first run if using separate train/val directories
124+
# "notes": "Wi-Fi vs anomalous Wi-Fi, train on both BladeRF TX & Ettus B200Mini RX and on Ettus B200Mini RX/TX, validate on Ettus B200Mini RX/TX, anarkiwi collect"
125+
# },
126+
# "experiment_11": {
127+
# "experiment_name": "experiment_11",
128+
# "class_list": ["wifi","anom_wifi"],
129+
# "train_dir": ["data/gamutrf/anom_wifi/train_gamutrf-nz-anon-wifi", "data/gamutrf/anom_wifi/train_gamutrf-nz-nonanon-wifi", "data/gamutrf/anom_wifi/train_gamutrf-wifi-and-anom-bladerf"],
130+
# "val_dir": ["data/gamutrf/anom_wifi/val_gamutrf-wifi-and-anom-bladerf"],
131+
# "iq_epochs": 40,
132+
# "spec_epochs": 70,
133+
# "spec_skip_export": True, # USE WITH CAUTION (but speeds up large directories significantly): skip after first run if using separate train/val directories
134+
# "notes": "Wi-Fi vs anomalous Wi-Fi, train on both BladeRF TX & Ettus B200Mini RX and on Ettus B200Mini RX/TX, validate on BladeRF TX, anarkiwi collect"
135+
# },
136136
}
137137

138138

0 commit comments

Comments
 (0)
Please sign in to comment.