Source code for stable_datasets.timeseries.fsd_kaggle_2018
"""Legacy FSDKaggle2018 loader (to be refactored into a BaseDatasetBuilder).
This module was moved under `stable_datasets.timeseries` to align the repository layout.
It still exposes the original imperative `FSDKaggle2018.load(...)` API for now.
"""
import io
import os
import time
import urllib.request
import zipfile
import numpy as np
from scipy.io.wavfile import read as wav_read
from tqdm import tqdm
[docs]
class FSDKaggle2018:
"""FSDKaggle2018 Sound Classification
https://zenodo.org/record/2552860
"""
[docs]
def download(path):
# Check if directory exists
if not os.path.isdir(path + "FSDKaggle2018"):
print("\tCreating FSDKaggle2018 Directory")
os.mkdir(path + "FSDKaggle2018")
url = "https://zenodo.org/record/2552860/files/FSDKaggle2018.audio_test.zip?download=1"
# Check if file exists
if not os.path.exists(path + "FSDKaggle2018/audio_test.zip"):
print("\tDownloading test set")
urllib.request.urlretrieve(url, path + "FSDKaggle2018/audio_test.zip")
url = "https://zenodo.org/record/2552860/files/FSDKaggle2018.audio_train.zip?download=1"
if not os.path.exists(path + "FSDKaggle2018/audio_train.zip"):
print("\tDownloading train set")
urllib.request.urlretrieve(url, path + "FSDKaggle2018/audio_train.zip")
url = "https://zenodo.org/record/2552860/files/FSDKaggle2018.meta.zip?download=1"
if not os.path.exists(path + "FSDKaggle2018/meta.zip"):
print("\tDownloading meta set")
urllib.request.urlretrieve(url, path + "FSDKaggle2018/meta.zip")
[docs]
def load(path=None):
if path is None:
path = os.environ["DATASET_PATH"]
FSDKaggle2018.download(path)
t0 = time.time()
f = zipfile.ZipFile(path + "FSDKaggle2018/audio_train.zip")
wavs_train = []
names_train = []
for filename in tqdm(f.namelist(), ascii=True, desc="Loading train set"):
if ".wav" not in filename:
continue
wavfile = f.read(filename)
byt = io.BytesIO(wavfile)
wavs_train.append(wav_read(byt)[1].astype("float32"))
names_train.append(filename.split("/")[-1])
f = zipfile.ZipFile(path + "FSDKaggle2018/audio_test.zip")
wavs_test = []
names_test = []
for filename in tqdm(f.namelist(), ascii=True, desc="Loading test set"):
if ".wav" not in filename:
continue
wavfile = f.read(filename)
byt = io.BytesIO(wavfile)
wavs_test.append(wav_read(byt)[1].astype("float32"))
names_test.append(filename.split("/")[-1])
f = zipfile.ZipFile(path + "FSDKaggle2018/meta.zip")
meta_train = np.loadtxt(
io.BytesIO(f.read("FSDKaggle2018.meta/train_post_competition.csv")),
delimiter=",",
skiprows=1,
dtype="str",
)
meta_test = np.loadtxt(
io.BytesIO(f.read("FSDKaggle2018.meta/test_post_competition_scoring_clips.csv")),
delimiter=",",
skiprows=1,
dtype="str",
)
filenames = list(meta_train[:, 0])
labels_train, verified, fsid_train = [], [], []
for i in range(len(wavs_train)):
index = filenames.index(names_train[i])
labels_train.append(meta_train[index][1])
verified.append(meta_train[index][2])
fsid_train.append(meta_train[index][3])
filenames = list(meta_test[:, 0])
labels_test, usage, fsid_test = [], [], []
for i in range(len(wavs_test)):
index = filenames.index(names_test[i])
labels_test.append(meta_test[index][1])
usage.append(meta_test[index][2])
fsid_test.append(meta_test[index][3])
dataset = {
"wavs_train": wavs_train,
"labels_train": labels_train,
"verified_train": verified,
"fsid_train": fsid_train,
"wavs_test": wavs_test,
"labels_test": labels_test,
"usage_test": usage,
"fsid_test": fsid_test,
}
print(f"Dataset FSDKaggle2018 loaded in {time.time() - t0:.2f}s.")
return dataset