renumics/dcase23-task2-enriched
Dataset Card for the Enriched "DCASE 2023 Challenge Task 2 Dataset". Dataset Summary Data-centric AI principles have become increasingly important for real-world use cases. At Renumics we believe that classical benchmark datasets and competitions should be extended to reflect this development. This is why we are publishing benchmark datasets with application-specific enrichments (e.g. embeddings, baseline results, uncertainties, label error scores). We hope this… See the full description on the dataset page: https://huggingface.co/datasets/renumics/dcase23-task2-enriched.
6533
1import os2import json3import datasets4import datasets.info5import pandas as pd6import numpy as np7import tempfile8import requests9import io10from pathlib import Path11from datasets import load_dataset12from typing import Iterable, Dict, Optional, Union, List13 14 15_CITATION = """\16@dataset{kota_dohi_2023_7882613,17 author = {Kota Dohi and18 Keisuke Imoto and19 Noboru Harada and20 Daisuke Niizumi and21 Yuma Koizumi and22 Tomoya Nishida and23 Harsh Purohit and24 Takashi Endo and25 Yohei Kawaguchi},26 title = {DCASE 2023 Challenge Task 2 Development Dataset},27 month = mar,28 year = 2023,29 publisher = {Zenodo},30 version = {3.0},31 doi = {10.5281/zenodo.7882613},32 url = {https://doi.org/10.5281/zenodo.7882613}33}34"""35_LICENSE = "Creative Commons Attribution 4.0 International Public License"36 37_METADATA_REG = r"attributes_\d+.csv"38 39_NUM_TARGETS = 240_NUM_CLASSES = 1441 42_TARGET_NAMES = ["normal", "anomaly"]43_CLASS_NAMES = ["gearbox", "fan", "bearing", "slider", "ToyCar", "ToyTrain", "valve", "bandsaw", "grinder", "shaker", "ToyDrone", "ToyNscale", "ToyTank", "Vacuum"]44 45_HOMEPAGE = {46 "dev": "https://zenodo.org/record/7690157",47 "add": "",48 "eval": "",49}50 51DATA_URLS = {52 "dev": {53 "train": "data/dev_train.tar.gz",54 "test": "data/dev_test.tar.gz",55 "metadata": "data/dev_metadata.csv",56 },57 "add": {58 "train": "data/add_train.tar.gz",59 "metadata": "data/add_metadata.csv",60 },61 "eval": {62 "test": "data/eval_test.tar.gz",63 "metadata": None,64 },65}66 67EMBEDDING_URLS = {68 "dev": {69 "embeddings_ast-finetuned-audioset-10-10-0.4593": {70 "train": "data/MIT_ast-finetuned-audioset-10-10-0.4593-embeddings_dev_train.npz",71 "test": "data/MIT_ast-finetuned-audioset-10-10-0.4593-embeddings_dev_test.npz",72 "size": (1, 768),73 "dtype": "float32",74 },75 },76 "add": {77 "embeddings_ast-finetuned-audioset-10-10-0.4593": {78 "train": "data/MIT_ast-finetuned-audioset-10-10-0.4593-embeddings_add_train.npz",79 "size": (1, 768),80 "dtype": "float32",81 },82 },83 "eval": {84 "embeddings_ast-finetuned-audioset-10-10-0.4593": {85 "test": "data/MIT_ast-finetuned-audioset-10-10-0.4593-embeddings_eval_test.npz",86 "size": (1, 768),87 "dtype": "float32",88 },89 },90}91 92STATS = {93 "name": "Enriched Dataset of 'DCASE 2023 Challenge Task 2'",94 "configs": {95 'dev': {96 'date': "Mar 1, 2023",97 'version': "3.0.0",98 'homepage': "https://zenodo.org/record/7882613",99 "splits": ["train", "test"],100 },101 'add': {102 'date': "Apr 15, 2023",103 'version': "1.0.0",104 'homepage': "https://zenodo.org/record/7830345",105 "splits": ["train"],106 },107 'eval': {108 'date': "May 1, 2023",109 'version': "1.0.0",110 'homepage': "https://zenodo.org/record/7860847",111 "splits": ["test"],112 },113 }114}115 116DATASET = {117 'dev': 'DCASE 2023 Challenge Task 2 Development Dataset',118 'add': 'DCASE 2023 Challenge Task 2 Additional Train Dataset',119 'eval': 'DCASE 2023 Challenge Task 2 Evaluation Dataset',120}121 122 123SPOTLIGHT_LAYOUTS = {124 "standard": {"orientation":"vertical","children":[{"kind":"split","weight":51.96463654223969,"orientation":"horizontal","children":[{"kind":"tab","weight":30,"children":[{"kind":"widget","name":"Table","type":"table","config":{"tableView":"full","visibleColumns":["class","class_name","config","d1p","d1v","d2p","d2v","d3p","d3v","file_path","label","section","split"],"sorting":None,"orderByRelevance":False}}]},{"kind":"tab","weight":33.970588235294116,"children":[{"kind":"widget","name":"Similarity Map (2)","type":"similaritymap","config":{"placeBy":None,"reductionMethod":None,"colorBy":"label","sizeBy":None,"filter":False,"umapNNeighbors":20,"umapMetric":None,"umapMinDist":0.15,"pcaNormalization":None,"umapMenuLocalGlobalBalance":None,"umapMenuIsAdvanced":False}}]},{"kind":"tab","weight":36.029411764705884,"children":[{"kind":"widget","name":"Similarity Map","type":"similaritymap","config":{"placeBy":None,"reductionMethod":None,"colorBy":"class","sizeBy":None,"filter":False,"umapNNeighbors":20,"umapMetric":None,"umapMinDist":0.15,"pcaNormalization":None,"umapMenuLocalGlobalBalance":None,"umapMenuIsAdvanced":False}},{"kind":"widget","name":"Scatter Plot","type":"scatterplot","config":{"xAxisColumn":None,"yAxisColumn":None,"colorBy":None,"sizeBy":None,"filter":False}},{"kind":"widget","name":"Histogram","type":"histogram","config":{"columnKey":None,"stackByColumnKey":None,"filter":False}}]}]},{"kind":"tab","weight":48.03536345776031,"children":[{"kind":"widget","name":"Inspector","type":"inspector","config":{"views":[{"view":"AudioView","columns":["path"],"name":"view","key":"43a5beff-9423-41c9-a5ba-285a7ece7a02"},{"view":"SpectrogramView","columns":["path"],"name":"view","key":"5f035027-dd02-4587-ba77-defdf823c124"}],"visibleColumns":4}}]}]},125 "simple": {"orientation":"vertical","children":[{"kind":"split","weight":60.575296108291035,"orientation":"horizontal","children":[{"kind":"tab","weight":31.52260461369049,"children":[{"kind":"widget","name":"Table","type":"table","config":{"tableView":"filtered","visibleColumns":["class","d1p","d1v","d2p","d2v","d3p","d3v","dev_train_lof_anomaly","dev_train_lof_anomaly_score","domain","label","section"],"sorting":None,"orderByRelevance":False}}]},{"kind":"tab","weight":33.869200490640154,"children":[{"kind":"widget","name":"Similarity map with AST-lof anomaly score","type":"similaritymap","config":{"placeBy":None,"reductionMethod":None,"colorBy":"dev_train_lof_anomaly_score","sizeBy":"label","filter":False,"umapNNeighbors":20,"umapMetric":None,"umapMinDist":0.15,"pcaNormalization":None,"umapMenuLocalGlobalBalance":None,"umapMenuIsAdvanced":False}}]},{"kind":"tab","weight":34.60819489566936,"children":[{"kind":"widget","name":"Similarity map with classes","type":"similaritymap","config":{"placeBy":None,"reductionMethod":None,"colorBy":"class","sizeBy":None,"filter":False,"umapNNeighbors":20,"umapMetric":None,"umapMinDist":0.15,"pcaNormalization":None,"umapMenuLocalGlobalBalance":None,"umapMenuIsAdvanced":False}},{"kind":"widget","name":"Scatter Plot","type":"scatterplot","config":{"xAxisColumn":None,"yAxisColumn":None,"colorBy":None,"sizeBy":None,"filter":False}},{"kind":"widget","name":"Histogram","type":"histogram","config":{"columnKey":"domain","stackByColumnKey":"prediction_correct_dcase2023_task2_baseline_ae","filter":False}}]}]},{"kind":"tab","weight":39.424703891708965,"children":[{"kind":"widget","name":"Inspector","type":"inspector","config":{"views":[{"view":"AudioView","columns":["path"],"name":"view","key":"dea9a175-9582-412e-9f49-be729e8838fb"},{"view":"SpectrogramView","columns":["path"],"name":"view","key":"676bd937-226b-4632-ae2d-ec8bc37bcc5d"},{"view":"ScalarView","columns":["label"],"name":"view","key":"dbfcc0b1-9e96-4d31-8856-f0bd7f0b8144"},{"view":"ScalarView","columns":["domain"],"name":"view","key":"3e79654f-e017-402c-b136-6a13c4409ae4"}],"visibleColumns":4}}]}]},126 "extended": {"orientation":"vertical","children":[{"kind":"split","weight":54.145516074450086,"orientation":"horizontal","children":[{"kind":"tab","weight":31.52260461369049,"children":[{"kind":"widget","name":"Table","type":"table","config":{"tableView":"filtered","visibleColumns":["class","d1p","d1v","d2p","d2v","d3p","d3v","dev_train_lof_anomaly","dev_train_lof_anomaly_score","domain","label","section"],"sorting":None,"orderByRelevance":False}}]},{"kind":"tab","weight":33.869200490640154,"children":[{"kind":"widget","name":"Similarity map with AST-lof anomaly score","type":"similaritymap","config":{"placeBy":None,"reductionMethod":None,"colorBy":"dev_train_lof_anomaly_score","sizeBy":"label","filter":False,"umapNNeighbors":20,"umapMetric":None,"umapMinDist":0.15,"pcaNormalization":None,"umapMenuLocalGlobalBalance":None,"umapMenuIsAdvanced":False}}]},{"kind":"tab","weight":34.60819489566936,"children":[{"kind":"widget","name":"Similarity map with classes","type":"similaritymap","config":{"placeBy":None,"reductionMethod":None,"colorBy":"class","sizeBy":None,"filter":False,"umapNNeighbors":20,"umapMetric":None,"umapMinDist":0.15,"pcaNormalization":None,"umapMenuLocalGlobalBalance":None,"umapMenuIsAdvanced":False}},{"kind":"widget","name":"Scatter Plot","type":"scatterplot","config":{"xAxisColumn":None,"yAxisColumn":None,"colorBy":None,"sizeBy":None,"filter":False}}]}]},{"kind":"split","weight":45.854483925549914,"orientation":"horizontal","children":[{"kind":"tab","weight":58.581483486735245,"children":[{"kind":"widget","name":"Inspector","type":"inspector","config":{"views":[{"view":"AudioView","columns":["path"],"name":"view","key":"dea9a175-9582-412e-9f49-be729e8838fb"},{"view":"SpectrogramView","columns":["path"],"name":"view","key":"676bd937-226b-4632-ae2d-ec8bc37bcc5d"},{"view":"ScalarView","columns":["label"],"name":"view","key":"dbfcc0b1-9e96-4d31-8856-f0bd7f0b8144"},{"view":"ScalarView","columns":["domain"],"name":"view","key":"3e79654f-e017-402c-b136-6a13c4409ae4"}],"visibleColumns":4}}]},{"kind":"tab","weight":41.418516513264755,"children":[{"kind":"widget","name":"Histogram","type":"histogram","config":{"columnKey":"class","stackByColumnKey":"dev_train_lof_anomaly"}}]}]}]},127}128 129SPOTLIGHT_RENAME = {130 "audio": "original_audio",131 "path": "audio",132}133 134 135class DCASE2023Task2DatasetConfig(datasets.BuilderConfig):136 """BuilderConfig for DCASE2023Task2Dataset."""137 138 def __init__(self, name, version, **kwargs):139 self.release_date = kwargs.pop("release_date", None)140 self.homepage = kwargs.pop("homepage", None)141 self.data_urls = kwargs.pop("data_urls", None)142 self.embeddings_urls = kwargs.pop("embeddings_urls", None)143 self.splits = kwargs.pop("splits", None)144 self.rename = kwargs.pop("rename", None)145 self.layout = kwargs.pop("layout", None)146 description = (147 f"Dataset for the DCASE 2023 Challenge Task 2 'First-Shot Unsupervised Anomalous Sound Detection "148 f"for Machine Condition Monitoring'. released on {self.release_date}. Original data available under"149 f"{self.homepage}. "150 f"CONFIG: {name}."151 )152 super(DCASE2023Task2DatasetConfig, self).__init__(153 name=name,154 version=datasets.Version(version),155 description=description,156 )157 158 def to_spotlight(self, data: Union[pd.DataFrame, datasets.Dataset]) -> pd.DataFrame:159 160 def get_split(path: str) -> str:161 fn = os.path.basename(path)162 if "train" in fn:163 return "train"164 elif "test" in fn:165 return "test"166 else:167 raise NotImplementedError168 169 if type(data) == datasets.Dataset:170 # retrieve split171 df = data.to_pandas()172 df["split"] = data.split._name if "+" not in data.split._name else df["path"].map(get_split)173 df["config"] = data.config_name174 175 # get clearnames for classes176 class_names = data.features["class"].names177 df["class_name"] = df["class"].apply(lambda x: class_names[x])178 elif type(data) == pd.DataFrame:179 df = data180 else:181 raise TypeError("type(data) not in Union[pd.DataFrame, datasets.Dataset]")182 183 df["file_path"] = df["path"]184 df.rename(columns=self.rename, inplace=True)185 186 return df.copy()187 188 def get_layout(self, config: str = "standard") -> str:189 layout_json = tempfile.mktemp(".json")190 with open(layout_json, "w") as outfile:191 json.dump(self.layout[config], outfile)192 193 return layout_json194 195 196class DCASE2023Task2Dataset(datasets.GeneratorBasedBuilder):197 """Dataset for the DCASE 2023 Challenge Task 2 "First-Shot Unsupervised Anomalous Sound Detection198 for Machine Condition Monitoring"."""199 200 VERSION = datasets.Version("0.1.0")201 202 DEFAULT_CONFIG_NAME = "dev"203 204 BUILDER_CONFIGS = [205 DCASE2023Task2DatasetConfig(206 name=key,207 version=stats["version"],208 dataset=DATASET[key],209 homepage=_HOMEPAGE[key],210 data_urls=DATA_URLS[key],211 embeddings_urls=EMBEDDING_URLS[key],212 release_date=stats["date"],213 splits=stats["splits"],214 layout=SPOTLIGHT_LAYOUTS,215 rename=SPOTLIGHT_RENAME,216 )217 for key, stats in STATS["configs"].items()218 ]219 220 def _info(self):221 features = {222 "audio": datasets.Audio(sampling_rate=16_000),223 "path": datasets.Value("string"),224 "section": datasets.Value("int64"),225 "domain": datasets.ClassLabel(num_classes=2, names=["source", "target"]),226 "label": datasets.ClassLabel(num_classes=_NUM_TARGETS, names=_TARGET_NAMES),227 "class": datasets.ClassLabel(num_classes=_NUM_CLASSES, names=_CLASS_NAMES),228 "d1p": datasets.Value("string"),229 "d1v": datasets.Value("string"),230 "d2p": datasets.Value("string"),231 "d2v": datasets.Value("string"),232 "d3p": datasets.Value("string"),233 "d3v": datasets.Value("string"),234 "dev_train_lof_anomaly": datasets.Value("int64"),235 "dev_train_lof_anomaly_score": datasets.Value("float32"),236 "add_train_lof_anomaly": datasets.Value("int64"),237 "add_train_lof_anomaly_score": datasets.Value("float32"),238 }239 if self.config.embeddings_urls is not None:240 features.update({241 emb_name: [datasets.Value(emb["dtype"])] for emb_name, emb in self.config.embeddings_urls.items()242 })243 features = datasets.Features(features)244 245 return datasets.DatasetInfo(246 # This is the description that will appear on the datasets page.247 description=self.config.description,248 features=features,249 supervised_keys=datasets.info.SupervisedKeysData("label"),250 homepage=self.config.homepage,251 license=_LICENSE,252 citation=_CITATION,253 )254 255 def _split_generators(256 self,257 dl_manager: datasets.DownloadManager258 ):259 """Returns SplitGenerators."""260 dl_manager.download_config.ignore_url_params = True261 audio_path = {}262 local_extracted_archive = {}263 split_type = {"train": datasets.Split.TRAIN, "test": datasets.Split.TEST}264 embeddings = {split: dict() for split in split_type}265 266 for split in split_type:267 if split in self.config.splits:268 audio_path[split] = dl_manager.download(self.config.data_urls[split])269 local_extracted_archive[split] = dl_manager.extract(270 audio_path[split]) if not dl_manager.is_streaming else None271 if self.config.embeddings_urls is not None:272 for emb_name, emb_data in self.config.embeddings_urls.items():273 downloaded_embeddings = dl_manager.download(emb_data[split])274 if dl_manager.is_streaming:275 response = requests.get(downloaded_embeddings)276 response.raise_for_status()277 downloaded_embeddings = io.BytesIO(response.content)278 npz_file = np.load(downloaded_embeddings, allow_pickle=True)279 embeddings[split][emb_name] = npz_file["arr_0"].item()280 281 return [282 datasets.SplitGenerator(283 name=split_type[split],284 gen_kwargs={285 "split": split,286 "local_extracted_archive": local_extracted_archive[split],287 "audio_files": dl_manager.iter_archive(audio_path[split]),288 "embeddings": embeddings[split],289 "metadata_file": dl_manager.download_and_extract(self.config.data_urls["metadata"]) if self.config.data_urls["metadata"] is not None else None,290 "scores_file": dl_manager.download_and_extract("data/scores.csv"),291 "is_streaming": dl_manager.is_streaming,292 },293 ) for split in split_type if split in self.config.splits294 ]295 296 def _generate_examples(297 self,298 split: str,299 local_extracted_archive: Union[Dict, List],300 audio_files: Optional[Iterable],301 embeddings: Optional[Dict],302 metadata_file: Optional[str],303 scores_file: Optional[str],304 is_streaming: Optional[bool],305 ):306 """Yields examples."""307 if metadata_file is not None:308 metadata = pd.read_csv(metadata_file)309 if scores_file is not None:310 scores = pd.read_csv(scores_file)311 data_fields = list(self._info().features.keys())312 313 id_ = 0314 for path, f in audio_files:315 lookup = Path(path).parent.name + "/" + Path(path).name316 if metadata_file is None or lookup in metadata["path"].values:317 path = os.path.join(local_extracted_archive, path) if local_extracted_archive else path318 if is_streaming:319 audio = {"path": path, "bytes": f.read()}320 else:321 audio = {"path": path, "bytes": None}322 result = {field: None for field in data_fields}323 if metadata_file is not None:324 result.update(metadata[metadata["path"] == lookup].T.squeeze().to_dict())325 if scores is not None:326 result.update(scores[scores["path"] == lookup].T.squeeze().to_dict())327 for emb_key in embeddings.keys():328 result[emb_key] = np.asarray(embeddings[emb_key][lookup]).squeeze().tolist()329 result["path"] = path330 yield id_, {**result, "audio": audio}331 id_ += 1332 333 334if __name__ == "__main__":335 ds = load_dataset("dcase23-task2-enriched.py", "dev", split="train", streaming=True)336 