mattricesound commited on
Commit
8a3bb8f
1 Parent(s): 30c1b93

Update dataset to use range for num effects

Browse files
Files changed (6) hide show
  1. README.md +8 -14
  2. cfg/config.yaml +14 -19
  3. cfg/exp/default.yaml +4 -9
  4. cfg/exp/dist.yaml +3 -4
  5. remfx/datasets.py +43 -37
  6. setup.py +0 -1
README.md CHANGED
@@ -20,36 +20,30 @@
20
 
21
  ## Experiments
22
  Training parameters can be configured in `cfg/exp/default.yaml`. Here are some descriptions
23
- - `max_kept_effects={n}` max number of <b> Kept </b> effects to apply to each file. Set to -1 to always use all effects (default: -1)
24
- - `max_removed_effects={n}` max number of <b> Removed </b> effects to apply to each file. Set to -1 to always use all effects (default: -1)
25
  - `model={model}` architecture to use (see 'Models')
26
- - `effects_to_use={effect}` Effects to use (see 'Effects') (default: all in the list)
27
- - `effects_to_remove={effect}` Effects to remove (see 'Effects') (default: all in the list)
28
  - `accelerator=null/'gpu'` Use GPU (1 device) (default: null)
29
  - `render_files=True/False` Render files. Disable to skip rendering stage (default: True)
30
  - `render_root={path/to/dir}`. Root directory to render files to (default: DATASET_ROOT)
31
 
32
- Note that "kept effects" are calculated from the difference between `effects_to_use` and `effects_to_remove`.
33
-
34
  These can also be specified on the command line.
35
- Example: `python scripts/train.py model=demucs "effects_to_use=[distortion, reverb, chorus]" "effects_to_remove=[distortion]" max_kept_effects=2 max_removed_effects=4 shuffle_kept_effects=False shuffle_removed_effects=True accelerator='gpu' render_root=/scratch/VocalSet'`
36
-
37
- Printout:
38
- ```
39
- Effect Summary:
40
- Apply kept effects: ['chorus', 'reverb'] (Up to 2, chosen in order) -> Dry
41
- Apply remove effects: ['distortion'] (Up to 4, chosen randomly) -> Wet
42
- ```
43
 
44
  ## Models
45
  - `umx`
46
  - `demucs`
 
 
 
47
 
48
  ## Effects
49
  - `chorus`
50
  - `compressor`
51
  - `distortion`
52
  - `reverb`
 
53
 
54
  ## Misc.
55
  By default, files are rendered to `input_dir / processed / {string_of_effects} / {train|val|test}`.
 
20
 
21
  ## Experiments
22
  Training parameters can be configured in `cfg/exp/default.yaml`. Here are some descriptions
23
+ - `num_kept_effects={min, max}` range of <b> Kept </b> effects to apply to each file.
24
+ - `num_removed_effects={min, max}` range of <b> Removed </b> effects to apply to each file.
25
  - `model={model}` architecture to use (see 'Models')
26
+ - `effects_to_keek={effect}` Effects to apply but not remove (see 'Effects')
27
+ - `effects_to_remove={effect}` Effects to remove (see 'Effects')
28
  - `accelerator=null/'gpu'` Use GPU (1 device) (default: null)
29
  - `render_files=True/False` Render files. Disable to skip rendering stage (default: True)
30
  - `render_root={path/to/dir}`. Root directory to render files to (default: DATASET_ROOT)
31
 
 
 
32
  These can also be specified on the command line.
 
 
 
 
 
 
 
 
33
 
34
  ## Models
35
  - `umx`
36
  - `demucs`
37
+ - `tcn`
38
+ - `dcunet`
39
+ - `dptnet`
40
 
41
  ## Effects
42
  - `chorus`
43
  - `compressor`
44
  - `distortion`
45
  - `reverb`
46
+ - `delay`
47
 
48
  ## Misc.
49
  By default, files are rendered to `input_dir / processed / {string_of_effects} / {train|val|test}`.
