├── task2_regression ├── models │ ├── __init__.py │ ├── linear.py │ └── vlaai.py ├── util │ ├── __init__.py │ ├── config.json │ ├── window.py │ ├── time_lags.py │ ├── envelope.py │ └── dataset_generator.py ├── experiments │ ├── __init__.py │ ├── predict_test.py │ ├── linear_baseline.py │ └── vlaai.py ├── __init__.py └── create_data │ ├── speech_features.py │ └── split_and_normalize.py ├── task1_match_mismatch ├── models │ ├── __init__.py │ └── dilated_convolutional_model.py ├── util │ ├── __init__.py │ ├── config.json │ ├── mel_spectrogram.py │ ├── envelope.py │ └── dataset_generator.py ├── experiments │ ├── __init__.py │ ├── predict_test.py │ └── dilated_convolutional_model.py ├── __init__.py └── create_data │ ├── speech_features.py │ └── split_and_normalize.py ├── __init__.py ├── requirements.txt ├── test_scripts ├── labels_match_mismatch │ ├── sub-047.json │ ├── sub-048.json │ ├── sub-049.json │ ├── sub-050.json │ ├── sub-051.json │ ├── sub-052.json │ ├── sub-053.json │ ├── sub-054.json │ ├── sub-055.json │ ├── sub-056.json │ ├── sub-043.json │ ├── sub-044.json │ ├── sub-045.json │ ├── sub-046.json │ ├── sub-002.json │ ├── sub-003.json │ ├── sub-004.json │ ├── sub-005.json │ ├── sub-006.json │ ├── sub-007.json │ ├── sub-008.json │ ├── sub-009.json │ ├── sub-010.json │ ├── sub-011.json │ ├── sub-012.json │ ├── sub-013.json │ ├── sub-014.json │ ├── sub-015.json │ ├── sub-016.json │ ├── sub-017.json │ ├── sub-018.json │ ├── sub-019.json │ ├── sub-020.json │ ├── sub-021.json │ ├── sub-022.json │ ├── sub-023.json │ ├── sub-024.json │ ├── sub-025.json │ ├── sub-026.json │ ├── sub-032.json │ ├── sub-033.json │ ├── sub-034.json │ ├── sub-035.json │ ├── sub-036.json │ ├── sub-037.json │ ├── sub-038.json │ ├── sub-039.json │ ├── sub-040.json │ ├── sub-041.json │ ├── sub-042.json │ ├── sub-063.json │ ├── sub-064.json │ ├── sub-065.json │ ├── sub-066.json │ ├── sub-067.json │ ├── sub-068.json │ ├── sub-069.json │ ├── sub-070.json │ ├── sub-071.json │ ├── sub-057.json │ ├── sub-058.json │ ├── sub-059.json │ ├── sub-060.json │ ├── sub-061.json │ ├── sub-062.json │ ├── sub-027.json │ ├── sub-028.json │ ├── sub-029.json │ ├── sub-030.json │ ├── sub-031.json │ ├── sub-081.json │ ├── sub-077.json │ ├── sub-072.json │ ├── sub-073.json │ ├── sub-074.json │ ├── sub-075.json │ └── sub-076.json ├── score_match_mismatch.py └── score_regression.py ├── LICENSE ├── .gitignore └── README.md /task2_regression/models/__init__.py: -------------------------------------------------------------------------------- 1 | """Models for task2.""" 2 | -------------------------------------------------------------------------------- /task1_match_mismatch/models/__init__.py: -------------------------------------------------------------------------------- 1 | """Models for task1.""" 2 | -------------------------------------------------------------------------------- /task1_match_mismatch/util/__init__.py: -------------------------------------------------------------------------------- 1 | """Utilities for task1.""" 2 | -------------------------------------------------------------------------------- /task2_regression/util/__init__.py: -------------------------------------------------------------------------------- 1 | """Utilities for task2.""" 2 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | """Code for the ICASSP 2023 auditory eeg challenge.""" 2 | -------------------------------------------------------------------------------- /task2_regression/experiments/__init__.py: -------------------------------------------------------------------------------- 1 | """Experiments for task2.""" 2 | -------------------------------------------------------------------------------- /task1_match_mismatch/experiments/__init__.py: -------------------------------------------------------------------------------- 1 | """Experiments for task1.""" 2 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | tensorflow >=2.4.0 2 | numpy 3 | scipy 4 | brian2 5 | brian2hears 6 | librosa -------------------------------------------------------------------------------- /task2_regression/__init__.py: -------------------------------------------------------------------------------- 1 | """Code for task 2 of the Auditory EEG ICASSP challenge.""" 2 | -------------------------------------------------------------------------------- /task1_match_mismatch/__init__.py: -------------------------------------------------------------------------------- 1 | """Code for task 1 of the Auditory EEG ICASSP challenge.""" 2 | -------------------------------------------------------------------------------- /task2_regression/util/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "dataset_folder": "path/to/dataset", 3 | "raw_eeg_folder": "raw_eeg", 4 | "raw_stimuli_folder": "stimuli", 5 | "preprocessed_eeg_folder": "preprocessed_eeg", 6 | "preprocessed_stimuli_folder": "preprocessed_stimuli", 7 | "split_folder": "split_data" 8 | } 9 | -------------------------------------------------------------------------------- /task1_match_mismatch/util/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "dataset_folder": "path/to/dataset", 3 | "raw_eeg_folder": "raw_eeg", 4 | "raw_stimuli_folder": "stimuli", 5 | "preprocessed_eeg_folder": "preprocessed_eeg", 6 | "preprocessed_stimuli_folder": "preprocessed_stimuli", 7 | "split_folder": "split_data" 8 | } 9 | -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-047.json: -------------------------------------------------------------------------------- 1 | {"sub-047_0": 1, "sub-047_1": 0, "sub-047_2": 0, "sub-047_3": 0, "sub-047_4": 0, "sub-047_5": 1, "sub-047_6": 0, "sub-047_7": 1, "sub-047_8": 0, "sub-047_9": 1, "sub-047_10": 0, "sub-047_11": 1, "sub-047_12": 1, "sub-047_13": 1, "sub-047_14": 0, "sub-047_15": 0, "sub-047_16": 1, "sub-047_17": 1, "sub-047_18": 0, "sub-047_19": 0, "sub-047_20": 0, "sub-047_21": 0, "sub-047_22": 0, "sub-047_23": 1, "sub-047_24": 1, "sub-047_25": 1, "sub-047_26": 0, "sub-047_27": 1, "sub-047_28": 0, "sub-047_29": 0, "sub-047_30": 1, "sub-047_31": 0, "sub-047_32": 0, "sub-047_33": 0, "sub-047_34": 1, "sub-047_35": 1, "sub-047_36": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-048.json: -------------------------------------------------------------------------------- 1 | {"sub-048_0": 1, "sub-048_1": 0, "sub-048_2": 0, "sub-048_3": 0, "sub-048_4": 0, "sub-048_5": 1, "sub-048_6": 0, "sub-048_7": 1, "sub-048_8": 0, "sub-048_9": 1, "sub-048_10": 0, "sub-048_11": 1, "sub-048_12": 1, "sub-048_13": 1, "sub-048_14": 0, "sub-048_15": 0, "sub-048_16": 1, "sub-048_17": 1, "sub-048_18": 0, "sub-048_19": 0, "sub-048_20": 0, "sub-048_21": 0, "sub-048_22": 0, "sub-048_23": 1, "sub-048_24": 1, "sub-048_25": 1, "sub-048_26": 0, "sub-048_27": 1, "sub-048_28": 0, "sub-048_29": 0, "sub-048_30": 1, "sub-048_31": 0, "sub-048_32": 0, "sub-048_33": 0, "sub-048_34": 1, "sub-048_35": 1, "sub-048_36": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-049.json: -------------------------------------------------------------------------------- 1 | {"sub-049_0": 1, "sub-049_1": 0, "sub-049_2": 0, "sub-049_3": 0, "sub-049_4": 0, "sub-049_5": 1, "sub-049_6": 0, "sub-049_7": 1, "sub-049_8": 0, "sub-049_9": 1, "sub-049_10": 0, "sub-049_11": 1, "sub-049_12": 1, "sub-049_13": 1, "sub-049_14": 0, "sub-049_15": 0, "sub-049_16": 1, "sub-049_17": 1, "sub-049_18": 0, "sub-049_19": 0, "sub-049_20": 0, "sub-049_21": 0, "sub-049_22": 0, "sub-049_23": 1, "sub-049_24": 1, "sub-049_25": 1, "sub-049_26": 0, "sub-049_27": 1, "sub-049_28": 0, "sub-049_29": 0, "sub-049_30": 1, "sub-049_31": 0, "sub-049_32": 0, "sub-049_33": 0, "sub-049_34": 1, "sub-049_35": 1, "sub-049_36": 1, "sub-049_37": 0, "sub-049_38": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-050.json: -------------------------------------------------------------------------------- 1 | {"sub-050_0": 1, "sub-050_1": 0, "sub-050_2": 0, "sub-050_3": 0, "sub-050_4": 0, "sub-050_5": 1, "sub-050_6": 0, "sub-050_7": 1, "sub-050_8": 0, "sub-050_9": 1, "sub-050_10": 0, "sub-050_11": 1, "sub-050_12": 1, "sub-050_13": 1, "sub-050_14": 0, "sub-050_15": 0, "sub-050_16": 1, "sub-050_17": 1, "sub-050_18": 0, "sub-050_19": 0, "sub-050_20": 0, "sub-050_21": 0, "sub-050_22": 0, "sub-050_23": 1, "sub-050_24": 1, "sub-050_25": 1, "sub-050_26": 0, "sub-050_27": 1, "sub-050_28": 0, "sub-050_29": 0, "sub-050_30": 1, "sub-050_31": 0, "sub-050_32": 0, "sub-050_33": 0, "sub-050_34": 1, "sub-050_35": 1, "sub-050_36": 1, "sub-050_37": 0, "sub-050_38": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-051.json: -------------------------------------------------------------------------------- 1 | {"sub-051_0": 1, "sub-051_1": 0, "sub-051_2": 0, "sub-051_3": 0, "sub-051_4": 0, "sub-051_5": 1, "sub-051_6": 0, "sub-051_7": 1, "sub-051_8": 0, "sub-051_9": 1, "sub-051_10": 0, "sub-051_11": 1, "sub-051_12": 1, "sub-051_13": 1, "sub-051_14": 0, "sub-051_15": 0, "sub-051_16": 1, "sub-051_17": 1, "sub-051_18": 0, "sub-051_19": 0, "sub-051_20": 0, "sub-051_21": 0, "sub-051_22": 0, "sub-051_23": 1, "sub-051_24": 1, "sub-051_25": 1, "sub-051_26": 0, "sub-051_27": 1, "sub-051_28": 0, "sub-051_29": 0, "sub-051_30": 1, "sub-051_31": 0, "sub-051_32": 0, "sub-051_33": 0, "sub-051_34": 1, "sub-051_35": 1, "sub-051_36": 1, "sub-051_37": 0, "sub-051_38": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-052.json: -------------------------------------------------------------------------------- 1 | {"sub-052_0": 1, "sub-052_1": 0, "sub-052_2": 0, "sub-052_3": 0, "sub-052_4": 0, "sub-052_5": 1, "sub-052_6": 0, "sub-052_7": 1, "sub-052_8": 0, "sub-052_9": 1, "sub-052_10": 0, "sub-052_11": 1, "sub-052_12": 1, "sub-052_13": 1, "sub-052_14": 0, "sub-052_15": 0, "sub-052_16": 1, "sub-052_17": 1, "sub-052_18": 0, "sub-052_19": 0, "sub-052_20": 0, "sub-052_21": 0, "sub-052_22": 0, "sub-052_23": 1, "sub-052_24": 1, "sub-052_25": 1, "sub-052_26": 0, "sub-052_27": 1, "sub-052_28": 0, "sub-052_29": 0, "sub-052_30": 1, "sub-052_31": 0, "sub-052_32": 0, "sub-052_33": 0, "sub-052_34": 1, "sub-052_35": 1, "sub-052_36": 1, "sub-052_37": 0, "sub-052_38": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-053.json: -------------------------------------------------------------------------------- 1 | {"sub-053_0": 1, "sub-053_1": 0, "sub-053_2": 0, "sub-053_3": 0, "sub-053_4": 0, "sub-053_5": 1, "sub-053_6": 0, "sub-053_7": 1, "sub-053_8": 0, "sub-053_9": 1, "sub-053_10": 0, "sub-053_11": 1, "sub-053_12": 1, "sub-053_13": 1, "sub-053_14": 0, "sub-053_15": 0, "sub-053_16": 1, "sub-053_17": 1, "sub-053_18": 0, "sub-053_19": 0, "sub-053_20": 0, "sub-053_21": 0, "sub-053_22": 0, "sub-053_23": 1, "sub-053_24": 1, "sub-053_25": 1, "sub-053_26": 0, "sub-053_27": 1, "sub-053_28": 0, "sub-053_29": 0, "sub-053_30": 1, "sub-053_31": 0, "sub-053_32": 0, "sub-053_33": 0, "sub-053_34": 1, "sub-053_35": 1, "sub-053_36": 1, "sub-053_37": 0, "sub-053_38": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-054.json: -------------------------------------------------------------------------------- 1 | {"sub-054_0": 1, "sub-054_1": 0, "sub-054_2": 0, "sub-054_3": 0, "sub-054_4": 0, "sub-054_5": 1, "sub-054_6": 0, "sub-054_7": 1, "sub-054_8": 0, "sub-054_9": 1, "sub-054_10": 0, "sub-054_11": 1, "sub-054_12": 1, "sub-054_13": 1, "sub-054_14": 0, "sub-054_15": 0, "sub-054_16": 1, "sub-054_17": 1, "sub-054_18": 0, "sub-054_19": 0, "sub-054_20": 0, "sub-054_21": 0, "sub-054_22": 0, "sub-054_23": 1, "sub-054_24": 1, "sub-054_25": 1, "sub-054_26": 0, "sub-054_27": 1, "sub-054_28": 0, "sub-054_29": 0, "sub-054_30": 1, "sub-054_31": 0, "sub-054_32": 0, "sub-054_33": 0, "sub-054_34": 1, "sub-054_35": 1, "sub-054_36": 1, "sub-054_37": 0, "sub-054_38": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-055.json: -------------------------------------------------------------------------------- 1 | {"sub-055_0": 1, "sub-055_1": 0, "sub-055_2": 0, "sub-055_3": 0, "sub-055_4": 0, "sub-055_5": 1, "sub-055_6": 0, "sub-055_7": 1, "sub-055_8": 0, "sub-055_9": 1, "sub-055_10": 0, "sub-055_11": 1, "sub-055_12": 1, "sub-055_13": 1, "sub-055_14": 0, "sub-055_15": 0, "sub-055_16": 1, "sub-055_17": 1, "sub-055_18": 0, "sub-055_19": 0, "sub-055_20": 0, "sub-055_21": 0, "sub-055_22": 0, "sub-055_23": 1, "sub-055_24": 1, "sub-055_25": 1, "sub-055_26": 0, "sub-055_27": 1, "sub-055_28": 0, "sub-055_29": 0, "sub-055_30": 1, "sub-055_31": 0, "sub-055_32": 0, "sub-055_33": 0, "sub-055_34": 1, "sub-055_35": 1, "sub-055_36": 1, "sub-055_37": 0, "sub-055_38": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-056.json: -------------------------------------------------------------------------------- 1 | {"sub-056_0": 1, "sub-056_1": 0, "sub-056_2": 0, "sub-056_3": 0, "sub-056_4": 0, "sub-056_5": 1, "sub-056_6": 0, "sub-056_7": 1, "sub-056_8": 0, "sub-056_9": 1, "sub-056_10": 0, "sub-056_11": 1, "sub-056_12": 1, "sub-056_13": 1, "sub-056_14": 0, "sub-056_15": 0, "sub-056_16": 1, "sub-056_17": 1, "sub-056_18": 0, "sub-056_19": 0, "sub-056_20": 0, "sub-056_21": 0, "sub-056_22": 0, "sub-056_23": 1, "sub-056_24": 1, "sub-056_25": 1, "sub-056_26": 0, "sub-056_27": 1, "sub-056_28": 0, "sub-056_29": 0, "sub-056_30": 1, "sub-056_31": 0, "sub-056_32": 0, "sub-056_33": 0, "sub-056_34": 1, "sub-056_35": 1, "sub-056_36": 1, "sub-056_37": 0, "sub-056_38": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-043.json: -------------------------------------------------------------------------------- 1 | {"sub-043_0": 1, "sub-043_1": 0, "sub-043_2": 0, "sub-043_3": 0, "sub-043_4": 0, "sub-043_5": 1, "sub-043_6": 0, "sub-043_7": 1, "sub-043_8": 0, "sub-043_9": 1, "sub-043_10": 0, "sub-043_11": 1, "sub-043_12": 1, "sub-043_13": 1, "sub-043_14": 0, "sub-043_15": 0, "sub-043_16": 1, "sub-043_17": 1, "sub-043_18": 0, "sub-043_19": 0, "sub-043_20": 0, "sub-043_21": 0, "sub-043_22": 0, "sub-043_23": 1, "sub-043_24": 1, "sub-043_25": 1, "sub-043_26": 0, "sub-043_27": 1, "sub-043_28": 0, "sub-043_29": 0, "sub-043_30": 1, "sub-043_31": 0, "sub-043_32": 0, "sub-043_33": 0, "sub-043_34": 1, "sub-043_35": 1, "sub-043_36": 1, "sub-043_37": 0, "sub-043_38": 1, "sub-043_39": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-044.json: -------------------------------------------------------------------------------- 1 | {"sub-044_0": 1, "sub-044_1": 0, "sub-044_2": 0, "sub-044_3": 0, "sub-044_4": 0, "sub-044_5": 1, "sub-044_6": 0, "sub-044_7": 1, "sub-044_8": 0, "sub-044_9": 1, "sub-044_10": 0, "sub-044_11": 1, "sub-044_12": 1, "sub-044_13": 1, "sub-044_14": 0, "sub-044_15": 0, "sub-044_16": 1, "sub-044_17": 1, "sub-044_18": 0, "sub-044_19": 0, "sub-044_20": 0, "sub-044_21": 0, "sub-044_22": 0, "sub-044_23": 1, "sub-044_24": 1, "sub-044_25": 1, "sub-044_26": 0, "sub-044_27": 1, "sub-044_28": 0, "sub-044_29": 0, "sub-044_30": 1, "sub-044_31": 0, "sub-044_32": 0, "sub-044_33": 0, "sub-044_34": 1, "sub-044_35": 1, "sub-044_36": 1, "sub-044_37": 0, "sub-044_38": 1, "sub-044_39": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-045.json: -------------------------------------------------------------------------------- 1 | {"sub-045_0": 1, "sub-045_1": 0, "sub-045_2": 0, "sub-045_3": 0, "sub-045_4": 0, "sub-045_5": 1, "sub-045_6": 0, "sub-045_7": 1, "sub-045_8": 0, "sub-045_9": 1, "sub-045_10": 0, "sub-045_11": 1, "sub-045_12": 1, "sub-045_13": 1, "sub-045_14": 0, "sub-045_15": 0, "sub-045_16": 1, "sub-045_17": 1, "sub-045_18": 0, "sub-045_19": 0, "sub-045_20": 0, "sub-045_21": 0, "sub-045_22": 0, "sub-045_23": 1, "sub-045_24": 1, "sub-045_25": 1, "sub-045_26": 0, "sub-045_27": 1, "sub-045_28": 0, "sub-045_29": 0, "sub-045_30": 1, "sub-045_31": 0, "sub-045_32": 0, "sub-045_33": 0, "sub-045_34": 1, "sub-045_35": 1, "sub-045_36": 1, "sub-045_37": 0, "sub-045_38": 1, "sub-045_39": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-046.json: -------------------------------------------------------------------------------- 1 | {"sub-046_0": 1, "sub-046_1": 0, "sub-046_2": 0, "sub-046_3": 0, "sub-046_4": 0, "sub-046_5": 1, "sub-046_6": 0, "sub-046_7": 1, "sub-046_8": 0, "sub-046_9": 1, "sub-046_10": 0, "sub-046_11": 1, "sub-046_12": 1, "sub-046_13": 1, "sub-046_14": 0, "sub-046_15": 0, "sub-046_16": 1, "sub-046_17": 1, "sub-046_18": 0, "sub-046_19": 0, "sub-046_20": 0, "sub-046_21": 0, "sub-046_22": 0, "sub-046_23": 1, "sub-046_24": 1, "sub-046_25": 1, "sub-046_26": 0, "sub-046_27": 1, "sub-046_28": 0, "sub-046_29": 0, "sub-046_30": 1, "sub-046_31": 0, "sub-046_32": 0, "sub-046_33": 0, "sub-046_34": 1, "sub-046_35": 1, "sub-046_36": 1, "sub-046_37": 0, "sub-046_38": 1, "sub-046_39": 0} -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Code and for the Auditory EEG ICASSP Challenge 2023 2 | 3 | Copyright (C) 2022 ExpORL 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-002.json: -------------------------------------------------------------------------------- 1 | {"sub-002_0": 1, "sub-002_1": 0, "sub-002_2": 0, "sub-002_3": 0, "sub-002_4": 0, "sub-002_5": 1, "sub-002_6": 0, "sub-002_7": 1, "sub-002_8": 0, "sub-002_9": 1, "sub-002_10": 0, "sub-002_11": 1, "sub-002_12": 1, "sub-002_13": 1, "sub-002_14": 0, "sub-002_15": 0, "sub-002_16": 1, "sub-002_17": 1, "sub-002_18": 0, "sub-002_19": 0, "sub-002_20": 0, "sub-002_21": 0, "sub-002_22": 0, "sub-002_23": 1, "sub-002_24": 1, "sub-002_25": 1, "sub-002_26": 0, "sub-002_27": 1, "sub-002_28": 0, "sub-002_29": 0, "sub-002_30": 1, "sub-002_31": 0, "sub-002_32": 0, "sub-002_33": 0, "sub-002_34": 1, "sub-002_35": 1, "sub-002_36": 1, "sub-002_37": 0, "sub-002_38": 1, "sub-002_39": 0, "sub-002_40": 1, "sub-002_41": 1, "sub-002_42": 0, "sub-002_43": 0, "sub-002_44": 1, "sub-002_45": 1, "sub-002_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-003.json: -------------------------------------------------------------------------------- 1 | {"sub-003_0": 1, "sub-003_1": 0, "sub-003_2": 0, "sub-003_3": 0, "sub-003_4": 0, "sub-003_5": 1, "sub-003_6": 0, "sub-003_7": 1, "sub-003_8": 0, "sub-003_9": 1, "sub-003_10": 0, "sub-003_11": 1, "sub-003_12": 1, "sub-003_13": 1, "sub-003_14": 0, "sub-003_15": 0, "sub-003_16": 1, "sub-003_17": 1, "sub-003_18": 0, "sub-003_19": 0, "sub-003_20": 0, "sub-003_21": 0, "sub-003_22": 0, "sub-003_23": 1, "sub-003_24": 1, "sub-003_25": 1, "sub-003_26": 0, "sub-003_27": 1, "sub-003_28": 0, "sub-003_29": 0, "sub-003_30": 1, "sub-003_31": 0, "sub-003_32": 0, "sub-003_33": 0, "sub-003_34": 1, "sub-003_35": 1, "sub-003_36": 1, "sub-003_37": 0, "sub-003_38": 1, "sub-003_39": 0, "sub-003_40": 1, "sub-003_41": 1, "sub-003_42": 0, "sub-003_43": 0, "sub-003_44": 1, "sub-003_45": 1, "sub-003_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-004.json: -------------------------------------------------------------------------------- 1 | {"sub-004_0": 1, "sub-004_1": 0, "sub-004_2": 0, "sub-004_3": 0, "sub-004_4": 0, "sub-004_5": 1, "sub-004_6": 0, "sub-004_7": 1, "sub-004_8": 0, "sub-004_9": 1, "sub-004_10": 0, "sub-004_11": 1, "sub-004_12": 1, "sub-004_13": 1, "sub-004_14": 0, "sub-004_15": 0, "sub-004_16": 1, "sub-004_17": 1, "sub-004_18": 0, "sub-004_19": 0, "sub-004_20": 0, "sub-004_21": 0, "sub-004_22": 0, "sub-004_23": 1, "sub-004_24": 1, "sub-004_25": 1, "sub-004_26": 0, "sub-004_27": 1, "sub-004_28": 0, "sub-004_29": 0, "sub-004_30": 1, "sub-004_31": 0, "sub-004_32": 0, "sub-004_33": 0, "sub-004_34": 1, "sub-004_35": 1, "sub-004_36": 1, "sub-004_37": 0, "sub-004_38": 1, "sub-004_39": 0, "sub-004_40": 1, "sub-004_41": 1, "sub-004_42": 0, "sub-004_43": 0, "sub-004_44": 1, "sub-004_45": 1, "sub-004_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-005.json: -------------------------------------------------------------------------------- 1 | {"sub-005_0": 1, "sub-005_1": 0, "sub-005_2": 0, "sub-005_3": 0, "sub-005_4": 0, "sub-005_5": 1, "sub-005_6": 0, "sub-005_7": 1, "sub-005_8": 0, "sub-005_9": 1, "sub-005_10": 0, "sub-005_11": 1, "sub-005_12": 1, "sub-005_13": 1, "sub-005_14": 0, "sub-005_15": 0, "sub-005_16": 1, "sub-005_17": 1, "sub-005_18": 0, "sub-005_19": 0, "sub-005_20": 0, "sub-005_21": 0, "sub-005_22": 0, "sub-005_23": 1, "sub-005_24": 1, "sub-005_25": 1, "sub-005_26": 0, "sub-005_27": 1, "sub-005_28": 0, "sub-005_29": 0, "sub-005_30": 1, "sub-005_31": 0, "sub-005_32": 0, "sub-005_33": 0, "sub-005_34": 1, "sub-005_35": 1, "sub-005_36": 1, "sub-005_37": 0, "sub-005_38": 1, "sub-005_39": 0, "sub-005_40": 1, "sub-005_41": 1, "sub-005_42": 0, "sub-005_43": 0, "sub-005_44": 1, "sub-005_45": 1, "sub-005_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-006.json: -------------------------------------------------------------------------------- 1 | {"sub-006_0": 1, "sub-006_1": 0, "sub-006_2": 0, "sub-006_3": 0, "sub-006_4": 0, "sub-006_5": 1, "sub-006_6": 0, "sub-006_7": 1, "sub-006_8": 0, "sub-006_9": 1, "sub-006_10": 0, "sub-006_11": 1, "sub-006_12": 1, "sub-006_13": 1, "sub-006_14": 0, "sub-006_15": 0, "sub-006_16": 1, "sub-006_17": 1, "sub-006_18": 0, "sub-006_19": 0, "sub-006_20": 0, "sub-006_21": 0, "sub-006_22": 0, "sub-006_23": 1, "sub-006_24": 1, "sub-006_25": 1, "sub-006_26": 0, "sub-006_27": 1, "sub-006_28": 0, "sub-006_29": 0, "sub-006_30": 1, "sub-006_31": 0, "sub-006_32": 0, "sub-006_33": 0, "sub-006_34": 1, "sub-006_35": 1, "sub-006_36": 1, "sub-006_37": 0, "sub-006_38": 1, "sub-006_39": 0, "sub-006_40": 1, "sub-006_41": 1, "sub-006_42": 0, "sub-006_43": 0, "sub-006_44": 1, "sub-006_45": 1, "sub-006_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-007.json: -------------------------------------------------------------------------------- 1 | {"sub-007_0": 1, "sub-007_1": 0, "sub-007_2": 0, "sub-007_3": 0, "sub-007_4": 0, "sub-007_5": 1, "sub-007_6": 0, "sub-007_7": 1, "sub-007_8": 0, "sub-007_9": 1, "sub-007_10": 0, "sub-007_11": 1, "sub-007_12": 1, "sub-007_13": 1, "sub-007_14": 0, "sub-007_15": 0, "sub-007_16": 1, "sub-007_17": 1, "sub-007_18": 0, "sub-007_19": 0, "sub-007_20": 0, "sub-007_21": 0, "sub-007_22": 0, "sub-007_23": 1, "sub-007_24": 1, "sub-007_25": 1, "sub-007_26": 0, "sub-007_27": 1, "sub-007_28": 0, "sub-007_29": 0, "sub-007_30": 1, "sub-007_31": 0, "sub-007_32": 0, "sub-007_33": 0, "sub-007_34": 1, "sub-007_35": 1, "sub-007_36": 1, "sub-007_37": 0, "sub-007_38": 1, "sub-007_39": 0, "sub-007_40": 1, "sub-007_41": 1, "sub-007_42": 0, "sub-007_43": 0, "sub-007_44": 1, "sub-007_45": 1, "sub-007_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-008.json: -------------------------------------------------------------------------------- 1 | {"sub-008_0": 1, "sub-008_1": 0, "sub-008_2": 0, "sub-008_3": 0, "sub-008_4": 0, "sub-008_5": 1, "sub-008_6": 0, "sub-008_7": 1, "sub-008_8": 0, "sub-008_9": 1, "sub-008_10": 0, "sub-008_11": 1, "sub-008_12": 1, "sub-008_13": 1, "sub-008_14": 0, "sub-008_15": 0, "sub-008_16": 1, "sub-008_17": 1, "sub-008_18": 0, "sub-008_19": 0, "sub-008_20": 0, "sub-008_21": 0, "sub-008_22": 0, "sub-008_23": 1, "sub-008_24": 1, "sub-008_25": 1, "sub-008_26": 0, "sub-008_27": 1, "sub-008_28": 0, "sub-008_29": 0, "sub-008_30": 1, "sub-008_31": 0, "sub-008_32": 0, "sub-008_33": 0, "sub-008_34": 1, "sub-008_35": 1, "sub-008_36": 1, "sub-008_37": 0, "sub-008_38": 1, "sub-008_39": 0, "sub-008_40": 1, "sub-008_41": 1, "sub-008_42": 0, "sub-008_43": 0, "sub-008_44": 1, "sub-008_45": 1, "sub-008_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-009.json: -------------------------------------------------------------------------------- 1 | {"sub-009_0": 1, "sub-009_1": 0, "sub-009_2": 0, "sub-009_3": 0, "sub-009_4": 0, "sub-009_5": 1, "sub-009_6": 0, "sub-009_7": 1, "sub-009_8": 0, "sub-009_9": 1, "sub-009_10": 0, "sub-009_11": 1, "sub-009_12": 1, "sub-009_13": 1, "sub-009_14": 0, "sub-009_15": 0, "sub-009_16": 1, "sub-009_17": 1, "sub-009_18": 0, "sub-009_19": 0, "sub-009_20": 0, "sub-009_21": 0, "sub-009_22": 0, "sub-009_23": 1, "sub-009_24": 1, "sub-009_25": 1, "sub-009_26": 0, "sub-009_27": 1, "sub-009_28": 0, "sub-009_29": 0, "sub-009_30": 1, "sub-009_31": 0, "sub-009_32": 0, "sub-009_33": 0, "sub-009_34": 1, "sub-009_35": 1, "sub-009_36": 1, "sub-009_37": 0, "sub-009_38": 1, "sub-009_39": 0, "sub-009_40": 1, "sub-009_41": 1, "sub-009_42": 0, "sub-009_43": 0, "sub-009_44": 1, "sub-009_45": 1, "sub-009_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-010.json: -------------------------------------------------------------------------------- 1 | {"sub-010_0": 1, "sub-010_1": 0, "sub-010_2": 0, "sub-010_3": 0, "sub-010_4": 0, "sub-010_5": 1, "sub-010_6": 0, "sub-010_7": 1, "sub-010_8": 0, "sub-010_9": 1, "sub-010_10": 0, "sub-010_11": 1, "sub-010_12": 1, "sub-010_13": 1, "sub-010_14": 0, "sub-010_15": 0, "sub-010_16": 1, "sub-010_17": 1, "sub-010_18": 0, "sub-010_19": 0, "sub-010_20": 0, "sub-010_21": 0, "sub-010_22": 0, "sub-010_23": 1, "sub-010_24": 1, "sub-010_25": 1, "sub-010_26": 0, "sub-010_27": 1, "sub-010_28": 0, "sub-010_29": 0, "sub-010_30": 1, "sub-010_31": 0, "sub-010_32": 0, "sub-010_33": 0, "sub-010_34": 1, "sub-010_35": 1, "sub-010_36": 1, "sub-010_37": 0, "sub-010_38": 1, "sub-010_39": 0, "sub-010_40": 1, "sub-010_41": 1, "sub-010_42": 0, "sub-010_43": 0, "sub-010_44": 1, "sub-010_45": 1, "sub-010_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-011.json: -------------------------------------------------------------------------------- 1 | {"sub-011_0": 1, "sub-011_1": 0, "sub-011_2": 0, "sub-011_3": 0, "sub-011_4": 0, "sub-011_5": 1, "sub-011_6": 0, "sub-011_7": 1, "sub-011_8": 0, "sub-011_9": 1, "sub-011_10": 0, "sub-011_11": 1, "sub-011_12": 1, "sub-011_13": 1, "sub-011_14": 0, "sub-011_15": 0, "sub-011_16": 1, "sub-011_17": 1, "sub-011_18": 0, "sub-011_19": 0, "sub-011_20": 0, "sub-011_21": 0, "sub-011_22": 0, "sub-011_23": 1, "sub-011_24": 1, "sub-011_25": 1, "sub-011_26": 0, "sub-011_27": 1, "sub-011_28": 0, "sub-011_29": 0, "sub-011_30": 1, "sub-011_31": 0, "sub-011_32": 0, "sub-011_33": 0, "sub-011_34": 1, "sub-011_35": 1, "sub-011_36": 1, "sub-011_37": 0, "sub-011_38": 1, "sub-011_39": 0, "sub-011_40": 1, "sub-011_41": 1, "sub-011_42": 0, "sub-011_43": 0, "sub-011_44": 1, "sub-011_45": 1, "sub-011_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-012.json: -------------------------------------------------------------------------------- 1 | {"sub-012_0": 1, "sub-012_1": 0, "sub-012_2": 0, "sub-012_3": 0, "sub-012_4": 0, "sub-012_5": 1, "sub-012_6": 0, "sub-012_7": 1, "sub-012_8": 0, "sub-012_9": 1, "sub-012_10": 0, "sub-012_11": 1, "sub-012_12": 1, "sub-012_13": 1, "sub-012_14": 0, "sub-012_15": 0, "sub-012_16": 1, "sub-012_17": 1, "sub-012_18": 0, "sub-012_19": 0, "sub-012_20": 0, "sub-012_21": 0, "sub-012_22": 0, "sub-012_23": 1, "sub-012_24": 1, "sub-012_25": 1, "sub-012_26": 0, "sub-012_27": 1, "sub-012_28": 0, "sub-012_29": 0, "sub-012_30": 1, "sub-012_31": 0, "sub-012_32": 0, "sub-012_33": 0, "sub-012_34": 1, "sub-012_35": 1, "sub-012_36": 1, "sub-012_37": 0, "sub-012_38": 1, "sub-012_39": 0, "sub-012_40": 1, "sub-012_41": 1, "sub-012_42": 0, "sub-012_43": 0, "sub-012_44": 1, "sub-012_45": 1, "sub-012_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-013.json: -------------------------------------------------------------------------------- 1 | {"sub-013_0": 1, "sub-013_1": 0, "sub-013_2": 0, "sub-013_3": 0, "sub-013_4": 0, "sub-013_5": 1, "sub-013_6": 0, "sub-013_7": 1, "sub-013_8": 0, "sub-013_9": 1, "sub-013_10": 0, "sub-013_11": 1, "sub-013_12": 1, "sub-013_13": 1, "sub-013_14": 0, "sub-013_15": 0, "sub-013_16": 1, "sub-013_17": 1, "sub-013_18": 0, "sub-013_19": 0, "sub-013_20": 0, "sub-013_21": 0, "sub-013_22": 0, "sub-013_23": 1, "sub-013_24": 1, "sub-013_25": 1, "sub-013_26": 0, "sub-013_27": 1, "sub-013_28": 0, "sub-013_29": 0, "sub-013_30": 1, "sub-013_31": 0, "sub-013_32": 0, "sub-013_33": 0, "sub-013_34": 1, "sub-013_35": 1, "sub-013_36": 1, "sub-013_37": 0, "sub-013_38": 1, "sub-013_39": 0, "sub-013_40": 1, "sub-013_41": 1, "sub-013_42": 0, "sub-013_43": 0, "sub-013_44": 1, "sub-013_45": 1, "sub-013_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-014.json: -------------------------------------------------------------------------------- 1 | {"sub-014_0": 1, "sub-014_1": 0, "sub-014_2": 0, "sub-014_3": 0, "sub-014_4": 0, "sub-014_5": 1, "sub-014_6": 0, "sub-014_7": 1, "sub-014_8": 0, "sub-014_9": 1, "sub-014_10": 0, "sub-014_11": 1, "sub-014_12": 1, "sub-014_13": 1, "sub-014_14": 0, "sub-014_15": 0, "sub-014_16": 1, "sub-014_17": 1, "sub-014_18": 0, "sub-014_19": 0, "sub-014_20": 0, "sub-014_21": 0, "sub-014_22": 0, "sub-014_23": 1, "sub-014_24": 1, "sub-014_25": 1, "sub-014_26": 0, "sub-014_27": 1, "sub-014_28": 0, "sub-014_29": 0, "sub-014_30": 1, "sub-014_31": 0, "sub-014_32": 0, "sub-014_33": 0, "sub-014_34": 1, "sub-014_35": 1, "sub-014_36": 1, "sub-014_37": 0, "sub-014_38": 1, "sub-014_39": 0, "sub-014_40": 1, "sub-014_41": 1, "sub-014_42": 0, "sub-014_43": 0, "sub-014_44": 1, "sub-014_45": 1, "sub-014_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-015.json: -------------------------------------------------------------------------------- 1 | {"sub-015_0": 1, "sub-015_1": 0, "sub-015_2": 0, "sub-015_3": 0, "sub-015_4": 0, "sub-015_5": 1, "sub-015_6": 0, "sub-015_7": 1, "sub-015_8": 0, "sub-015_9": 1, "sub-015_10": 0, "sub-015_11": 1, "sub-015_12": 1, "sub-015_13": 1, "sub-015_14": 0, "sub-015_15": 0, "sub-015_16": 1, "sub-015_17": 1, "sub-015_18": 0, "sub-015_19": 0, "sub-015_20": 0, "sub-015_21": 0, "sub-015_22": 0, "sub-015_23": 1, "sub-015_24": 1, "sub-015_25": 1, "sub-015_26": 0, "sub-015_27": 1, "sub-015_28": 0, "sub-015_29": 0, "sub-015_30": 1, "sub-015_31": 0, "sub-015_32": 0, "sub-015_33": 0, "sub-015_34": 1, "sub-015_35": 1, "sub-015_36": 1, "sub-015_37": 0, "sub-015_38": 1, "sub-015_39": 0, "sub-015_40": 1, "sub-015_41": 1, "sub-015_42": 0, "sub-015_43": 0, "sub-015_44": 1, "sub-015_45": 1, "sub-015_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-016.json: -------------------------------------------------------------------------------- 1 | {"sub-016_0": 1, "sub-016_1": 0, "sub-016_2": 0, "sub-016_3": 0, "sub-016_4": 0, "sub-016_5": 1, "sub-016_6": 0, "sub-016_7": 1, "sub-016_8": 0, "sub-016_9": 1, "sub-016_10": 0, "sub-016_11": 1, "sub-016_12": 1, "sub-016_13": 1, "sub-016_14": 0, "sub-016_15": 0, "sub-016_16": 1, "sub-016_17": 1, "sub-016_18": 0, "sub-016_19": 0, "sub-016_20": 0, "sub-016_21": 0, "sub-016_22": 0, "sub-016_23": 1, "sub-016_24": 1, "sub-016_25": 1, "sub-016_26": 0, "sub-016_27": 1, "sub-016_28": 0, "sub-016_29": 0, "sub-016_30": 1, "sub-016_31": 0, "sub-016_32": 0, "sub-016_33": 0, "sub-016_34": 1, "sub-016_35": 1, "sub-016_36": 1, "sub-016_37": 0, "sub-016_38": 1, "sub-016_39": 0, "sub-016_40": 1, "sub-016_41": 1, "sub-016_42": 0, "sub-016_43": 0, "sub-016_44": 1, "sub-016_45": 1, "sub-016_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-017.json: -------------------------------------------------------------------------------- 1 | {"sub-017_0": 1, "sub-017_1": 0, "sub-017_2": 0, "sub-017_3": 0, "sub-017_4": 0, "sub-017_5": 1, "sub-017_6": 0, "sub-017_7": 1, "sub-017_8": 0, "sub-017_9": 1, "sub-017_10": 0, "sub-017_11": 1, "sub-017_12": 1, "sub-017_13": 1, "sub-017_14": 0, "sub-017_15": 0, "sub-017_16": 1, "sub-017_17": 1, "sub-017_18": 0, "sub-017_19": 0, "sub-017_20": 0, "sub-017_21": 0, "sub-017_22": 0, "sub-017_23": 1, "sub-017_24": 1, "sub-017_25": 1, "sub-017_26": 0, "sub-017_27": 1, "sub-017_28": 0, "sub-017_29": 0, "sub-017_30": 1, "sub-017_31": 0, "sub-017_32": 0, "sub-017_33": 0, "sub-017_34": 1, "sub-017_35": 1, "sub-017_36": 1, "sub-017_37": 0, "sub-017_38": 1, "sub-017_39": 0, "sub-017_40": 1, "sub-017_41": 1, "sub-017_42": 0, "sub-017_43": 0, "sub-017_44": 1, "sub-017_45": 1, "sub-017_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-018.json: -------------------------------------------------------------------------------- 1 | {"sub-018_0": 1, "sub-018_1": 0, "sub-018_2": 0, "sub-018_3": 0, "sub-018_4": 0, "sub-018_5": 1, "sub-018_6": 0, "sub-018_7": 1, "sub-018_8": 0, "sub-018_9": 1, "sub-018_10": 0, "sub-018_11": 1, "sub-018_12": 1, "sub-018_13": 1, "sub-018_14": 0, "sub-018_15": 0, "sub-018_16": 1, "sub-018_17": 1, "sub-018_18": 0, "sub-018_19": 0, "sub-018_20": 0, "sub-018_21": 0, "sub-018_22": 0, "sub-018_23": 1, "sub-018_24": 1, "sub-018_25": 1, "sub-018_26": 0, "sub-018_27": 1, "sub-018_28": 0, "sub-018_29": 0, "sub-018_30": 1, "sub-018_31": 0, "sub-018_32": 0, "sub-018_33": 0, "sub-018_34": 1, "sub-018_35": 1, "sub-018_36": 1, "sub-018_37": 0, "sub-018_38": 1, "sub-018_39": 0, "sub-018_40": 1, "sub-018_41": 1, "sub-018_42": 0, "sub-018_43": 0, "sub-018_44": 1, "sub-018_45": 1, "sub-018_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-019.json: -------------------------------------------------------------------------------- 1 | {"sub-019_0": 1, "sub-019_1": 0, "sub-019_2": 0, "sub-019_3": 0, "sub-019_4": 0, "sub-019_5": 1, "sub-019_6": 0, "sub-019_7": 1, "sub-019_8": 0, "sub-019_9": 1, "sub-019_10": 0, "sub-019_11": 1, "sub-019_12": 1, "sub-019_13": 1, "sub-019_14": 0, "sub-019_15": 0, "sub-019_16": 1, "sub-019_17": 1, "sub-019_18": 0, "sub-019_19": 0, "sub-019_20": 0, "sub-019_21": 0, "sub-019_22": 0, "sub-019_23": 1, "sub-019_24": 1, "sub-019_25": 1, "sub-019_26": 0, "sub-019_27": 1, "sub-019_28": 0, "sub-019_29": 0, "sub-019_30": 1, "sub-019_31": 0, "sub-019_32": 0, "sub-019_33": 0, "sub-019_34": 1, "sub-019_35": 1, "sub-019_36": 1, "sub-019_37": 0, "sub-019_38": 1, "sub-019_39": 0, "sub-019_40": 1, "sub-019_41": 1, "sub-019_42": 0, "sub-019_43": 0, "sub-019_44": 1, "sub-019_45": 1, "sub-019_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-020.json: -------------------------------------------------------------------------------- 1 | {"sub-020_0": 1, "sub-020_1": 0, "sub-020_2": 0, "sub-020_3": 0, "sub-020_4": 0, "sub-020_5": 1, "sub-020_6": 0, "sub-020_7": 1, "sub-020_8": 0, "sub-020_9": 1, "sub-020_10": 0, "sub-020_11": 1, "sub-020_12": 1, "sub-020_13": 1, "sub-020_14": 0, "sub-020_15": 0, "sub-020_16": 1, "sub-020_17": 1, "sub-020_18": 0, "sub-020_19": 0, "sub-020_20": 0, "sub-020_21": 0, "sub-020_22": 0, "sub-020_23": 1, "sub-020_24": 1, "sub-020_25": 1, "sub-020_26": 0, "sub-020_27": 1, "sub-020_28": 0, "sub-020_29": 0, "sub-020_30": 1, "sub-020_31": 0, "sub-020_32": 0, "sub-020_33": 0, "sub-020_34": 1, "sub-020_35": 1, "sub-020_36": 1, "sub-020_37": 0, "sub-020_38": 1, "sub-020_39": 0, "sub-020_40": 1, "sub-020_41": 1, "sub-020_42": 0, "sub-020_43": 0, "sub-020_44": 1, "sub-020_45": 1, "sub-020_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-021.json: -------------------------------------------------------------------------------- 1 | {"sub-021_0": 1, "sub-021_1": 0, "sub-021_2": 0, "sub-021_3": 0, "sub-021_4": 0, "sub-021_5": 1, "sub-021_6": 0, "sub-021_7": 1, "sub-021_8": 0, "sub-021_9": 1, "sub-021_10": 0, "sub-021_11": 1, "sub-021_12": 1, "sub-021_13": 1, "sub-021_14": 0, "sub-021_15": 0, "sub-021_16": 1, "sub-021_17": 1, "sub-021_18": 0, "sub-021_19": 0, "sub-021_20": 0, "sub-021_21": 0, "sub-021_22": 0, "sub-021_23": 1, "sub-021_24": 1, "sub-021_25": 1, "sub-021_26": 0, "sub-021_27": 1, "sub-021_28": 0, "sub-021_29": 0, "sub-021_30": 1, "sub-021_31": 0, "sub-021_32": 0, "sub-021_33": 0, "sub-021_34": 1, "sub-021_35": 1, "sub-021_36": 1, "sub-021_37": 0, "sub-021_38": 1, "sub-021_39": 0, "sub-021_40": 1, "sub-021_41": 1, "sub-021_42": 0, "sub-021_43": 0, "sub-021_44": 1, "sub-021_45": 1, "sub-021_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-022.json: -------------------------------------------------------------------------------- 1 | {"sub-022_0": 1, "sub-022_1": 0, "sub-022_2": 0, "sub-022_3": 0, "sub-022_4": 0, "sub-022_5": 1, "sub-022_6": 0, "sub-022_7": 1, "sub-022_8": 0, "sub-022_9": 1, "sub-022_10": 0, "sub-022_11": 1, "sub-022_12": 1, "sub-022_13": 1, "sub-022_14": 0, "sub-022_15": 0, "sub-022_16": 1, "sub-022_17": 1, "sub-022_18": 0, "sub-022_19": 0, "sub-022_20": 0, "sub-022_21": 0, "sub-022_22": 0, "sub-022_23": 1, "sub-022_24": 1, "sub-022_25": 1, "sub-022_26": 0, "sub-022_27": 1, "sub-022_28": 0, "sub-022_29": 0, "sub-022_30": 1, "sub-022_31": 0, "sub-022_32": 0, "sub-022_33": 0, "sub-022_34": 1, "sub-022_35": 1, "sub-022_36": 1, "sub-022_37": 0, "sub-022_38": 1, "sub-022_39": 0, "sub-022_40": 1, "sub-022_41": 1, "sub-022_42": 0, "sub-022_43": 0, "sub-022_44": 1, "sub-022_45": 1, "sub-022_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-023.json: -------------------------------------------------------------------------------- 1 | {"sub-023_0": 1, "sub-023_1": 0, "sub-023_2": 0, "sub-023_3": 0, "sub-023_4": 0, "sub-023_5": 1, "sub-023_6": 0, "sub-023_7": 1, "sub-023_8": 0, "sub-023_9": 1, "sub-023_10": 0, "sub-023_11": 1, "sub-023_12": 1, "sub-023_13": 1, "sub-023_14": 0, "sub-023_15": 0, "sub-023_16": 1, "sub-023_17": 1, "sub-023_18": 0, "sub-023_19": 0, "sub-023_20": 0, "sub-023_21": 0, "sub-023_22": 0, "sub-023_23": 1, "sub-023_24": 1, "sub-023_25": 1, "sub-023_26": 0, "sub-023_27": 1, "sub-023_28": 0, "sub-023_29": 0, "sub-023_30": 1, "sub-023_31": 0, "sub-023_32": 0, "sub-023_33": 0, "sub-023_34": 1, "sub-023_35": 1, "sub-023_36": 1, "sub-023_37": 0, "sub-023_38": 1, "sub-023_39": 0, "sub-023_40": 1, "sub-023_41": 1, "sub-023_42": 0, "sub-023_43": 0, "sub-023_44": 1, "sub-023_45": 1, "sub-023_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-024.json: -------------------------------------------------------------------------------- 1 | {"sub-024_0": 1, "sub-024_1": 0, "sub-024_2": 0, "sub-024_3": 0, "sub-024_4": 0, "sub-024_5": 1, "sub-024_6": 0, "sub-024_7": 1, "sub-024_8": 0, "sub-024_9": 1, "sub-024_10": 0, "sub-024_11": 1, "sub-024_12": 1, "sub-024_13": 1, "sub-024_14": 0, "sub-024_15": 0, "sub-024_16": 1, "sub-024_17": 1, "sub-024_18": 0, "sub-024_19": 0, "sub-024_20": 0, "sub-024_21": 0, "sub-024_22": 0, "sub-024_23": 1, "sub-024_24": 1, "sub-024_25": 1, "sub-024_26": 0, "sub-024_27": 1, "sub-024_28": 0, "sub-024_29": 0, "sub-024_30": 1, "sub-024_31": 0, "sub-024_32": 0, "sub-024_33": 0, "sub-024_34": 1, "sub-024_35": 1, "sub-024_36": 1, "sub-024_37": 0, "sub-024_38": 1, "sub-024_39": 0, "sub-024_40": 1, "sub-024_41": 1, "sub-024_42": 0, "sub-024_43": 0, "sub-024_44": 1, "sub-024_45": 1, "sub-024_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-025.json: -------------------------------------------------------------------------------- 1 | {"sub-025_0": 1, "sub-025_1": 0, "sub-025_2": 0, "sub-025_3": 0, "sub-025_4": 0, "sub-025_5": 1, "sub-025_6": 0, "sub-025_7": 1, "sub-025_8": 0, "sub-025_9": 1, "sub-025_10": 0, "sub-025_11": 1, "sub-025_12": 1, "sub-025_13": 1, "sub-025_14": 0, "sub-025_15": 0, "sub-025_16": 1, "sub-025_17": 1, "sub-025_18": 0, "sub-025_19": 0, "sub-025_20": 0, "sub-025_21": 0, "sub-025_22": 0, "sub-025_23": 1, "sub-025_24": 1, "sub-025_25": 1, "sub-025_26": 0, "sub-025_27": 1, "sub-025_28": 0, "sub-025_29": 0, "sub-025_30": 1, "sub-025_31": 0, "sub-025_32": 0, "sub-025_33": 0, "sub-025_34": 1, "sub-025_35": 1, "sub-025_36": 1, "sub-025_37": 0, "sub-025_38": 1, "sub-025_39": 0, "sub-025_40": 1, "sub-025_41": 1, "sub-025_42": 0, "sub-025_43": 0, "sub-025_44": 1, "sub-025_45": 1, "sub-025_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-026.json: -------------------------------------------------------------------------------- 1 | {"sub-026_0": 1, "sub-026_1": 0, "sub-026_2": 0, "sub-026_3": 0, "sub-026_4": 0, "sub-026_5": 1, "sub-026_6": 0, "sub-026_7": 1, "sub-026_8": 0, "sub-026_9": 1, "sub-026_10": 0, "sub-026_11": 1, "sub-026_12": 1, "sub-026_13": 1, "sub-026_14": 0, "sub-026_15": 0, "sub-026_16": 1, "sub-026_17": 1, "sub-026_18": 0, "sub-026_19": 0, "sub-026_20": 0, "sub-026_21": 0, "sub-026_22": 0, "sub-026_23": 1, "sub-026_24": 1, "sub-026_25": 1, "sub-026_26": 0, "sub-026_27": 1, "sub-026_28": 0, "sub-026_29": 0, "sub-026_30": 1, "sub-026_31": 0, "sub-026_32": 0, "sub-026_33": 0, "sub-026_34": 1, "sub-026_35": 1, "sub-026_36": 1, "sub-026_37": 0, "sub-026_38": 1, "sub-026_39": 0, "sub-026_40": 1, "sub-026_41": 1, "sub-026_42": 0, "sub-026_43": 0, "sub-026_44": 1, "sub-026_45": 1, "sub-026_46": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-032.json: -------------------------------------------------------------------------------- 1 | {"sub-032_0": 1, "sub-032_1": 0, "sub-032_2": 0, "sub-032_3": 0, "sub-032_4": 0, "sub-032_5": 1, "sub-032_6": 0, "sub-032_7": 1, "sub-032_8": 0, "sub-032_9": 1, "sub-032_10": 0, "sub-032_11": 1, "sub-032_12": 1, "sub-032_13": 1, "sub-032_14": 0, "sub-032_15": 0, "sub-032_16": 1, "sub-032_17": 1, "sub-032_18": 0, "sub-032_19": 0, "sub-032_20": 0, "sub-032_21": 0, "sub-032_22": 0, "sub-032_23": 1, "sub-032_24": 1, "sub-032_25": 1, "sub-032_26": 0, "sub-032_27": 1, "sub-032_28": 0, "sub-032_29": 0, "sub-032_30": 1, "sub-032_31": 0, "sub-032_32": 0, "sub-032_33": 0, "sub-032_34": 1, "sub-032_35": 1, "sub-032_36": 1, "sub-032_37": 0, "sub-032_38": 1, "sub-032_39": 0, "sub-032_40": 1, "sub-032_41": 1, "sub-032_42": 0, "sub-032_43": 0, "sub-032_44": 1, "sub-032_45": 1, "sub-032_46": 0, "sub-032_47": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-033.json: -------------------------------------------------------------------------------- 1 | {"sub-033_0": 1, "sub-033_1": 0, "sub-033_2": 0, "sub-033_3": 0, "sub-033_4": 0, "sub-033_5": 1, "sub-033_6": 0, "sub-033_7": 1, "sub-033_8": 0, "sub-033_9": 1, "sub-033_10": 0, "sub-033_11": 1, "sub-033_12": 1, "sub-033_13": 1, "sub-033_14": 0, "sub-033_15": 0, "sub-033_16": 1, "sub-033_17": 1, "sub-033_18": 0, "sub-033_19": 0, "sub-033_20": 0, "sub-033_21": 0, "sub-033_22": 0, "sub-033_23": 1, "sub-033_24": 1, "sub-033_25": 1, "sub-033_26": 0, "sub-033_27": 1, "sub-033_28": 0, "sub-033_29": 0, "sub-033_30": 1, "sub-033_31": 0, "sub-033_32": 0, "sub-033_33": 0, "sub-033_34": 1, "sub-033_35": 1, "sub-033_36": 1, "sub-033_37": 0, "sub-033_38": 1, "sub-033_39": 0, "sub-033_40": 1, "sub-033_41": 1, "sub-033_42": 0, "sub-033_43": 0, "sub-033_44": 1, "sub-033_45": 1, "sub-033_46": 0, "sub-033_47": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-034.json: -------------------------------------------------------------------------------- 1 | {"sub-034_0": 1, "sub-034_1": 0, "sub-034_2": 0, "sub-034_3": 0, "sub-034_4": 0, "sub-034_5": 1, "sub-034_6": 0, "sub-034_7": 1, "sub-034_8": 0, "sub-034_9": 1, "sub-034_10": 0, "sub-034_11": 1, "sub-034_12": 1, "sub-034_13": 1, "sub-034_14": 0, "sub-034_15": 0, "sub-034_16": 1, "sub-034_17": 1, "sub-034_18": 0, "sub-034_19": 0, "sub-034_20": 0, "sub-034_21": 0, "sub-034_22": 0, "sub-034_23": 1, "sub-034_24": 1, "sub-034_25": 1, "sub-034_26": 0, "sub-034_27": 1, "sub-034_28": 0, "sub-034_29": 0, "sub-034_30": 1, "sub-034_31": 0, "sub-034_32": 0, "sub-034_33": 0, "sub-034_34": 1, "sub-034_35": 1, "sub-034_36": 1, "sub-034_37": 0, "sub-034_38": 1, "sub-034_39": 0, "sub-034_40": 1, "sub-034_41": 1, "sub-034_42": 0, "sub-034_43": 0, "sub-034_44": 1, "sub-034_45": 1, "sub-034_46": 0, "sub-034_47": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-035.json: -------------------------------------------------------------------------------- 1 | {"sub-035_0": 1, "sub-035_1": 0, "sub-035_2": 0, "sub-035_3": 0, "sub-035_4": 0, "sub-035_5": 1, "sub-035_6": 0, "sub-035_7": 1, "sub-035_8": 0, "sub-035_9": 1, "sub-035_10": 0, "sub-035_11": 1, "sub-035_12": 1, "sub-035_13": 1, "sub-035_14": 0, "sub-035_15": 0, "sub-035_16": 1, "sub-035_17": 1, "sub-035_18": 0, "sub-035_19": 0, "sub-035_20": 0, "sub-035_21": 0, "sub-035_22": 0, "sub-035_23": 1, "sub-035_24": 1, "sub-035_25": 1, "sub-035_26": 0, "sub-035_27": 1, "sub-035_28": 0, "sub-035_29": 0, "sub-035_30": 1, "sub-035_31": 0, "sub-035_32": 0, "sub-035_33": 0, "sub-035_34": 1, "sub-035_35": 1, "sub-035_36": 1, "sub-035_37": 0, "sub-035_38": 1, "sub-035_39": 0, "sub-035_40": 1, "sub-035_41": 1, "sub-035_42": 0, "sub-035_43": 0, "sub-035_44": 1, "sub-035_45": 1, "sub-035_46": 0, "sub-035_47": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-036.json: -------------------------------------------------------------------------------- 1 | {"sub-036_0": 1, "sub-036_1": 0, "sub-036_2": 0, "sub-036_3": 0, "sub-036_4": 0, "sub-036_5": 1, "sub-036_6": 0, "sub-036_7": 1, "sub-036_8": 0, "sub-036_9": 1, "sub-036_10": 0, "sub-036_11": 1, "sub-036_12": 1, "sub-036_13": 1, "sub-036_14": 0, "sub-036_15": 0, "sub-036_16": 1, "sub-036_17": 1, "sub-036_18": 0, "sub-036_19": 0, "sub-036_20": 0, "sub-036_21": 0, "sub-036_22": 0, "sub-036_23": 1, "sub-036_24": 1, "sub-036_25": 1, "sub-036_26": 0, "sub-036_27": 1, "sub-036_28": 0, "sub-036_29": 0, "sub-036_30": 1, "sub-036_31": 0, "sub-036_32": 0, "sub-036_33": 0, "sub-036_34": 1, "sub-036_35": 1, "sub-036_36": 1, "sub-036_37": 0, "sub-036_38": 1, "sub-036_39": 0, "sub-036_40": 1, "sub-036_41": 1, "sub-036_42": 0, "sub-036_43": 0, "sub-036_44": 1, "sub-036_45": 1, "sub-036_46": 0, "sub-036_47": 1} -------------------------------------------------------------------------------- /task2_regression/util/window.py: -------------------------------------------------------------------------------- 1 | """General utilities.""" 2 | import numpy as np 3 | 4 | 5 | def window_data(data, window_length, hop): 6 | """Window data into overlapping windows. 7 | 8 | Parameters 9 | ---------- 10 | data: np.ndarray 11 | Data to window. Shape (n_samples, n_channels) 12 | window_length: int 13 | Length of the window in samples. 14 | hop: int 15 | Hop size in samples. 16 | 17 | Returns 18 | ------- 19 | np.ndarray 20 | Windowed data. Shape (n_windows, window_length, n_channels) 21 | """ 22 | new_data = np.empty( 23 | ((data.shape[0] - window_length) // hop, window_length, data.shape[1]) 24 | ) 25 | for i in range(new_data.shape[0]): 26 | new_data[i, :, :] = data[ 27 | i * hop : i * hop + window_length, : # noqa: E203 E501 28 | ] 29 | return new_data 30 | -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-037.json: -------------------------------------------------------------------------------- 1 | {"sub-037_0": 1, "sub-037_1": 0, "sub-037_2": 0, "sub-037_3": 0, "sub-037_4": 0, "sub-037_5": 1, "sub-037_6": 0, "sub-037_7": 1, "sub-037_8": 0, "sub-037_9": 1, "sub-037_10": 0, "sub-037_11": 1, "sub-037_12": 1, "sub-037_13": 1, "sub-037_14": 0, "sub-037_15": 0, "sub-037_16": 1, "sub-037_17": 1, "sub-037_18": 0, "sub-037_19": 0, "sub-037_20": 0, "sub-037_21": 0, "sub-037_22": 0, "sub-037_23": 1, "sub-037_24": 1, "sub-037_25": 1, "sub-037_26": 0, "sub-037_27": 1, "sub-037_28": 0, "sub-037_29": 0, "sub-037_30": 1, "sub-037_31": 0, "sub-037_32": 0, "sub-037_33": 0, "sub-037_34": 1, "sub-037_35": 1, "sub-037_36": 1, "sub-037_37": 0, "sub-037_38": 1, "sub-037_39": 0, "sub-037_40": 1, "sub-037_41": 1, "sub-037_42": 0, "sub-037_43": 0, "sub-037_44": 1, "sub-037_45": 1, "sub-037_46": 0, "sub-037_47": 1, "sub-037_48": 1, "sub-037_49": 0, "sub-037_50": 1, "sub-037_51": 0, "sub-037_52": 1, "sub-037_53": 0, "sub-037_54": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-038.json: -------------------------------------------------------------------------------- 1 | {"sub-038_0": 1, "sub-038_1": 0, "sub-038_2": 0, "sub-038_3": 0, "sub-038_4": 0, "sub-038_5": 1, "sub-038_6": 0, "sub-038_7": 1, "sub-038_8": 0, "sub-038_9": 1, "sub-038_10": 0, "sub-038_11": 1, "sub-038_12": 1, "sub-038_13": 1, "sub-038_14": 0, "sub-038_15": 0, "sub-038_16": 1, "sub-038_17": 1, "sub-038_18": 0, "sub-038_19": 0, "sub-038_20": 0, "sub-038_21": 0, "sub-038_22": 0, "sub-038_23": 1, "sub-038_24": 1, "sub-038_25": 1, "sub-038_26": 0, "sub-038_27": 1, "sub-038_28": 0, "sub-038_29": 0, "sub-038_30": 1, "sub-038_31": 0, "sub-038_32": 0, "sub-038_33": 0, "sub-038_34": 1, "sub-038_35": 1, "sub-038_36": 1, "sub-038_37": 0, "sub-038_38": 1, "sub-038_39": 0, "sub-038_40": 1, "sub-038_41": 1, "sub-038_42": 0, "sub-038_43": 0, "sub-038_44": 1, "sub-038_45": 1, "sub-038_46": 0, "sub-038_47": 1, "sub-038_48": 1, "sub-038_49": 0, "sub-038_50": 1, "sub-038_51": 0, "sub-038_52": 1, "sub-038_53": 0, "sub-038_54": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-039.json: -------------------------------------------------------------------------------- 1 | {"sub-039_0": 1, "sub-039_1": 0, "sub-039_2": 0, "sub-039_3": 0, "sub-039_4": 0, "sub-039_5": 1, "sub-039_6": 0, "sub-039_7": 1, "sub-039_8": 0, "sub-039_9": 1, "sub-039_10": 0, "sub-039_11": 1, "sub-039_12": 1, "sub-039_13": 1, "sub-039_14": 0, "sub-039_15": 0, "sub-039_16": 1, "sub-039_17": 1, "sub-039_18": 0, "sub-039_19": 0, "sub-039_20": 0, "sub-039_21": 0, "sub-039_22": 0, "sub-039_23": 1, "sub-039_24": 1, "sub-039_25": 1, "sub-039_26": 0, "sub-039_27": 1, "sub-039_28": 0, "sub-039_29": 0, "sub-039_30": 1, "sub-039_31": 0, "sub-039_32": 0, "sub-039_33": 0, "sub-039_34": 1, "sub-039_35": 1, "sub-039_36": 1, "sub-039_37": 0, "sub-039_38": 1, "sub-039_39": 0, "sub-039_40": 1, "sub-039_41": 1, "sub-039_42": 0, "sub-039_43": 0, "sub-039_44": 1, "sub-039_45": 1, "sub-039_46": 0, "sub-039_47": 1, "sub-039_48": 1, "sub-039_49": 0, "sub-039_50": 1, "sub-039_51": 0, "sub-039_52": 1, "sub-039_53": 0, "sub-039_54": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-040.json: -------------------------------------------------------------------------------- 1 | {"sub-040_0": 1, "sub-040_1": 0, "sub-040_2": 0, "sub-040_3": 0, "sub-040_4": 0, "sub-040_5": 1, "sub-040_6": 0, "sub-040_7": 1, "sub-040_8": 0, "sub-040_9": 1, "sub-040_10": 0, "sub-040_11": 1, "sub-040_12": 1, "sub-040_13": 1, "sub-040_14": 0, "sub-040_15": 0, "sub-040_16": 1, "sub-040_17": 1, "sub-040_18": 0, "sub-040_19": 0, "sub-040_20": 0, "sub-040_21": 0, "sub-040_22": 0, "sub-040_23": 1, "sub-040_24": 1, "sub-040_25": 1, "sub-040_26": 0, "sub-040_27": 1, "sub-040_28": 0, "sub-040_29": 0, "sub-040_30": 1, "sub-040_31": 0, "sub-040_32": 0, "sub-040_33": 0, "sub-040_34": 1, "sub-040_35": 1, "sub-040_36": 1, "sub-040_37": 0, "sub-040_38": 1, "sub-040_39": 0, "sub-040_40": 1, "sub-040_41": 1, "sub-040_42": 0, "sub-040_43": 0, "sub-040_44": 1, "sub-040_45": 1, "sub-040_46": 0, "sub-040_47": 1, "sub-040_48": 1, "sub-040_49": 0, "sub-040_50": 1, "sub-040_51": 0, "sub-040_52": 1, "sub-040_53": 0, "sub-040_54": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-041.json: -------------------------------------------------------------------------------- 1 | {"sub-041_0": 1, "sub-041_1": 0, "sub-041_2": 0, "sub-041_3": 0, "sub-041_4": 0, "sub-041_5": 1, "sub-041_6": 0, "sub-041_7": 1, "sub-041_8": 0, "sub-041_9": 1, "sub-041_10": 0, "sub-041_11": 1, "sub-041_12": 1, "sub-041_13": 1, "sub-041_14": 0, "sub-041_15": 0, "sub-041_16": 1, "sub-041_17": 1, "sub-041_18": 0, "sub-041_19": 0, "sub-041_20": 0, "sub-041_21": 0, "sub-041_22": 0, "sub-041_23": 1, "sub-041_24": 1, "sub-041_25": 1, "sub-041_26": 0, "sub-041_27": 1, "sub-041_28": 0, "sub-041_29": 0, "sub-041_30": 1, "sub-041_31": 0, "sub-041_32": 0, "sub-041_33": 0, "sub-041_34": 1, "sub-041_35": 1, "sub-041_36": 1, "sub-041_37": 0, "sub-041_38": 1, "sub-041_39": 0, "sub-041_40": 1, "sub-041_41": 1, "sub-041_42": 0, "sub-041_43": 0, "sub-041_44": 1, "sub-041_45": 1, "sub-041_46": 0, "sub-041_47": 1, "sub-041_48": 1, "sub-041_49": 0, "sub-041_50": 1, "sub-041_51": 0, "sub-041_52": 1, "sub-041_53": 0, "sub-041_54": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-042.json: -------------------------------------------------------------------------------- 1 | {"sub-042_0": 1, "sub-042_1": 0, "sub-042_2": 0, "sub-042_3": 0, "sub-042_4": 0, "sub-042_5": 1, "sub-042_6": 0, "sub-042_7": 1, "sub-042_8": 0, "sub-042_9": 1, "sub-042_10": 0, "sub-042_11": 1, "sub-042_12": 1, "sub-042_13": 1, "sub-042_14": 0, "sub-042_15": 0, "sub-042_16": 1, "sub-042_17": 1, "sub-042_18": 0, "sub-042_19": 0, "sub-042_20": 0, "sub-042_21": 0, "sub-042_22": 0, "sub-042_23": 1, "sub-042_24": 1, "sub-042_25": 1, "sub-042_26": 0, "sub-042_27": 1, "sub-042_28": 0, "sub-042_29": 0, "sub-042_30": 1, "sub-042_31": 0, "sub-042_32": 0, "sub-042_33": 0, "sub-042_34": 1, "sub-042_35": 1, "sub-042_36": 1, "sub-042_37": 0, "sub-042_38": 1, "sub-042_39": 0, "sub-042_40": 1, "sub-042_41": 1, "sub-042_42": 0, "sub-042_43": 0, "sub-042_44": 1, "sub-042_45": 1, "sub-042_46": 0, "sub-042_47": 1, "sub-042_48": 1, "sub-042_49": 0, "sub-042_50": 1, "sub-042_51": 0, "sub-042_52": 1, "sub-042_53": 0, "sub-042_54": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-063.json: -------------------------------------------------------------------------------- 1 | {"sub-063_0": 1, "sub-063_1": 0, "sub-063_2": 0, "sub-063_3": 0, "sub-063_4": 0, "sub-063_5": 1, "sub-063_6": 0, "sub-063_7": 1, "sub-063_8": 0, "sub-063_9": 1, "sub-063_10": 0, "sub-063_11": 1, "sub-063_12": 1, "sub-063_13": 1, "sub-063_14": 0, "sub-063_15": 0, "sub-063_16": 1, "sub-063_17": 1, "sub-063_18": 0, "sub-063_19": 0, "sub-063_20": 0, "sub-063_21": 0, "sub-063_22": 0, "sub-063_23": 1, "sub-063_24": 1, "sub-063_25": 1, "sub-063_26": 0, "sub-063_27": 1, "sub-063_28": 0, "sub-063_29": 0, "sub-063_30": 1, "sub-063_31": 0, "sub-063_32": 0, "sub-063_33": 0, "sub-063_34": 1, "sub-063_35": 1, "sub-063_36": 1, "sub-063_37": 0, "sub-063_38": 1, "sub-063_39": 0, "sub-063_40": 1, "sub-063_41": 1, "sub-063_42": 0, "sub-063_43": 0, "sub-063_44": 1, "sub-063_45": 1, "sub-063_46": 0, "sub-063_47": 1, "sub-063_48": 1, "sub-063_49": 0, "sub-063_50": 1, "sub-063_51": 0, "sub-063_52": 1, "sub-063_53": 0, "sub-063_54": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-064.json: -------------------------------------------------------------------------------- 1 | {"sub-064_0": 1, "sub-064_1": 0, "sub-064_2": 0, "sub-064_3": 0, "sub-064_4": 0, "sub-064_5": 1, "sub-064_6": 0, "sub-064_7": 1, "sub-064_8": 0, "sub-064_9": 1, "sub-064_10": 0, "sub-064_11": 1, "sub-064_12": 1, "sub-064_13": 1, "sub-064_14": 0, "sub-064_15": 0, "sub-064_16": 1, "sub-064_17": 1, "sub-064_18": 0, "sub-064_19": 0, "sub-064_20": 0, "sub-064_21": 0, "sub-064_22": 0, "sub-064_23": 1, "sub-064_24": 1, "sub-064_25": 1, "sub-064_26": 0, "sub-064_27": 1, "sub-064_28": 0, "sub-064_29": 0, "sub-064_30": 1, "sub-064_31": 0, "sub-064_32": 0, "sub-064_33": 0, "sub-064_34": 1, "sub-064_35": 1, "sub-064_36": 1, "sub-064_37": 0, "sub-064_38": 1, "sub-064_39": 0, "sub-064_40": 1, "sub-064_41": 1, "sub-064_42": 0, "sub-064_43": 0, "sub-064_44": 1, "sub-064_45": 1, "sub-064_46": 0, "sub-064_47": 1, "sub-064_48": 1, "sub-064_49": 0, "sub-064_50": 1, "sub-064_51": 0, "sub-064_52": 1, "sub-064_53": 0, "sub-064_54": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-065.json: -------------------------------------------------------------------------------- 1 | {"sub-065_0": 1, "sub-065_1": 0, "sub-065_2": 0, "sub-065_3": 0, "sub-065_4": 0, "sub-065_5": 1, "sub-065_6": 0, "sub-065_7": 1, "sub-065_8": 0, "sub-065_9": 1, "sub-065_10": 0, "sub-065_11": 1, "sub-065_12": 1, "sub-065_13": 1, "sub-065_14": 0, "sub-065_15": 0, "sub-065_16": 1, "sub-065_17": 1, "sub-065_18": 0, "sub-065_19": 0, "sub-065_20": 0, "sub-065_21": 0, "sub-065_22": 0, "sub-065_23": 1, "sub-065_24": 1, "sub-065_25": 1, "sub-065_26": 0, "sub-065_27": 1, "sub-065_28": 0, "sub-065_29": 0, "sub-065_30": 1, "sub-065_31": 0, "sub-065_32": 0, "sub-065_33": 0, "sub-065_34": 1, "sub-065_35": 1, "sub-065_36": 1, "sub-065_37": 0, "sub-065_38": 1, "sub-065_39": 0, "sub-065_40": 1, "sub-065_41": 1, "sub-065_42": 0, "sub-065_43": 0, "sub-065_44": 1, "sub-065_45": 1, "sub-065_46": 0, "sub-065_47": 1, "sub-065_48": 1, "sub-065_49": 0, "sub-065_50": 1, "sub-065_51": 0, "sub-065_52": 1, "sub-065_53": 0, "sub-065_54": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-066.json: -------------------------------------------------------------------------------- 1 | {"sub-066_0": 1, "sub-066_1": 0, "sub-066_2": 0, "sub-066_3": 0, "sub-066_4": 0, "sub-066_5": 1, "sub-066_6": 0, "sub-066_7": 1, "sub-066_8": 0, "sub-066_9": 1, "sub-066_10": 0, "sub-066_11": 1, "sub-066_12": 1, "sub-066_13": 1, "sub-066_14": 0, "sub-066_15": 0, "sub-066_16": 1, "sub-066_17": 1, "sub-066_18": 0, "sub-066_19": 0, "sub-066_20": 0, "sub-066_21": 0, "sub-066_22": 0, "sub-066_23": 1, "sub-066_24": 1, "sub-066_25": 1, "sub-066_26": 0, "sub-066_27": 1, "sub-066_28": 0, "sub-066_29": 0, "sub-066_30": 1, "sub-066_31": 0, "sub-066_32": 0, "sub-066_33": 0, "sub-066_34": 1, "sub-066_35": 1, "sub-066_36": 1, "sub-066_37": 0, "sub-066_38": 1, "sub-066_39": 0, "sub-066_40": 1, "sub-066_41": 1, "sub-066_42": 0, "sub-066_43": 0, "sub-066_44": 1, "sub-066_45": 1, "sub-066_46": 0, "sub-066_47": 1, "sub-066_48": 1, "sub-066_49": 0, "sub-066_50": 1, "sub-066_51": 0, "sub-066_52": 1, "sub-066_53": 0, "sub-066_54": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-067.json: -------------------------------------------------------------------------------- 1 | {"sub-067_0": 1, "sub-067_1": 0, "sub-067_2": 0, "sub-067_3": 0, "sub-067_4": 0, "sub-067_5": 1, "sub-067_6": 0, "sub-067_7": 1, "sub-067_8": 0, "sub-067_9": 1, "sub-067_10": 0, "sub-067_11": 1, "sub-067_12": 1, "sub-067_13": 1, "sub-067_14": 0, "sub-067_15": 0, "sub-067_16": 1, "sub-067_17": 1, "sub-067_18": 0, "sub-067_19": 0, "sub-067_20": 0, "sub-067_21": 0, "sub-067_22": 0, "sub-067_23": 1, "sub-067_24": 1, "sub-067_25": 1, "sub-067_26": 0, "sub-067_27": 1, "sub-067_28": 0, "sub-067_29": 0, "sub-067_30": 1, "sub-067_31": 0, "sub-067_32": 0, "sub-067_33": 0, "sub-067_34": 1, "sub-067_35": 1, "sub-067_36": 1, "sub-067_37": 0, "sub-067_38": 1, "sub-067_39": 0, "sub-067_40": 1, "sub-067_41": 1, "sub-067_42": 0, "sub-067_43": 0, "sub-067_44": 1, "sub-067_45": 1, "sub-067_46": 0, "sub-067_47": 1, "sub-067_48": 1, "sub-067_49": 0, "sub-067_50": 1, "sub-067_51": 0, "sub-067_52": 1, "sub-067_53": 0, "sub-067_54": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-068.json: -------------------------------------------------------------------------------- 1 | {"sub-068_0": 1, "sub-068_1": 0, "sub-068_2": 0, "sub-068_3": 0, "sub-068_4": 0, "sub-068_5": 1, "sub-068_6": 0, "sub-068_7": 1, "sub-068_8": 0, "sub-068_9": 1, "sub-068_10": 0, "sub-068_11": 1, "sub-068_12": 1, "sub-068_13": 1, "sub-068_14": 0, "sub-068_15": 0, "sub-068_16": 1, "sub-068_17": 1, "sub-068_18": 0, "sub-068_19": 0, "sub-068_20": 0, "sub-068_21": 0, "sub-068_22": 0, "sub-068_23": 1, "sub-068_24": 1, "sub-068_25": 1, "sub-068_26": 0, "sub-068_27": 1, "sub-068_28": 0, "sub-068_29": 0, "sub-068_30": 1, "sub-068_31": 0, "sub-068_32": 0, "sub-068_33": 0, "sub-068_34": 1, "sub-068_35": 1, "sub-068_36": 1, "sub-068_37": 0, "sub-068_38": 1, "sub-068_39": 0, "sub-068_40": 1, "sub-068_41": 1, "sub-068_42": 0, "sub-068_43": 0, "sub-068_44": 1, "sub-068_45": 1, "sub-068_46": 0, "sub-068_47": 1, "sub-068_48": 1, "sub-068_49": 0, "sub-068_50": 1, "sub-068_51": 0, "sub-068_52": 1, "sub-068_53": 0, "sub-068_54": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-069.json: -------------------------------------------------------------------------------- 1 | {"sub-069_0": 1, "sub-069_1": 0, "sub-069_2": 0, "sub-069_3": 0, "sub-069_4": 0, "sub-069_5": 1, "sub-069_6": 0, "sub-069_7": 1, "sub-069_8": 0, "sub-069_9": 1, "sub-069_10": 0, "sub-069_11": 1, "sub-069_12": 1, "sub-069_13": 1, "sub-069_14": 0, "sub-069_15": 0, "sub-069_16": 1, "sub-069_17": 1, "sub-069_18": 0, "sub-069_19": 0, "sub-069_20": 0, "sub-069_21": 0, "sub-069_22": 0, "sub-069_23": 1, "sub-069_24": 1, "sub-069_25": 1, "sub-069_26": 0, "sub-069_27": 1, "sub-069_28": 0, "sub-069_29": 0, "sub-069_30": 1, "sub-069_31": 0, "sub-069_32": 0, "sub-069_33": 0, "sub-069_34": 1, "sub-069_35": 1, "sub-069_36": 1, "sub-069_37": 0, "sub-069_38": 1, "sub-069_39": 0, "sub-069_40": 1, "sub-069_41": 1, "sub-069_42": 0, "sub-069_43": 0, "sub-069_44": 1, "sub-069_45": 1, "sub-069_46": 0, "sub-069_47": 1, "sub-069_48": 1, "sub-069_49": 0, "sub-069_50": 1, "sub-069_51": 0, "sub-069_52": 1, "sub-069_53": 0, "sub-069_54": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-070.json: -------------------------------------------------------------------------------- 1 | {"sub-070_0": 1, "sub-070_1": 0, "sub-070_2": 0, "sub-070_3": 0, "sub-070_4": 0, "sub-070_5": 1, "sub-070_6": 0, "sub-070_7": 1, "sub-070_8": 0, "sub-070_9": 1, "sub-070_10": 0, "sub-070_11": 1, "sub-070_12": 1, "sub-070_13": 1, "sub-070_14": 0, "sub-070_15": 0, "sub-070_16": 1, "sub-070_17": 1, "sub-070_18": 0, "sub-070_19": 0, "sub-070_20": 0, "sub-070_21": 0, "sub-070_22": 0, "sub-070_23": 1, "sub-070_24": 1, "sub-070_25": 1, "sub-070_26": 0, "sub-070_27": 1, "sub-070_28": 0, "sub-070_29": 0, "sub-070_30": 1, "sub-070_31": 0, "sub-070_32": 0, "sub-070_33": 0, "sub-070_34": 1, "sub-070_35": 1, "sub-070_36": 1, "sub-070_37": 0, "sub-070_38": 1, "sub-070_39": 0, "sub-070_40": 1, "sub-070_41": 1, "sub-070_42": 0, "sub-070_43": 0, "sub-070_44": 1, "sub-070_45": 1, "sub-070_46": 0, "sub-070_47": 1, "sub-070_48": 1, "sub-070_49": 0, "sub-070_50": 1, "sub-070_51": 0, "sub-070_52": 1, "sub-070_53": 0, "sub-070_54": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-071.json: -------------------------------------------------------------------------------- 1 | {"sub-071_0": 1, "sub-071_1": 0, "sub-071_2": 0, "sub-071_3": 0, "sub-071_4": 0, "sub-071_5": 1, "sub-071_6": 0, "sub-071_7": 1, "sub-071_8": 0, "sub-071_9": 1, "sub-071_10": 0, "sub-071_11": 1, "sub-071_12": 1, "sub-071_13": 1, "sub-071_14": 0, "sub-071_15": 0, "sub-071_16": 1, "sub-071_17": 1, "sub-071_18": 0, "sub-071_19": 0, "sub-071_20": 0, "sub-071_21": 0, "sub-071_22": 0, "sub-071_23": 1, "sub-071_24": 1, "sub-071_25": 1, "sub-071_26": 0, "sub-071_27": 1, "sub-071_28": 0, "sub-071_29": 0, "sub-071_30": 1, "sub-071_31": 0, "sub-071_32": 0, "sub-071_33": 0, "sub-071_34": 1, "sub-071_35": 1, "sub-071_36": 1, "sub-071_37": 0, "sub-071_38": 1, "sub-071_39": 0, "sub-071_40": 1, "sub-071_41": 1, "sub-071_42": 0, "sub-071_43": 0, "sub-071_44": 1, "sub-071_45": 1, "sub-071_46": 0, "sub-071_47": 1, "sub-071_48": 1, "sub-071_49": 0, "sub-071_50": 1, "sub-071_51": 0, "sub-071_52": 1, "sub-071_53": 0, "sub-071_54": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-057.json: -------------------------------------------------------------------------------- 1 | {"sub-057_0": 1, "sub-057_1": 0, "sub-057_2": 0, "sub-057_3": 0, "sub-057_4": 0, "sub-057_5": 1, "sub-057_6": 0, "sub-057_7": 1, "sub-057_8": 0, "sub-057_9": 1, "sub-057_10": 0, "sub-057_11": 1, "sub-057_12": 1, "sub-057_13": 1, "sub-057_14": 0, "sub-057_15": 0, "sub-057_16": 1, "sub-057_17": 1, "sub-057_18": 0, "sub-057_19": 0, "sub-057_20": 0, "sub-057_21": 0, "sub-057_22": 0, "sub-057_23": 1, "sub-057_24": 1, "sub-057_25": 1, "sub-057_26": 0, "sub-057_27": 1, "sub-057_28": 0, "sub-057_29": 0, "sub-057_30": 1, "sub-057_31": 0, "sub-057_32": 0, "sub-057_33": 0, "sub-057_34": 1, "sub-057_35": 1, "sub-057_36": 1, "sub-057_37": 0, "sub-057_38": 1, "sub-057_39": 0, "sub-057_40": 1, "sub-057_41": 1, "sub-057_42": 0, "sub-057_43": 0, "sub-057_44": 1, "sub-057_45": 1, "sub-057_46": 0, "sub-057_47": 1, "sub-057_48": 1, "sub-057_49": 0, "sub-057_50": 1, "sub-057_51": 0, "sub-057_52": 1, "sub-057_53": 0, "sub-057_54": 0, "sub-057_55": 0, "sub-057_56": 0, "sub-057_57": 0, "sub-057_58": 0, "sub-057_59": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-058.json: -------------------------------------------------------------------------------- 1 | {"sub-058_0": 1, "sub-058_1": 0, "sub-058_2": 0, "sub-058_3": 0, "sub-058_4": 0, "sub-058_5": 1, "sub-058_6": 0, "sub-058_7": 1, "sub-058_8": 0, "sub-058_9": 1, "sub-058_10": 0, "sub-058_11": 1, "sub-058_12": 1, "sub-058_13": 1, "sub-058_14": 0, "sub-058_15": 0, "sub-058_16": 1, "sub-058_17": 1, "sub-058_18": 0, "sub-058_19": 0, "sub-058_20": 0, "sub-058_21": 0, "sub-058_22": 0, "sub-058_23": 1, "sub-058_24": 1, "sub-058_25": 1, "sub-058_26": 0, "sub-058_27": 1, "sub-058_28": 0, "sub-058_29": 0, "sub-058_30": 1, "sub-058_31": 0, "sub-058_32": 0, "sub-058_33": 0, "sub-058_34": 1, "sub-058_35": 1, "sub-058_36": 1, "sub-058_37": 0, "sub-058_38": 1, "sub-058_39": 0, "sub-058_40": 1, "sub-058_41": 1, "sub-058_42": 0, "sub-058_43": 0, "sub-058_44": 1, "sub-058_45": 1, "sub-058_46": 0, "sub-058_47": 1, "sub-058_48": 1, "sub-058_49": 0, "sub-058_50": 1, "sub-058_51": 0, "sub-058_52": 1, "sub-058_53": 0, "sub-058_54": 0, "sub-058_55": 0, "sub-058_56": 0, "sub-058_57": 0, "sub-058_58": 0, "sub-058_59": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-059.json: -------------------------------------------------------------------------------- 1 | {"sub-059_0": 1, "sub-059_1": 0, "sub-059_2": 0, "sub-059_3": 0, "sub-059_4": 0, "sub-059_5": 1, "sub-059_6": 0, "sub-059_7": 1, "sub-059_8": 0, "sub-059_9": 1, "sub-059_10": 0, "sub-059_11": 1, "sub-059_12": 1, "sub-059_13": 1, "sub-059_14": 0, "sub-059_15": 0, "sub-059_16": 1, "sub-059_17": 1, "sub-059_18": 0, "sub-059_19": 0, "sub-059_20": 0, "sub-059_21": 0, "sub-059_22": 0, "sub-059_23": 1, "sub-059_24": 1, "sub-059_25": 1, "sub-059_26": 0, "sub-059_27": 1, "sub-059_28": 0, "sub-059_29": 0, "sub-059_30": 1, "sub-059_31": 0, "sub-059_32": 0, "sub-059_33": 0, "sub-059_34": 1, "sub-059_35": 1, "sub-059_36": 1, "sub-059_37": 0, "sub-059_38": 1, "sub-059_39": 0, "sub-059_40": 1, "sub-059_41": 1, "sub-059_42": 0, "sub-059_43": 0, "sub-059_44": 1, "sub-059_45": 1, "sub-059_46": 0, "sub-059_47": 1, "sub-059_48": 1, "sub-059_49": 0, "sub-059_50": 1, "sub-059_51": 0, "sub-059_52": 1, "sub-059_53": 0, "sub-059_54": 0, "sub-059_55": 0, "sub-059_56": 0, "sub-059_57": 0, "sub-059_58": 0, "sub-059_59": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-060.json: -------------------------------------------------------------------------------- 1 | {"sub-060_0": 1, "sub-060_1": 0, "sub-060_2": 0, "sub-060_3": 0, "sub-060_4": 0, "sub-060_5": 1, "sub-060_6": 0, "sub-060_7": 1, "sub-060_8": 0, "sub-060_9": 1, "sub-060_10": 0, "sub-060_11": 1, "sub-060_12": 1, "sub-060_13": 1, "sub-060_14": 0, "sub-060_15": 0, "sub-060_16": 1, "sub-060_17": 1, "sub-060_18": 0, "sub-060_19": 0, "sub-060_20": 0, "sub-060_21": 0, "sub-060_22": 0, "sub-060_23": 1, "sub-060_24": 1, "sub-060_25": 1, "sub-060_26": 0, "sub-060_27": 1, "sub-060_28": 0, "sub-060_29": 0, "sub-060_30": 1, "sub-060_31": 0, "sub-060_32": 0, "sub-060_33": 0, "sub-060_34": 1, "sub-060_35": 1, "sub-060_36": 1, "sub-060_37": 0, "sub-060_38": 1, "sub-060_39": 0, "sub-060_40": 1, "sub-060_41": 1, "sub-060_42": 0, "sub-060_43": 0, "sub-060_44": 1, "sub-060_45": 1, "sub-060_46": 0, "sub-060_47": 1, "sub-060_48": 1, "sub-060_49": 0, "sub-060_50": 1, "sub-060_51": 0, "sub-060_52": 1, "sub-060_53": 0, "sub-060_54": 0, "sub-060_55": 0, "sub-060_56": 0, "sub-060_57": 0, "sub-060_58": 0, "sub-060_59": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-061.json: -------------------------------------------------------------------------------- 1 | {"sub-061_0": 1, "sub-061_1": 0, "sub-061_2": 0, "sub-061_3": 0, "sub-061_4": 0, "sub-061_5": 1, "sub-061_6": 0, "sub-061_7": 1, "sub-061_8": 0, "sub-061_9": 1, "sub-061_10": 0, "sub-061_11": 1, "sub-061_12": 1, "sub-061_13": 1, "sub-061_14": 0, "sub-061_15": 0, "sub-061_16": 1, "sub-061_17": 1, "sub-061_18": 0, "sub-061_19": 0, "sub-061_20": 0, "sub-061_21": 0, "sub-061_22": 0, "sub-061_23": 1, "sub-061_24": 1, "sub-061_25": 1, "sub-061_26": 0, "sub-061_27": 1, "sub-061_28": 0, "sub-061_29": 0, "sub-061_30": 1, "sub-061_31": 0, "sub-061_32": 0, "sub-061_33": 0, "sub-061_34": 1, "sub-061_35": 1, "sub-061_36": 1, "sub-061_37": 0, "sub-061_38": 1, "sub-061_39": 0, "sub-061_40": 1, "sub-061_41": 1, "sub-061_42": 0, "sub-061_43": 0, "sub-061_44": 1, "sub-061_45": 1, "sub-061_46": 0, "sub-061_47": 1, "sub-061_48": 1, "sub-061_49": 0, "sub-061_50": 1, "sub-061_51": 0, "sub-061_52": 1, "sub-061_53": 0, "sub-061_54": 0, "sub-061_55": 0, "sub-061_56": 0, "sub-061_57": 0, "sub-061_58": 0, "sub-061_59": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-062.json: -------------------------------------------------------------------------------- 1 | {"sub-062_0": 1, "sub-062_1": 0, "sub-062_2": 0, "sub-062_3": 0, "sub-062_4": 0, "sub-062_5": 1, "sub-062_6": 0, "sub-062_7": 1, "sub-062_8": 0, "sub-062_9": 1, "sub-062_10": 0, "sub-062_11": 1, "sub-062_12": 1, "sub-062_13": 1, "sub-062_14": 0, "sub-062_15": 0, "sub-062_16": 1, "sub-062_17": 1, "sub-062_18": 0, "sub-062_19": 0, "sub-062_20": 0, "sub-062_21": 0, "sub-062_22": 0, "sub-062_23": 1, "sub-062_24": 1, "sub-062_25": 1, "sub-062_26": 0, "sub-062_27": 1, "sub-062_28": 0, "sub-062_29": 0, "sub-062_30": 1, "sub-062_31": 0, "sub-062_32": 0, "sub-062_33": 0, "sub-062_34": 1, "sub-062_35": 1, "sub-062_36": 1, "sub-062_37": 0, "sub-062_38": 1, "sub-062_39": 0, "sub-062_40": 1, "sub-062_41": 1, "sub-062_42": 0, "sub-062_43": 0, "sub-062_44": 1, "sub-062_45": 1, "sub-062_46": 0, "sub-062_47": 1, "sub-062_48": 1, "sub-062_49": 0, "sub-062_50": 1, "sub-062_51": 0, "sub-062_52": 1, "sub-062_53": 0, "sub-062_54": 0, "sub-062_55": 0, "sub-062_56": 0, "sub-062_57": 0, "sub-062_58": 0, "sub-062_59": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-027.json: -------------------------------------------------------------------------------- 1 | {"sub-027_0": 1, "sub-027_1": 0, "sub-027_2": 0, "sub-027_3": 0, "sub-027_4": 0, "sub-027_5": 1, "sub-027_6": 0, "sub-027_7": 1, "sub-027_8": 0, "sub-027_9": 1, "sub-027_10": 0, "sub-027_11": 1, "sub-027_12": 1, "sub-027_13": 1, "sub-027_14": 0, "sub-027_15": 0, "sub-027_16": 1, "sub-027_17": 1, "sub-027_18": 0, "sub-027_19": 0, "sub-027_20": 0, "sub-027_21": 0, "sub-027_22": 0, "sub-027_23": 1, "sub-027_24": 1, "sub-027_25": 1, "sub-027_26": 0, "sub-027_27": 1, "sub-027_28": 0, "sub-027_29": 0, "sub-027_30": 1, "sub-027_31": 0, "sub-027_32": 0, "sub-027_33": 0, "sub-027_34": 1, "sub-027_35": 1, "sub-027_36": 1, "sub-027_37": 0, "sub-027_38": 1, "sub-027_39": 0, "sub-027_40": 1, "sub-027_41": 1, "sub-027_42": 0, "sub-027_43": 0, "sub-027_44": 1, "sub-027_45": 1, "sub-027_46": 0, "sub-027_47": 1, "sub-027_48": 1, "sub-027_49": 0, "sub-027_50": 1, "sub-027_51": 0, "sub-027_52": 1, "sub-027_53": 0, "sub-027_54": 0, "sub-027_55": 0, "sub-027_56": 0, "sub-027_57": 0, "sub-027_58": 0, "sub-027_59": 0, "sub-027_60": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-028.json: -------------------------------------------------------------------------------- 1 | {"sub-028_0": 1, "sub-028_1": 0, "sub-028_2": 0, "sub-028_3": 0, "sub-028_4": 0, "sub-028_5": 1, "sub-028_6": 0, "sub-028_7": 1, "sub-028_8": 0, "sub-028_9": 1, "sub-028_10": 0, "sub-028_11": 1, "sub-028_12": 1, "sub-028_13": 1, "sub-028_14": 0, "sub-028_15": 0, "sub-028_16": 1, "sub-028_17": 1, "sub-028_18": 0, "sub-028_19": 0, "sub-028_20": 0, "sub-028_21": 0, "sub-028_22": 0, "sub-028_23": 1, "sub-028_24": 1, "sub-028_25": 1, "sub-028_26": 0, "sub-028_27": 1, "sub-028_28": 0, "sub-028_29": 0, "sub-028_30": 1, "sub-028_31": 0, "sub-028_32": 0, "sub-028_33": 0, "sub-028_34": 1, "sub-028_35": 1, "sub-028_36": 1, "sub-028_37": 0, "sub-028_38": 1, "sub-028_39": 0, "sub-028_40": 1, "sub-028_41": 1, "sub-028_42": 0, "sub-028_43": 0, "sub-028_44": 1, "sub-028_45": 1, "sub-028_46": 0, "sub-028_47": 1, "sub-028_48": 1, "sub-028_49": 0, "sub-028_50": 1, "sub-028_51": 0, "sub-028_52": 1, "sub-028_53": 0, "sub-028_54": 0, "sub-028_55": 0, "sub-028_56": 0, "sub-028_57": 0, "sub-028_58": 0, "sub-028_59": 0, "sub-028_60": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-029.json: -------------------------------------------------------------------------------- 1 | {"sub-029_0": 1, "sub-029_1": 0, "sub-029_2": 0, "sub-029_3": 0, "sub-029_4": 0, "sub-029_5": 1, "sub-029_6": 0, "sub-029_7": 1, "sub-029_8": 0, "sub-029_9": 1, "sub-029_10": 0, "sub-029_11": 1, "sub-029_12": 1, "sub-029_13": 1, "sub-029_14": 0, "sub-029_15": 0, "sub-029_16": 1, "sub-029_17": 1, "sub-029_18": 0, "sub-029_19": 0, "sub-029_20": 0, "sub-029_21": 0, "sub-029_22": 0, "sub-029_23": 1, "sub-029_24": 1, "sub-029_25": 1, "sub-029_26": 0, "sub-029_27": 1, "sub-029_28": 0, "sub-029_29": 0, "sub-029_30": 1, "sub-029_31": 0, "sub-029_32": 0, "sub-029_33": 0, "sub-029_34": 1, "sub-029_35": 1, "sub-029_36": 1, "sub-029_37": 0, "sub-029_38": 1, "sub-029_39": 0, "sub-029_40": 1, "sub-029_41": 1, "sub-029_42": 0, "sub-029_43": 0, "sub-029_44": 1, "sub-029_45": 1, "sub-029_46": 0, "sub-029_47": 1, "sub-029_48": 1, "sub-029_49": 0, "sub-029_50": 1, "sub-029_51": 0, "sub-029_52": 1, "sub-029_53": 0, "sub-029_54": 0, "sub-029_55": 0, "sub-029_56": 0, "sub-029_57": 0, "sub-029_58": 0, "sub-029_59": 0, "sub-029_60": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-030.json: -------------------------------------------------------------------------------- 1 | {"sub-030_0": 1, "sub-030_1": 0, "sub-030_2": 0, "sub-030_3": 0, "sub-030_4": 0, "sub-030_5": 1, "sub-030_6": 0, "sub-030_7": 1, "sub-030_8": 0, "sub-030_9": 1, "sub-030_10": 0, "sub-030_11": 1, "sub-030_12": 1, "sub-030_13": 1, "sub-030_14": 0, "sub-030_15": 0, "sub-030_16": 1, "sub-030_17": 1, "sub-030_18": 0, "sub-030_19": 0, "sub-030_20": 0, "sub-030_21": 0, "sub-030_22": 0, "sub-030_23": 1, "sub-030_24": 1, "sub-030_25": 1, "sub-030_26": 0, "sub-030_27": 1, "sub-030_28": 0, "sub-030_29": 0, "sub-030_30": 1, "sub-030_31": 0, "sub-030_32": 0, "sub-030_33": 0, "sub-030_34": 1, "sub-030_35": 1, "sub-030_36": 1, "sub-030_37": 0, "sub-030_38": 1, "sub-030_39": 0, "sub-030_40": 1, "sub-030_41": 1, "sub-030_42": 0, "sub-030_43": 0, "sub-030_44": 1, "sub-030_45": 1, "sub-030_46": 0, "sub-030_47": 1, "sub-030_48": 1, "sub-030_49": 0, "sub-030_50": 1, "sub-030_51": 0, "sub-030_52": 1, "sub-030_53": 0, "sub-030_54": 0, "sub-030_55": 0, "sub-030_56": 0, "sub-030_57": 0, "sub-030_58": 0, "sub-030_59": 0, "sub-030_60": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-031.json: -------------------------------------------------------------------------------- 1 | {"sub-031_0": 1, "sub-031_1": 0, "sub-031_2": 0, "sub-031_3": 0, "sub-031_4": 0, "sub-031_5": 1, "sub-031_6": 0, "sub-031_7": 1, "sub-031_8": 0, "sub-031_9": 1, "sub-031_10": 0, "sub-031_11": 1, "sub-031_12": 1, "sub-031_13": 1, "sub-031_14": 0, "sub-031_15": 0, "sub-031_16": 1, "sub-031_17": 1, "sub-031_18": 0, "sub-031_19": 0, "sub-031_20": 0, "sub-031_21": 0, "sub-031_22": 0, "sub-031_23": 1, "sub-031_24": 1, "sub-031_25": 1, "sub-031_26": 0, "sub-031_27": 1, "sub-031_28": 0, "sub-031_29": 0, "sub-031_30": 1, "sub-031_31": 0, "sub-031_32": 0, "sub-031_33": 0, "sub-031_34": 1, "sub-031_35": 1, "sub-031_36": 1, "sub-031_37": 0, "sub-031_38": 1, "sub-031_39": 0, "sub-031_40": 1, "sub-031_41": 1, "sub-031_42": 0, "sub-031_43": 0, "sub-031_44": 1, "sub-031_45": 1, "sub-031_46": 0, "sub-031_47": 1, "sub-031_48": 1, "sub-031_49": 0, "sub-031_50": 1, "sub-031_51": 0, "sub-031_52": 1, "sub-031_53": 0, "sub-031_54": 0, "sub-031_55": 0, "sub-031_56": 0, "sub-031_57": 0, "sub-031_58": 0, "sub-031_59": 0, "sub-031_60": 1} -------------------------------------------------------------------------------- /task2_regression/util/time_lags.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | 3 | 4 | def time_lag_matrix(eeg, envelope=None, num_lags=26): 5 | """Create a time-lag matrix from a 2D numpy array. 6 | 7 | Parameters 8 | ---------- 9 | eeg: numpy.ndarray 10 | 2D numpy array with shape (n_samples, n_channels) 11 | envelope: numpy.ndarray 12 | Envelope of speech 13 | num_lags: int 14 | Number of time lags to use. 15 | 16 | Returns 17 | ------- 18 | np.ndarray 19 | 2D numpy array with shape (n_samples, n_channels* num_lags) 20 | """ 21 | 22 | num_channels = np.shape(eeg)[1] 23 | # Create a time-lag matrix 24 | for i in range(0, num_lags): 25 | # Roll the array to the right 26 | eeg_t = np.roll(eeg, -i, axis=0) 27 | 28 | # zero-pad at the end 29 | if i > 0: 30 | eeg_t[-i:, :] = 0 31 | 32 | if i == 0: 33 | final_array = eeg_t 34 | else: 35 | final_array = np.concatenate((final_array, eeg_t), axis=1) 36 | 37 | # Shuffle the columns such that they are ordered by time lag 38 | final_array = final_array[ 39 | :, 40 | list( 41 | np.concatenate( 42 | [ 43 | np.arange(i, final_array.shape[1], num_channels) 44 | for i in range(num_channels) 45 | ] 46 | ) 47 | ), 48 | ] 49 | 50 | time_len = final_array.shape[0] 51 | # Add bias term 52 | final_array = np.concatenate((final_array, np.ones((time_len, 1))), axis=1) 53 | if envelope is None: 54 | return final_array 55 | else: 56 | return final_array, envelope 57 | -------------------------------------------------------------------------------- /task2_regression/models/linear.py: -------------------------------------------------------------------------------- 1 | """ This module contains linear backward model""" 2 | import tensorflow as tf 3 | 4 | from task2_regression.models.vlaai import pearson_tf 5 | 6 | 7 | @tf.function 8 | def pearson_loss_cut(y_true, y_pred, axis=1): 9 | """Pearson loss function. 10 | 11 | Parameters 12 | ---------- 13 | y_true: tf.Tensor 14 | True values. Shape is (batch_size, time_steps, n_features) 15 | y_pred: tf.Tensor 16 | Predicted values. Shape is (batch_size, time_steps, n_features) 17 | 18 | Returns 19 | ------- 20 | tf.Tensor 21 | Pearson loss. 22 | Shape is (batch_size, 1, n_features) 23 | """ 24 | return -pearson_tf(y_true[:, : tf.shape(y_pred)[1], :], y_pred, axis=axis) 25 | 26 | 27 | @tf.function 28 | def pearson_metric_cut(y_true, y_pred, axis=1): 29 | """Pearson metric function. 30 | 31 | Parameters 32 | ---------- 33 | y_true: tf.Tensor 34 | True values. Shape is (batch_size, time_steps, n_features) 35 | y_pred: tf.Tensor 36 | Predicted values. Shape is (batch_size, time_steps, n_features) 37 | 38 | Returns 39 | ------- 40 | tf.Tensor 41 | Pearson metric. 42 | Shape is (batch_size, 1, n_features) 43 | """ 44 | return pearson_tf(y_true[:, : tf.shape(y_pred)[1], :], y_pred, axis=axis) 45 | 46 | 47 | def simple_linear_model(integration_window=32, nb_filters=1, nb_channels=64): 48 | inp = tf.keras.layers.Input( 49 | ( 50 | None, 51 | nb_channels, 52 | ) 53 | ) 54 | out = tf.keras.layers.Conv1D(nb_filters, integration_window)(inp) 55 | model = tf.keras.models.Model(inputs=[inp], outputs=[out]) 56 | model.compile( 57 | tf.keras.optimizers.Adam(), 58 | loss=pearson_loss_cut, 59 | metrics=[pearson_metric_cut] 60 | ) 61 | return model 62 | -------------------------------------------------------------------------------- /task2_regression/create_data/speech_features.py: -------------------------------------------------------------------------------- 1 | """Run preprocessing on the stimuli.""" 2 | import glob 3 | import json 4 | import logging 5 | import os 6 | 7 | import numpy as np 8 | 9 | from task2_regression.util.envelope import calculate_envelope 10 | 11 | if __name__ == "__main__": 12 | 13 | # Whether to overwrite already existing features 14 | overwrite = False 15 | 16 | # Get the path to the config gile 17 | task_folder = os.path.dirname(os.path.dirname(__file__)) 18 | config_path = os.path.join(task_folder, 'util', 'config.json') 19 | 20 | # Load the config 21 | with open(config_path) as fp: 22 | config = json.load(fp) 23 | 24 | # Run the extraction 25 | logging.info(f'Extracting speech features') 26 | 27 | # Get the downloaded data directory 28 | dataset_folder = config["dataset_folder"] 29 | 30 | source_stimuli_folder = os.path.join(dataset_folder, config["raw_stimuli_folder"]) 31 | # Get the path to save the preprocessed files 32 | output_stimuli_folder = os.path.join(dataset_folder, config["preprocessed_stimuli_folder"]) 33 | 34 | # Create the save directory if it didn't exist already 35 | os.makedirs(output_stimuli_folder, exist_ok=True) 36 | 37 | # Find the stimuli file 38 | speech_files = glob.glob(os.path.join(source_stimuli_folder, "*.npz")) 39 | 40 | # Preprocess the stimuli 41 | nb_speech_files = len(speech_files) 42 | logging.info("Found %u stimuli files", nb_speech_files) 43 | for index, filepath in enumerate(speech_files): 44 | # Loop over each speech file and create envelope and mel spectrogram 45 | # and save them 46 | filename = os.path.basename(filepath) 47 | 48 | print(f"Preprocessing {filepath} ({index + 1}/{nb_speech_files})") 49 | 50 | # Envelope 51 | env_path = os.path.join(output_stimuli_folder, filename.replace(".npz", "_envelope.npy")) 52 | if not os.path.exists(env_path) or overwrite: 53 | envelope = calculate_envelope(filepath) 54 | np.save(env_path, envelope) 55 | else: 56 | print(f"Skipping {env_path} because it already exists") 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /task1_match_mismatch/util/mel_spectrogram.py: -------------------------------------------------------------------------------- 1 | """Code to calculate mel spectrograms.""" 2 | import math 3 | 4 | import librosa 5 | import numpy as np 6 | import scipy.signal 7 | 8 | 9 | def calculate_mel_spectrogram( 10 | audio_path, 11 | target_fs=64, 12 | fmin=-4.2735, 13 | fmax=5444, 14 | nb_filters=28, 15 | hop_length=None, 16 | win_length=None, 17 | ): 18 | """Calculates mel spectrogram of a raw speech file. 19 | 20 | Parameters 21 | --------- 22 | audio_path: str 23 | audio file path 24 | target_fs: int 25 | Sampling frequency of the calculated mel spectrogram 26 | fmin: Union[float, int] 27 | Minimum center frequency used in mel filter matrix 28 | fmax: Union[float, int] 29 | Maximum center frequency used in mel filter matrix 30 | nb_filters: int 31 | Number of mel spectrogram frequency bands 32 | hop_length: int 33 | Hop length (in samples) used for calculation of the spectrogram 34 | win_length: int 35 | Window length (in samples) of each frame 36 | 37 | Returns 38 | ------- 39 | numpy.ndarray 40 | Mel spectrogram 41 | """ 42 | 43 | speech = np.load(audio_path) 44 | audio, fs = speech["audio"], speech["fs"] 45 | if not hop_length: 46 | hop_length = int((1 / target_fs) * fs) # this will downsample the signal to target_fs Hz 47 | if not win_length: 48 | win_length = int(0.025 * fs) # 25 milli seconds 49 | 50 | # Finds the closest power of 2 51 | # that is bigger than win_length 52 | n_fft = int(math.pow(2, math.ceil(math.log2(win_length)))) 53 | 54 | # DC removal 55 | audio = audio - np.mean(audio) 56 | 57 | mel_spectrogram = librosa.feature.melspectrogram(audio, window=scipy.signal.windows.hamming(win_length), 58 | sr=fs, n_fft=n_fft, hop_length=hop_length, 59 | win_length=win_length, fmin=fmin, fmax=fmax, htk=True, 60 | n_mels=nb_filters, center=False, norm=None, power=1.0).T 61 | 62 | mel_spectrogram=np.power(mel_spectrogram, 0.6) 63 | 64 | return mel_spectrogram 65 | -------------------------------------------------------------------------------- /task2_regression/experiments/predict_test.py: -------------------------------------------------------------------------------- 1 | """ 2 | Sample code to generate test labels (reconstructed envelopes) for 3 | the regression task. The requested format for submitting the reconstructed envelopes is 4 | as follows: 5 | for each subject a json file containing a python dictionary in the 6 | format of ==> {'sample_id': reconstructed_envelope, ... }. 7 | """ 8 | 9 | import os 10 | import glob 11 | import json 12 | import numpy as np 13 | from task2_regression.models.linear import simple_linear_model 14 | 15 | 16 | if __name__ == '__main__': 17 | 18 | # Parameters 19 | window_length = 60*64 # one minute 20 | # Root dataset directory containing test set 21 | # Change the path to the downloaded test dataset dir 22 | dataset_dir = 'path/to/test/dataset' 23 | # Path to your pretrained model 24 | pretrained_model = os.path.join(os.path.dirname(__file__), 'results_linear_baseline', 'model.h5') 25 | 26 | # Define and load the pretrained model 27 | model = simple_linear_model() 28 | model.load_weights(pretrained_model) 29 | 30 | test_data = glob.glob(os.path.join(dataset_dir, 'sub*.json')) 31 | for sub_path in test_data: 32 | subject = os.path.basename(sub_path).split('.')[0] 33 | 34 | with open(sub_path, 'r') as f: 35 | sub_dictionary = json.load(f) 36 | 37 | # Get test data from subject dictionary 38 | id_list, sub_data = zip(*sub_dictionary.items()) 39 | 40 | # Normalize data 41 | data_mean = np.expand_dims(np.mean(sub_data, axis=1), axis=1) 42 | data_std = np.expand_dims(np.std(sub_data, axis=1), axis=1) 43 | sub_data = (sub_data - data_mean) / data_std 44 | 45 | predictions = model.predict(sub_data) 46 | # Make predictions json-serializable 47 | predictions = [np.array(value).tolist() for value in np.squeeze(predictions)] 48 | 49 | # Create dictionary from id_list and predictions 50 | sub = dict(zip(id_list, predictions)) 51 | 52 | prediction_dir = os.path.join(os.path.dirname(__file__), 'predictions') 53 | os.makedirs(prediction_dir, exist_ok=True) 54 | with open(os.path.join(prediction_dir, subject + '.json'), 'w') as f: 55 | json.dump(sub, f) 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /task1_match_mismatch/util/envelope.py: -------------------------------------------------------------------------------- 1 | """Code to calculate speech envelopes.""" 2 | import numpy as np 3 | 4 | from brian2 import Hz, kHz 5 | from brian2hears import Sound, erbspace, Gammatone, Filterbank 6 | from scipy import signal 7 | 8 | 9 | def calculate_envelope(audio_path, power_factor=0.6, target_fs=64): 10 | """Calculates gammatone envelope of a raw speech file. 11 | 12 | -- the calculation of the envelope is based on the 13 | following publication: 14 | "Auditory-Inspired Speech Envelope Extraction Methods for Improved EEG-Based 15 | Auditory Attention Detection in a Cocktail Party Scenario" (Biesmans et al., 2016) 16 | 17 | parameters 18 | ---------- 19 | audio_path: str 20 | Audio file path 21 | power_factor: float 22 | Power used in power law relation, which is used to model 23 | relation between perceived loudness and actual speech 24 | intensity 25 | target_fs: int 26 | Sampling frequency of the calculated envelope 27 | 28 | returns 29 | ------- 30 | numpy.ndarray 31 | Envelope of a speech 32 | """ 33 | speech = np.load(audio_path) 34 | audio, fs = speech["audio"], speech["fs"] 35 | del speech 36 | 37 | sound = Sound(audio, samplerate=fs * Hz) 38 | # 28 center frequencies from 50 Hz till 5kHz 39 | center_frequencies = erbspace(50 * Hz, 5 * kHz, 28) 40 | filter_bank = Gammatone(sound, center_frequencies) 41 | envelope_calculation = EnvelopeFromGammatone(filter_bank, power_factor) 42 | output = envelope_calculation.process() 43 | 44 | # Downsample to 64 Hz 45 | envelope = signal.resample_poly(output, target_fs, fs) 46 | return envelope 47 | 48 | 49 | class EnvelopeFromGammatone(Filterbank): 50 | """Converts the output of a GammatoneFilterbank to an envelope.""" 51 | 52 | def __init__(self, source, power_factor): 53 | """Initialize the envelope transformation. 54 | 55 | Parameters 56 | ---------- 57 | source : Gammatone 58 | Gammatone filterbank output to convert to envelope 59 | power_factor : float 60 | The power factor for each sample. 61 | """ 62 | super().__init__(source) 63 | self.power_factor = power_factor 64 | self.nchannels = 1 65 | 66 | def buffer_apply(self, input_): 67 | return np.reshape( 68 | np.sum(np.power(np.abs(input_), self.power_factor), axis=1, keepdims=True), 69 | (np.shape(input_)[0], self.nchannels), 70 | ) 71 | 72 | 73 | -------------------------------------------------------------------------------- /task2_regression/util/envelope.py: -------------------------------------------------------------------------------- 1 | """Code to calculate speech envelopes.""" 2 | import numpy as np 3 | 4 | from brian2 import Hz, kHz 5 | from brian2hears import Sound, erbspace, Gammatone, Filterbank 6 | from scipy import signal 7 | 8 | 9 | def calculate_envelope(audio_path, power_factor=0.6, target_fs=64): 10 | """Calculates gammatone envelope of a raw speech file. 11 | 12 | -- the calculation of the envelope is based on the 13 | following publication: 14 | "Auditory-Inspired Speech Envelope Extraction Methods for Improved EEG-Based 15 | Auditory Attention Detection in a Cocktail Party Scenario" (Biesmans et al., 2016) 16 | 17 | parameters 18 | ---------- 19 | audio_path: str 20 | Audio file path 21 | power_factor: float 22 | Power used in power law relation, which is used to model 23 | relation between perceived loudness and actual speech 24 | intensity 25 | target_fs: int 26 | Sampling frequency of the calculated envelope 27 | 28 | returns 29 | ------- 30 | numpy.ndarray 31 | Envelope of a speech 32 | """ 33 | speech = np.load(audio_path) 34 | audio, fs = speech["audio"], speech["fs"] 35 | del speech 36 | 37 | sound = Sound(audio, samplerate=fs * Hz) 38 | # 28 center frequencies from 50 Hz till 5kHz 39 | center_frequencies = erbspace(50 * Hz, 5 * kHz, 28) 40 | filter_bank = Gammatone(sound, center_frequencies) 41 | envelope_calculation = EnvelopeFromGammatone(filter_bank, power_factor) 42 | output = envelope_calculation.process() 43 | del sound 44 | # Downsample to 64 Hz 45 | envelope = signal.resample_poly(output, target_fs, fs) 46 | return envelope 47 | 48 | 49 | class EnvelopeFromGammatone(Filterbank): 50 | """Converts the output of a GammatoneFilterbank to an envelope.""" 51 | 52 | def __init__(self, source, power_factor): 53 | """Initialize the envelope transformation. 54 | 55 | Parameters 56 | ---------- 57 | source : Gammatone 58 | Gammatone filterbank output to convert to envelope 59 | power_factor : float 60 | The power factor for each sample. 61 | """ 62 | super().__init__(source) 63 | self.power_factor = power_factor 64 | self.nchannels = 1 65 | 66 | def buffer_apply(self, input_): 67 | return np.reshape( 68 | np.sum(np.power(np.abs(input_), self.power_factor), axis=1, keepdims=True), 69 | (np.shape(input_)[0], self.nchannels), 70 | ) 71 | 72 | 73 | -------------------------------------------------------------------------------- /task1_match_mismatch/create_data/speech_features.py: -------------------------------------------------------------------------------- 1 | """Run preprocessing on the stimuli.""" 2 | import glob 3 | import json 4 | import logging 5 | import os 6 | 7 | import numpy as np 8 | 9 | from task1_match_mismatch.util.envelope import calculate_envelope 10 | from task1_match_mismatch.util.mel_spectrogram import calculate_mel_spectrogram 11 | 12 | if __name__ == "__main__": 13 | 14 | # Whether to overwrite already existing features 15 | overwrite = False 16 | 17 | # Get the path to the config file 18 | task_folder = os.path.dirname(os.path.dirname(__file__)) 19 | config_path = os.path.join(task_folder, 'util', 'config.json') 20 | 21 | # Load the config 22 | with open(config_path) as fp: 23 | config = json.load(fp) 24 | 25 | # Run the extraction 26 | logging.info(f'Extracting speech features') 27 | 28 | # Get the downloaded data directory 29 | dataset_folder = config["dataset_folder"] 30 | 31 | source_stimuli_folder = os.path.join(dataset_folder, config["raw_stimuli_folder"]) 32 | # Get the path to save the preprocessed files 33 | output_stimuli_folder = os.path.join(dataset_folder, config["preprocessed_stimuli_folder"]) 34 | 35 | # Create the save directory if it didn't exist already 36 | os.makedirs(output_stimuli_folder, exist_ok=True) 37 | 38 | # Find the stimuli files 39 | speech_files = glob.glob(os.path.join(source_stimuli_folder, "*.npz")) 40 | 41 | # Preprocess the stimuli 42 | nb_speech_files = len(speech_files) 43 | logging.info("Found %u stimuli files", nb_speech_files) 44 | for index, filepath in enumerate(speech_files): 45 | # Loop over each speech file and create envelope and mel spectrogram 46 | # and save them 47 | filename = os.path.basename(filepath) 48 | 49 | print(f"Preprocessing {filepath} ({index + 1}/{nb_speech_files})") 50 | 51 | # Envelope 52 | env_path = os.path.join(output_stimuli_folder, filename.replace(".npz", "_envelope.npy")) 53 | if not os.path.exists(env_path) or overwrite: 54 | envelope = calculate_envelope(filepath) 55 | np.save(env_path, envelope) 56 | else: 57 | print(f"Skipping {env_path} because it already exists") 58 | 59 | # Mel 60 | mel_path = os.path.join(output_stimuli_folder, filename.replace(".npz", "_mel.npy")) 61 | if not os.path.exists(mel_path) or overwrite: 62 | mel = calculate_mel_spectrogram(filepath) 63 | np.save(mel_path, mel) 64 | else: 65 | print(f"Skipping {mel_path} because it already exists") 66 | 67 | 68 | -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-081.json: -------------------------------------------------------------------------------- 1 | {"sub-081_0": 1, "sub-081_1": 0, "sub-081_2": 0, "sub-081_3": 0, "sub-081_4": 0, "sub-081_5": 1, "sub-081_6": 0, "sub-081_7": 1, "sub-081_8": 0, "sub-081_9": 1, "sub-081_10": 0, "sub-081_11": 1, "sub-081_12": 1, "sub-081_13": 1, "sub-081_14": 0, "sub-081_15": 0, "sub-081_16": 1, "sub-081_17": 1, "sub-081_18": 0, "sub-081_19": 0, "sub-081_20": 0, "sub-081_21": 0, "sub-081_22": 0, "sub-081_23": 1, "sub-081_24": 1, "sub-081_25": 1, "sub-081_26": 0, "sub-081_27": 1, "sub-081_28": 0, "sub-081_29": 0, "sub-081_30": 1, "sub-081_31": 0, "sub-081_32": 0, "sub-081_33": 0, "sub-081_34": 1, "sub-081_35": 1, "sub-081_36": 1, "sub-081_37": 0, "sub-081_38": 1, "sub-081_39": 0, "sub-081_40": 1, "sub-081_41": 1, "sub-081_42": 0, "sub-081_43": 0, "sub-081_44": 1, "sub-081_45": 1, "sub-081_46": 0, "sub-081_47": 1, "sub-081_48": 1, "sub-081_49": 0, "sub-081_50": 1, "sub-081_51": 0, "sub-081_52": 1, "sub-081_53": 1, "sub-081_54": 0, "sub-081_55": 0, "sub-081_56": 0, "sub-081_57": 0, "sub-081_58": 1, "sub-081_59": 0, "sub-081_60": 1, "sub-081_61": 0, "sub-081_62": 1, "sub-081_63": 0, "sub-081_64": 1, "sub-081_65": 1, "sub-081_66": 1, "sub-081_67": 0, "sub-081_68": 0, "sub-081_69": 1, "sub-081_70": 1, "sub-081_71": 0, "sub-081_72": 0, "sub-081_73": 0, "sub-081_74": 0, "sub-081_75": 0, "sub-081_76": 1, "sub-081_77": 1, "sub-081_78": 1, "sub-081_79": 0, "sub-081_80": 1, "sub-081_81": 0, "sub-081_82": 0, "sub-081_83": 1, "sub-081_84": 0, "sub-081_85": 0, "sub-081_86": 0, "sub-081_87": 1, "sub-081_88": 1, "sub-081_89": 1, "sub-081_90": 0, "sub-081_91": 1, "sub-081_92": 0, "sub-081_93": 1, "sub-081_94": 1, "sub-081_95": 0, "sub-081_96": 0, "sub-081_97": 1, "sub-081_98": 1, "sub-081_99": 0, "sub-081_100": 1, "sub-081_101": 1, "sub-081_102": 0, "sub-081_103": 1, "sub-081_104": 0, "sub-081_105": 1, "sub-081_106": 0, "sub-081_107": 0, "sub-081_108": 0, "sub-081_109": 0, "sub-081_110": 0, "sub-081_111": 0, "sub-081_112": 0, "sub-081_113": 1, "sub-081_114": 1, "sub-081_115": 0, "sub-081_116": 1, "sub-081_117": 1, "sub-081_118": 1, "sub-081_119": 0, "sub-081_120": 0, "sub-081_121": 1, "sub-081_122": 0, "sub-081_123": 0, "sub-081_124": 1, "sub-081_125": 0, "sub-081_126": 1, "sub-081_127": 0, "sub-081_128": 1, "sub-081_129": 1, "sub-081_130": 1, "sub-081_131": 0, "sub-081_132": 0, "sub-081_133": 1, "sub-081_134": 1, "sub-081_135": 0, "sub-081_136": 1, "sub-081_137": 1, "sub-081_138": 0, "sub-081_139": 0, "sub-081_140": 0, "sub-081_141": 1, "sub-081_142": 0, "sub-081_143": 0, "sub-081_144": 0, "sub-081_145": 1, "sub-081_146": 1, "sub-081_147": 0, "sub-081_148": 0, "sub-081_149": 1, "sub-081_150": 0, "sub-081_151": 1, "sub-081_152": 1, "sub-081_153": 0, "sub-081_154": 0, "sub-081_155": 0, "sub-081_156": 1, "sub-081_157": 0, "sub-081_158": 1, "sub-081_159": 1, "sub-081_160": 0, "sub-081_161": 0, "sub-081_162": 1, "sub-081_163": 1, "sub-081_164": 0, "sub-081_165": 1, "sub-081_166": 0, "sub-081_167": 0, "sub-081_168": 1, "sub-081_169": 1, "sub-081_170": 1, "sub-081_171": 0, "sub-081_172": 0, "sub-081_173": 0, "sub-081_174": 0, "sub-081_175": 1, "sub-081_176": 0, "sub-081_177": 1, "sub-081_178": 0, "sub-081_179": 1, "sub-081_180": 0, "sub-081_181": 1, "sub-081_182": 1, "sub-081_183": 1, "sub-081_184": 0, "sub-081_185": 0, "sub-081_186": 1, "sub-081_187": 1, "sub-081_188": 0, "sub-081_189": 0, "sub-081_190": 0, "sub-081_191": 0, "sub-081_192": 0, "sub-081_193": 1, "sub-081_194": 1, "sub-081_195": 1, "sub-081_196": 0, "sub-081_197": 1, "sub-081_198": 0, "sub-081_199": 0, "sub-081_200": 1, "sub-081_201": 0, "sub-081_202": 0, "sub-081_203": 0, "sub-081_204": 1, "sub-081_205": 1, "sub-081_206": 1, "sub-081_207": 0, "sub-081_208": 1, "sub-081_209": 0, "sub-081_210": 1, "sub-081_211": 1, "sub-081_212": 0, "sub-081_213": 0, "sub-081_214": 1, "sub-081_215": 1, "sub-081_216": 0, "sub-081_217": 1, "sub-081_218": 1, "sub-081_219": 0, "sub-081_220": 1, "sub-081_221": 0, "sub-081_222": 1, "sub-081_223": 0, "sub-081_224": 0, "sub-081_225": 0, "sub-081_226": 0} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # From https://github.com/github/gitignore/blob/main/Python.gitignore 2 | # Byte-compiled / optimized / DLL files 3 | __pycache__/ 4 | *.py[cod] 5 | *$py.class 6 | 7 | # C extensions 8 | *.so 9 | 10 | # Distribution / packaging 11 | .Python 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | cover/ 54 | 55 | # Translations 56 | *.mo 57 | *.pot 58 | 59 | # Django stuff: 60 | *.log 61 | local_settings.py 62 | db.sqlite3 63 | db.sqlite3-journal 64 | 65 | # Flask stuff: 66 | instance/ 67 | .webassets-cache 68 | 69 | # Scrapy stuff: 70 | .scrapy 71 | 72 | # Sphinx documentation 73 | docs/_build/ 74 | 75 | # PyBuilder 76 | .pybuilder/ 77 | target/ 78 | 79 | # Jupyter Notebook 80 | .ipynb_checkpoints 81 | 82 | # IPython 83 | profile_default/ 84 | ipython_config.py 85 | 86 | # pyenv 87 | # For a library or package, you might want to ignore these files since the code is 88 | # intended to run in multiple environments; otherwise, check them in: 89 | # .python-version 90 | 91 | # pipenv 92 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 93 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 94 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 95 | # install all needed dependencies. 96 | #Pipfile.lock 97 | 98 | # poetry 99 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 100 | # This is especially recommended for binary packages to ensure reproducibility, and is more 101 | # commonly ignored for libraries. 102 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 103 | #poetry.lock 104 | 105 | # pdm 106 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 107 | #pdm.lock 108 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 109 | # in version control. 110 | # https://pdm.fming.dev/#use-with-ide 111 | .pdm.toml 112 | 113 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 114 | __pypackages__/ 115 | 116 | # Celery stuff 117 | celerybeat-schedule 118 | celerybeat.pid 119 | 120 | # SageMath parsed files 121 | *.sage.py 122 | 123 | # Environments 124 | .env 125 | .venv 126 | env/ 127 | venv/ 128 | ENV/ 129 | env.bak/ 130 | venv.bak/ 131 | 132 | # Spyder project settings 133 | .spyderproject 134 | .spyproject 135 | 136 | # Rope project settings 137 | .ropeproject 138 | 139 | # mkdocs documentation 140 | /site 141 | 142 | # mypy 143 | .mypy_cache/ 144 | .dmypy.json 145 | dmypy.json 146 | 147 | # Pyre type checker 148 | .pyre/ 149 | 150 | # pytype static type analyzer 151 | .pytype/ 152 | 153 | # Cython debug symbols 154 | cython_debug/ 155 | 156 | # PyCharm 157 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 158 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 159 | # and can be added to the global gitignore or merged into this file. For a more nuclear 160 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 161 | .idea 162 | 163 | # Specific for tis project 164 | task*/experiments/results*/ 165 | -------------------------------------------------------------------------------- /task1_match_mismatch/experiments/predict_test.py: -------------------------------------------------------------------------------- 1 | """ 2 | Sample code to generate labels for test dataset of 3 | match-mismatch task. The requested format for submitting the labels is 4 | as follows: 5 | for each subject a json file containing a python dictionary in the 6 | format of ==> {'sample_id': prediction, ... }. 7 | 8 | """ 9 | 10 | import os 11 | import glob 12 | import json 13 | import numpy as np 14 | from task1_match_mismatch.util import envelope 15 | from task1_match_mismatch.models.dilated_convolutional_model import dilation_model 16 | 17 | 18 | def create_test_samples(eeg_path, envelope_dir): 19 | with open(eeg_path, 'r') as f: 20 | sub = json.load(f) 21 | eeg_data = [] 22 | spch1_data = [] 23 | spch2_data = [] 24 | id_list = [] 25 | for key, sample in sub.items(): 26 | eeg_data.append(sample[0]) 27 | 28 | spch1_path = os.path.join(envelope_dir, sample[1]) 29 | spch2_path = os.path.join(envelope_dir, sample[2]) 30 | envelope1 = np.load(spch1_path) 31 | env1 = envelope1['envelope'] 32 | envelope2 = np.load(spch2_path) 33 | env2 = envelope2['envelope'] 34 | 35 | spch1_data.append(env1) 36 | spch2_data.append(env2) 37 | id_list.append(key) 38 | eeg = np.array(eeg_data) 39 | spch1 = np.array(spch1_data) 40 | spch2 = np.array(spch2_data) 41 | return (eeg, spch1, spch2), id_list 42 | 43 | 44 | def get_label(pred): 45 | if pred >= 0.5: 46 | label = 1 47 | else: 48 | label = 0 49 | return label 50 | 51 | if __name__ == '__main__': 52 | 53 | window_length = 3*64 54 | 55 | # Root dataset directory containing test set 56 | # Change the path to the downloaded test dataset dir 57 | dataset_dir = 'path/to/test/dataset' 58 | 59 | # Path to your pretrained model 60 | pretrained_model = os.path.join(os.path.dirname(__file__), 'results_dilated_convolutional_model', 'model.h5') 61 | 62 | # Calculate envelope of the speech files (only if the envelope directory does not exist) 63 | stimuli_dir = os.path.join(dataset_dir, 'stimuli_segments') 64 | envelope_dir = os.path.join(dataset_dir, 'envelope_segments') 65 | # Create envelope of segments if it has not already been created 66 | if not os.path.isdir(envelope_dir): 67 | os.makedirs(envelope_dir, exist_ok=True) 68 | for stimulus_seg in glob.glob(os.path.join(stimuli_dir, '*.npz')): 69 | base_name = os.path.basename(stimulus_seg).split('.')[0] 70 | if not os.path.exists(os.path.join(envelope_dir, base_name + '.npz')): 71 | env = envelope.calculate_envelope(stimulus_seg) 72 | target_path = os.path.join(envelope_dir, base_name + '.npz') 73 | np.savez(target_path, envelope=env) 74 | 75 | 76 | # Define and load the pretrained model 77 | model = dilation_model(time_window=window_length) 78 | model.load_weights(pretrained_model) 79 | 80 | test_data = glob.glob(os.path.join(dataset_dir, 'sub*.json')) 81 | for sub_path in test_data: 82 | subject = os.path.basename(sub_path).split('.')[0] 83 | 84 | sub_dataset, id_list = create_test_samples(sub_path, os.path.join(dataset_dir, 'envelope_segments')) 85 | # Normalize data 86 | subject_data = [] 87 | for item in sub_dataset: 88 | item_mean = np.expand_dims(np.mean(item, axis=1), axis=1) 89 | item_std = np.expand_dims(np.std(item, axis=1), axis=1) 90 | subject_data.append((item - item_mean) / item_std) 91 | sub_dataset = tuple(subject_data) 92 | 93 | predictions = model.predict(sub_dataset) 94 | predictions = list(np.squeeze(predictions)) 95 | predictions = map(get_label, predictions) 96 | sub = dict(zip(id_list, predictions)) 97 | 98 | prediction_dir = os.path.join(os.path.dirname(__file__), 'predictions') 99 | os.makedirs(prediction_dir, exist_ok=True) 100 | with open(os.path.join(prediction_dir, subject + '.json'), 'w') as f: 101 | json.dump(sub, f) 102 | 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /task1_match_mismatch/models/dilated_convolutional_model.py: -------------------------------------------------------------------------------- 1 | """Default dilation model.""" 2 | import tensorflow as tf 3 | 4 | 5 | def dilation_model( 6 | time_window=None, 7 | eeg_input_dimension=64, 8 | env_input_dimension=1, 9 | layers=3, 10 | kernel_size=3, 11 | spatial_filters=8, 12 | dilation_filters=16, 13 | activation="relu", 14 | compile=True, 15 | inputs=tuple(), 16 | ): 17 | """Convolutional dilation model. 18 | 19 | Code was taken and adapted from 20 | https://github.com/exporl/eeg-matching-eusipco2020 21 | 22 | Parameters 23 | ---------- 24 | time_window : int or None 25 | Segment length. If None, the model will accept every time window input 26 | length. 27 | eeg_input_dimension : int 28 | number of channels of the EEG 29 | env_input_dimension : int 30 | dimemsion of the stimulus representation. 31 | if stimulus == envelope, env_input_dimension =1 32 | if stimulus == mel, env_input_dimension =28 33 | layers : int 34 | Depth of the network/Number of layers 35 | kernel_size : int 36 | Size of the kernel for the dilation convolutions 37 | spatial_filters : int 38 | Number of parallel filters to use in the spatial layer 39 | dilation_filters : int 40 | Number of parallel filters to use in the dilation layers 41 | activation : str or list or tuple 42 | Name of the non-linearity to apply after the dilation layers 43 | or list/tuple of different non-linearities 44 | compile : bool 45 | If model should be compiled 46 | inputs : tuple 47 | Alternative inputs 48 | 49 | Returns 50 | ------- 51 | tf.Model 52 | The dilation model 53 | 54 | 55 | References 56 | ---------- 57 | Accou, B., Jalilpour Monesi, M., Montoya, J., Van hamme, H. & Francart, T. 58 | Modeling the relationship between acoustic stimulus and EEG with a dilated 59 | convolutional neural network. In 2020 28th European Signal Processing 60 | Conference (EUSIPCO), 1175–1179, DOI: 10.23919/Eusipco47968.2020.9287417 61 | (2021). ISSN: 2076-1465. 62 | 63 | Accou, B., Monesi, M. J., hamme, H. V. & Francart, T. 64 | Predicting speech intelligibility from EEG in a non-linear classification 65 | paradigm. J. Neural Eng. 18, 066008, DOI: 10.1088/1741-2552/ac33e9 (2021). 66 | Publisher: IOP Publishing 67 | """ 68 | # If different inputs are required 69 | if len(inputs) == 3: 70 | eeg, env1, env2 = inputs[0], inputs[1], inputs[2] 71 | else: 72 | eeg = tf.keras.layers.Input(shape=[time_window, eeg_input_dimension]) 73 | env1 = tf.keras.layers.Input(shape=[time_window, env_input_dimension]) 74 | env2 = tf.keras.layers.Input(shape=[time_window, env_input_dimension]) 75 | 76 | # Activations to apply 77 | if isinstance(activation, str): 78 | activations = [activation] * layers 79 | else: 80 | activations = activation 81 | 82 | env_proj_1 = env1 83 | env_proj_2 = env2 84 | # Spatial convolution 85 | eeg_proj_1 = tf.keras.layers.Conv1D(spatial_filters, kernel_size=1)(eeg) 86 | 87 | # Construct dilation layers 88 | for layer_index in range(layers): 89 | # dilation on EEG 90 | eeg_proj_1 = tf.keras.layers.Conv1D( 91 | dilation_filters, 92 | kernel_size=kernel_size, 93 | dilation_rate=kernel_size**layer_index, 94 | strides=1, 95 | activation=activations[layer_index], 96 | )(eeg_proj_1) 97 | 98 | # Dilation on envelope data, share weights 99 | env_proj_layer = tf.keras.layers.Conv1D( 100 | dilation_filters, 101 | kernel_size=kernel_size, 102 | dilation_rate=kernel_size**layer_index, 103 | strides=1, 104 | activation=activations[layer_index], 105 | ) 106 | env_proj_1 = env_proj_layer(env_proj_1) 107 | env_proj_2 = env_proj_layer(env_proj_2) 108 | 109 | # Comparison 110 | cos1 = tf.keras.layers.Dot(1, normalize=True)([eeg_proj_1, env_proj_1]) 111 | cos2 = tf.keras.layers.Dot(1, normalize=True)([eeg_proj_1, env_proj_2]) 112 | 113 | # Classification 114 | out = tf.keras.layers.Dense(1, activation="sigmoid")( 115 | tf.keras.layers.Flatten()(tf.keras.layers.Concatenate()([cos1, cos2])) 116 | ) 117 | 118 | model = tf.keras.Model(inputs=[eeg, env1, env2], outputs=[out]) 119 | 120 | if compile: 121 | model.compile( 122 | optimizer=tf.keras.optimizers.Adam(), 123 | metrics=["acc"], 124 | loss=["binary_crossentropy"], 125 | ) 126 | print(model.summary()) 127 | return model 128 | -------------------------------------------------------------------------------- /task2_regression/create_data/split_and_normalize.py: -------------------------------------------------------------------------------- 1 | """Split data in sets and normalize (per recording).""" 2 | import glob 3 | import json 4 | import os 5 | import pickle 6 | 7 | 8 | import numpy as np 9 | 10 | 11 | if __name__ == "__main__": 12 | 13 | # Arguments for splitting and normalizing 14 | speech_features = ['envelope'] 15 | splits = [80, 10, 10] 16 | split_names = ['train', 'val', 'test'] 17 | overwrite = True 18 | 19 | # Calculate the split fraction 20 | split_fractions = [x/sum(splits) for x in splits] 21 | 22 | # Get the path to the config gile 23 | task_folder = os.path.dirname(os.path.dirname(__file__)) 24 | config_path = os.path.join(task_folder, 'util', 'config.json') 25 | 26 | # Load the config 27 | with open(config_path) as fp: 28 | config = json.load(fp) 29 | 30 | # Construct the necessary paths 31 | processed_eeg_folder = os.path.join(config["dataset_folder"], config["preprocessed_eeg_folder"]) 32 | processed_stimuli_folder = os.path.join(config["dataset_folder"], config["preprocessed_stimuli_folder"]) 33 | split_data_folder = os.path.join(config["dataset_folder"], config["split_folder"]) 34 | 35 | # Create the output folder 36 | os.makedirs(split_data_folder, exist_ok=True) 37 | 38 | # FInd all subjects 39 | all_subjects = glob.glob(os.path.join(processed_eeg_folder, "sub*")) 40 | nb_subjects = len(all_subjects) 41 | print(f"Found {nb_subjects} subjects to split/normalize") 42 | 43 | # Loop over subjects 44 | for subject_index, subject_path in enumerate(all_subjects): 45 | subject = os.path.basename(subject_path) 46 | print(f"Starting with subject {subject} ({subject_index + 1}/{nb_subjects})...") 47 | # Find all recordings 48 | all_recordings = glob.glob(os.path.join(subject_path, "*", "sub*.pkl")) 49 | print(f"\tFound {len(all_recordings)} recordings for subject {subject}.") 50 | # Loop over recordings 51 | for recording_index, recording in enumerate(all_recordings): 52 | print(f"\tStarting with recording {recording} ({recording_index + 1}/{len(all_recordings)})...") 53 | 54 | # Load EEG from disk 55 | print(f"\t\tLoading EEG for {recording}") 56 | with open(recording, "rb") as fp: 57 | data = pickle.load(fp) 58 | 59 | # Retrieve EEG data and pointer to the stimulus 60 | eeg, stimulus_filename = data["eeg"], data["stimulus"] 61 | shortest_length = eeg.shape[0] 62 | stimulus_filename_parts = stimulus_filename.split(".") 63 | 64 | # Create mapping between feature name and feature data 65 | all_data_for_recording = {"eeg": eeg} 66 | 67 | # Find corresponding stimuli for the EEG recording 68 | for feature_name in speech_features: 69 | # Load feature from disk 70 | print(f"\t\tLoading {feature_name} for recording {recording} ") 71 | stimulus_feature_path = os.path.join( 72 | processed_stimuli_folder, 73 | stimulus_filename_parts[0] + "_" + feature_name + ".npy", 74 | ) 75 | feature = np.load(stimulus_feature_path) 76 | # Calculate the shortest length 77 | shortest_length = min(feature.shape[0], shortest_length) 78 | # Update all_data_for_recording 79 | all_data_for_recording[feature_name] = feature 80 | 81 | # Do the actual splitting 82 | print(f"\t\tSplitting/normalizing recording {recording}...") 83 | for feature_name, feature in all_data_for_recording.items(): 84 | start_index = 0 85 | feature_mean = None 86 | feature_std = None 87 | 88 | for split_name, split_fraction in zip(split_names, split_fractions): 89 | end_index = start_index + int(shortest_length * split_fraction) 90 | 91 | # Cut the feature to the shortest length 92 | cut_feature = feature[start_index:end_index, ...] 93 | 94 | # Normalize the feature 95 | if feature_mean is None: 96 | feature_mean = np.mean(cut_feature, axis=0) 97 | feature_std = np.std(cut_feature, axis=0) 98 | norm_feature = (cut_feature - feature_mean)/feature_std 99 | 100 | # Save the feature 101 | save_filename = f"{split_name}_-_{subject}_-_{stimulus_filename_parts[0]}_-_{feature_name}.npy" 102 | save_path = os.path.join(split_data_folder, save_filename) 103 | if not os.path.exists(save_path) or overwrite: 104 | np.save(save_path, cut_feature) 105 | else: 106 | print(f"\t\tSkipping {save_filename} because it already exists") 107 | start_index = end_index 108 | 109 | -------------------------------------------------------------------------------- /task1_match_mismatch/create_data/split_and_normalize.py: -------------------------------------------------------------------------------- 1 | """Split data in sets and normalize (per recording).""" 2 | import glob 3 | import json 4 | import os 5 | import pickle 6 | 7 | 8 | import numpy as np 9 | 10 | 11 | if __name__ == "__main__": 12 | 13 | # Arguments for splitting and normalizing 14 | speech_features = ['envelope', 'mel'] 15 | splits = [80, 10, 10] 16 | split_names = ['train', 'val', 'test'] 17 | overwrite = False 18 | 19 | # Calculate the split fraction 20 | split_fractions = [x/sum(splits) for x in splits] 21 | 22 | # Get the path to the config file 23 | task_folder = os.path.dirname(os.path.dirname(__file__)) 24 | config_path = os.path.join(task_folder, 'util', 'config.json') 25 | 26 | # Load the config 27 | with open(config_path) as fp: 28 | config = json.load(fp) 29 | 30 | # Construct the necessary paths 31 | processed_eeg_folder = os.path.join(config["dataset_folder"], config["preprocessed_eeg_folder"]) 32 | processed_stimuli_folder = os.path.join(config["dataset_folder"], config["preprocessed_stimuli_folder"]) 33 | split_data_folder = os.path.join(config["dataset_folder"], config["split_folder"]) 34 | 35 | # Create the output folder 36 | os.makedirs(split_data_folder, exist_ok=True) 37 | 38 | # Find all subjects 39 | all_subjects = glob.glob(os.path.join(processed_eeg_folder, "sub*")) 40 | nb_subjects = len(all_subjects) 41 | print(f"Found {nb_subjects} subjects to split/normalize") 42 | 43 | # Loop over subjects 44 | for subject_index, subject_path in enumerate(all_subjects): 45 | subject = os.path.basename(subject_path) 46 | print(f"Starting with subject {subject} ({subject_index + 1}/{nb_subjects})...") 47 | # Find all recordings 48 | all_recordings = glob.glob(os.path.join(subject_path, "*", "sub*.pkl")) 49 | print(f"\tFound {len(all_recordings)} recordings for subject {subject}.") 50 | # Loop over recordings 51 | for recording_index, recording in enumerate(all_recordings): 52 | print(f"\tStarting with recording {recording} ({recording_index + 1}/{len(all_recordings)})...") 53 | 54 | # Load EEG from disk 55 | print(f"\t\tLoading EEG for {recording}") 56 | with open(recording, "rb") as fp: 57 | data = pickle.load(fp) 58 | 59 | # Retrieve EEG data and pointer to the stimulus 60 | eeg, stimulus_filename = data["eeg"], data["stimulus"] 61 | shortest_length = eeg.shape[0] 62 | stimulus_filename_parts = stimulus_filename.split(".") 63 | 64 | # Create mapping between feature name and feature data 65 | all_data_for_recording = {"eeg": eeg} 66 | 67 | # Find corresponding stimuli for the EEG recording 68 | for feature_name in speech_features: 69 | # Load feature from disk 70 | print(f"\t\tLoading {feature_name} for recording {recording} ") 71 | stimulus_feature_path = os.path.join( 72 | processed_stimuli_folder, 73 | stimulus_filename_parts[0] + "_" + feature_name + ".npy", 74 | ) 75 | feature = np.load(stimulus_feature_path) 76 | # Calculate the shortest length 77 | shortest_length = min(feature.shape[0], shortest_length) 78 | # Update all_data_for_recording 79 | all_data_for_recording[feature_name] = feature 80 | 81 | # Do the actual splitting 82 | print(f"\t\tSplitting/normalizing recording {recording}...") 83 | for feature_name, feature in all_data_for_recording.items(): 84 | start_index = 0 85 | feature_mean = None 86 | feature_std = None 87 | 88 | for split_name, split_fraction in zip(split_names, split_fractions): 89 | end_index = start_index + int(shortest_length * split_fraction) 90 | 91 | # Cut the feature to the shortest length 92 | cut_feature = feature[start_index:end_index, ...] 93 | 94 | # Normalize the feature 95 | if feature_mean is None: 96 | feature_mean = np.mean(cut_feature, axis=0) 97 | feature_std = np.std(cut_feature, axis=0) 98 | norm_feature = (cut_feature - feature_mean)/feature_std 99 | 100 | # Save the feature 101 | save_filename = f"{split_name}_-_{subject}_-_{stimulus_filename_parts[0]}_-_{feature_name}.npy" 102 | save_path = os.path.join(split_data_folder, save_filename) 103 | if not os.path.exists(save_path) or overwrite: 104 | np.save(save_path, cut_feature) 105 | else: 106 | print(f"\t\tSkipping {save_filename} because it already exists") 107 | start_index = end_index 108 | 109 | -------------------------------------------------------------------------------- /task2_regression/experiments/linear_baseline.py: -------------------------------------------------------------------------------- 1 | """Example experiment for a linear baseline method.""" 2 | import glob 3 | import json 4 | import logging 5 | import os 6 | import tensorflow as tf 7 | 8 | from task2_regression.models.linear import simple_linear_model 9 | from task2_regression.util.dataset_generator import RegressionDataGenerator, create_tf_dataset 10 | 11 | 12 | def evaluate_model(model, test_dict): 13 | """Evaluate a model. 14 | 15 | Parameters 16 | ---------- 17 | model: tf.keras.Model 18 | Model to evaluate. 19 | test_dict: dict 20 | Mapping between a subject and a tf.data.Dataset containing the test 21 | set for the subject. 22 | 23 | Returns 24 | ------- 25 | dict 26 | Mapping between a subject and the loss/evaluation score on the test set 27 | """ 28 | evaluation = {} 29 | for subject, ds_test in test_dict.items(): 30 | logging.info(f"Scores for subject {subject}:") 31 | results = model.evaluate(ds_test, verbose=2) 32 | metrics = model.metrics_names 33 | evaluation[subject] = dict(zip(metrics, results)) 34 | return evaluation 35 | 36 | 37 | if __name__ == "__main__": 38 | # Parameters 39 | # Length of the decision window 40 | window_length = 10 * 64 # 10 seconds 41 | # Hop length between two consecutive decision windows 42 | hop_length = 64 43 | epochs = 100 44 | patience = 5 45 | batch_size = 64 46 | only_evaluate = False 47 | training_log_filename = "training_log.csv" 48 | results_filename = 'eval.json' 49 | 50 | 51 | # Get the path to the config gile 52 | experiments_folder = os.path.dirname(__file__) 53 | task_folder = os.path.dirname(experiments_folder) 54 | config_path = os.path.join(task_folder, 'util', 'config.json') 55 | 56 | # Load the config 57 | with open(config_path) as fp: 58 | config = json.load(fp) 59 | 60 | # Provide the path of the dataset 61 | # which is split already to train, val, test 62 | 63 | data_folder = os.path.join(config["dataset_folder"], config["split_folder"]) 64 | stimulus_features = ["envelope"] 65 | features = ["eeg"] + stimulus_features 66 | 67 | # Create a directory to store (intermediate) results 68 | results_folder = os.path.join(experiments_folder, "results_linear_baseline") 69 | os.makedirs(results_folder, exist_ok=True) 70 | 71 | # create a simple linear model 72 | model = simple_linear_model() 73 | model.summary() 74 | model_path = os.path.join(results_folder, "model.h5") 75 | 76 | if only_evaluate: 77 | model = tf.keras.models.load_model(model_path) 78 | else: 79 | 80 | train_files = [x for x in glob.glob(os.path.join(data_folder, "train_-_*")) if os.path.basename(x).split("_-_")[-1].split(".")[0] in features] 81 | # Create list of numpy array files 82 | train_generator = RegressionDataGenerator(train_files, window_length) 83 | dataset_train = create_tf_dataset(train_generator, window_length, None, hop_length, batch_size) 84 | 85 | # Create the generator for the validation set 86 | val_files = [x for x in glob.glob(os.path.join(data_folder, "val_-_*")) if os.path.basename(x).split("_-_")[-1].split(".")[0] in features] 87 | val_generator = RegressionDataGenerator(val_files, window_length) 88 | dataset_val = create_tf_dataset(val_generator, window_length, None, hop_length, batch_size) 89 | 90 | # Train the model 91 | model.fit( 92 | dataset_train, 93 | epochs=epochs, 94 | validation_data=dataset_val, 95 | callbacks=[ 96 | tf.keras.callbacks.ModelCheckpoint(model_path, save_best_only=True), 97 | tf.keras.callbacks.CSVLogger(os.path.join(results_folder, training_log_filename)), 98 | tf.keras.callbacks.EarlyStopping(patience=patience, restore_best_weights=True), 99 | ], 100 | ) 101 | 102 | # Evaluate the model on test set 103 | # Create a dataset generator for each test subject 104 | test_files = [x for x in glob.glob(os.path.join(data_folder, "test_-_*")) if os.path.basename(x).split("_-_")[-1].split(".")[0] in features] 105 | # Get all different subjects from the test set 106 | subjects = list(set([os.path.basename(x).split("_-_")[1] for x in test_files])) 107 | datasets_test = {} 108 | # Create a generator for each subject 109 | for sub in subjects: 110 | files_test_sub = [f for f in test_files if sub in os.path.basename(f)] 111 | test_generator = RegressionDataGenerator(files_test_sub, window_length) 112 | datasets_test[sub] = create_tf_dataset(test_generator, window_length, None, hop_length, 1) 113 | 114 | # Evaluate the model 115 | evaluation = evaluate_model(model, datasets_test) 116 | 117 | # We can save our results in a json encoded file 118 | results_path = os.path.join(results_folder, results_filename) 119 | with open(results_path, "w") as fp: 120 | json.dump(evaluation, fp) 121 | logging.info(f"Results saved at {results_path}") 122 | -------------------------------------------------------------------------------- /task2_regression/experiments/vlaai.py: -------------------------------------------------------------------------------- 1 | """Example experiment for the VLAAI model.""" 2 | import glob 3 | import json 4 | import logging 5 | import os 6 | import tensorflow as tf 7 | 8 | from task2_regression.models.vlaai import vlaai, pearson_loss, pearson_metric 9 | from task2_regression.util.dataset_generator import RegressionDataGenerator, create_tf_dataset 10 | 11 | 12 | def evaluate_model(model, test_dict): 13 | """Evaluate a model. 14 | 15 | Parameters 16 | ---------- 17 | model: tf.keras.Model 18 | Model to evaluate. 19 | test_dict: dict 20 | Mapping between a subject and a tf.data.Dataset containing the test 21 | set for the subject. 22 | 23 | Returns 24 | ------- 25 | dict 26 | Mapping between a subject and the loss/evaluation score on the test set 27 | """ 28 | evaluation = {} 29 | for subject, ds_test in test_dict.items(): 30 | logging.info(f"Scores for subject {subject}:") 31 | results = model.evaluate(ds_test, verbose=2) 32 | metrics = model.metrics_names 33 | evaluation[subject] = dict(zip(metrics, results)) 34 | return evaluation 35 | 36 | 37 | if __name__ == "__main__": 38 | # Parameters 39 | # Length of the decision window 40 | window_length = 10 * 64 # 10 seconds 41 | # Hop length between two consecutive decision windows 42 | hop_length = 64 43 | epochs = 100 44 | patience = 5 45 | batch_size = 64 46 | only_evaluate = False 47 | training_log_filename = "training_log.csv" 48 | results_filename = 'eval.json' 49 | 50 | 51 | # Get the path to the config gile 52 | experiments_folder = os.path.dirname(__file__) 53 | task_folder = os.path.dirname(experiments_folder) 54 | config_path = os.path.join(task_folder, 'util', 'config.json') 55 | 56 | # Load the config 57 | with open(config_path) as fp: 58 | config = json.load(fp) 59 | 60 | # Provide the path of the dataset 61 | # which is split already to train, val, test 62 | 63 | data_folder = os.path.join(config["dataset_folder"], config["split_folder"]) 64 | stimulus_features = ["envelope"] 65 | features = ["eeg"] + stimulus_features 66 | 67 | # Create a directory to store (intermediate) results 68 | results_folder = os.path.join(experiments_folder, "results_vlaai") 69 | os.makedirs(results_folder, exist_ok=True) 70 | 71 | # create the model 72 | model = vlaai() 73 | model.compile(tf.keras.optimizers.Adam(), loss=pearson_loss, metrics=[pearson_metric]) 74 | model_path = os.path.join(results_folder, "model.h5") 75 | 76 | if only_evaluate: 77 | model = tf.keras.models.load_model(model_path) 78 | else: 79 | 80 | train_files = [x for x in glob.glob(os.path.join(data_folder, "train_-_*")) if os.path.basename(x).split("_-_")[-1].split(".")[0] in features] 81 | # Create list of numpy array files 82 | train_generator = RegressionDataGenerator(train_files, window_length) 83 | dataset_train = create_tf_dataset(train_generator, window_length, None, hop_length, batch_size) 84 | 85 | # Create the generator for the validation set 86 | val_files = [x for x in glob.glob(os.path.join(data_folder, "val_-_*")) if os.path.basename(x).split("_-_")[-1].split(".")[0] in features] 87 | val_generator = RegressionDataGenerator(val_files, window_length) 88 | dataset_val = create_tf_dataset(val_generator, window_length, None, hop_length, batch_size) 89 | 90 | # Train the model 91 | model.fit( 92 | dataset_train, 93 | epochs=epochs, 94 | validation_data=dataset_val, 95 | callbacks=[ 96 | tf.keras.callbacks.ModelCheckpoint(model_path, save_best_only=True), 97 | tf.keras.callbacks.CSVLogger(os.path.join(results_folder, training_log_filename)), 98 | tf.keras.callbacks.EarlyStopping(patience=patience, restore_best_weights=True), 99 | ], 100 | ) 101 | 102 | # Evaluate the model on test set 103 | # Create a dataset generator for each test subject 104 | test_files = [x for x in glob.glob(os.path.join(data_folder, "test_-_*")) if os.path.basename(x).split("_-_")[-1].split(".")[0] in features] 105 | # Get all different subjects from the test set 106 | subjects = list(set([os.path.basename(x).split("_-_")[1] for x in test_files])) 107 | datasets_test = {} 108 | # Create a generator for each subject 109 | for sub in subjects: 110 | files_test_sub = [f for f in test_files if sub in os.path.basename(f)] 111 | test_generator = RegressionDataGenerator(files_test_sub, window_length) 112 | datasets_test[sub] = create_tf_dataset(test_generator, window_length, None, hop_length, 1) 113 | 114 | # Evaluate the model 115 | evaluation = evaluate_model(model, datasets_test) 116 | 117 | # We can save our results in a json encoded file 118 | results_path = os.path.join(results_folder, results_filename) 119 | with open(results_path, "w") as fp: 120 | json.dump(evaluation, fp) 121 | logging.info(f"Results saved at {results_path}") 122 | -------------------------------------------------------------------------------- /test_scripts/score_match_mismatch.py: -------------------------------------------------------------------------------- 1 | import os 2 | import glob 3 | 4 | import pickle 5 | import json 6 | import numpy as np 7 | from zipfile import ZipFile 8 | 9 | 10 | path_labels_match_mismatch = os.path.join(os.path.dirname(__file__), 'labels_match_mismatch') 11 | path_save_scores = os.path.join(os.path.dirname(__file__), 'results_task_match_mismatch') 12 | predicted_results_folder = "PATH_TO_YOUR_RESULTS_FOLDER" 13 | 14 | subjects_training = ['sub-002', 'sub-003', 'sub-004', 'sub-005', 'sub-006', 'sub-007', 'sub-008', 'sub-009', 'sub-010', 'sub-011', 'sub-012', 'sub-013', 'sub-014', 'sub-015', 'sub-016', 'sub-017', 'sub-018', 'sub-019', 'sub-020', 'sub-021', 'sub-022', 'sub-023', 'sub-024', 'sub-025', 'sub-026', 'sub-027', 'sub-028', 'sub-029', 'sub-030', 'sub-031', 'sub-032', 'sub-033', 'sub-034', 'sub-035', 'sub-036', 'sub-037', 'sub-038', 'sub-039', 'sub-040', 'sub-041', 'sub-042', 'sub-043', 'sub-044', 'sub-045', 'sub-046', 'sub-047', 'sub-048', 'sub-049', 'sub-050', 'sub-051', 'sub-052', 'sub-053', 'sub-054', 'sub-055', 'sub-056', 'sub-057', 'sub-058', 'sub-059', 'sub-060', 'sub-061', 'sub-062', 'sub-063', 'sub-064', 'sub-065', 'sub-066', 'sub-067', 'sub-068', 'sub-069', 'sub-070', 'sub-071'] 15 | subjects_heldout = ['sub-072', 'sub-073', 'sub-074', 'sub-075', 'sub-076', 'sub-077', 'sub-078', 'sub-079', 'sub-080', 'sub-083', 'sub-081', 'sub-082', 'sub-084', 'sub-085'] 16 | 17 | 18 | def score_task(predicted_labels): 19 | # create dictionary for final score, per subject 20 | score_per_subject = {} 21 | # load the true labels subject per subject 22 | for file in glob.glob(os.path.join(path_labels_match_mismatch, '*.json')): 23 | with open(file, 'r') as f: 24 | labels = json.load(f) 25 | subject = os.path.splitext(os.path.basename(file))[0] 26 | score = 0 27 | for key, label in labels.items(): 28 | # check if key in predicted_labels, else is wrong 29 | if key in predicted_labels: 30 | score += (int(predicted_labels[key]) == label) 31 | else: 32 | score += 0 33 | 34 | # print(f'{subject}: {score/len(labels)}') 35 | score_per_subject[subject] = score/len(labels) 36 | 37 | # print the average score for subjects in the subjects_training 38 | scores_training = [100*score_per_subject[x] for x in subjects_training] 39 | scores_test = [100*score_per_subject[x] for x in subjects_heldout] 40 | 41 | total_score = 2/3*np.mean(scores_training)+ 1/3*np.mean(scores_test) 42 | 43 | print(f'Total score : {np.mean(total_score)}') 44 | print(f'Total score training : {np.mean(scores_training)}') 45 | print(f'Total score test : {np.mean(scores_test)}') 46 | score = {'within': list(sorted(scores_training)), 'heldout': list(sorted(scores_test)), 'total': total_score} 47 | 48 | return score 49 | 50 | 51 | 52 | 53 | all_zips = glob.glob(predicted_results_folder + '/*.zip') 54 | for zip_file in all_zips: 55 | # unzip file 56 | with ZipFile(zip_file, 'r') as zipObj: 57 | # Extract all the contents of zip file in different directory 58 | group_folder = os.path.join(predicted_results_folder, zip_file.split('/')[-1].split('.')[0].replace(' ', '')) 59 | if not os.path.exists(group_folder): 60 | os.mkdir(group_folder) 61 | zipObj.extractall(group_folder) 62 | 63 | 64 | all_scores = {} 65 | # Loop over all the unzipped folders 66 | for group_results in glob.glob(os.path.join(predicted_results_folder, '*')): 67 | if os.path.isdir(group_results): 68 | # Loop over all the json files in the folder 69 | predicted_labels = {} 70 | # find all json files in group_results and subfolders 71 | for file in glob.glob(os.path.join(group_results, '**/*.json'), recursive=True): 72 | with open(file, 'r') as f: 73 | predicted_labels.update(json.load(f)) 74 | score = score_task(predicted_labels) 75 | group_name = group_results.split('/')[-1].split('group_')[-1].split('_submission')[0] 76 | print(group_name, score['total']) 77 | submission_number = int(group_results.split('.')[0].split('submission_')[-1]) 78 | if group_name not in all_scores: 79 | all_scores[group_name] = {} 80 | all_scores[group_name][submission_number] = score 81 | 82 | 83 | 84 | last_scores = {} 85 | for group_name, results in all_scores.items(): 86 | last_submission = max(results.keys()) 87 | last_scores[group_name] = results[last_submission] 88 | 89 | 90 | # save last_scores to json file 91 | with open(os.path.join(path_save_scores, 'scores_task1.json'), 'w') as f: 92 | json.dump(last_scores, f) 93 | 94 | 95 | mean_variances = [] 96 | for group_name, results in all_scores.items(): 97 | for submission_number, scores in results.items(): 98 | variances_group = {'group_name': group_name,'submission':submission_number,'within_mean': np.mean(scores['within']), 'within_std': np.std(scores['within']),'heldout_mean': np.mean(scores['heldout']),'heldout_std': np.std(scores['heldout']), 'total':scores['total']} 99 | mean_variances.append(variances_group) 100 | 101 | mean_variances = list(sorted(mean_variances, key=lambda x: x['total'], reverse=True)) 102 | 103 | with open(os.path.join(path_save_scores, 104 | 'scores_task1_means.json'), 'w') as f: 105 | json.dump(mean_variances, f) 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | -------------------------------------------------------------------------------- /task2_regression/util/dataset_generator.py: -------------------------------------------------------------------------------- 1 | """Code for the dataset_generator for task2.""" 2 | import itertools 3 | import os 4 | 5 | import numpy as np 6 | import tensorflow as tf 7 | 8 | 9 | def create_tf_dataset( 10 | data_generator, 11 | window_length, 12 | batch_equalizer_fn=None, 13 | hop_length=64, 14 | batch_size=64, 15 | data_types=(tf.float32, tf.float32), 16 | feature_dims=(64, 1) 17 | ): 18 | """Creates a tf.data.Dataset. 19 | 20 | This will be used to create a dataset generator that will 21 | pass windowed data to a model in both tasks. 22 | 23 | Parameters 24 | --------- 25 | data_generator: DataGenerator 26 | A data generator. 27 | window_length: int 28 | Length of the decision window in samples. 29 | batch_equalizer_fn: Callable 30 | Function that will be applied on the data after batching (using 31 | the `map` method from tf.data.Dataset). In the match/mismatch task, 32 | this function creates the imposter segments and labels. 33 | hop_length: int 34 | Hop length between two consecutive decision windows. 35 | batch_size: Optional[int] 36 | If not None, specifies the batch size. In the match/mismatch task, 37 | this amount will be doubled by the default_batch_equalizer_fn 38 | data_types: Union[Sequence[tf.dtype], tf.dtype] 39 | The data types that the individual features of data_generator should 40 | be cast to. If you only specify a single datatype, it will be chosen 41 | for all EEG/speech features. 42 | 43 | Returns 44 | ------- 45 | tf.data.Dataset 46 | A Dataset object that generates data to train/evaluate models 47 | efficiently 48 | """ 49 | # create tf dataset from generator 50 | dataset = tf.data.Dataset.from_generator( 51 | data_generator, 52 | output_signature=tuple( 53 | tf.TensorSpec(shape=(None, x), dtype=data_types[index]) 54 | for index, x in enumerate(feature_dims) 55 | ), 56 | ) 57 | # window dataset 58 | dataset = dataset.map( 59 | lambda *args: [ 60 | tf.signal.frame(arg, window_length, hop_length, axis=0) 61 | for arg in args 62 | ] 63 | ) 64 | 65 | # batch data 66 | dataset = dataset.interleave( 67 | lambda *args: tf.data.Dataset.from_tensor_slices(args), 68 | cycle_length=4, 69 | block_length=16, 70 | ) 71 | if batch_size is not None: 72 | dataset = dataset.batch(batch_size, drop_remainder=True) 73 | 74 | if batch_equalizer_fn is not None: 75 | # Create the labels and make sure classes are balanced 76 | dataset = dataset.map(batch_equalizer_fn) 77 | 78 | return dataset 79 | 80 | 81 | 82 | 83 | 84 | class RegressionDataGenerator: 85 | """Generate data for the regression task.""" 86 | 87 | def __init__( 88 | self, 89 | files, 90 | window_length, 91 | ): 92 | """Initialize the DataGenerator. 93 | 94 | Parameters 95 | ---------- 96 | files: Sequence[Union[str, pathlib.Path]] 97 | Files to load. 98 | window_length: int 99 | Length of the decision window. 100 | """ 101 | self.window_length = window_length 102 | self.files = self.group_recordings(files) 103 | 104 | def group_recordings(self, files): 105 | """Group recordings and corresponding stimuli. 106 | 107 | Parameters 108 | ---------- 109 | files : Sequence[Union[str, pathlib.Path]] 110 | List of filepaths to preprocessed and split EEG and speech features 111 | 112 | Returns 113 | ------- 114 | list 115 | Files grouped by the self.group_key_fn and subsequently sorted 116 | by the self.feature_sort_fn. 117 | """ 118 | new_files = [] 119 | grouped = itertools.groupby(sorted(files), lambda x: "_-_".join(os.path.basename(x).split("_-_")[:3])) 120 | for recording_name, feature_paths in grouped: 121 | new_files += [sorted(feature_paths, key=lambda x: "0" if x == "eeg" else x)] 122 | return new_files 123 | 124 | def __len__(self): 125 | return len(self.files) 126 | 127 | def __getitem__(self, recording_index): 128 | """Get data for a certain recording. 129 | 130 | Parameters 131 | ---------- 132 | recording_index: int 133 | Index of the recording in this dataset 134 | 135 | Returns 136 | ------- 137 | Union[Tuple[tf.Tensor,...], Tuple[np.ndarray,...]] 138 | The features corresponding to the recording_index recording 139 | """ 140 | data = [] 141 | for feature in self.files[recording_index]: 142 | data += [np.load(feature).astype(np.float32)] 143 | 144 | return tuple(tf.constant(x) for x in data) 145 | 146 | 147 | def __call__(self): 148 | """Load data for the next recording. 149 | 150 | Yields 151 | ------- 152 | Union[Tuple[tf.Tensor,...], Tuple[np.ndarray,...]] 153 | The features corresponding to the recording_index recording 154 | """ 155 | for idx in range(self.__len__()): 156 | yield self.__getitem__(idx) 157 | 158 | if idx == self.__len__() - 1: 159 | self.on_epoch_end() 160 | 161 | def on_epoch_end(self): 162 | """Change state at the end of an epoch.""" 163 | np.random.shuffle(self.files) 164 | 165 | -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-077.json: -------------------------------------------------------------------------------- 1 | {"sub-077_0": 1, "sub-077_1": 0, "sub-077_2": 0, "sub-077_3": 0, "sub-077_4": 0, "sub-077_5": 1, "sub-077_6": 0, "sub-077_7": 1, "sub-077_8": 0, "sub-077_9": 1, "sub-077_10": 0, "sub-077_11": 1, "sub-077_12": 1, "sub-077_13": 1, "sub-077_14": 0, "sub-077_15": 0, "sub-077_16": 1, "sub-077_17": 1, "sub-077_18": 0, "sub-077_19": 0, "sub-077_20": 0, "sub-077_21": 0, "sub-077_22": 0, "sub-077_23": 1, "sub-077_24": 1, "sub-077_25": 1, "sub-077_26": 0, "sub-077_27": 1, "sub-077_28": 0, "sub-077_29": 0, "sub-077_30": 1, "sub-077_31": 0, "sub-077_32": 0, "sub-077_33": 0, "sub-077_34": 1, "sub-077_35": 1, "sub-077_36": 1, "sub-077_37": 0, "sub-077_38": 1, "sub-077_39": 0, "sub-077_40": 1, "sub-077_41": 1, "sub-077_42": 0, "sub-077_43": 0, "sub-077_44": 1, "sub-077_45": 1, "sub-077_46": 0, "sub-077_47": 1, "sub-077_48": 1, "sub-077_49": 0, "sub-077_50": 1, "sub-077_51": 0, "sub-077_52": 1, "sub-077_53": 0, "sub-077_54": 0, "sub-077_55": 0, "sub-077_56": 0, "sub-077_57": 0, "sub-077_58": 0, "sub-077_59": 0, "sub-077_60": 1, "sub-077_61": 1, "sub-077_62": 0, "sub-077_63": 1, "sub-077_64": 1, "sub-077_65": 1, "sub-077_66": 0, "sub-077_67": 0, "sub-077_68": 1, "sub-077_69": 0, "sub-077_70": 0, "sub-077_71": 1, "sub-077_72": 0, "sub-077_73": 1, "sub-077_74": 0, "sub-077_75": 1, "sub-077_76": 1, "sub-077_77": 1, "sub-077_78": 0, "sub-077_79": 0, "sub-077_80": 1, "sub-077_81": 1, "sub-077_82": 0, "sub-077_83": 1, "sub-077_84": 1, "sub-077_85": 0, "sub-077_86": 0, "sub-077_87": 0, "sub-077_88": 1, "sub-077_89": 0, "sub-077_90": 0, "sub-077_91": 0, "sub-077_92": 1, "sub-077_93": 1, "sub-077_94": 0, "sub-077_95": 0, "sub-077_96": 1, "sub-077_97": 0, "sub-077_98": 1, "sub-077_99": 1, "sub-077_100": 0, "sub-077_101": 0, "sub-077_102": 0, "sub-077_103": 1, "sub-077_104": 0, "sub-077_105": 1, "sub-077_106": 1, "sub-077_107": 0, "sub-077_108": 0, "sub-077_109": 1, "sub-077_110": 1, "sub-077_111": 0, "sub-077_112": 1, "sub-077_113": 0, "sub-077_114": 0, "sub-077_115": 1, "sub-077_116": 1, "sub-077_117": 0, "sub-077_118": 0, "sub-077_119": 1, "sub-077_120": 0, "sub-077_121": 0, "sub-077_122": 0, "sub-077_123": 0, "sub-077_124": 1, "sub-077_125": 0, "sub-077_126": 0, "sub-077_127": 0, "sub-077_128": 0, "sub-077_129": 1, "sub-077_130": 1, "sub-077_131": 1, "sub-077_132": 0, "sub-077_133": 0, "sub-077_134": 0, "sub-077_135": 0, "sub-077_136": 1, "sub-077_137": 0, "sub-077_138": 1, "sub-077_139": 0, "sub-077_140": 1, "sub-077_141": 0, "sub-077_142": 1, "sub-077_143": 1, "sub-077_144": 1, "sub-077_145": 0, "sub-077_146": 0, "sub-077_147": 1, "sub-077_148": 1, "sub-077_149": 0, "sub-077_150": 0, "sub-077_151": 0, "sub-077_152": 0, "sub-077_153": 0, "sub-077_154": 1, "sub-077_155": 1, "sub-077_156": 1, "sub-077_157": 0, "sub-077_158": 1, "sub-077_159": 0, "sub-077_160": 0, "sub-077_161": 1, "sub-077_162": 0, "sub-077_163": 0, "sub-077_164": 0, "sub-077_165": 1, "sub-077_166": 1, "sub-077_167": 1, "sub-077_168": 0, "sub-077_169": 1, "sub-077_170": 0, "sub-077_171": 1, "sub-077_172": 1, "sub-077_173": 0, "sub-077_174": 0, "sub-077_175": 1, "sub-077_176": 1, "sub-077_177": 0, "sub-077_178": 1, "sub-077_179": 1, "sub-077_180": 0, "sub-077_181": 1, "sub-077_182": 0, "sub-077_183": 1, "sub-077_184": 0, "sub-077_185": 0, "sub-077_186": 0, "sub-077_187": 0, "sub-077_188": 0, "sub-077_189": 0, "sub-077_190": 0, "sub-077_191": 1, "sub-077_192": 1, "sub-077_193": 0, "sub-077_194": 1, "sub-077_195": 1, "sub-077_196": 1, "sub-077_197": 0, "sub-077_198": 0, "sub-077_199": 1, "sub-077_200": 0, "sub-077_201": 0, "sub-077_202": 1, "sub-077_203": 0, "sub-077_204": 1, "sub-077_205": 0, "sub-077_206": 1, "sub-077_207": 1, "sub-077_208": 1, "sub-077_209": 0, "sub-077_210": 0, "sub-077_211": 1, "sub-077_212": 1, "sub-077_213": 0, "sub-077_214": 1, "sub-077_215": 1, "sub-077_216": 0, "sub-077_217": 0, "sub-077_218": 0, "sub-077_219": 1, "sub-077_220": 0, "sub-077_221": 0, "sub-077_222": 0, "sub-077_223": 1, "sub-077_224": 1, "sub-077_225": 0, "sub-077_226": 0, "sub-077_227": 1, "sub-077_228": 0, "sub-077_229": 1, "sub-077_230": 1, "sub-077_231": 0, "sub-077_232": 0, "sub-077_233": 0, "sub-077_234": 1, "sub-077_235": 0, "sub-077_236": 1, "sub-077_237": 1, "sub-077_238": 0, "sub-077_239": 0, "sub-077_240": 1, "sub-077_241": 1, "sub-077_242": 0, "sub-077_243": 1, "sub-077_244": 0, "sub-077_245": 0, "sub-077_246": 1, "sub-077_247": 1, "sub-077_248": 0, "sub-077_249": 0, "sub-077_250": 1, "sub-077_251": 0, "sub-077_252": 0, "sub-077_253": 0, "sub-077_254": 0, "sub-077_255": 1, "sub-077_256": 0, "sub-077_257": 0, "sub-077_258": 0, "sub-077_259": 0, "sub-077_260": 1, "sub-077_261": 1, "sub-077_262": 1, "sub-077_263": 1, "sub-077_264": 1, "sub-077_265": 1, "sub-077_266": 1, "sub-077_267": 1, "sub-077_268": 0, "sub-077_269": 0, "sub-077_270": 0, "sub-077_271": 0, "sub-077_272": 0, "sub-077_273": 1, "sub-077_274": 1, "sub-077_275": 0, "sub-077_276": 0, "sub-077_277": 0, "sub-077_278": 0, "sub-077_279": 1, "sub-077_280": 0, "sub-077_281": 1, "sub-077_282": 0, "sub-077_283": 1, "sub-077_284": 0, "sub-077_285": 1, "sub-077_286": 1, "sub-077_287": 1, "sub-077_288": 0, "sub-077_289": 0, "sub-077_290": 1, "sub-077_291": 1, "sub-077_292": 0, "sub-077_293": 0, "sub-077_294": 0, "sub-077_295": 0, "sub-077_296": 0, "sub-077_297": 1, "sub-077_298": 1, "sub-077_299": 1, "sub-077_300": 0, "sub-077_301": 1, "sub-077_302": 0, "sub-077_303": 0, "sub-077_304": 1, "sub-077_305": 0, "sub-077_306": 0, "sub-077_307": 0, "sub-077_308": 1, "sub-077_309": 1, "sub-077_310": 1, "sub-077_311": 0, "sub-077_312": 1, "sub-077_313": 0, "sub-077_314": 1, "sub-077_315": 1, "sub-077_316": 0, "sub-077_317": 0, "sub-077_318": 1, "sub-077_319": 1, "sub-077_320": 0, "sub-077_321": 1, "sub-077_322": 1, "sub-077_323": 0, "sub-077_324": 1, "sub-077_325": 0, "sub-077_326": 1, "sub-077_327": 0, "sub-077_328": 0, "sub-077_329": 0, "sub-077_330": 0, "sub-077_331": 0, "sub-077_332": 0, "sub-077_333": 0} -------------------------------------------------------------------------------- /task1_match_mismatch/experiments/dilated_convolutional_model.py: -------------------------------------------------------------------------------- 1 | """Example experiment for dilation model.""" 2 | import glob 3 | import json 4 | import logging 5 | import os 6 | import tensorflow as tf 7 | 8 | from task1_match_mismatch.models.dilated_convolutional_model import dilation_model 9 | from task1_match_mismatch.util.dataset_generator import MatchMismatchDataGenerator, default_batch_equalizer_fn, create_tf_dataset 10 | 11 | 12 | def evaluate_model(model, test_dict): 13 | """Evaluate a model. 14 | 15 | Parameters 16 | ---------- 17 | model: tf.keras.Model 18 | Model to evaluate. 19 | test_dict: dict 20 | Mapping between a subject and a tf.data.Dataset containing the test 21 | set for the subject. 22 | 23 | Returns 24 | ------- 25 | dict 26 | Mapping between a subject and the loss/evaluation score on the test set 27 | """ 28 | evaluation = {} 29 | for subject, ds_test in test_dict.items(): 30 | logging.info(f"Scores for subject {subject}:") 31 | results = model.evaluate(ds_test, verbose=2) 32 | metrics = model.metrics_names 33 | evaluation[subject] = dict(zip(metrics, results)) 34 | return evaluation 35 | 36 | 37 | if __name__ == "__main__": 38 | # Parameters 39 | # Length of the decision window 40 | window_length = 3 * 64 # 3 seconds 41 | # Hop length between two consecutive decision windows 42 | hop_length = 64 43 | # Number of samples (space) between end of matched speech and beginning of mismatched speech 44 | spacing = 64 45 | epochs = 100 46 | patience = 5 47 | batch_size = 64 48 | only_evaluate = False 49 | training_log_filename = "training_log.csv" 50 | results_filename = 'eval.json' 51 | 52 | 53 | # Get the path to the config gile 54 | experiments_folder = os.path.dirname(__file__) 55 | task_folder = os.path.dirname(experiments_folder) 56 | config_path = os.path.join(task_folder, 'util', 'config.json') 57 | 58 | # Load the config 59 | with open(config_path) as fp: 60 | config = json.load(fp) 61 | 62 | # Provide the path of the dataset 63 | # which is split already to train, val, test 64 | data_folder = os.path.join(config["dataset_folder"], config["split_folder"]) 65 | 66 | # stimulus feature which will be used for training the model. Can be either 'envelope' ( dimension 1) or 'mel' (dimension 28) 67 | stimulus_features = ["envelope"] 68 | stimulus_dimension = 1 69 | 70 | # uncomment if you want to train with the mel spectrogram stimulus representation 71 | # stimulus_features = ["mel"] 72 | # stimulus_dimension = 28 73 | 74 | features = ["eeg"] + stimulus_features 75 | 76 | # Create a directory to store (intermediate) results 77 | results_folder = os.path.join(experiments_folder, "results_dilated_convolutional_model") 78 | os.makedirs(results_folder, exist_ok=True) 79 | 80 | # create dilation model 81 | model = dilation_model(time_window=window_length, eeg_input_dimension=64, env_input_dimension=stimulus_dimension) 82 | model_path = os.path.join(results_folder, "model.h5") 83 | 84 | if only_evaluate: 85 | model = tf.keras.models.load_model(model_path) 86 | else: 87 | 88 | train_files = [x for x in glob.glob(os.path.join(data_folder, "train_-_*")) if os.path.basename(x).split("_-_")[-1].split(".")[0] in features] 89 | # Create list of numpy array files 90 | train_generator = MatchMismatchDataGenerator(train_files, window_length, spacing=spacing) 91 | dataset_train = create_tf_dataset(train_generator, window_length, default_batch_equalizer_fn, hop_length, batch_size) 92 | 93 | # Create the generator for the validation set 94 | val_files = [x for x in glob.glob(os.path.join(data_folder, "val_-_*")) if os.path.basename(x).split("_-_")[-1].split(".")[0] in features] 95 | val_generator = MatchMismatchDataGenerator(val_files, window_length, spacing=spacing) 96 | dataset_val = create_tf_dataset(val_generator, window_length, default_batch_equalizer_fn, hop_length, batch_size) 97 | 98 | # Train the model 99 | model.fit( 100 | dataset_train, 101 | epochs=epochs, 102 | validation_data=dataset_val, 103 | callbacks=[ 104 | tf.keras.callbacks.ModelCheckpoint(model_path, save_best_only=True), 105 | tf.keras.callbacks.CSVLogger(os.path.join(results_folder, training_log_filename)), 106 | tf.keras.callbacks.EarlyStopping(patience=patience, restore_best_weights=True), 107 | ], 108 | ) 109 | 110 | # Evaluate the model on test set 111 | # Create a dataset generator for each test subject 112 | test_files = [x for x in glob.glob(os.path.join(data_folder, "test_-_*")) if os.path.basename(x).split("_-_")[-1].split(".")[0] in features] 113 | # Get all different subjects from the test set 114 | subjects = list(set([os.path.basename(x).split("_-_")[1] for x in test_files])) 115 | datasets_test = {} 116 | # Create a generator for each subject 117 | for sub in subjects: 118 | files_test_sub = [f for f in test_files if sub in os.path.basename(f)] 119 | test_generator = MatchMismatchDataGenerator(files_test_sub, window_length, spacing=spacing) 120 | datasets_test[sub] = create_tf_dataset(test_generator, window_length, default_batch_equalizer_fn, hop_length, 1,) 121 | 122 | # Evaluate the model 123 | evaluation = evaluate_model(model, datasets_test) 124 | 125 | # We can save our results in a json encoded file 126 | results_path = os.path.join(results_folder, results_filename) 127 | with open(results_path, "w") as fp: 128 | json.dump(evaluation, fp) 129 | logging.info(f"Results saved at {results_path}") 130 | -------------------------------------------------------------------------------- /test_scripts/score_regression.py: -------------------------------------------------------------------------------- 1 | import os 2 | import glob 3 | 4 | import scipy.stats 5 | import json 6 | import numpy as np 7 | from zipfile import ZipFile 8 | 9 | subjects_training = ['sub-002', 'sub-003', 'sub-004', 'sub-005', 'sub-006', 'sub-007', 'sub-008', 'sub-009', 'sub-010', 'sub-011', 'sub-012', 'sub-013', 'sub-014', 'sub-015', 'sub-016', 'sub-017', 'sub-018', 'sub-019', 'sub-020', 'sub-021', 'sub-022', 'sub-023', 'sub-024', 'sub-025', 'sub-026', 'sub-027', 'sub-028', 'sub-029', 'sub-030', 'sub-031', 'sub-032', 'sub-033', 'sub-034', 'sub-035', 'sub-036', 'sub-037', 'sub-038', 'sub-039', 'sub-040', 'sub-041', 'sub-042', 'sub-043', 'sub-044', 'sub-045', 'sub-046', 'sub-047', 'sub-048', 'sub-049', 'sub-050', 'sub-051', 'sub-052', 'sub-053', 'sub-054', 'sub-055', 'sub-056', 'sub-057', 'sub-058', 'sub-059', 'sub-060', 'sub-061', 'sub-062', 'sub-063', 'sub-064', 'sub-065', 'sub-066', 'sub-067', 'sub-068', 'sub-069', 'sub-070', 'sub-071'] 10 | subjects_heldout = ['sub-072', 'sub-073', 'sub-074', 'sub-075', 'sub-076', 'sub-077', 'sub-078', 'sub-079', 'sub-080', 'sub-083', 'sub-081', 'sub-082', 'sub-084', 'sub-085'] 11 | 12 | 13 | 14 | path_labels_match_mismatch = os.path.join(os.path.dirname(__file__), 'labels_regression') 15 | path_save_scores = os.path.join(os.path.dirname(__file__), 'results_task_regression') 16 | predicted_results_folder = "PATH_TO_YOUR_RESULTS_FOLDER" 17 | 18 | 19 | def score_task(predicted_labels): 20 | # create dictionary for final score, per subject 21 | score_per_subject = {} 22 | # load the true labels subject per subject 23 | for file in glob.glob(os.path.join(path_labels_match_mismatch, '*.json')): 24 | with open(file, 'r') as f: 25 | labels = json.load(f) 26 | subject = os.path.splitext(os.path.basename(file))[0] 27 | score = [] 28 | for key, label in labels.items(): 29 | # check if key in predicted_labels, else is wrong 30 | label = label[0] 31 | if key in predicted_labels: 32 | predicted_env = predicted_labels[key] 33 | # check if predicted_env is a list 34 | if not isinstance(predicted_env, list): 35 | print(predicted_env, key, group_name) 36 | if len(predicted_env) < len(label): 37 | # pad with zeros 38 | predicted_env = np.pad(predicted_env, (0, len(label) - len(predicted_env)), 'constant') 39 | 40 | elif len(predicted_env) > len(label): 41 | # truncate 42 | predicted_env = predicted_env[:len(label)] 43 | score.append(scipy.stats.pearsonr(predicted_env, np.squeeze(label))[0]) 44 | else: 45 | score.append(0) 46 | 47 | # print(f'{subject}: {np.mean(score)}') 48 | score_per_subject[subject] = np.mean(score) 49 | 50 | # print the average score for subjects in the subjects_training 51 | scores_training = [score_per_subject[x] for x in subjects_training] 52 | scores_test = [score_per_subject[x] for x in subjects_heldout] 53 | 54 | total_score = 2/3*np.mean(scores_training)+ 1/3*np.mean(scores_test) 55 | 56 | print(f'Total score : {np.mean(total_score)}') 57 | print(f'Total score training : {np.mean(scores_training)}') 58 | print(f'Total score test : {np.mean(scores_test)}') 59 | score = {'within': list(sorted(scores_training)), 'heldout': list(sorted(scores_test)), 'total': total_score} 60 | 61 | return score 62 | 63 | 64 | 65 | 66 | all_zips = glob.glob(predicted_results_folder + '/*.zip') 67 | for zip_file in all_zips: 68 | # unzip file 69 | with ZipFile(zip_file, 'r') as zipObj: 70 | # Extract all the contents of zip file in different directory 71 | group_folder = os.path.join(predicted_results_folder, zip_file.split('/')[-1].split('.')[0].replace(' ', '')) 72 | if not os.path.exists(group_folder): 73 | os.mkdir(group_folder) 74 | zipObj.extractall(group_folder) 75 | 76 | 77 | all_scores = {} 78 | # Loop over all the unzipped folders 79 | for group_results in glob.glob(os.path.join(predicted_results_folder, '*')): 80 | if os.path.isdir(group_results): 81 | # Loop over all the json files in the folder 82 | predicted_labels = {} 83 | # find all json files in group_results and subfolders 84 | for file in glob.glob(os.path.join(group_results, '**/*.json'), recursive=True): 85 | with open(file, 'r') as f: 86 | temp_labels = json.load(f) 87 | predicted_labels.update(temp_labels) 88 | # predicted_labels.update(json.load(f)) 89 | 90 | group_name = group_results.split('/')[-1].split('group_')[-1].split('_sub')[0] 91 | 92 | score = score_task(predicted_labels) 93 | print(group_name, score['total']) 94 | submission_number = int(group_results.split('.')[0].split('submission_')[-1]) 95 | if group_name not in all_scores: 96 | all_scores[group_name] = {} 97 | all_scores[group_name][submission_number] = score 98 | 99 | last_scores = {} 100 | for group_name, results in all_scores.items(): 101 | last_submission = max(results.keys()) 102 | last_scores[group_name] = results[last_submission] 103 | 104 | 105 | # save last_scores to json file 106 | with open(os.path.join(path_save_scores, 'scores_task2.json'), 'w') as f: 107 | json.dump(last_scores, f) 108 | 109 | mean_variances = [] 110 | for group_name, results in all_scores.items(): 111 | for submission_number, scores in results.items(): 112 | variances_group = {'group_name': group_name,'submission':submission_number,'within_mean': np.mean(scores['within']), 'within_std': np.std(scores['within']),'heldout_mean': np.mean(scores['heldout']),'heldout_std': np.std(scores['heldout']), 'total':scores['total']} 113 | mean_variances.append(variances_group) 114 | 115 | 116 | mean_variances = list(sorted(mean_variances, key=lambda x: x['total'], reverse=True)) 117 | 118 | with open(os.path.join( path_save_scores, 119 | 'scores_task2_means.json'), 'w') as f: 120 | json.dump(mean_variances, f) 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Challenge is finished! 2 | ====================== 3 | This is the 2023 Auditory EEG challenge, which is now finished. If you are looking for the most recent challenge, go to the [2024 ICASSP Auditory EEG challenge codebase](https://github.com/exporl/auditory-eeg-challenge-2024-code). 4 | 5 | Auditory-eeg-challenge-2023-code 6 | ================================ 7 | This is the codebase for the [2023 ICASSP Auditory EEG challenge](https://exporl.github.io/auditory-eeg-challenge-2023). 8 | This codebase contains baseline models and code to preprocess stimuli for both tasks. 9 | 10 | # Prerequisites 11 | 12 | Python >= 3.6 13 | 14 | # General setup 15 | 16 | Steps to get a working setup: 17 | 18 | ## 1. Clone this repository and install the [requirements.txt](requirements.txt) 19 | ```bash 20 | # Clone this repository 21 | git clone https://github.com/exporl/auditory-eeg-challenge-2023-code 22 | 23 | # Go to the root folder 24 | cd auditory-eeg-challenge-2023-code 25 | 26 | # Optional: install a virtual environment 27 | python3 -m venv venv # Optional 28 | source venv/bin/activate # Optional 29 | 30 | # Install requirements.txt 31 | python3 -m install requirements.txt 32 | ``` 33 | 34 | ## 2. [Download the data](https://kuleuven-my.sharepoint.com/personal/lies_bollens_kuleuven_be/_layouts/15/onedrive.aspx?id=%2Fpersonal%2Flies%5Fbollens%5Fkuleuven%5Fbe%2FDocuments%2FICASSP%2D2023%2Deeg%2Ddecoding%2Dchallenge%2Ddataset&ga=1) 35 | 36 | You will need a password, which you will receive when you [register](https://exporl.github.io/auditory-eeg-challenge-2023/registration/). 37 | The folder contains multiple folders (and `zip` files containing the same data as their corresponding folders). For bulk downloading, we recommend using the `zip` files, as there is a bug in Onedrive when it has to zip files >= 4GB resulting in "corrupt" zip archives. 38 | 39 | 1. `split_data(.zip)` contains already preprocessed, split and normalized data; ready for model training/evaluation. 40 | If you want to get started quickly, you can opt to only download this folder/zipfile. 41 | 42 | 2. `preprocessed_eeg(.zip)` and `preprocessed_stimuli(.zip)` contain preprocessed EEG and stimuli files (envelope and mel features) respectively. 43 | At this stage data is not yet split into different sets and normalized. To go from this to the data in `split_data`, you will have to run the `speech_features.py` script ([task1_match_mismatch/create_data/speech_features.py](./task1_match_mismatch/create_data/speech_features.py) for task 1 and [task2_regression/create_data/speech_features.py](./task2_regression/create_data/speech_features.py) for task 2). 44 | 45 | 3. `raw_eeg(.zip)` and `stimuli(.zip)` contain the raw EEG and stimuli files. If you want to process the stimuli files, you can run `split_and_normalize.py` (([task1_match_mismatch/create_data/split_and_normalize.py](./task1_match_mismatch/create_data/split_and_normalize.py) for task 1 and [task2_regression/create_data/split_and_normalize.py](./task2_regression/create_data/split_and_normalize.py) for task 2). The processed stimuli files will be stored in the `processed_stimuli` folder. 46 | Currently, no preprocessing code is made available to preprocess EEG, so you will have to write your own implementation or use the precomputed `processed_eeg` folder. 47 | 48 | Make sure to download/unzip these folders into the same folder (e.g. `challenge_folder_task1`) for each task. 49 | Note that it is possible to use the same preprocessed (and split) dataset for both task 1 and task 2, but it is not required. 50 | 51 | 52 | ![data_diagram](./images/data_diagram.svg) 53 | 54 | ## 3. Adjust the `config.json` accordingly 55 | 56 | Each task has a `config.json` defining the folder names and structure for the data (i.e. [task1_match_mismatch/util/config.json](./task1_match_mismatch/util/config.json) and [task2_regression/util/config.json](./task2_regression/util/config.json)). 57 | Adjust `dataset_folder` in the `config.json` file from `null` to the absolute path to the folder containing all data (The `challenge_folder_task_1` from the previous point). 58 | 59 | 60 | OK, you should be all setup now! 61 | 62 | 63 | 64 | # Running the tasks 65 | 66 | Each task has already some ready-to-go experiments files defined to give you a 67 | baseline and make you acquainted with the problem. The experiment files live 68 | in the `experiment` subfolder for each task. The training log, 69 | best model and evaluation results will be stored in a folder called 70 | `results_{experiment_name}`. 71 | 72 | ## Task1: Match-mismatch 73 | 74 | By running [task1_match_mismatch/experiments/dilated_convolutional_model.py](./task1_match_mismatch/experiments/dilated_convolutional_model.py), 75 | you can train the dilated convolutional model introduced by Accou et al. [(2021a)](https://doi.org/10.23919/Eusipco47968.2020.9287417) and [(2021b)](https://doi.org/10.1088/1741-2552/ac33e9). 76 | 77 | Other models you might find interesting are [Decheveigné et al (2021)](https://www.sciencedirect.com/science/article/pii/S1053811918300338), [Monesi et al. (2020)](https://ieeexplore.ieee.org/abstract/document/9054000), [Monesi et al. (2021)](https://arxiv.org/abs/2106.09622),…. 78 | 79 | ## Task2: Regression (reconstructing envelope from EEG) 80 | 81 | By running [task2_regression/experiments/linear_baseline.py](./task2_regression/experiments/linear_baseline.py), you can 82 | train and evaluate a simple linear baseline model with Pearson correlation as a loss function, similar to the baseline model used in [Accou et al (2022)](https://www.biorxiv.org/content/10.1101/2022.09.28.509945). 83 | 84 | By running [task2_regression/experiments/vlaai.py](./task2_regression/experiments/vlaai.py), you can train/evaluate 85 | the VLAAI model as proposed by [Accou et al (2022)](https://www.biorxiv.org/content/10.1101/2022.09.28.509945). You can find a pre-trained model at [VLAAI's github page](https://github.com/exporl/vlaai). 86 | 87 | Other models you might find interesting are: [Thornton et al. (2022)](https://iopscience.iop.org/article/10.1088/1741-2552/ac7976),... 88 | 89 | # Previous version 90 | 91 | If you are still using a previous version of this example code, we recommend updating to this version, as the test-set code and data will be made compatible for this version. 92 | If you still like access to the previous version, you can find it [here](https://github.com/exporl/auditory-eeg-challenge-2023-code/tree/258b2d48bab4f2ac1da01b8c2aa30f6396063ff5) 93 | -------------------------------------------------------------------------------- /task2_regression/models/vlaai.py: -------------------------------------------------------------------------------- 1 | """Code to construct the VLAAI network. 2 | Code was extrcted from https://github.com/exporl/vlaai 3 | """ 4 | import tensorflow as tf 5 | 6 | 7 | def extractor( 8 | filters=(256, 256, 256, 128, 128), 9 | kernels=(8,) * 5, 10 | input_channels=64, 11 | normalization_fn=lambda x: tf.keras.layers.LayerNormalization()(x), 12 | activation_fn=lambda x: tf.keras.layers.LeakyReLU()(x), 13 | name="extractor", 14 | ): 15 | """Construct the extractor model. 16 | 17 | Parameters 18 | ---------- 19 | filters: Sequence[int] 20 | Number of filters for each layer. 21 | kernels: Sequence[int] 22 | Kernel size for each layer. 23 | input_channels: int 24 | Number of EEG channels in the input 25 | normalization_fn: Callable[[tf.Tensor], tf.Tensor] 26 | Function to normalize the contents of a tensor. 27 | activation_fn: Callable[[tf.Tensor], tf.Tensor] 28 | Function to apply an activation function to the contents of a tensor. 29 | name: str 30 | Name of the model. 31 | 32 | Returns 33 | ------- 34 | tf.keras.models.Model 35 | The extractor model. 36 | """ 37 | eeg = tf.keras.layers.Input((None, input_channels)) 38 | 39 | x = eeg 40 | 41 | if len(filters) != len(kernels): 42 | raise ValueError("'filters' and 'kernels' must have the same length") 43 | 44 | # Add the convolutional layers 45 | for filter_, kernel in zip(filters, kernels): 46 | x = tf.keras.layers.Conv1D(filter_, kernel)(x) 47 | x = normalization_fn(x) 48 | x = activation_fn(x) 49 | x = tf.keras.layers.ZeroPadding1D((0, kernel - 1))(x) 50 | 51 | return tf.keras.models.Model(inputs=[eeg], outputs=[x], name=name) 52 | 53 | 54 | def output_context( 55 | filter_=64, 56 | kernel=32, 57 | input_channels=64, 58 | normalization_fn=lambda x: tf.keras.layers.LayerNormalization()(x), 59 | activation_fn=lambda x: tf.keras.layers.LeakyReLU()(x), 60 | name="output_context_model", 61 | ): 62 | """Construct the output context model. 63 | 64 | Parameters 65 | ---------- 66 | filter_: int 67 | Number of filters for the convolutional layer. 68 | kernel: int 69 | Kernel size for the convolutional layer. 70 | input_channels: int 71 | Number of EEG channels in the input. 72 | normalization_fn: Callable[[tf.Tensor], tf.Tensor] 73 | Function to normalize the contents of a tensor. 74 | activation_fn: Callable[[tf.Tensor], tf.Tensor] 75 | Function to apply an activation function to the contents of a tensor. 76 | name: str 77 | Name of the model. 78 | 79 | Returns 80 | ------- 81 | tf.keras.models.Model 82 | The output context model. 83 | """ 84 | inp = tf.keras.layers.Input((None, input_channels)) 85 | x = tf.keras.layers.ZeroPadding1D((kernel - 1, 0))(inp) 86 | x = tf.keras.layers.Conv1D(filter_, kernel)(x) 87 | x = normalization_fn(x) 88 | x = activation_fn(x) 89 | return tf.keras.models.Model(inputs=[inp], outputs=[x], name=name) 90 | 91 | 92 | def vlaai( 93 | nb_blocks=4, 94 | extractor_model=None, 95 | output_context_model=None, 96 | use_skip=True, 97 | input_channels=64, 98 | output_dim=1, 99 | name="vlaai", 100 | ): 101 | """Construct the VLAAI model. 102 | 103 | Parameters 104 | ---------- 105 | nb_blocks: int 106 | Number of repeated blocks to use. 107 | extractor_model: Callable[[tf.Tensor], tf.Tensor] 108 | The extractor model to use. 109 | output_context_model: Callable[[tf.Tensor], tf.Tensor] 110 | The output context model to use. 111 | use_skip: bool 112 | Whether to use skip connections. 113 | input_channels: int 114 | Number of EEG channels in the input. 115 | output_dim: int 116 | Number of output dimensions. 117 | name: str 118 | Name of the model. 119 | 120 | Returns 121 | ------- 122 | tf.keras.models.Model 123 | The VLAAI model. 124 | """ 125 | if extractor_model is None: 126 | extractor_model = extractor() 127 | if output_context_model is None: 128 | output_context_model = output_context() 129 | 130 | eeg = tf.keras.layers.Input((None, input_channels)) 131 | 132 | # If using skip connections: start with x set to zero 133 | if use_skip: 134 | x = tf.zeros_like(eeg) 135 | else: 136 | x = eeg 137 | 138 | # Iterate over the blocks 139 | for i in range(nb_blocks): 140 | if use_skip: 141 | x = extractor_model(eeg + x) 142 | else: 143 | x = extractor_model(x) 144 | x = tf.keras.layers.Dense(input_channels)(x) 145 | x = output_context_model(x) 146 | 147 | x = tf.keras.layers.Dense(output_dim)(x) 148 | 149 | return tf.keras.models.Model(inputs=[eeg], outputs=[x], name=name) 150 | 151 | 152 | def pearson_tf(y_true, y_pred, axis=1): 153 | """Pearson correlation function implemented in tensorflow. 154 | 155 | Parameters 156 | ---------- 157 | y_true: tf.Tensor 158 | Ground truth labels. Shape is (batch_size, time_steps, n_features) 159 | y_pred: tf.Tensor 160 | Predicted labels. Shape is (batch_size, time_steps, n_features) 161 | axis: int 162 | Axis along which to compute the pearson correlation. Default is 1. 163 | 164 | Returns 165 | ------- 166 | tf.Tensor 167 | Pearson correlation. 168 | Shape is (batch_size, 1, n_features) if axis is 1. 169 | """ 170 | # Compute the mean of the true and predicted values 171 | y_true_mean = tf.reduce_mean(y_true, axis=axis, keepdims=True) 172 | y_pred_mean = tf.reduce_mean(y_pred, axis=axis, keepdims=True) 173 | 174 | # Compute the numerator and denominator of the pearson correlation 175 | numerator = tf.reduce_sum( 176 | (y_true - y_true_mean) * (y_pred - y_pred_mean), 177 | axis=axis, 178 | keepdims=True, 179 | ) 180 | std_true = tf.reduce_sum(tf.square(y_true - y_true_mean), axis=axis, keepdims=True) 181 | std_pred = tf.reduce_sum(tf.square(y_pred - y_pred_mean), axis=axis, keepdims=True) 182 | denominator = tf.sqrt(std_true * std_pred) 183 | 184 | # Compute the pearson correlation 185 | return tf.math.divide_no_nan(numerator, denominator) 186 | 187 | 188 | @tf.function 189 | def pearson_loss(y_true, y_pred, axis=1): 190 | """Pearson loss function. 191 | 192 | Parameters 193 | ---------- 194 | y_true: tf.Tensor 195 | True values. Shape is (batch_size, time_steps, n_features) 196 | y_pred: tf.Tensor 197 | Predicted values. Shape is (batch_size, time_steps, n_features) 198 | 199 | Returns 200 | ------- 201 | tf.Tensor 202 | Pearson loss. 203 | Shape is (batch_size, 1, n_features) 204 | """ 205 | return -pearson_tf(y_true, y_pred, axis=axis) 206 | 207 | 208 | @tf.function 209 | def pearson_metric(y_true, y_pred, axis=1): 210 | """Pearson metric function. 211 | 212 | Parameters 213 | ---------- 214 | y_true: tf.Tensor 215 | True values. Shape is (batch_size, time_steps, n_features) 216 | y_pred: tf.Tensor 217 | Predicted values. Shape is (batch_size, time_steps, n_features) 218 | 219 | Returns 220 | ------- 221 | tf.Tensor 222 | Pearson metric. 223 | Shape is (batch_size, 1, n_features) 224 | """ 225 | return pearson_tf(y_true, y_pred, axis=axis) 226 | -------------------------------------------------------------------------------- /task1_match_mismatch/util/dataset_generator.py: -------------------------------------------------------------------------------- 1 | """Code for the dataset_generator for task1.""" 2 | import itertools 3 | import os 4 | 5 | import numpy as np 6 | import tensorflow as tf 7 | 8 | 9 | 10 | @tf.function 11 | def default_batch_equalizer_fn(*args): 12 | """Batch equalizer. 13 | Prepares the inputs for a model to be trained in 14 | match-mismatch task. It makes sure that match_env 15 | and mismatch_env are equally presented as a first 16 | envelope in match-mismatch task. 17 | 18 | Parameters 19 | ---------- 20 | args : Sequence[tf.Tensor] 21 | List of tensors representing feature data 22 | 23 | Returns 24 | ------- 25 | Tuple[Tuple[tf.Tensor], tf.Tensor] 26 | Tuple of the EEG/speech features serving as the input to the model and 27 | the labels for the match/mismatch task 28 | 29 | Notes 30 | ----- 31 | This function will also double the batch size. E.g. if the batch size of 32 | the elements in each of the args was 32, the output features will have 33 | a batch size of 64. 34 | """ 35 | eeg = args[0] 36 | new_eeg = tf.concat([eeg, eeg], axis=0) 37 | all_features = [new_eeg] 38 | for match, mismatch in zip(args[1::2], args[2::2]): 39 | stimulus_feature1 = tf.concat([match, mismatch], axis=0) 40 | stimulus_feature2 = tf.concat([mismatch, match], axis=0) 41 | all_features += [stimulus_feature1, stimulus_feature2] 42 | labels = tf.concat( 43 | [ 44 | tf.tile(tf.constant([[0]]), [tf.shape(eeg)[0], 1]), 45 | tf.tile(tf.constant([[1]]), [tf.shape(eeg)[0], 1]), 46 | ], 47 | axis=0, 48 | ) 49 | 50 | # print(new_eeg.shape, env1.shape, env2.shape, labels.shape) 51 | return tuple(all_features), labels 52 | 53 | 54 | def create_tf_dataset( 55 | data_generator, 56 | window_length, 57 | batch_equalizer_fn=None, 58 | hop_length=64, 59 | batch_size=64, 60 | data_types=(tf.float32, tf.float32, tf.float32), 61 | feature_dims=(64, 1, 1) 62 | ): 63 | """Creates a tf.data.Dataset. 64 | 65 | This will be used to create a dataset generator that will 66 | pass windowed data to a model in both tasks. 67 | 68 | Parameters 69 | --------- 70 | data_generator: DataGenerator 71 | A data generator. 72 | window_length: int 73 | Length of the decision window in samples. 74 | batch_equalizer_fn: Callable 75 | Function that will be applied on the data after batching (using 76 | the `map` method from tf.data.Dataset). In the match/mismatch task, 77 | this function creates the imposter segments and labels. 78 | hop_length: int 79 | Hop length between two consecutive decision windows. 80 | batch_size: Optional[int] 81 | If not None, specifies the batch size. In the match/mismatch task, 82 | this amount will be doubled by the default_batch_equalizer_fn 83 | data_types: Union[Sequence[tf.dtype], tf.dtype] 84 | The data types that the individual features of data_generator should 85 | be cast to. If you only specify a single datatype, it will be chosen 86 | for all EEG/speech features. 87 | 88 | Returns 89 | ------- 90 | tf.data.Dataset 91 | A Dataset object that generates data to train/evaluate models 92 | efficiently 93 | """ 94 | # create tf dataset from generator 95 | dataset = tf.data.Dataset.from_generator( 96 | data_generator, 97 | output_signature=tuple( 98 | tf.TensorSpec(shape=(None, x), dtype=data_types[index]) 99 | for index, x in enumerate(feature_dims) 100 | ), 101 | ) 102 | # window dataset 103 | dataset = dataset.map( 104 | lambda *args: [ 105 | tf.signal.frame(arg, window_length, hop_length, axis=0) 106 | for arg in args 107 | ] 108 | ) 109 | 110 | # batch data 111 | dataset = dataset.interleave( 112 | lambda *args: tf.data.Dataset.from_tensor_slices(args), 113 | cycle_length=4, 114 | block_length=16, 115 | ) 116 | if batch_size is not None: 117 | dataset = dataset.batch(batch_size, drop_remainder=True) 118 | 119 | if batch_equalizer_fn is not None: 120 | # Create the labels and make sure classes are balanced 121 | dataset = dataset.map(batch_equalizer_fn) 122 | 123 | return dataset 124 | 125 | 126 | 127 | class MatchMismatchDataGenerator: 128 | """Generate data for the Match/Mismatch task.""" 129 | 130 | def __init__( 131 | self, 132 | files, 133 | window_length, 134 | spacing 135 | ): 136 | """Initialize the DataGenerator. 137 | 138 | Parameters 139 | ---------- 140 | files: Sequence[Union[str, pathlib.Path]] 141 | Files to load. 142 | window_length: int 143 | Length of the decision window. 144 | spacing: int 145 | Spacing between matched and mismatched samples 146 | """ 147 | self.window_length = window_length 148 | self.files = self.group_recordings(files) 149 | self.spacing = spacing 150 | 151 | def group_recordings(self, files): 152 | """Group recordings and corresponding stimuli. 153 | 154 | Parameters 155 | ---------- 156 | files : Sequence[Union[str, pathlib.Path]] 157 | List of filepaths to preprocessed and split EEG and speech features 158 | 159 | Returns 160 | ------- 161 | list 162 | Files grouped by the self.group_key_fn and subsequently sorted 163 | by the self.feature_sort_fn. 164 | """ 165 | new_files = [] 166 | grouped = itertools.groupby(sorted(files), lambda x: "_-_".join(os.path.basename(x).split("_-_")[:3])) 167 | for recording_name, feature_paths in grouped: 168 | new_files += [sorted(feature_paths, key=lambda x: "0" if x == "eeg" else x)] 169 | return new_files 170 | 171 | def __len__(self): 172 | return len(self.files) 173 | 174 | def __getitem__(self, recording_index): 175 | """Get data for a certain recording. 176 | 177 | Parameters 178 | ---------- 179 | recording_index: int 180 | Index of the recording in this dataset 181 | 182 | Returns 183 | ------- 184 | Union[Tuple[tf.Tensor,...], Tuple[np.ndarray,...]] 185 | The features corresponding to the recording_index recording 186 | """ 187 | data = [] 188 | for feature in self.files[recording_index]: 189 | data += [np.load(feature).astype(np.float32)] 190 | data = self.prepare_data(data) 191 | return tuple(tf.constant(x) for x in data) 192 | 193 | 194 | def __call__(self): 195 | """Load data for the next recording. 196 | 197 | Yields 198 | ------- 199 | Union[Tuple[tf.Tensor,...], Tuple[np.ndarray,...]] 200 | The features corresponding to the recording_index recording 201 | """ 202 | for idx in range(self.__len__()): 203 | yield self.__getitem__(idx) 204 | 205 | if idx == self.__len__() - 1: 206 | self.on_epoch_end() 207 | 208 | def on_epoch_end(self): 209 | """Change state at the end of an epoch.""" 210 | np.random.shuffle(self.files) 211 | 212 | def prepare_data(self, data): 213 | """Creates mismatch (imposter) envelope. 214 | 215 | Parameters 216 | ---------- 217 | data: Sequence[numpy.ndarray] 218 | Data to create an imposter for. 219 | 220 | Returns 221 | ------- 222 | tuple (numpy.ndarray, numpy.ndarray, numpy.ndarray, ...) 223 | (EEG, matched stimulus feature, mismatched stimulus feature, ...). 224 | """ 225 | eeg = data[0] 226 | new_length = eeg.shape[0] - self.window_length - self.spacing 227 | resulting_data = [eeg[:new_length, ...]] 228 | for stimulus_feature in data[1:]: 229 | match_feature = stimulus_feature[:new_length, ...] 230 | mismatch_feature = stimulus_feature[ 231 | self.spacing + self.window_length:, ... 232 | ] 233 | resulting_data += [match_feature, mismatch_feature] 234 | return resulting_data 235 | 236 | -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-072.json: -------------------------------------------------------------------------------- 1 | {"sub-072_0": 1, "sub-072_1": 0, "sub-072_2": 0, "sub-072_3": 0, "sub-072_4": 0, "sub-072_5": 1, "sub-072_6": 0, "sub-072_7": 1, "sub-072_8": 0, "sub-072_9": 1, "sub-072_10": 0, "sub-072_11": 1, "sub-072_12": 1, "sub-072_13": 1, "sub-072_14": 0, "sub-072_15": 0, "sub-072_16": 1, "sub-072_17": 1, "sub-072_18": 0, "sub-072_19": 0, "sub-072_20": 0, "sub-072_21": 0, "sub-072_22": 0, "sub-072_23": 1, "sub-072_24": 1, "sub-072_25": 1, "sub-072_26": 0, "sub-072_27": 1, "sub-072_28": 0, "sub-072_29": 0, "sub-072_30": 1, "sub-072_31": 0, "sub-072_32": 0, "sub-072_33": 0, "sub-072_34": 1, "sub-072_35": 1, "sub-072_36": 1, "sub-072_37": 0, "sub-072_38": 1, "sub-072_39": 0, "sub-072_40": 1, "sub-072_41": 1, "sub-072_42": 0, "sub-072_43": 0, "sub-072_44": 1, "sub-072_45": 1, "sub-072_46": 0, "sub-072_47": 1, "sub-072_48": 1, "sub-072_49": 0, "sub-072_50": 1, "sub-072_51": 0, "sub-072_52": 1, "sub-072_53": 0, "sub-072_54": 0, "sub-072_55": 0, "sub-072_56": 0, "sub-072_57": 0, "sub-072_58": 0, "sub-072_59": 0, "sub-072_60": 1, "sub-072_61": 1, "sub-072_62": 0, "sub-072_63": 1, "sub-072_64": 1, "sub-072_65": 1, "sub-072_66": 0, "sub-072_67": 0, "sub-072_68": 1, "sub-072_69": 0, "sub-072_70": 0, "sub-072_71": 1, "sub-072_72": 0, "sub-072_73": 1, "sub-072_74": 0, "sub-072_75": 1, "sub-072_76": 1, "sub-072_77": 1, "sub-072_78": 0, "sub-072_79": 0, "sub-072_80": 1, "sub-072_81": 1, "sub-072_82": 0, "sub-072_83": 1, "sub-072_84": 1, "sub-072_85": 0, "sub-072_86": 0, "sub-072_87": 0, "sub-072_88": 1, "sub-072_89": 0, "sub-072_90": 0, "sub-072_91": 0, "sub-072_92": 1, "sub-072_93": 1, "sub-072_94": 0, "sub-072_95": 0, "sub-072_96": 1, "sub-072_97": 0, "sub-072_98": 1, "sub-072_99": 1, "sub-072_100": 0, "sub-072_101": 0, "sub-072_102": 0, "sub-072_103": 1, "sub-072_104": 0, "sub-072_105": 1, "sub-072_106": 1, "sub-072_107": 0, "sub-072_108": 0, "sub-072_109": 1, "sub-072_110": 1, "sub-072_111": 0, "sub-072_112": 1, "sub-072_113": 0, "sub-072_114": 0, "sub-072_115": 1, "sub-072_116": 1, "sub-072_117": 0, "sub-072_118": 0, "sub-072_119": 1, "sub-072_120": 0, "sub-072_121": 0, "sub-072_122": 0, "sub-072_123": 0, "sub-072_124": 1, "sub-072_125": 0, "sub-072_126": 0, "sub-072_127": 0, "sub-072_128": 0, "sub-072_129": 1, "sub-072_130": 1, "sub-072_131": 1, "sub-072_132": 1, "sub-072_133": 1, "sub-072_134": 1, "sub-072_135": 1, "sub-072_136": 1, "sub-072_137": 0, "sub-072_138": 0, "sub-072_139": 0, "sub-072_140": 0, "sub-072_141": 0, "sub-072_142": 1, "sub-072_143": 1, "sub-072_144": 0, "sub-072_145": 0, "sub-072_146": 0, "sub-072_147": 0, "sub-072_148": 1, "sub-072_149": 0, "sub-072_150": 1, "sub-072_151": 0, "sub-072_152": 1, "sub-072_153": 0, "sub-072_154": 1, "sub-072_155": 1, "sub-072_156": 1, "sub-072_157": 0, "sub-072_158": 0, "sub-072_159": 1, "sub-072_160": 1, "sub-072_161": 0, "sub-072_162": 0, "sub-072_163": 0, "sub-072_164": 0, "sub-072_165": 0, "sub-072_166": 1, "sub-072_167": 1, "sub-072_168": 1, "sub-072_169": 0, "sub-072_170": 1, "sub-072_171": 0, "sub-072_172": 0, "sub-072_173": 1, "sub-072_174": 0, "sub-072_175": 0, "sub-072_176": 0, "sub-072_177": 1, "sub-072_178": 1, "sub-072_179": 1, "sub-072_180": 0, "sub-072_181": 1, "sub-072_182": 0, "sub-072_183": 1, "sub-072_184": 1, "sub-072_185": 0, "sub-072_186": 0, "sub-072_187": 1, "sub-072_188": 1, "sub-072_189": 0, "sub-072_190": 1, "sub-072_191": 1, "sub-072_192": 0, "sub-072_193": 1, "sub-072_194": 0, "sub-072_195": 1, "sub-072_196": 0, "sub-072_197": 0, "sub-072_198": 0, "sub-072_199": 0, "sub-072_200": 0, "sub-072_201": 0, "sub-072_202": 0, "sub-072_203": 1, "sub-072_204": 0, "sub-072_205": 0, "sub-072_206": 0, "sub-072_207": 0, "sub-072_208": 1, "sub-072_209": 0, "sub-072_210": 1, "sub-072_211": 0, "sub-072_212": 1, "sub-072_213": 0, "sub-072_214": 1, "sub-072_215": 1, "sub-072_216": 1, "sub-072_217": 0, "sub-072_218": 0, "sub-072_219": 1, "sub-072_220": 1, "sub-072_221": 0, "sub-072_222": 0, "sub-072_223": 0, "sub-072_224": 0, "sub-072_225": 0, "sub-072_226": 1, "sub-072_227": 1, "sub-072_228": 1, "sub-072_229": 0, "sub-072_230": 1, "sub-072_231": 0, "sub-072_232": 0, "sub-072_233": 1, "sub-072_234": 0, "sub-072_235": 0, "sub-072_236": 0, "sub-072_237": 1, "sub-072_238": 1, "sub-072_239": 1, "sub-072_240": 0, "sub-072_241": 1, "sub-072_242": 0, "sub-072_243": 1, "sub-072_244": 1, "sub-072_245": 0, "sub-072_246": 0, "sub-072_247": 1, "sub-072_248": 1, "sub-072_249": 0, "sub-072_250": 1, "sub-072_251": 1, "sub-072_252": 0, "sub-072_253": 1, "sub-072_254": 0, "sub-072_255": 1, "sub-072_256": 0, "sub-072_257": 0, "sub-072_258": 0, "sub-072_259": 0, "sub-072_260": 0, "sub-072_261": 0, "sub-072_262": 0, "sub-072_263": 1, "sub-072_264": 1, "sub-072_265": 0, "sub-072_266": 1, "sub-072_267": 1, "sub-072_268": 1, "sub-072_269": 0, "sub-072_270": 0, "sub-072_271": 1, "sub-072_272": 0, "sub-072_273": 0, "sub-072_274": 1, "sub-072_275": 0, "sub-072_276": 1, "sub-072_277": 0, "sub-072_278": 1, "sub-072_279": 1, "sub-072_280": 1, "sub-072_281": 0, "sub-072_282": 0, "sub-072_283": 1, "sub-072_284": 1, "sub-072_285": 0, "sub-072_286": 1, "sub-072_287": 1, "sub-072_288": 0, "sub-072_289": 0, "sub-072_290": 0, "sub-072_291": 1, "sub-072_292": 0, "sub-072_293": 0, "sub-072_294": 0, "sub-072_295": 1, "sub-072_296": 1, "sub-072_297": 0, "sub-072_298": 0, "sub-072_299": 1, "sub-072_300": 0, "sub-072_301": 1, "sub-072_302": 1, "sub-072_303": 0, "sub-072_304": 0, "sub-072_305": 0, "sub-072_306": 1, "sub-072_307": 0, "sub-072_308": 1, "sub-072_309": 1, "sub-072_310": 0, "sub-072_311": 0, "sub-072_312": 1, "sub-072_313": 1, "sub-072_314": 0, "sub-072_315": 1, "sub-072_316": 0, "sub-072_317": 0, "sub-072_318": 1, "sub-072_319": 1, "sub-072_320": 0, "sub-072_321": 0, "sub-072_322": 1, "sub-072_323": 0, "sub-072_324": 0, "sub-072_325": 0, "sub-072_326": 0, "sub-072_327": 1, "sub-072_328": 0, "sub-072_329": 0, "sub-072_330": 0, "sub-072_331": 0, "sub-072_332": 1, "sub-072_333": 1, "sub-072_334": 1, "sub-072_335": 0, "sub-072_336": 0, "sub-072_337": 0, "sub-072_338": 0, "sub-072_339": 1, "sub-072_340": 0, "sub-072_341": 1, "sub-072_342": 0, "sub-072_343": 1, "sub-072_344": 0, "sub-072_345": 1, "sub-072_346": 1, "sub-072_347": 1, "sub-072_348": 0, "sub-072_349": 0, "sub-072_350": 1, "sub-072_351": 1, "sub-072_352": 0, "sub-072_353": 0, "sub-072_354": 0, "sub-072_355": 0, "sub-072_356": 0, "sub-072_357": 1, "sub-072_358": 1, "sub-072_359": 1, "sub-072_360": 0, "sub-072_361": 1, "sub-072_362": 0, "sub-072_363": 0, "sub-072_364": 1, "sub-072_365": 0, "sub-072_366": 0, "sub-072_367": 0, "sub-072_368": 1, "sub-072_369": 1, "sub-072_370": 1, "sub-072_371": 0, "sub-072_372": 1, "sub-072_373": 0, "sub-072_374": 1, "sub-072_375": 1, "sub-072_376": 0, "sub-072_377": 0, "sub-072_378": 1, "sub-072_379": 1, "sub-072_380": 0, "sub-072_381": 1, "sub-072_382": 1, "sub-072_383": 0, "sub-072_384": 1, "sub-072_385": 0, "sub-072_386": 1, "sub-072_387": 0, "sub-072_388": 0, "sub-072_389": 0, "sub-072_390": 0, "sub-072_391": 0, "sub-072_392": 1, "sub-072_393": 0, "sub-072_394": 0, "sub-072_395": 0, "sub-072_396": 0, "sub-072_397": 1, "sub-072_398": 0, "sub-072_399": 1, "sub-072_400": 0, "sub-072_401": 1, "sub-072_402": 0, "sub-072_403": 1, "sub-072_404": 1, "sub-072_405": 1, "sub-072_406": 0, "sub-072_407": 0, "sub-072_408": 1, "sub-072_409": 1, "sub-072_410": 0, "sub-072_411": 0, "sub-072_412": 0, "sub-072_413": 0, "sub-072_414": 0, "sub-072_415": 1, "sub-072_416": 1, "sub-072_417": 1, "sub-072_418": 0, "sub-072_419": 1, "sub-072_420": 0, "sub-072_421": 0, "sub-072_422": 1, "sub-072_423": 0, "sub-072_424": 0, "sub-072_425": 0, "sub-072_426": 1, "sub-072_427": 1, "sub-072_428": 1, "sub-072_429": 0, "sub-072_430": 1, "sub-072_431": 0, "sub-072_432": 1, "sub-072_433": 1, "sub-072_434": 0, "sub-072_435": 0, "sub-072_436": 1, "sub-072_437": 1, "sub-072_438": 0, "sub-072_439": 1, "sub-072_440": 1, "sub-072_441": 0, "sub-072_442": 1, "sub-072_443": 0, "sub-072_444": 1, "sub-072_445": 0, "sub-072_446": 0, "sub-072_447": 0, "sub-072_448": 0, "sub-072_449": 0, "sub-072_450": 0, "sub-072_451": 0, "sub-072_452": 1, "sub-072_453": 1, "sub-072_454": 0, "sub-072_455": 1, "sub-072_456": 1, "sub-072_457": 1, "sub-072_458": 0, "sub-072_459": 0, "sub-072_460": 1, "sub-072_461": 0, "sub-072_462": 0, "sub-072_463": 1, "sub-072_464": 0, "sub-072_465": 1, "sub-072_466": 0, "sub-072_467": 1, "sub-072_468": 1, "sub-072_469": 1, "sub-072_470": 0, "sub-072_471": 0, "sub-072_472": 1, "sub-072_473": 1, "sub-072_474": 0, "sub-072_475": 1, "sub-072_476": 1, "sub-072_477": 0, "sub-072_478": 0, "sub-072_479": 0, "sub-072_480": 1, "sub-072_481": 0, "sub-072_482": 0, "sub-072_483": 0, "sub-072_484": 1, "sub-072_485": 1, "sub-072_486": 0, "sub-072_487": 0, "sub-072_488": 1, "sub-072_489": 0, "sub-072_490": 1, "sub-072_491": 1, "sub-072_492": 0, "sub-072_493": 0, "sub-072_494": 0, "sub-072_495": 1, "sub-072_496": 0, "sub-072_497": 1, "sub-072_498": 1, "sub-072_499": 0, "sub-072_500": 0, "sub-072_501": 1, "sub-072_502": 1, "sub-072_503": 0, "sub-072_504": 1, "sub-072_505": 0, "sub-072_506": 0, "sub-072_507": 1, "sub-072_508": 1, "sub-072_509": 1, "sub-072_510": 0, "sub-072_511": 0, "sub-072_512": 0, "sub-072_513": 0, "sub-072_514": 1, "sub-072_515": 0, "sub-072_516": 1, "sub-072_517": 0, "sub-072_518": 1, "sub-072_519": 0, "sub-072_520": 1, "sub-072_521": 1, "sub-072_522": 1, "sub-072_523": 0, "sub-072_524": 0, "sub-072_525": 1, "sub-072_526": 1, "sub-072_527": 0, "sub-072_528": 0, "sub-072_529": 0, "sub-072_530": 0, "sub-072_531": 0, "sub-072_532": 1, "sub-072_533": 1, "sub-072_534": 1, "sub-072_535": 0, "sub-072_536": 1, "sub-072_537": 0, "sub-072_538": 0, "sub-072_539": 1, "sub-072_540": 0, "sub-072_541": 0, "sub-072_542": 0, "sub-072_543": 1, "sub-072_544": 1, "sub-072_545": 1, "sub-072_546": 0, "sub-072_547": 1, "sub-072_548": 0, "sub-072_549": 1, "sub-072_550": 1, "sub-072_551": 0, "sub-072_552": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-073.json: -------------------------------------------------------------------------------- 1 | {"sub-073_0": 1, "sub-073_1": 0, "sub-073_2": 0, "sub-073_3": 0, "sub-073_4": 0, "sub-073_5": 1, "sub-073_6": 0, "sub-073_7": 1, "sub-073_8": 0, "sub-073_9": 1, "sub-073_10": 0, "sub-073_11": 1, "sub-073_12": 1, "sub-073_13": 1, "sub-073_14": 0, "sub-073_15": 0, "sub-073_16": 1, "sub-073_17": 1, "sub-073_18": 0, "sub-073_19": 0, "sub-073_20": 0, "sub-073_21": 0, "sub-073_22": 0, "sub-073_23": 1, "sub-073_24": 1, "sub-073_25": 1, "sub-073_26": 0, "sub-073_27": 1, "sub-073_28": 0, "sub-073_29": 0, "sub-073_30": 1, "sub-073_31": 0, "sub-073_32": 0, "sub-073_33": 0, "sub-073_34": 1, "sub-073_35": 1, "sub-073_36": 1, "sub-073_37": 0, "sub-073_38": 1, "sub-073_39": 0, "sub-073_40": 1, "sub-073_41": 1, "sub-073_42": 0, "sub-073_43": 0, "sub-073_44": 1, "sub-073_45": 1, "sub-073_46": 0, "sub-073_47": 1, "sub-073_48": 1, "sub-073_49": 0, "sub-073_50": 1, "sub-073_51": 0, "sub-073_52": 1, "sub-073_53": 0, "sub-073_54": 0, "sub-073_55": 0, "sub-073_56": 0, "sub-073_57": 0, "sub-073_58": 0, "sub-073_59": 0, "sub-073_60": 1, "sub-073_61": 1, "sub-073_62": 0, "sub-073_63": 1, "sub-073_64": 1, "sub-073_65": 1, "sub-073_66": 0, "sub-073_67": 0, "sub-073_68": 1, "sub-073_69": 0, "sub-073_70": 0, "sub-073_71": 1, "sub-073_72": 0, "sub-073_73": 1, "sub-073_74": 0, "sub-073_75": 1, "sub-073_76": 1, "sub-073_77": 1, "sub-073_78": 0, "sub-073_79": 0, "sub-073_80": 1, "sub-073_81": 1, "sub-073_82": 0, "sub-073_83": 1, "sub-073_84": 1, "sub-073_85": 0, "sub-073_86": 0, "sub-073_87": 0, "sub-073_88": 1, "sub-073_89": 0, "sub-073_90": 0, "sub-073_91": 0, "sub-073_92": 1, "sub-073_93": 1, "sub-073_94": 0, "sub-073_95": 0, "sub-073_96": 1, "sub-073_97": 0, "sub-073_98": 1, "sub-073_99": 1, "sub-073_100": 0, "sub-073_101": 0, "sub-073_102": 0, "sub-073_103": 1, "sub-073_104": 0, "sub-073_105": 1, "sub-073_106": 1, "sub-073_107": 0, "sub-073_108": 0, "sub-073_109": 1, "sub-073_110": 1, "sub-073_111": 0, "sub-073_112": 1, "sub-073_113": 0, "sub-073_114": 0, "sub-073_115": 1, "sub-073_116": 1, "sub-073_117": 0, "sub-073_118": 0, "sub-073_119": 1, "sub-073_120": 0, "sub-073_121": 0, "sub-073_122": 0, "sub-073_123": 0, "sub-073_124": 1, "sub-073_125": 0, "sub-073_126": 0, "sub-073_127": 0, "sub-073_128": 0, "sub-073_129": 1, "sub-073_130": 1, "sub-073_131": 1, "sub-073_132": 0, "sub-073_133": 0, "sub-073_134": 0, "sub-073_135": 0, "sub-073_136": 1, "sub-073_137": 0, "sub-073_138": 1, "sub-073_139": 0, "sub-073_140": 1, "sub-073_141": 0, "sub-073_142": 1, "sub-073_143": 1, "sub-073_144": 1, "sub-073_145": 0, "sub-073_146": 0, "sub-073_147": 1, "sub-073_148": 1, "sub-073_149": 0, "sub-073_150": 0, "sub-073_151": 0, "sub-073_152": 0, "sub-073_153": 0, "sub-073_154": 1, "sub-073_155": 1, "sub-073_156": 1, "sub-073_157": 0, "sub-073_158": 1, "sub-073_159": 0, "sub-073_160": 0, "sub-073_161": 1, "sub-073_162": 0, "sub-073_163": 0, "sub-073_164": 0, "sub-073_165": 1, "sub-073_166": 1, "sub-073_167": 1, "sub-073_168": 0, "sub-073_169": 1, "sub-073_170": 0, "sub-073_171": 1, "sub-073_172": 1, "sub-073_173": 0, "sub-073_174": 0, "sub-073_175": 1, "sub-073_176": 1, "sub-073_177": 0, "sub-073_178": 1, "sub-073_179": 1, "sub-073_180": 0, "sub-073_181": 1, "sub-073_182": 0, "sub-073_183": 1, "sub-073_184": 0, "sub-073_185": 0, "sub-073_186": 0, "sub-073_187": 0, "sub-073_188": 0, "sub-073_189": 0, "sub-073_190": 0, "sub-073_191": 1, "sub-073_192": 1, "sub-073_193": 0, "sub-073_194": 1, "sub-073_195": 1, "sub-073_196": 1, "sub-073_197": 0, "sub-073_198": 0, "sub-073_199": 1, "sub-073_200": 0, "sub-073_201": 0, "sub-073_202": 1, "sub-073_203": 0, "sub-073_204": 1, "sub-073_205": 0, "sub-073_206": 1, "sub-073_207": 1, "sub-073_208": 1, "sub-073_209": 0, "sub-073_210": 0, "sub-073_211": 1, "sub-073_212": 1, "sub-073_213": 0, "sub-073_214": 1, "sub-073_215": 1, "sub-073_216": 0, "sub-073_217": 0, "sub-073_218": 0, "sub-073_219": 1, "sub-073_220": 0, "sub-073_221": 0, "sub-073_222": 0, "sub-073_223": 1, "sub-073_224": 1, "sub-073_225": 0, "sub-073_226": 0, "sub-073_227": 1, "sub-073_228": 0, "sub-073_229": 1, "sub-073_230": 1, "sub-073_231": 0, "sub-073_232": 0, "sub-073_233": 0, "sub-073_234": 1, "sub-073_235": 0, "sub-073_236": 1, "sub-073_237": 1, "sub-073_238": 0, "sub-073_239": 0, "sub-073_240": 1, "sub-073_241": 1, "sub-073_242": 0, "sub-073_243": 1, "sub-073_244": 0, "sub-073_245": 0, "sub-073_246": 1, "sub-073_247": 1, "sub-073_248": 1, "sub-073_249": 0, "sub-073_250": 0, "sub-073_251": 0, "sub-073_252": 0, "sub-073_253": 1, "sub-073_254": 0, "sub-073_255": 1, "sub-073_256": 0, "sub-073_257": 1, "sub-073_258": 0, "sub-073_259": 1, "sub-073_260": 1, "sub-073_261": 1, "sub-073_262": 0, "sub-073_263": 0, "sub-073_264": 1, "sub-073_265": 1, "sub-073_266": 0, "sub-073_267": 0, "sub-073_268": 0, "sub-073_269": 0, "sub-073_270": 0, "sub-073_271": 1, "sub-073_272": 1, "sub-073_273": 1, "sub-073_274": 0, "sub-073_275": 1, "sub-073_276": 0, "sub-073_277": 0, "sub-073_278": 1, "sub-073_279": 0, "sub-073_280": 0, "sub-073_281": 0, "sub-073_282": 1, "sub-073_283": 1, "sub-073_284": 1, "sub-073_285": 0, "sub-073_286": 1, "sub-073_287": 0, "sub-073_288": 1, "sub-073_289": 1, "sub-073_290": 0, "sub-073_291": 0, "sub-073_292": 1, "sub-073_293": 1, "sub-073_294": 0, "sub-073_295": 1, "sub-073_296": 1, "sub-073_297": 0, "sub-073_298": 1, "sub-073_299": 0, "sub-073_300": 1, "sub-073_301": 0, "sub-073_302": 0, "sub-073_303": 0, "sub-073_304": 0, "sub-073_305": 0, "sub-073_306": 0, "sub-073_307": 0, "sub-073_308": 1, "sub-073_309": 0, "sub-073_310": 0, "sub-073_311": 0, "sub-073_312": 0, "sub-073_313": 1, "sub-073_314": 0, "sub-073_315": 1, "sub-073_316": 0, "sub-073_317": 1, "sub-073_318": 0, "sub-073_319": 1, "sub-073_320": 1, "sub-073_321": 1, "sub-073_322": 0, "sub-073_323": 0, "sub-073_324": 1, "sub-073_325": 1, "sub-073_326": 0, "sub-073_327": 0, "sub-073_328": 0, "sub-073_329": 0, "sub-073_330": 0, "sub-073_331": 1, "sub-073_332": 1, "sub-073_333": 1, "sub-073_334": 0, "sub-073_335": 1, "sub-073_336": 0, "sub-073_337": 0, "sub-073_338": 1, "sub-073_339": 0, "sub-073_340": 0, "sub-073_341": 0, "sub-073_342": 1, "sub-073_343": 1, "sub-073_344": 1, "sub-073_345": 0, "sub-073_346": 1, "sub-073_347": 0, "sub-073_348": 1, "sub-073_349": 1, "sub-073_350": 0, "sub-073_351": 0, "sub-073_352": 1, "sub-073_353": 0, "sub-073_354": 0, "sub-073_355": 0, "sub-073_356": 0, "sub-073_357": 1, "sub-073_358": 0, "sub-073_359": 1, "sub-073_360": 0, "sub-073_361": 1, "sub-073_362": 0, "sub-073_363": 1, "sub-073_364": 1, "sub-073_365": 1, "sub-073_366": 0, "sub-073_367": 0, "sub-073_368": 1, "sub-073_369": 1, "sub-073_370": 0, "sub-073_371": 0, "sub-073_372": 0, "sub-073_373": 0, "sub-073_374": 0, "sub-073_375": 1, "sub-073_376": 1, "sub-073_377": 1, "sub-073_378": 0, "sub-073_379": 1, "sub-073_380": 0, "sub-073_381": 0, "sub-073_382": 1, "sub-073_383": 0, "sub-073_384": 0, "sub-073_385": 0, "sub-073_386": 1, "sub-073_387": 1, "sub-073_388": 1, "sub-073_389": 0, "sub-073_390": 1, "sub-073_391": 0, "sub-073_392": 1, "sub-073_393": 1, "sub-073_394": 0, "sub-073_395": 0, "sub-073_396": 1, "sub-073_397": 1, "sub-073_398": 0, "sub-073_399": 1, "sub-073_400": 1, "sub-073_401": 0, "sub-073_402": 1, "sub-073_403": 0, "sub-073_404": 1, "sub-073_405": 0, "sub-073_406": 0, "sub-073_407": 0, "sub-073_408": 0, "sub-073_409": 0, "sub-073_410": 1, "sub-073_411": 0, "sub-073_412": 0, "sub-073_413": 0, "sub-073_414": 0, "sub-073_415": 1, "sub-073_416": 0, "sub-073_417": 1, "sub-073_418": 0, "sub-073_419": 1, "sub-073_420": 0, "sub-073_421": 1, "sub-073_422": 1, "sub-073_423": 1, "sub-073_424": 0, "sub-073_425": 0, "sub-073_426": 1, "sub-073_427": 1, "sub-073_428": 0, "sub-073_429": 0, "sub-073_430": 0, "sub-073_431": 0, "sub-073_432": 0, "sub-073_433": 1, "sub-073_434": 1, "sub-073_435": 1, "sub-073_436": 0, "sub-073_437": 1, "sub-073_438": 0, "sub-073_439": 0, "sub-073_440": 1, "sub-073_441": 0, "sub-073_442": 0, "sub-073_443": 0, "sub-073_444": 1, "sub-073_445": 1, "sub-073_446": 1, "sub-073_447": 0, "sub-073_448": 1, "sub-073_449": 0, "sub-073_450": 1, "sub-073_451": 1, "sub-073_452": 0, "sub-073_453": 0, "sub-073_454": 1, "sub-073_455": 1, "sub-073_456": 0, "sub-073_457": 1, "sub-073_458": 1, "sub-073_459": 0, "sub-073_460": 1, "sub-073_461": 0, "sub-073_462": 1, "sub-073_463": 0, "sub-073_464": 0, "sub-073_465": 0, "sub-073_466": 0, "sub-073_467": 0, "sub-073_468": 0, "sub-073_469": 0, "sub-073_470": 1, "sub-073_471": 1, "sub-073_472": 0, "sub-073_473": 1, "sub-073_474": 1, "sub-073_475": 1, "sub-073_476": 0, "sub-073_477": 0, "sub-073_478": 1, "sub-073_479": 0, "sub-073_480": 0, "sub-073_481": 1, "sub-073_482": 0, "sub-073_483": 1, "sub-073_484": 0, "sub-073_485": 1, "sub-073_486": 1, "sub-073_487": 1, "sub-073_488": 0, "sub-073_489": 0, "sub-073_490": 1, "sub-073_491": 1, "sub-073_492": 0, "sub-073_493": 1, "sub-073_494": 1, "sub-073_495": 0, "sub-073_496": 0, "sub-073_497": 0, "sub-073_498": 1, "sub-073_499": 0, "sub-073_500": 0, "sub-073_501": 0, "sub-073_502": 1, "sub-073_503": 1, "sub-073_504": 0, "sub-073_505": 0, "sub-073_506": 1, "sub-073_507": 0, "sub-073_508": 1, "sub-073_509": 1, "sub-073_510": 0, "sub-073_511": 0, "sub-073_512": 0, "sub-073_513": 1, "sub-073_514": 0, "sub-073_515": 1, "sub-073_516": 1, "sub-073_517": 0, "sub-073_518": 0, "sub-073_519": 1, "sub-073_520": 1, "sub-073_521": 0, "sub-073_522": 1, "sub-073_523": 0, "sub-073_524": 0, "sub-073_525": 1, "sub-073_526": 1, "sub-073_527": 0, "sub-073_528": 0, "sub-073_529": 1, "sub-073_530": 0, "sub-073_531": 0, "sub-073_532": 0, "sub-073_533": 0, "sub-073_534": 1, "sub-073_535": 0, "sub-073_536": 0, "sub-073_537": 0, "sub-073_538": 0, "sub-073_539": 1, "sub-073_540": 1, "sub-073_541": 1, "sub-073_542": 1, "sub-073_543": 1, "sub-073_544": 1, "sub-073_545": 1, "sub-073_546": 1, "sub-073_547": 0, "sub-073_548": 0, "sub-073_549": 0, "sub-073_550": 0, "sub-073_551": 0, "sub-073_552": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-074.json: -------------------------------------------------------------------------------- 1 | {"sub-074_0": 1, "sub-074_1": 0, "sub-074_2": 0, "sub-074_3": 0, "sub-074_4": 0, "sub-074_5": 1, "sub-074_6": 0, "sub-074_7": 1, "sub-074_8": 0, "sub-074_9": 1, "sub-074_10": 0, "sub-074_11": 1, "sub-074_12": 1, "sub-074_13": 1, "sub-074_14": 0, "sub-074_15": 0, "sub-074_16": 1, "sub-074_17": 1, "sub-074_18": 0, "sub-074_19": 0, "sub-074_20": 0, "sub-074_21": 0, "sub-074_22": 0, "sub-074_23": 1, "sub-074_24": 1, "sub-074_25": 1, "sub-074_26": 0, "sub-074_27": 1, "sub-074_28": 0, "sub-074_29": 0, "sub-074_30": 1, "sub-074_31": 0, "sub-074_32": 0, "sub-074_33": 0, "sub-074_34": 1, "sub-074_35": 1, "sub-074_36": 1, "sub-074_37": 0, "sub-074_38": 1, "sub-074_39": 0, "sub-074_40": 1, "sub-074_41": 1, "sub-074_42": 0, "sub-074_43": 0, "sub-074_44": 1, "sub-074_45": 1, "sub-074_46": 0, "sub-074_47": 1, "sub-074_48": 1, "sub-074_49": 0, "sub-074_50": 1, "sub-074_51": 0, "sub-074_52": 1, "sub-074_53": 0, "sub-074_54": 0, "sub-074_55": 0, "sub-074_56": 0, "sub-074_57": 0, "sub-074_58": 0, "sub-074_59": 0, "sub-074_60": 1, "sub-074_61": 1, "sub-074_62": 0, "sub-074_63": 1, "sub-074_64": 1, "sub-074_65": 1, "sub-074_66": 0, "sub-074_67": 0, "sub-074_68": 1, "sub-074_69": 0, "sub-074_70": 0, "sub-074_71": 1, "sub-074_72": 0, "sub-074_73": 1, "sub-074_74": 0, "sub-074_75": 1, "sub-074_76": 1, "sub-074_77": 1, "sub-074_78": 0, "sub-074_79": 0, "sub-074_80": 1, "sub-074_81": 1, "sub-074_82": 0, "sub-074_83": 1, "sub-074_84": 1, "sub-074_85": 0, "sub-074_86": 0, "sub-074_87": 0, "sub-074_88": 1, "sub-074_89": 0, "sub-074_90": 0, "sub-074_91": 0, "sub-074_92": 1, "sub-074_93": 1, "sub-074_94": 0, "sub-074_95": 0, "sub-074_96": 1, "sub-074_97": 0, "sub-074_98": 1, "sub-074_99": 1, "sub-074_100": 0, "sub-074_101": 0, "sub-074_102": 0, "sub-074_103": 1, "sub-074_104": 0, "sub-074_105": 1, "sub-074_106": 1, "sub-074_107": 0, "sub-074_108": 0, "sub-074_109": 1, "sub-074_110": 1, "sub-074_111": 0, "sub-074_112": 1, "sub-074_113": 0, "sub-074_114": 0, "sub-074_115": 1, "sub-074_116": 1, "sub-074_117": 0, "sub-074_118": 0, "sub-074_119": 1, "sub-074_120": 0, "sub-074_121": 0, "sub-074_122": 0, "sub-074_123": 0, "sub-074_124": 1, "sub-074_125": 0, "sub-074_126": 0, "sub-074_127": 0, "sub-074_128": 0, "sub-074_129": 1, "sub-074_130": 1, "sub-074_131": 1, "sub-074_132": 0, "sub-074_133": 0, "sub-074_134": 0, "sub-074_135": 0, "sub-074_136": 1, "sub-074_137": 0, "sub-074_138": 1, "sub-074_139": 0, "sub-074_140": 1, "sub-074_141": 0, "sub-074_142": 1, "sub-074_143": 1, "sub-074_144": 1, "sub-074_145": 0, "sub-074_146": 0, "sub-074_147": 1, "sub-074_148": 1, "sub-074_149": 0, "sub-074_150": 0, "sub-074_151": 0, "sub-074_152": 0, "sub-074_153": 0, "sub-074_154": 1, "sub-074_155": 1, "sub-074_156": 1, "sub-074_157": 0, "sub-074_158": 1, "sub-074_159": 0, "sub-074_160": 0, "sub-074_161": 1, "sub-074_162": 0, "sub-074_163": 0, "sub-074_164": 0, "sub-074_165": 1, "sub-074_166": 1, "sub-074_167": 1, "sub-074_168": 0, "sub-074_169": 1, "sub-074_170": 0, "sub-074_171": 1, "sub-074_172": 1, "sub-074_173": 0, "sub-074_174": 0, "sub-074_175": 1, "sub-074_176": 0, "sub-074_177": 0, "sub-074_178": 0, "sub-074_179": 0, "sub-074_180": 1, "sub-074_181": 0, "sub-074_182": 1, "sub-074_183": 0, "sub-074_184": 1, "sub-074_185": 0, "sub-074_186": 1, "sub-074_187": 1, "sub-074_188": 1, "sub-074_189": 0, "sub-074_190": 0, "sub-074_191": 1, "sub-074_192": 1, "sub-074_193": 0, "sub-074_194": 0, "sub-074_195": 0, "sub-074_196": 0, "sub-074_197": 0, "sub-074_198": 1, "sub-074_199": 1, "sub-074_200": 1, "sub-074_201": 0, "sub-074_202": 1, "sub-074_203": 0, "sub-074_204": 0, "sub-074_205": 1, "sub-074_206": 0, "sub-074_207": 0, "sub-074_208": 0, "sub-074_209": 1, "sub-074_210": 1, "sub-074_211": 1, "sub-074_212": 0, "sub-074_213": 1, "sub-074_214": 0, "sub-074_215": 1, "sub-074_216": 1, "sub-074_217": 0, "sub-074_218": 0, "sub-074_219": 1, "sub-074_220": 1, "sub-074_221": 0, "sub-074_222": 1, "sub-074_223": 1, "sub-074_224": 0, "sub-074_225": 1, "sub-074_226": 0, "sub-074_227": 1, "sub-074_228": 0, "sub-074_229": 0, "sub-074_230": 0, "sub-074_231": 0, "sub-074_232": 0, "sub-074_233": 0, "sub-074_234": 0, "sub-074_235": 1, "sub-074_236": 1, "sub-074_237": 0, "sub-074_238": 1, "sub-074_239": 1, "sub-074_240": 1, "sub-074_241": 0, "sub-074_242": 0, "sub-074_243": 1, "sub-074_244": 0, "sub-074_245": 0, "sub-074_246": 1, "sub-074_247": 0, "sub-074_248": 1, "sub-074_249": 0, "sub-074_250": 1, "sub-074_251": 1, "sub-074_252": 1, "sub-074_253": 0, "sub-074_254": 0, "sub-074_255": 1, "sub-074_256": 1, "sub-074_257": 0, "sub-074_258": 1, "sub-074_259": 1, "sub-074_260": 0, "sub-074_261": 0, "sub-074_262": 0, "sub-074_263": 1, "sub-074_264": 0, "sub-074_265": 0, "sub-074_266": 0, "sub-074_267": 1, "sub-074_268": 1, "sub-074_269": 0, "sub-074_270": 0, "sub-074_271": 1, "sub-074_272": 0, "sub-074_273": 1, "sub-074_274": 1, "sub-074_275": 0, "sub-074_276": 0, "sub-074_277": 0, "sub-074_278": 1, "sub-074_279": 0, "sub-074_280": 1, "sub-074_281": 1, "sub-074_282": 0, "sub-074_283": 0, "sub-074_284": 1, "sub-074_285": 1, "sub-074_286": 0, "sub-074_287": 1, "sub-074_288": 0, "sub-074_289": 0, "sub-074_290": 1, "sub-074_291": 1, "sub-074_292": 1, "sub-074_293": 0, "sub-074_294": 0, "sub-074_295": 0, "sub-074_296": 0, "sub-074_297": 1, "sub-074_298": 0, "sub-074_299": 1, "sub-074_300": 0, "sub-074_301": 1, "sub-074_302": 0, "sub-074_303": 1, "sub-074_304": 1, "sub-074_305": 1, "sub-074_306": 0, "sub-074_307": 0, "sub-074_308": 1, "sub-074_309": 1, "sub-074_310": 0, "sub-074_311": 0, "sub-074_312": 0, "sub-074_313": 0, "sub-074_314": 0, "sub-074_315": 1, "sub-074_316": 1, "sub-074_317": 1, "sub-074_318": 0, "sub-074_319": 1, "sub-074_320": 0, "sub-074_321": 0, "sub-074_322": 1, "sub-074_323": 0, "sub-074_324": 0, "sub-074_325": 0, "sub-074_326": 1, "sub-074_327": 1, "sub-074_328": 1, "sub-074_329": 0, "sub-074_330": 1, "sub-074_331": 0, "sub-074_332": 1, "sub-074_333": 1, "sub-074_334": 0, "sub-074_335": 0, "sub-074_336": 1, "sub-074_337": 1, "sub-074_338": 0, "sub-074_339": 1, "sub-074_340": 1, "sub-074_341": 0, "sub-074_342": 1, "sub-074_343": 0, "sub-074_344": 1, "sub-074_345": 0, "sub-074_346": 0, "sub-074_347": 0, "sub-074_348": 0, "sub-074_349": 0, "sub-074_350": 0, "sub-074_351": 0, "sub-074_352": 1, "sub-074_353": 0, "sub-074_354": 0, "sub-074_355": 0, "sub-074_356": 0, "sub-074_357": 1, "sub-074_358": 0, "sub-074_359": 1, "sub-074_360": 0, "sub-074_361": 1, "sub-074_362": 0, "sub-074_363": 1, "sub-074_364": 1, "sub-074_365": 1, "sub-074_366": 0, "sub-074_367": 0, "sub-074_368": 1, "sub-074_369": 1, "sub-074_370": 0, "sub-074_371": 0, "sub-074_372": 0, "sub-074_373": 0, "sub-074_374": 0, "sub-074_375": 1, "sub-074_376": 1, "sub-074_377": 1, "sub-074_378": 0, "sub-074_379": 1, "sub-074_380": 0, "sub-074_381": 0, "sub-074_382": 1, "sub-074_383": 0, "sub-074_384": 0, "sub-074_385": 0, "sub-074_386": 1, "sub-074_387": 1, "sub-074_388": 1, "sub-074_389": 0, "sub-074_390": 1, "sub-074_391": 0, "sub-074_392": 1, "sub-074_393": 1, "sub-074_394": 0, "sub-074_395": 0, "sub-074_396": 1, "sub-074_397": 1, "sub-074_398": 0, "sub-074_399": 1, "sub-074_400": 1, "sub-074_401": 0, "sub-074_402": 1, "sub-074_403": 0, "sub-074_404": 1, "sub-074_405": 0, "sub-074_406": 0, "sub-074_407": 0, "sub-074_408": 0, "sub-074_409": 0, "sub-074_410": 0, "sub-074_411": 0, "sub-074_412": 1, "sub-074_413": 1, "sub-074_414": 0, "sub-074_415": 1, "sub-074_416": 1, "sub-074_417": 1, "sub-074_418": 0, "sub-074_419": 0, "sub-074_420": 1, "sub-074_421": 0, "sub-074_422": 0, "sub-074_423": 1, "sub-074_424": 0, "sub-074_425": 1, "sub-074_426": 0, "sub-074_427": 1, "sub-074_428": 1, "sub-074_429": 1, "sub-074_430": 0, "sub-074_431": 0, "sub-074_432": 1, "sub-074_433": 1, "sub-074_434": 0, "sub-074_435": 1, "sub-074_436": 1, "sub-074_437": 0, "sub-074_438": 0, "sub-074_439": 0, "sub-074_440": 1, "sub-074_441": 0, "sub-074_442": 0, "sub-074_443": 0, "sub-074_444": 1, "sub-074_445": 1, "sub-074_446": 0, "sub-074_447": 0, "sub-074_448": 1, "sub-074_449": 0, "sub-074_450": 1, "sub-074_451": 1, "sub-074_452": 0, "sub-074_453": 0, "sub-074_454": 0, "sub-074_455": 1, "sub-074_456": 0, "sub-074_457": 1, "sub-074_458": 1, "sub-074_459": 0, "sub-074_460": 0, "sub-074_461": 1, "sub-074_462": 1, "sub-074_463": 0, "sub-074_464": 1, "sub-074_465": 0, "sub-074_466": 0, "sub-074_467": 1, "sub-074_468": 1, "sub-074_469": 0, "sub-074_470": 0, "sub-074_471": 1, "sub-074_472": 0, "sub-074_473": 0, "sub-074_474": 0, "sub-074_475": 0, "sub-074_476": 1, "sub-074_477": 0, "sub-074_478": 0, "sub-074_479": 0, "sub-074_480": 0, "sub-074_481": 1, "sub-074_482": 1, "sub-074_483": 1, "sub-074_484": 1, "sub-074_485": 1, "sub-074_486": 1, "sub-074_487": 1, "sub-074_488": 1, "sub-074_489": 0, "sub-074_490": 0, "sub-074_491": 0, "sub-074_492": 0, "sub-074_493": 0, "sub-074_494": 1, "sub-074_495": 1, "sub-074_496": 0, "sub-074_497": 0, "sub-074_498": 0, "sub-074_499": 0, "sub-074_500": 1, "sub-074_501": 0, "sub-074_502": 1, "sub-074_503": 0, "sub-074_504": 1, "sub-074_505": 0, "sub-074_506": 1, "sub-074_507": 1, "sub-074_508": 1, "sub-074_509": 0, "sub-074_510": 0, "sub-074_511": 1, "sub-074_512": 1, "sub-074_513": 0, "sub-074_514": 0, "sub-074_515": 0, "sub-074_516": 0, "sub-074_517": 0, "sub-074_518": 1, "sub-074_519": 1, "sub-074_520": 1, "sub-074_521": 0, "sub-074_522": 1, "sub-074_523": 0, "sub-074_524": 0, "sub-074_525": 1, "sub-074_526": 0, "sub-074_527": 0, "sub-074_528": 0, "sub-074_529": 1, "sub-074_530": 1, "sub-074_531": 1, "sub-074_532": 0, "sub-074_533": 1, "sub-074_534": 0, "sub-074_535": 1, "sub-074_536": 1, "sub-074_537": 0, "sub-074_538": 0, "sub-074_539": 1, "sub-074_540": 1, "sub-074_541": 0, "sub-074_542": 1, "sub-074_543": 1, "sub-074_544": 0, "sub-074_545": 1, "sub-074_546": 0, "sub-074_547": 1, "sub-074_548": 0, "sub-074_549": 0, "sub-074_550": 0, "sub-074_551": 0, "sub-074_552": 0} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-075.json: -------------------------------------------------------------------------------- 1 | {"sub-075_0": 1, "sub-075_1": 0, "sub-075_2": 0, "sub-075_3": 0, "sub-075_4": 0, "sub-075_5": 1, "sub-075_6": 0, "sub-075_7": 1, "sub-075_8": 0, "sub-075_9": 1, "sub-075_10": 0, "sub-075_11": 1, "sub-075_12": 1, "sub-075_13": 1, "sub-075_14": 0, "sub-075_15": 0, "sub-075_16": 1, "sub-075_17": 1, "sub-075_18": 0, "sub-075_19": 0, "sub-075_20": 0, "sub-075_21": 0, "sub-075_22": 0, "sub-075_23": 1, "sub-075_24": 1, "sub-075_25": 1, "sub-075_26": 0, "sub-075_27": 1, "sub-075_28": 0, "sub-075_29": 0, "sub-075_30": 1, "sub-075_31": 0, "sub-075_32": 0, "sub-075_33": 0, "sub-075_34": 1, "sub-075_35": 1, "sub-075_36": 1, "sub-075_37": 0, "sub-075_38": 1, "sub-075_39": 0, "sub-075_40": 1, "sub-075_41": 1, "sub-075_42": 0, "sub-075_43": 0, "sub-075_44": 1, "sub-075_45": 0, "sub-075_46": 0, "sub-075_47": 0, "sub-075_48": 0, "sub-075_49": 1, "sub-075_50": 0, "sub-075_51": 1, "sub-075_52": 0, "sub-075_53": 1, "sub-075_54": 0, "sub-075_55": 1, "sub-075_56": 1, "sub-075_57": 1, "sub-075_58": 0, "sub-075_59": 0, "sub-075_60": 1, "sub-075_61": 1, "sub-075_62": 0, "sub-075_63": 0, "sub-075_64": 0, "sub-075_65": 0, "sub-075_66": 0, "sub-075_67": 1, "sub-075_68": 1, "sub-075_69": 1, "sub-075_70": 0, "sub-075_71": 1, "sub-075_72": 0, "sub-075_73": 0, "sub-075_74": 1, "sub-075_75": 0, "sub-075_76": 0, "sub-075_77": 0, "sub-075_78": 1, "sub-075_79": 1, "sub-075_80": 1, "sub-075_81": 0, "sub-075_82": 1, "sub-075_83": 0, "sub-075_84": 1, "sub-075_85": 1, "sub-075_86": 0, "sub-075_87": 0, "sub-075_88": 1, "sub-075_89": 1, "sub-075_90": 0, "sub-075_91": 1, "sub-075_92": 1, "sub-075_93": 0, "sub-075_94": 1, "sub-075_95": 0, "sub-075_96": 1, "sub-075_97": 0, "sub-075_98": 0, "sub-075_99": 0, "sub-075_100": 0, "sub-075_101": 0, "sub-075_102": 1, "sub-075_103": 0, "sub-075_104": 0, "sub-075_105": 0, "sub-075_106": 0, "sub-075_107": 1, "sub-075_108": 0, "sub-075_109": 1, "sub-075_110": 0, "sub-075_111": 1, "sub-075_112": 0, "sub-075_113": 1, "sub-075_114": 1, "sub-075_115": 1, "sub-075_116": 0, "sub-075_117": 0, "sub-075_118": 1, "sub-075_119": 1, "sub-075_120": 0, "sub-075_121": 0, "sub-075_122": 0, "sub-075_123": 0, "sub-075_124": 0, "sub-075_125": 1, "sub-075_126": 1, "sub-075_127": 1, "sub-075_128": 0, "sub-075_129": 1, "sub-075_130": 0, "sub-075_131": 0, "sub-075_132": 1, "sub-075_133": 0, "sub-075_134": 0, "sub-075_135": 0, "sub-075_136": 1, "sub-075_137": 1, "sub-075_138": 1, "sub-075_139": 0, "sub-075_140": 1, "sub-075_141": 0, "sub-075_142": 1, "sub-075_143": 1, "sub-075_144": 0, "sub-075_145": 0, "sub-075_146": 1, "sub-075_147": 1, "sub-075_148": 0, "sub-075_149": 1, "sub-075_150": 1, "sub-075_151": 0, "sub-075_152": 1, "sub-075_153": 0, "sub-075_154": 1, "sub-075_155": 0, "sub-075_156": 0, "sub-075_157": 0, "sub-075_158": 0, "sub-075_159": 0, "sub-075_160": 0, "sub-075_161": 0, "sub-075_162": 1, "sub-075_163": 0, "sub-075_164": 0, "sub-075_165": 0, "sub-075_166": 0, "sub-075_167": 1, "sub-075_168": 0, "sub-075_169": 1, "sub-075_170": 0, "sub-075_171": 1, "sub-075_172": 0, "sub-075_173": 1, "sub-075_174": 1, "sub-075_175": 1, "sub-075_176": 0, "sub-075_177": 0, "sub-075_178": 1, "sub-075_179": 1, "sub-075_180": 0, "sub-075_181": 0, "sub-075_182": 0, "sub-075_183": 0, "sub-075_184": 0, "sub-075_185": 1, "sub-075_186": 1, "sub-075_187": 1, "sub-075_188": 0, "sub-075_189": 1, "sub-075_190": 0, "sub-075_191": 0, "sub-075_192": 1, "sub-075_193": 0, "sub-075_194": 0, "sub-075_195": 0, "sub-075_196": 1, "sub-075_197": 1, "sub-075_198": 1, "sub-075_199": 0, "sub-075_200": 1, "sub-075_201": 0, "sub-075_202": 1, "sub-075_203": 1, "sub-075_204": 0, "sub-075_205": 0, "sub-075_206": 1, "sub-075_207": 1, "sub-075_208": 0, "sub-075_209": 1, "sub-075_210": 1, "sub-075_211": 0, "sub-075_212": 1, "sub-075_213": 0, "sub-075_214": 1, "sub-075_215": 0, "sub-075_216": 0, "sub-075_217": 0, "sub-075_218": 0, "sub-075_219": 0, "sub-075_220": 0, "sub-075_221": 0, "sub-075_222": 1, "sub-075_223": 1, "sub-075_224": 0, "sub-075_225": 1, "sub-075_226": 1, "sub-075_227": 1, "sub-075_228": 0, "sub-075_229": 0, "sub-075_230": 1, "sub-075_231": 0, "sub-075_232": 0, "sub-075_233": 1, "sub-075_234": 0, "sub-075_235": 1, "sub-075_236": 0, "sub-075_237": 1, "sub-075_238": 1, "sub-075_239": 1, "sub-075_240": 0, "sub-075_241": 0, "sub-075_242": 1, "sub-075_243": 1, "sub-075_244": 0, "sub-075_245": 1, "sub-075_246": 1, "sub-075_247": 0, "sub-075_248": 0, "sub-075_249": 0, "sub-075_250": 1, "sub-075_251": 0, "sub-075_252": 0, "sub-075_253": 0, "sub-075_254": 1, "sub-075_255": 1, "sub-075_256": 0, "sub-075_257": 0, "sub-075_258": 1, "sub-075_259": 0, "sub-075_260": 1, "sub-075_261": 1, "sub-075_262": 0, "sub-075_263": 0, "sub-075_264": 0, "sub-075_265": 1, "sub-075_266": 0, "sub-075_267": 1, "sub-075_268": 1, "sub-075_269": 0, "sub-075_270": 0, "sub-075_271": 1, "sub-075_272": 1, "sub-075_273": 0, "sub-075_274": 1, "sub-075_275": 0, "sub-075_276": 0, "sub-075_277": 1, "sub-075_278": 1, "sub-075_279": 0, "sub-075_280": 0, "sub-075_281": 1, "sub-075_282": 0, "sub-075_283": 0, "sub-075_284": 0, "sub-075_285": 0, "sub-075_286": 1, "sub-075_287": 0, "sub-075_288": 0, "sub-075_289": 0, "sub-075_290": 0, "sub-075_291": 1, "sub-075_292": 1, "sub-075_293": 1, "sub-075_294": 0, "sub-075_295": 0, "sub-075_296": 0, "sub-075_297": 0, "sub-075_298": 1, "sub-075_299": 0, "sub-075_300": 1, "sub-075_301": 0, "sub-075_302": 1, "sub-075_303": 0, "sub-075_304": 1, "sub-075_305": 1, "sub-075_306": 1, "sub-075_307": 0, "sub-075_308": 0, "sub-075_309": 1, "sub-075_310": 1, "sub-075_311": 0, "sub-075_312": 0, "sub-075_313": 0, "sub-075_314": 0, "sub-075_315": 0, "sub-075_316": 1, "sub-075_317": 1, "sub-075_318": 1, "sub-075_319": 0, "sub-075_320": 1, "sub-075_321": 0, "sub-075_322": 0, "sub-075_323": 1, "sub-075_324": 0, "sub-075_325": 0, "sub-075_326": 0, "sub-075_327": 1, "sub-075_328": 1, "sub-075_329": 1, "sub-075_330": 0, "sub-075_331": 1, "sub-075_332": 0, "sub-075_333": 1, "sub-075_334": 1, "sub-075_335": 0, "sub-075_336": 0, "sub-075_337": 1, "sub-075_338": 1, "sub-075_339": 0, "sub-075_340": 1, "sub-075_341": 1, "sub-075_342": 0, "sub-075_343": 1, "sub-075_344": 0, "sub-075_345": 1, "sub-075_346": 0, "sub-075_347": 0, "sub-075_348": 0, "sub-075_349": 0, "sub-075_350": 0, "sub-075_351": 0, "sub-075_352": 0, "sub-075_353": 1, "sub-075_354": 1, "sub-075_355": 0, "sub-075_356": 1, "sub-075_357": 1, "sub-075_358": 1, "sub-075_359": 0, "sub-075_360": 0, "sub-075_361": 1, "sub-075_362": 0, "sub-075_363": 0, "sub-075_364": 1, "sub-075_365": 0, "sub-075_366": 1, "sub-075_367": 0, "sub-075_368": 1, "sub-075_369": 1, "sub-075_370": 1, "sub-075_371": 0, "sub-075_372": 0, "sub-075_373": 1, "sub-075_374": 1, "sub-075_375": 0, "sub-075_376": 1, "sub-075_377": 1, "sub-075_378": 0, "sub-075_379": 0, "sub-075_380": 0, "sub-075_381": 1, "sub-075_382": 0, "sub-075_383": 0, "sub-075_384": 0, "sub-075_385": 1, "sub-075_386": 1, "sub-075_387": 0, "sub-075_388": 0, "sub-075_389": 1, "sub-075_390": 0, "sub-075_391": 1, "sub-075_392": 1, "sub-075_393": 0, "sub-075_394": 0, "sub-075_395": 0, "sub-075_396": 1, "sub-075_397": 0, "sub-075_398": 1, "sub-075_399": 1, "sub-075_400": 0, "sub-075_401": 0, "sub-075_402": 1, "sub-075_403": 1, "sub-075_404": 0, "sub-075_405": 1, "sub-075_406": 0, "sub-075_407": 0, "sub-075_408": 1, "sub-075_409": 1, "sub-075_410": 1, "sub-075_411": 0, "sub-075_412": 0, "sub-075_413": 0, "sub-075_414": 0, "sub-075_415": 1, "sub-075_416": 0, "sub-075_417": 1, "sub-075_418": 0, "sub-075_419": 1, "sub-075_420": 0, "sub-075_421": 1, "sub-075_422": 1, "sub-075_423": 1, "sub-075_424": 0, "sub-075_425": 0, "sub-075_426": 1, "sub-075_427": 1, "sub-075_428": 0, "sub-075_429": 0, "sub-075_430": 0, "sub-075_431": 0, "sub-075_432": 0, "sub-075_433": 1, "sub-075_434": 1, "sub-075_435": 1, "sub-075_436": 0, "sub-075_437": 1, "sub-075_438": 0, "sub-075_439": 0, "sub-075_440": 1, "sub-075_441": 0, "sub-075_442": 0, "sub-075_443": 0, "sub-075_444": 1, "sub-075_445": 1, "sub-075_446": 1, "sub-075_447": 0, "sub-075_448": 1, "sub-075_449": 0, "sub-075_450": 1, "sub-075_451": 1, "sub-075_452": 0, "sub-075_453": 0, "sub-075_454": 1, "sub-075_455": 1, "sub-075_456": 0, "sub-075_457": 1, "sub-075_458": 1, "sub-075_459": 0, "sub-075_460": 1, "sub-075_461": 0, "sub-075_462": 1, "sub-075_463": 0, "sub-075_464": 0, "sub-075_465": 0, "sub-075_466": 0, "sub-075_467": 0, "sub-075_468": 0, "sub-075_469": 0, "sub-075_470": 1, "sub-075_471": 1, "sub-075_472": 0, "sub-075_473": 1, "sub-075_474": 1, "sub-075_475": 1, "sub-075_476": 0, "sub-075_477": 0, "sub-075_478": 1, "sub-075_479": 0, "sub-075_480": 0, "sub-075_481": 1, "sub-075_482": 0, "sub-075_483": 1, "sub-075_484": 0, "sub-075_485": 1, "sub-075_486": 1, "sub-075_487": 1, "sub-075_488": 0, "sub-075_489": 0, "sub-075_490": 1, "sub-075_491": 1, "sub-075_492": 0, "sub-075_493": 1, "sub-075_494": 1, "sub-075_495": 0, "sub-075_496": 0, "sub-075_497": 0, "sub-075_498": 1, "sub-075_499": 0, "sub-075_500": 0, "sub-075_501": 0, "sub-075_502": 1, "sub-075_503": 1, "sub-075_504": 0, "sub-075_505": 0, "sub-075_506": 1, "sub-075_507": 0, "sub-075_508": 1, "sub-075_509": 1, "sub-075_510": 0, "sub-075_511": 0, "sub-075_512": 0, "sub-075_513": 1, "sub-075_514": 0, "sub-075_515": 1, "sub-075_516": 1, "sub-075_517": 0, "sub-075_518": 0, "sub-075_519": 1, "sub-075_520": 1, "sub-075_521": 0, "sub-075_522": 1, "sub-075_523": 0, "sub-075_524": 0, "sub-075_525": 1, "sub-075_526": 1, "sub-075_527": 0, "sub-075_528": 0, "sub-075_529": 1, "sub-075_530": 0, "sub-075_531": 0, "sub-075_532": 0, "sub-075_533": 0, "sub-075_534": 1, "sub-075_535": 0, "sub-075_536": 0, "sub-075_537": 0, "sub-075_538": 0, "sub-075_539": 1, "sub-075_540": 1, "sub-075_541": 1, "sub-075_542": 1, "sub-075_543": 1, "sub-075_544": 1, "sub-075_545": 1, "sub-075_546": 1, "sub-075_547": 0, "sub-075_548": 0, "sub-075_549": 0, "sub-075_550": 0, "sub-075_551": 0, "sub-075_552": 1} -------------------------------------------------------------------------------- /test_scripts/labels_match_mismatch/sub-076.json: -------------------------------------------------------------------------------- 1 | {"sub-076_0": 1, "sub-076_1": 0, "sub-076_2": 0, "sub-076_3": 0, "sub-076_4": 0, "sub-076_5": 1, "sub-076_6": 0, "sub-076_7": 1, "sub-076_8": 0, "sub-076_9": 1, "sub-076_10": 0, "sub-076_11": 1, "sub-076_12": 1, "sub-076_13": 1, "sub-076_14": 0, "sub-076_15": 0, "sub-076_16": 1, "sub-076_17": 1, "sub-076_18": 0, "sub-076_19": 0, "sub-076_20": 0, "sub-076_21": 0, "sub-076_22": 0, "sub-076_23": 1, "sub-076_24": 1, "sub-076_25": 1, "sub-076_26": 0, "sub-076_27": 1, "sub-076_28": 0, "sub-076_29": 0, "sub-076_30": 1, "sub-076_31": 0, "sub-076_32": 0, "sub-076_33": 0, "sub-076_34": 1, "sub-076_35": 1, "sub-076_36": 1, "sub-076_37": 0, "sub-076_38": 1, "sub-076_39": 0, "sub-076_40": 1, "sub-076_41": 1, "sub-076_42": 0, "sub-076_43": 0, "sub-076_44": 1, "sub-076_45": 0, "sub-076_46": 0, "sub-076_47": 0, "sub-076_48": 0, "sub-076_49": 1, "sub-076_50": 0, "sub-076_51": 1, "sub-076_52": 0, "sub-076_53": 1, "sub-076_54": 0, "sub-076_55": 1, "sub-076_56": 1, "sub-076_57": 1, "sub-076_58": 0, "sub-076_59": 0, "sub-076_60": 1, "sub-076_61": 1, "sub-076_62": 0, "sub-076_63": 0, "sub-076_64": 0, "sub-076_65": 0, "sub-076_66": 0, "sub-076_67": 1, "sub-076_68": 1, "sub-076_69": 1, "sub-076_70": 0, "sub-076_71": 1, "sub-076_72": 0, "sub-076_73": 0, "sub-076_74": 1, "sub-076_75": 0, "sub-076_76": 0, "sub-076_77": 0, "sub-076_78": 1, "sub-076_79": 1, "sub-076_80": 1, "sub-076_81": 0, "sub-076_82": 1, "sub-076_83": 0, "sub-076_84": 1, "sub-076_85": 1, "sub-076_86": 0, "sub-076_87": 0, "sub-076_88": 1, "sub-076_89": 1, "sub-076_90": 0, "sub-076_91": 1, "sub-076_92": 1, "sub-076_93": 0, "sub-076_94": 1, "sub-076_95": 0, "sub-076_96": 1, "sub-076_97": 0, "sub-076_98": 0, "sub-076_99": 0, "sub-076_100": 0, "sub-076_101": 0, "sub-076_102": 0, "sub-076_103": 0, "sub-076_104": 1, "sub-076_105": 0, "sub-076_106": 0, "sub-076_107": 0, "sub-076_108": 0, "sub-076_109": 1, "sub-076_110": 0, "sub-076_111": 1, "sub-076_112": 0, "sub-076_113": 1, "sub-076_114": 0, "sub-076_115": 1, "sub-076_116": 1, "sub-076_117": 1, "sub-076_118": 0, "sub-076_119": 0, "sub-076_120": 1, "sub-076_121": 1, "sub-076_122": 0, "sub-076_123": 0, "sub-076_124": 0, "sub-076_125": 0, "sub-076_126": 0, "sub-076_127": 1, "sub-076_128": 1, "sub-076_129": 1, "sub-076_130": 0, "sub-076_131": 1, "sub-076_132": 0, "sub-076_133": 0, "sub-076_134": 1, "sub-076_135": 0, "sub-076_136": 0, "sub-076_137": 0, "sub-076_138": 1, "sub-076_139": 1, "sub-076_140": 1, "sub-076_141": 0, "sub-076_142": 1, "sub-076_143": 0, "sub-076_144": 1, "sub-076_145": 1, "sub-076_146": 0, "sub-076_147": 0, "sub-076_148": 1, "sub-076_149": 1, "sub-076_150": 0, "sub-076_151": 1, "sub-076_152": 1, "sub-076_153": 0, "sub-076_154": 1, "sub-076_155": 0, "sub-076_156": 1, "sub-076_157": 0, "sub-076_158": 0, "sub-076_159": 0, "sub-076_160": 0, "sub-076_161": 0, "sub-076_162": 1, "sub-076_163": 0, "sub-076_164": 0, "sub-076_165": 0, "sub-076_166": 0, "sub-076_167": 1, "sub-076_168": 0, "sub-076_169": 1, "sub-076_170": 0, "sub-076_171": 1, "sub-076_172": 0, "sub-076_173": 1, "sub-076_174": 1, "sub-076_175": 1, "sub-076_176": 0, "sub-076_177": 0, "sub-076_178": 1, "sub-076_179": 1, "sub-076_180": 0, "sub-076_181": 0, "sub-076_182": 0, "sub-076_183": 0, "sub-076_184": 0, "sub-076_185": 1, "sub-076_186": 1, "sub-076_187": 1, "sub-076_188": 0, "sub-076_189": 1, "sub-076_190": 0, "sub-076_191": 0, "sub-076_192": 1, "sub-076_193": 0, "sub-076_194": 0, "sub-076_195": 0, "sub-076_196": 1, "sub-076_197": 1, "sub-076_198": 1, "sub-076_199": 0, "sub-076_200": 1, "sub-076_201": 0, "sub-076_202": 1, "sub-076_203": 1, "sub-076_204": 0, "sub-076_205": 0, "sub-076_206": 1, "sub-076_207": 1, "sub-076_208": 0, "sub-076_209": 1, "sub-076_210": 1, "sub-076_211": 0, "sub-076_212": 1, "sub-076_213": 0, "sub-076_214": 1, "sub-076_215": 0, "sub-076_216": 0, "sub-076_217": 0, "sub-076_218": 0, "sub-076_219": 0, "sub-076_220": 0, "sub-076_221": 0, "sub-076_222": 1, "sub-076_223": 1, "sub-076_224": 0, "sub-076_225": 1, "sub-076_226": 1, "sub-076_227": 1, "sub-076_228": 0, "sub-076_229": 0, "sub-076_230": 1, "sub-076_231": 0, "sub-076_232": 0, "sub-076_233": 1, "sub-076_234": 0, "sub-076_235": 1, "sub-076_236": 0, "sub-076_237": 1, "sub-076_238": 1, "sub-076_239": 1, "sub-076_240": 0, "sub-076_241": 0, "sub-076_242": 1, "sub-076_243": 1, "sub-076_244": 0, "sub-076_245": 1, "sub-076_246": 1, "sub-076_247": 0, "sub-076_248": 0, "sub-076_249": 0, "sub-076_250": 1, "sub-076_251": 0, "sub-076_252": 0, "sub-076_253": 0, "sub-076_254": 1, "sub-076_255": 1, "sub-076_256": 0, "sub-076_257": 0, "sub-076_258": 1, "sub-076_259": 0, "sub-076_260": 1, "sub-076_261": 1, "sub-076_262": 0, "sub-076_263": 0, "sub-076_264": 0, "sub-076_265": 1, "sub-076_266": 0, "sub-076_267": 1, "sub-076_268": 1, "sub-076_269": 0, "sub-076_270": 0, "sub-076_271": 1, "sub-076_272": 1, "sub-076_273": 0, "sub-076_274": 1, "sub-076_275": 0, "sub-076_276": 0, "sub-076_277": 1, "sub-076_278": 1, "sub-076_279": 0, "sub-076_280": 0, "sub-076_281": 1, "sub-076_282": 0, "sub-076_283": 0, "sub-076_284": 0, "sub-076_285": 0, "sub-076_286": 1, "sub-076_287": 0, "sub-076_288": 0, "sub-076_289": 0, "sub-076_290": 0, "sub-076_291": 1, "sub-076_292": 1, "sub-076_293": 1, "sub-076_294": 1, "sub-076_295": 1, "sub-076_296": 1, "sub-076_297": 1, "sub-076_298": 1, "sub-076_299": 0, "sub-076_300": 0, "sub-076_301": 0, "sub-076_302": 0, "sub-076_303": 0, "sub-076_304": 1, "sub-076_305": 1, "sub-076_306": 0, "sub-076_307": 0, "sub-076_308": 0, "sub-076_309": 0, "sub-076_310": 1, "sub-076_311": 0, "sub-076_312": 1, "sub-076_313": 0, "sub-076_314": 1, "sub-076_315": 0, "sub-076_316": 1, "sub-076_317": 1, "sub-076_318": 1, "sub-076_319": 0, "sub-076_320": 0, "sub-076_321": 1, "sub-076_322": 1, "sub-076_323": 0, "sub-076_324": 0, "sub-076_325": 0, "sub-076_326": 0, "sub-076_327": 0, "sub-076_328": 1, "sub-076_329": 1, "sub-076_330": 1, "sub-076_331": 0, "sub-076_332": 1, "sub-076_333": 0, "sub-076_334": 0, "sub-076_335": 1, "sub-076_336": 0, "sub-076_337": 0, "sub-076_338": 0, "sub-076_339": 1, "sub-076_340": 1, "sub-076_341": 1, "sub-076_342": 0, "sub-076_343": 1, "sub-076_344": 0, "sub-076_345": 1, "sub-076_346": 1, "sub-076_347": 0, "sub-076_348": 0, "sub-076_349": 1, "sub-076_350": 1, "sub-076_351": 0, "sub-076_352": 1, "sub-076_353": 1, "sub-076_354": 0, "sub-076_355": 1, "sub-076_356": 0, "sub-076_357": 1, "sub-076_358": 0, "sub-076_359": 0, "sub-076_360": 0, "sub-076_361": 0, "sub-076_362": 0, "sub-076_363": 0, "sub-076_364": 0, "sub-076_365": 1, "sub-076_366": 1, "sub-076_367": 0, "sub-076_368": 1, "sub-076_369": 1, "sub-076_370": 1, "sub-076_371": 0, "sub-076_372": 0, "sub-076_373": 1, "sub-076_374": 0, "sub-076_375": 0, "sub-076_376": 1, "sub-076_377": 0, "sub-076_378": 1, "sub-076_379": 0, "sub-076_380": 1, "sub-076_381": 1, "sub-076_382": 1, "sub-076_383": 0, "sub-076_384": 0, "sub-076_385": 1, "sub-076_386": 1, "sub-076_387": 0, "sub-076_388": 1, "sub-076_389": 1, "sub-076_390": 0, "sub-076_391": 0, "sub-076_392": 0, "sub-076_393": 1, "sub-076_394": 0, "sub-076_395": 0, "sub-076_396": 0, "sub-076_397": 1, "sub-076_398": 1, "sub-076_399": 0, "sub-076_400": 0, "sub-076_401": 1, "sub-076_402": 0, "sub-076_403": 1, "sub-076_404": 1, "sub-076_405": 0, "sub-076_406": 0, "sub-076_407": 0, "sub-076_408": 1, "sub-076_409": 0, "sub-076_410": 1, "sub-076_411": 1, "sub-076_412": 0, "sub-076_413": 0, "sub-076_414": 1, "sub-076_415": 1, "sub-076_416": 0, "sub-076_417": 1, "sub-076_418": 0, "sub-076_419": 0, "sub-076_420": 1, "sub-076_421": 1, "sub-076_422": 0, "sub-076_423": 0, "sub-076_424": 1, "sub-076_425": 0, "sub-076_426": 0, "sub-076_427": 0, "sub-076_428": 0, "sub-076_429": 1, "sub-076_430": 0, "sub-076_431": 0, "sub-076_432": 0, "sub-076_433": 0, "sub-076_434": 1, "sub-076_435": 1, "sub-076_436": 1, "sub-076_437": 0, "sub-076_438": 0, "sub-076_439": 0, "sub-076_440": 0, "sub-076_441": 1, "sub-076_442": 0, "sub-076_443": 1, "sub-076_444": 0, "sub-076_445": 1, "sub-076_446": 0, "sub-076_447": 1, "sub-076_448": 1, "sub-076_449": 1, "sub-076_450": 0, "sub-076_451": 0, "sub-076_452": 1, "sub-076_453": 1, "sub-076_454": 0, "sub-076_455": 0, "sub-076_456": 0, "sub-076_457": 0, "sub-076_458": 0, "sub-076_459": 1, "sub-076_460": 1, "sub-076_461": 1, "sub-076_462": 0, "sub-076_463": 1, "sub-076_464": 0, "sub-076_465": 0, "sub-076_466": 1, "sub-076_467": 0, "sub-076_468": 0, "sub-076_469": 0, "sub-076_470": 1, "sub-076_471": 1, "sub-076_472": 1, "sub-076_473": 0, "sub-076_474": 1, "sub-076_475": 0, "sub-076_476": 1, "sub-076_477": 1, "sub-076_478": 0, "sub-076_479": 0, "sub-076_480": 1, "sub-076_481": 1, "sub-076_482": 0, "sub-076_483": 1, "sub-076_484": 1, "sub-076_485": 0, "sub-076_486": 1, "sub-076_487": 0, "sub-076_488": 1, "sub-076_489": 0, "sub-076_490": 0, "sub-076_491": 0, "sub-076_492": 0, "sub-076_493": 0, "sub-076_494": 0, "sub-076_495": 0, "sub-076_496": 1, "sub-076_497": 1, "sub-076_498": 0, "sub-076_499": 1, "sub-076_500": 1, "sub-076_501": 1, "sub-076_502": 0, "sub-076_503": 0, "sub-076_504": 1, "sub-076_505": 0, "sub-076_506": 0, "sub-076_507": 1, "sub-076_508": 0, "sub-076_509": 1, "sub-076_510": 0, "sub-076_511": 1, "sub-076_512": 1, "sub-076_513": 1, "sub-076_514": 0, "sub-076_515": 0, "sub-076_516": 1, "sub-076_517": 1, "sub-076_518": 0, "sub-076_519": 1, "sub-076_520": 1, "sub-076_521": 0, "sub-076_522": 0, "sub-076_523": 0, "sub-076_524": 1, "sub-076_525": 0, "sub-076_526": 0, "sub-076_527": 0, "sub-076_528": 1, "sub-076_529": 1, "sub-076_530": 0, "sub-076_531": 0, "sub-076_532": 1, "sub-076_533": 0, "sub-076_534": 1, "sub-076_535": 1, "sub-076_536": 0, "sub-076_537": 0, "sub-076_538": 0, "sub-076_539": 1, "sub-076_540": 0, "sub-076_541": 1, "sub-076_542": 1, "sub-076_543": 0, "sub-076_544": 0, "sub-076_545": 1, "sub-076_546": 1, "sub-076_547": 0, "sub-076_548": 1, "sub-076_549": 0, "sub-076_550": 0, "sub-076_551": 1, "sub-076_552": 1} --------------------------------------------------------------------------------