From f6dc822f3c9a1992fc0f50342d695e50588c4752 Mon Sep 17 00:00:00 2001 From: moto <855818+mthrok@users.noreply.github.com> Date: Sun, 14 Feb 2021 18:15:03 +0000 Subject: [PATCH 1/2] [PoC] Add YesNo dataset based on IterDataPipe --- torchaudio/datasets/yesno.py | 101 +++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/torchaudio/datasets/yesno.py b/torchaudio/datasets/yesno.py index 6d0d2c0a5f..cae81f836e 100644 --- a/torchaudio/datasets/yesno.py +++ b/torchaudio/datasets/yesno.py @@ -1,14 +1,17 @@ import os from pathlib import Path +from dataclasses import dataclass from typing import List, Tuple, Union from torch import Tensor from torch.utils.data import Dataset +from torch.data.utils import datapipes import torchaudio from torchaudio.datasets.utils import ( download_url, extract_archive, + ) @@ -17,10 +20,108 @@ "folder_in_archive": "waves_yesno", "url": "http://www.openslr.org/resources/1/waves_yesno.tar.gz", "checksum": "30301975fd8c5cac4040c261c0852f57cfa8adbbad2ce78e77e4986957445f27", + "files": [ + "0_0_0_0_1_1_1_1.wav", + "0_0_0_1_0_0_0_1.wav", + "0_0_0_1_0_1_1_0.wav", + "0_0_1_0_0_0_1_0.wav", + "0_0_1_0_0_1_1_0.wav", + "0_0_1_0_0_1_1_1.wav", + "0_0_1_0_1_0_0_0.wav", + "0_0_1_0_1_0_0_1.wav", + "0_0_1_0_1_0_1_1.wav", + "0_0_1_1_0_0_0_1.wav", + "0_0_1_1_0_1_0_0.wav", + "0_0_1_1_0_1_1_0.wav", + "0_0_1_1_0_1_1_1.wav", + "0_0_1_1_1_0_0_0.wav", + "0_0_1_1_1_0_0_1.wav", + "0_0_1_1_1_1_0_0.wav", + "0_0_1_1_1_1_1_0.wav", + "0_1_0_0_0_1_0_0.wav", + "0_1_0_0_0_1_1_0.wav", + "0_1_0_0_1_0_1_0.wav", + "0_1_0_0_1_0_1_1.wav", + "0_1_0_1_0_0_0_0.wav", + "0_1_0_1_1_0_1_0.wav", + "0_1_0_1_1_1_0_0.wav", + "0_1_1_0_0_1_1_0.wav", + "0_1_1_0_0_1_1_1.wav", + "0_1_1_1_0_0_0_0.wav", + "0_1_1_1_0_0_1_0.wav", + "0_1_1_1_0_1_0_1.wav", + "0_1_1_1_1_0_1_0.wav", + "0_1_1_1_1_1_1_1.wav", + "1_0_0_0_0_0_0_0.wav", + "1_0_0_0_0_0_0_1.wav", + "1_0_0_0_0_0_1_1.wav", + "1_0_0_0_1_0_0_1.wav", + "1_0_0_1_0_1_1_1.wav", + "1_0_1_0_1_0_0_1.wav", + "1_0_1_1_0_1_1_1.wav", + "1_0_1_1_1_0_1_0.wav", + "1_0_1_1_1_1_0_1.wav", + "1_1_0_0_0_0_0_1.wav", + "1_1_0_0_0_1_1_1.wav", + "1_1_0_0_1_0_1_0.wav", + "1_1_0_0_1_0_1_1.wav", + "1_1_0_0_1_1_1_0.wav", + "1_1_0_1_0_1_0_0.wav", + "1_1_0_1_0_1_1_0.wav", + "1_1_0_1_1_0_0_1.wav", + "1_1_0_1_1_0_1_1.wav", + "1_1_0_1_1_1_1_0.wav", + "1_1_1_0_0_0_0_1.wav", + "1_1_1_0_0_1_0_1.wav", + "1_1_1_0_0_1_1_1.wav", + "1_1_1_0_1_0_1_0.wav", + "1_1_1_0_1_0_1_1.wav", + "1_1_1_1_0_0_1_0.wav", + "1_1_1_1_0_1_0_0.wav", + "1_1_1_1_1_0_0_0.wav", + "1_1_1_1_1_1_0_0.wav", + "1_1_1_1_1_1_1_1.wav", + ] } } +@dataclass +class YesNoItem: + path: str + label: List[int] + waveform: Tensor + sample_rate: int + + +class ListYesNoItems(datapipes.iter.IterDataPipe): + """Given a root directory, return the list of files""" + def __init__(self, root): + self.data_dir = os.path.join(root, 'waves_yesno') + self.files = _RELEASE_CONFIGS['release1']['files'] + + def __iter__(self): + for filename in self.files: + path = os.path.join(self.data_dir, filename) + label = [int(c) for c in path.split("_")] + yield path, label + + +class LoadYesNoItem: + def __init__(self, data_pipe): + self.data_pipe = data_pipe + + def __iter__(self): + for path, label in self.data_pipe: + waveform, sample_rate = torchaudio.load(path) + yield YesNoItem(path, label, waveform, sample_rate) + + +def get_yesno_dataset(root_dir: str): # , download=False, url=_RELEASE_CONFIGS["release1"]["url"]): + # TODO: download dataset if necessary + return LoadYesNoItem(ListYesNoItems(root_dir)) + + class YESNO(Dataset): """Create a Dataset for YesNo. From 9cae27672c48a3ae8820214a31e784bd75336f4c Mon Sep 17 00:00:00 2001 From: moto <855818+mthrok@users.noreply.github.com> Date: Wed, 10 Mar 2021 16:27:59 +0000 Subject: [PATCH 2/2] fix import --- torchaudio/datasets/yesno.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/torchaudio/datasets/yesno.py b/torchaudio/datasets/yesno.py index cae81f836e..614cd4c7a5 100644 --- a/torchaudio/datasets/yesno.py +++ b/torchaudio/datasets/yesno.py @@ -4,8 +4,7 @@ from typing import List, Tuple, Union from torch import Tensor -from torch.utils.data import Dataset -from torch.data.utils import datapipes +from torch.utils.data import Dataset, IterDataPipe import torchaudio from torchaudio.datasets.utils import ( @@ -94,7 +93,7 @@ class YesNoItem: sample_rate: int -class ListYesNoItems(datapipes.iter.IterDataPipe): +class ListYesNoItems(IterDataPipe): """Given a root directory, return the list of files""" def __init__(self, root): self.data_dir = os.path.join(root, 'waves_yesno') @@ -107,7 +106,7 @@ def __iter__(self): yield path, label -class LoadYesNoItem: +class LoadYesNoItem(IterDataPipe): def __init__(self, data_pipe): self.data_pipe = data_pipe