cfg/config.yaml CHANGED
@@ -14,23 +14,18 @@ accelerator: null
14
  log_audio: True
15
 
16
  # Effects
17
- max_kept_effects: -1
18
- max_removed_effects: -1
19
  shuffle_kept_effects: True
20
  shuffle_removed_effects: False
21
  num_classes: 5
22
- effects_to_use:
23
- - compressor
24
- - distortion
25
  - reverb
26
  - chorus
27
  - delay
28
  effects_to_remove:
29
  - compressor
30
  - distortion
31
- - reverb
32
- - chorus
33
- - delay
34
 
35
  callbacks:
36
  model_checkpoint:
@@ -62,10 +57,10 @@ datamodule:
62
  chunk_size: ${chunk_size}
63
  mode: "train"
64
  effect_modules: ${effects}
65
- effects_to_use: ${effects_to_use}
66
  effects_to_remove: ${effects_to_remove}
67
- max_kept_effects: ${max_kept_effects}
68
- max_removed_effects: ${max_removed_effects}
69
  shuffle_kept_effects: ${shuffle_kept_effects}
70
  shuffle_removed_effects: ${shuffle_removed_effects}
71
  render_files: ${render_files}
@@ -78,10 +73,10 @@ datamodule:
78
  chunk_size: ${chunk_size}
79
  mode: "val"
80
  effect_modules: ${effects}
81
- effects_to_use: ${effects_to_use}
82
  effects_to_remove: ${effects_to_remove}
83
- max_kept_effects: ${max_kept_effects}
84
- max_removed_effects: ${max_removed_effects}
85
  shuffle_kept_effects: ${shuffle_kept_effects}
86
  shuffle_removed_effects: ${shuffle_removed_effects}
87
  render_files: ${render_files}
@@ -94,10 +89,10 @@ datamodule:
94
  chunk_size: ${chunk_size}
95
  mode: "test"
96
  effect_modules: ${effects}
97
- effects_to_use: ${effects_to_use}
98
  effects_to_remove: ${effects_to_remove}
99
- max_kept_effects: ${max_kept_effects}
100
- max_removed_effects: ${max_removed_effects}
101
  shuffle_kept_effects: ${shuffle_kept_effects}
102
  shuffle_removed_effects: ${shuffle_removed_effects}
103
  render_files: ${render_files}
@@ -121,11 +116,11 @@ trainer:
121
  _target_: pytorch_lightning.Trainer
122
  precision: 32 # Precision used for tensors, default `32`
123
  min_epochs: 0
124
- max_epochs: -1
125
  enable_model_summary: False
126
  log_every_n_steps: 1 # Logs metrics every N batches
127
  accumulate_grad_batches: 1
128
  accelerator: ${accelerator}
129
  devices: 1
130
  gradient_clip_val: 10.0
131
- max_steps: 50000
 
14
  log_audio: True
15
 
16
  # Effects
17
+ num_kept_effects: [2,2] # [min, max]
18
+ num_removed_effects: [2,2] # [min, max]
19
  shuffle_kept_effects: True
20
  shuffle_removed_effects: False
21
  num_classes: 5
22
+ effects_to_keep:
 
 
23
  - reverb
24
  - chorus
25
  - delay
26
  effects_to_remove:
27
  - compressor
28
  - distortion
 
 
 
29
 
30
  callbacks:
31
  model_checkpoint:
 
57
  chunk_size: ${chunk_size}
58
  mode: "train"
59
  effect_modules: ${effects}
60
+ effects_to_keep: ${effects_to_keep}
61
  effects_to_remove: ${effects_to_remove}
62
+ num_kept_effects: ${num_kept_effects}
63
+ num_removed_effects: ${num_removed_effects}
64
  shuffle_kept_effects: ${shuffle_kept_effects}
65
  shuffle_removed_effects: ${shuffle_removed_effects}
66
  render_files: ${render_files}
 
73
  chunk_size: ${chunk_size}
74
  mode: "val"
