CoolFace
Datasetpublic

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.

sourceHugging Facecc-by-4.0updated 3y agoView on Hugging Face
6likes533downloads
dcase23-task2-enriched.py336 linesDownload Raw Back to root
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