75
  effect_modules: ${effects}
76
+ effects_to_keep: ${effects_to_keep}
77
  effects_to_remove: ${effects_to_remove}
78
+ num_kept_effects: ${num_kept_effects}
79
+ num_removed_effects: ${num_removed_effects}
80
  shuffle_kept_effects: ${shuffle_kept_effects}
81
  shuffle_removed_effects: ${shuffle_removed_effects}
82
  render_files: ${render_files}
 
89
  chunk_size: ${chunk_size}
90
  mode: "test"
91
  effect_modules: ${effects}
92
+ effects_to_keep: ${effects_to_keep}
93
  effects_to_remove: ${effects_to_remove}
94
+ num_kept_effects: ${num_kept_effects}
95
+ num_removed_effects: ${num_removed_effects}
96
  shuffle_kept_effects: ${shuffle_kept_effects}
97
  shuffle_removed_effects: ${shuffle_removed_effects}
98
  render_files: ${render_files}
 
116
  _target_: pytorch_lightning.Trainer
117
  precision: 32 # Precision used for tensors, default `32`
118
  min_epochs: 0
119
+ num_epochs: -1
120
  enable_model_summary: False
121
  log_every_n_steps: 1 # Logs metrics every N batches
122
  accumulate_grad_batches: 1
123
  accelerator: ${accelerator}
124
  devices: 1
125
  gradient_clip_val: 10.0
126
+ num_steps: 50000
cfg/exp/default.yaml CHANGED
@@ -11,23 +11,18 @@ render_root: "./data"
11
  accelerator: null
12
  log_audio: True
13
  # Effects
14
- max_kept_effects: -1
15
- max_removed_effects: -1
16
  shuffle_kept_effects: True
17
  shuffle_removed_effects: False
18
  num_classes: 5
19
- effects_to_use:
20
- - compressor
21
- - distortion
22
- - reverb
23
- - chorus
24
- - delay
25
  effects_to_remove:
26
  - compressor
27
- - distortion
28
  - reverb
29
  - chorus
30
  - delay
 
31
  datamodule:
32
  batch_size: 16
33
  num_workers: 8
 
11
  accelerator: null
12
  log_audio: True
13
  # Effects
14
+ num_kept_effects: [0,0] # [min, max]
15
+ num_removed_effects: [0,5] # [min, max]
16
  shuffle_kept_effects: True
17
  shuffle_removed_effects: False
18
  num_classes: 5
19
+ effects_to_keep:
 
 
 
 
 
20
  effects_to_remove:
21
  - compressor
 
22
  - reverb
23
  - chorus
24
  - delay
25
+ - distortion
26
  datamodule:
27
  batch_size: 16
28
  num_workers: 8
cfg/exp/dist.yaml CHANGED
@@ -11,14 +11,13 @@ render_root: "/scratch/EffectSet"
11
  accelerator: "gpu"
12
  log_audio: True
13
  # Effects
14
- max_kept_effects: 5
15
- max_removed_effects: -1
16
  shuffle_kept_effects: True
17
  shuffle_removed_effects: False
18
  num_classes: 5
19
- effects_to_use:
20
  - compressor
21
- - distortion
22
  - reverb
23
  - chorus
24
  - delay
 
11
  accelerator: "gpu"
12
  log_audio: True
13
  # Effects
14
+ num_kept_effects: [0,4] # [min, max]
15
+ num_removed_effects: [1,1] # [min, max]
16
  shuffle_kept_effects: True
17
  shuffle_removed_effects: False
18
  num_classes: 5
19
+ effects_to_keep:
20
  - compressor
 
21
  - reverb
22
  - chorus
23
  - delay
remfx/datasets.py CHANGED
@@ -9,8 +9,7 @@ import random
9
  from tqdm import tqdm
10
  from pathlib import Path
11
  from remfx import effects
12
- from ordered_set import OrderedSet
13
- from typing import Any, List, Dict
14
  from torch.utils.data import Dataset, DataLoader
15
  from remfx.utils import select_random_chunk
16
 
@@ -155,10 +154,10 @@ class EffectDataset(Dataset):
155
  chunk_size: int = 262144,
156
  total_chunks: int = 1000,
157
  effect_modules: List[Dict[str, torch.nn.Module]] = None,
158
- effects_to_use: List[str] = None,
159
  effects_to_remove: List[str] = None,
160
- max_kept_effects: int = -1,
161
- max_removed_effects: int = 1,
162
  shuffle_kept_effects: bool = True,
163
  shuffle_removed_effects: bool = False,
164
  render_files: bool = True,
@@ -174,16 +173,16 @@ class EffectDataset(Dataset):
174
  self.total_chunks = total_chunks
175
  self.sample_rate = sample_rate
176
  self.mode = mode
177
- self.max_kept_effects = max_kept_effects
178
- self.max_removed_effects = max_removed_effects
179
- self.effects_to_use = effects_to_use
180
- self.effects_to_remove = effects_to_remove
181
  self.normalize = effects.LoudnessNormalize(sample_rate, target_lufs_db=-20)
182
  self.effects = effect_modules
183
  self.shuffle_kept_effects = shuffle_kept_effects
184
  self.shuffle_removed_effects = shuffle_removed_effects
185
- effects_string = "_".join(self.effects_to_use + ["_"] + self.effects_to_remove)
186
- self.effects_to_keep = self.validate_effect_input()
187
  self.proc_root = self.render_root / "processed" / effects_string / self.mode
188
 
189
  self.files = locate_files(self.root, self.mode)
@@ -251,7 +250,7 @@ class EffectDataset(Dataset):
251
  f"Effect {effect} not found in ALL_EFFECTS. "
252
  f"Please choose from {ALL_EFFECTS}"
253
  )
254
- for effect in self.effects_to_use:
255
  if effect not in self.effects.keys():
256
  raise ValueError(
257
  f"Effect {effect} not found in self.effects. "
@@ -263,27 +262,37 @@ class EffectDataset(Dataset):
263
  f"Effect {effect} not found in self.effects. "
264
  f"Please choose from {self.effects.keys()}"
265
  )
266
- kept_fx = list(
267
- OrderedSet(self.effects_to_use) - OrderedSet(self.effects_to_remove)
268
- )
269
  kept_str = "randomly" if self.shuffle_kept_effects else "in order"
270
- rem_fx = self.effects_to_remove
271
  rem_str = "randomly" if self.shuffle_removed_effects else "in order"
272
- if self.max_kept_effects == -1:
273
- num_kept_str = len(kept_fx)
 
 
 
 
 
274
  else:
275
- num_kept_str = f"Up to {self.max_kept_effects}"
276
- if self.max_removed_effects == -1:
277
- num_rem_str = len(rem_fx)
 
 
 
 
 
 
 
278
  else:
279
- num_rem_str = f"Up to {self.max_removed_effects}"
280
-
 
 
 
281
  print(
282
  f"Effect Summary: \n"
283
  f"Apply kept effects: {kept_fx} ({num_kept_str}, chosen {kept_str}) -> Dry\n"
284
  f"Apply remove effects: {rem_fx} ({num_rem_str}, chosen {rem_str}) -> Wet\n"
285
  )
286
- return kept_fx
287
 
288
  def process_effects(self, dry: torch.Tensor):
289
  # Apply Kept Effects
@@ -293,13 +302,10 @@ class EffectDataset(Dataset):
293
  else:
294
  effect_indices = torch.arange(len(self.effects_to_keep))
295
 
296
- # Up to max_kept_effects
297
- if self.max_kept_effects != -1:
298
- num_kept_effects = int(torch.rand(1).item() * (self.max_kept_effects))
299
- else:
300
- num_kept_effects = len(self.effects_to_keep)
301
  effect_indices = effect_indices[:num_kept_effects]
302
-
303
  # Index in effect settings
304
  effect_names_to_apply = [self.effects_to_keep[i] for i in effect_indices]
305
  effects_to_apply = [self.effects[i] for i in effect_names_to_apply]
@@ -312,22 +318,19 @@ class EffectDataset(Dataset):
312
 
313
  # Apply effects_to_remove
314
  # Shuffle effects if specified
315
- wet = torch.clone(dry)
316
  if self.shuffle_removed_effects:
317
  effect_indices = torch.randperm(len(self.effects_to_remove))
318
  else:
319
  effect_indices = torch.arange(len(self.effects_to_remove))
320
- # Up to max_removed_effects
321
- if self.max_removed_effects != -1:
322
- num_removed_effects = int(torch.rand(1).item() * (self.max_removed_effects))
323
- else:
324
- num_removed_effects = len(self.effects_to_remove)
325
  effect_indices = effect_indices[:num_removed_effects]
326
  # Index in effect settings
327
  effect_names_to_apply = [self.effects_to_remove[i] for i in effect_indices]
328
  effects_to_apply = [self.effects[i] for i in effect_names_to_apply]
329
  # Apply
330
-
331
  wet_labels = []
332
  for effect in effects_to_apply:
333
  # Normalize in-between effects
@@ -346,7 +349,10 @@ class EffectDataset(Dataset):
346
  # Normalize
347
  normalized_dry = self.normalize(dry)
348
  normalized_wet = self.normalize(wet)
 
 
349
 
 
350
  return normalized_dry, normalized_wet, dry_labels_tensor, wet_labels_tensor
351
 
352
 
 
9
  from tqdm import tqdm
10
  from pathlib import Path
11
  from remfx import effects
12
+ from typing import Any, List, Dict, Tuple
 
13
  from torch.utils.data import Dataset, DataLoader
14
  from remfx.utils import select_random_chunk
15
 
 
154
  chunk_size: int = 262144,
155
  total_chunks: int = 1000,
156
  effect_modules: List[Dict[str, torch.nn.Module]] = None,
157
+ effects_to_keep: List[str] = None,
158
  effects_to_remove: List[str] = None,
159
+ num_kept_effects: List[int] = [1, 5],
160
+ num_removed_effects: List[int] = [1, 5],
161
  shuffle_kept_effects: bool = True,
162
  shuffle_removed_effects: bool = False,
163
  render_files: bool = True,
 
173
  self.total_chunks = total_chunks
174
  self.sample_rate = sample_rate
175
  self.mode = mode
176
+ self.num_kept_effects = num_kept_effects
177
+ self.num_removed_effects = num_removed_effects
178
+ self.effects_to_keep = [] if effects_to_keep == None else effects_to_keep
179
+ self.effects_to_remove = [] if effects_to_remove == None else effects_to_remove
180
  self.normalize = effects.LoudnessNormalize(sample_rate, target_lufs_db=-20)
181
  self.effects = effect_modules
182
  self.shuffle_kept_effects = shuffle_kept_effects
183
  self.shuffle_removed_effects = shuffle_removed_effects
184
+ effects_string = "_".join(self.effects_to_keep + ["_"] + self.effects_to_remove)
185
+ self.validate_effect_input()
186
  self.proc_root = self.render_root / "processed" / effects_string / self.mode
187
 
188
  self.files = locate_files(self.root, self.mode)
 
250
  f"Effect {effect} not found in ALL_EFFECTS. "
251
  f"Please choose from {ALL_EFFECTS}"
252
  )
253
+ for effect in self.effects_to_keep:
254
  if effect not in self.effects.keys():
255
  raise ValueError(
256
  f"Effect {effect} not found in self.effects. "
 
262
  f"Effect {effect} not found in self.effects. "
263
  f"Please choose from {self.effects.keys()}"
264
  )
 
 
 
265
  kept_str = "randomly" if self.shuffle_kept_effects else "in order"
 
266
  rem_str = "randomly" if self.shuffle_removed_effects else "in order"
267
+ if self.num_kept_effects[0] > self.num_kept_effects[1]:
268
+ raise ValueError(
269
+ f"num_kept_effects must be a tuple of (min, max). "
270
+ f"Got {self.num_kept_effects}"
271
+ )
272
+ if self.num_kept_effects[0] == self.num_kept_effects[1]:
273
+ num_kept_str = f"{self.num_kept_effects[0]}"
274
  else:
275
+ num_kept_str = (
276
+ f"Between {self.num_kept_effects[0]}-{self.num_kept_effects[1]}"
277
+ )
278
+ if self.num_removed_effects[0] > self.num_removed_effects[1]:
279
+ raise ValueError(
280
+ f"num_removed_effects must be a tuple of (min, max). "
281
+ f"Got {self.num_removed_effects}"
282
+ )
283
+ if self.num_removed_effects[0] == self.num_removed_effects[1]:
284
+ num_rem_str = f"{self.num_removed_effects[0]}"
285
  else:
286
+ num_rem_str = (
287
+ f"Between {self.num_removed_effects[0]}-{self.num_removed_effects[1]}"
288
+ )
289
+ rem_fx = self.effects_to_remove
290
+ kept_fx = self.effects_to_keep
291
  print(
292
  f"Effect Summary: \n"
293
  f"Apply kept effects: {kept_fx} ({num_kept_str}, chosen {kept_str}) -> Dry\n"
294
  f"Apply remove effects: {rem_fx} ({num_rem_str}, chosen {rem_str}) -> Wet\n"
295
  )
 
296
 
297
  def process_effects(self, dry: torch.Tensor):
298
  # Apply Kept Effects
 
302
  else:
303
  effect_indices = torch.arange(len(self.effects_to_keep))
304
 
305
+ r1 = self.num_kept_effects[0]
306
+ r2 = self.num_kept_effects[1]
307
+ num_kept_effects = torch.round((r1 - r2) * torch.rand(1) + r2).int()
 
 
308
  effect_indices = effect_indices[:num_kept_effects]
 
309
  # Index in effect settings
310
  effect_names_to_apply = [self.effects_to_keep[i] for i in effect_indices]
311
  effects_to_apply = [self.effects[i] for i in effect_names_to_apply]
 
318
 
319
  # Apply effects_to_remove
320
  # Shuffle effects if specified
 
321
  if self.shuffle_removed_effects:
322
  effect_indices = torch.randperm(len(self.effects_to_remove))
323
  else:
324
  effect_indices = torch.arange(len(self.effects_to_remove))
325
+ wet = torch.clone(dry)
326
+ r1 = self.num_removed_effects[0]
327
+ r2 = self.num_removed_effects[1]
328
+ num_removed_effects = torch.round((r1 - r2) * torch.rand(1) + r2).int()
 
329
  effect_indices = effect_indices[:num_removed_effects]
330
  # Index in effect settings
331
  effect_names_to_apply = [self.effects_to_remove[i] for i in effect_indices]
332
  effects_to_apply = [self.effects[i] for i in effect_names_to_apply]
333
  # Apply
 
334
  wet_labels = []
335
  for effect in effects_to_apply:
336
  # Normalize in-between effects
 
349
  # Normalize
350
  normalized_dry = self.normalize(dry)
351
  normalized_wet = self.normalize(wet)
352
+ print(dry_labels_tensor, wet_labels_tensor)
353
+ import pdb
354
 
355
+ pdb.set_trace()
356
  return normalized_dry, normalized_wet, dry_labels_tensor, wet_labels_tensor
357
 
358
 
setup.py CHANGED
@@ -47,7 +47,6 @@ setup(
47
  "pyloudnorm",
48
  "pedalboard",
49
  "frechet_audio_distance",
50
- "ordered-set",
51
  "asteroid",
52
  ],
53
  include_package_data=True,
 
47
  "pyloudnorm",
48
  "pedalboard",
49
  "frechet_audio_distance",
 
50
  "asteroid",
51
  ],
52
  include_package_data=True,