{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Non-Semantic Representation of Speech\n\n- This notebook is a fork of https://www.kaggle.com/code/duythanhng/birdclef-2022-keras-simple-tutorial implementing mfcc features extraction + MobileNetV2 with Keras\n\n![Kaggle%20notebook.png](attachment:Kaggle%20notebook.png)\n\n- Kaggle submission score of 0.52","metadata":{},"attachments":{"Kaggle%20notebook.png":{"image/png":"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"}}},{"cell_type":"markdown","source":"- It aims to illustrate the use of Non-Semantic Representation of Speech with the implementation of TRILL model \n- Author: {Joel Shor, Aren Jansen, Ronnie Maor, Oran Lang, Omry Tuval, Félix de Chaumont Quitry, Marco Tagliasacchi, Ira Shavitt, Dotan Emanuel, Yinnon Haviv}\n- Title: {Towards Learning a Universal Non-Semantic Representation of Speech}\n- Year: 2020\n- Ref: https://arxiv.org/pdf/2002.12764.pdf","metadata":{}},{"cell_type":"markdown","source":"# Import","metadata":{}},{"cell_type":"code","source":"# Misc\nimport os\nimport json\nimport joblib\nimport warnings\n\nfrom ipywidgets import IntProgress\nfrom IPython.display import display\n\n# Data management\nimport numpy as np\nimport pandas as pd\n\n# Sound treatments\nimport librosa\nimport soundfile as sf\nfrom scipy import signal\n\n# Preprocessing\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import MultiLabelBinarizer\nfrom sklearn.model_selection import KFold\nfrom tensorflow.keras.utils import Sequence\nfrom tensorflow.keras.utils import to_categorical\n\n# Tensorflow\nimport tensorflow as tf\n\n# TRILL\nimport tensorflow.compat.v2 as tf\ntf.enable_v2_behavior()\nassert tf.executing_eagerly()\nimport tensorflow_hub as hub\n\n## Metrics\nimport tensorflow_addons as tfa\nfrom tensorflow_addons.layers.netvlad import NetVLAD\n\n# Plot\nimport matplotlib.pyplot as plt\nimport seaborn as sns","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:29.135898Z","iopub.execute_input":"2022-05-23T08:11:29.136156Z","iopub.status.idle":"2022-05-23T08:11:29.145011Z","shell.execute_reply.started":"2022-05-23T08:11:29.136127Z","shell.execute_reply":"2022-05-23T08:11:29.144148Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Environment","metadata":{}},{"cell_type":"code","source":"# Inactivate warnings\nwarnings.filterwarnings('ignore')\n\n# Allow to display all dataframes columns\npd.set_option(\"display.max_columns\", None)\n\n# Display Tensorlfow version\nprint('TensorFlow Version: {}'.format(tf.__version__))","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:29.146932Z","iopub.execute_input":"2022-05-23T08:11:29.147759Z","iopub.status.idle":"2022-05-23T08:11:29.158532Z","shell.execute_reply.started":"2022-05-23T08:11:29.147721Z","shell.execute_reply":"2022-05-23T08:11:29.157661Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DATA_PATH = '/kaggle/input/birdclef-2022/'\nWORKING_PATH = '/kaggle/working/'\nTRILL_PATH = '/kaggle/input/ziptrill/'\nMODEL_PATH = '/kaggle/input/trillmodels/'\nSOUND_PATH = '/kaggle/input/sounddata/'","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:29.159950Z","iopub.execute_input":"2022-05-23T08:11:29.160444Z","iopub.status.idle":"2022-05-23T08:11:29.166978Z","shell.execute_reply.started":"2022-05-23T08:11:29.160232Z","shell.execute_reply":"2022-05-23T08:11:29.166302Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data load","metadata":{}},{"cell_type":"code","source":"# Load meta data\ntrain_meta = pd.read_csv(DATA_PATH + 'train_metadata.csv', sep=',', decimal='.', encoding='utf8', low_memory=False)\n\n# Load scored birds\nwith open(DATA_PATH + 'scored_birds.json') as sbfile:\n    scored_birds = json.load(sbfile)\n    \n# Focus on 21 scored classes\nlabels = list(train_meta[train_meta['primary_label'].isin(scored_birds)]['primary_label'].unique())\nlabels","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:29.168951Z","iopub.execute_input":"2022-05-23T08:11:29.169208Z","iopub.status.idle":"2022-05-23T08:11:29.234879Z","shell.execute_reply.started":"2022-05-23T08:11:29.169174Z","shell.execute_reply":"2022-05-23T08:11:29.234148Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data exploration","metadata":{}},{"cell_type":"code","source":"train_meta.head()","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2022-05-23T08:11:29.236052Z","iopub.execute_input":"2022-05-23T08:11:29.236549Z","iopub.status.idle":"2022-05-23T08:11:29.254836Z","shell.execute_reply.started":"2022-05-23T08:11:29.236509Z","shell.execute_reply":"2022-05-23T08:11:29.254006Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Distribution per class","metadata":{}},{"cell_type":"code","source":"birds = train_meta[\"primary_label\"].value_counts().to_dict()\n\nfig = plt.figure(figsize=(16, 6))\nsns.barplot(x=list(birds.keys()), y=list(birds.values()), color='steelblue')\nplt.title('Distribution per class')\nplt.xlabel('Classes')\nplt.ylabel('Occurences')\nplt.xticks(rotation=90)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:29.256471Z","iopub.execute_input":"2022-05-23T08:11:29.256749Z","iopub.status.idle":"2022-05-23T08:11:30.988816Z","shell.execute_reply.started":"2022-05-23T08:11:29.256713Z","shell.execute_reply":"2022-05-23T08:11:30.988098Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"key_max = max(birds.keys(), key=(lambda k: birds[k]))\nkey_min = min(birds.keys(), key=(lambda k: birds[k]))\n\nprint('Number of classes: ', len(birds.keys()))\nprint('')\nprint('Minimum number of sounds for the class: ', key_min + ' ' + str(birds[key_min]))\nprint('Maximum number of sounds for the class: ', key_max + ' ' + str(birds[key_max]))\nprint('Total number of sounds: ', sum(birds.values()))\nprint('Average number of sounds per classes: ', sum(birds.values()) / len(birds.values()))","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:30.990277Z","iopub.execute_input":"2022-05-23T08:11:30.990731Z","iopub.status.idle":"2022-05-23T08:11:31.001270Z","shell.execute_reply.started":"2022-05-23T08:11:30.990692Z","shell.execute_reply":"2022-05-23T08:11:31.000547Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Focus on scored birds","metadata":{}},{"cell_type":"code","source":"# Focus on 21 scored classes\ndata_filtered = train_meta[train_meta['primary_label'].isin(scored_birds)]","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:31.003832Z","iopub.execute_input":"2022-05-23T08:11:31.004093Z","iopub.status.idle":"2022-05-23T08:11:31.014000Z","shell.execute_reply.started":"2022-05-23T08:11:31.004059Z","shell.execute_reply":"2022-05-23T08:11:31.013313Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"birds_filtered = data_filtered['primary_label'].value_counts().to_dict()\n\nfig = plt.figure(figsize=(16, 6))\nsns.barplot(x=list(birds_filtered.keys()), y=list(birds_filtered.values()), color='steelblue')\nplt.title('Distribution per class')\nplt.xlabel('Classes')\nplt.ylabel('Occurences')\nplt.xticks(rotation=90)\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:31.015477Z","iopub.execute_input":"2022-05-23T08:11:31.015741Z","iopub.status.idle":"2022-05-23T08:11:31.303102Z","shell.execute_reply.started":"2022-05-23T08:11:31.015705Z","shell.execute_reply":"2022-05-23T08:11:31.302397Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"key_max = max(birds_filtered.keys(), key=(lambda k: birds_filtered[k]))\nkey_min = min(birds_filtered.keys(), key=(lambda k: birds_filtered[k]))\n\nprint('Number of classes: ', len(birds_filtered.keys()))\nprint('Missing classes: ', scored_birds-birds_filtered.keys())\nprint('')\nprint('Minimum number of sounds for the class: ', key_min + ' ' + str(birds_filtered[key_min]))\nprint('Maximum number of sounds for the class: ', key_max + ' ' + str(birds_filtered[key_max]))\nprint('Total number of sounds: ', sum(birds_filtered.values()))\nprint('Average number of sounds per classes: ', sum(birds_filtered.values()) / len(birds_filtered.values()))","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:31.304438Z","iopub.execute_input":"2022-05-23T08:11:31.304836Z","iopub.status.idle":"2022-05-23T08:11:31.315847Z","shell.execute_reply.started":"2022-05-23T08:11:31.304797Z","shell.execute_reply":"2022-05-23T08:11:31.315128Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Birds number per sound","metadata":{}},{"cell_type":"code","source":"# Split secondary_labels in a list of birds\ndef split_secondary(df):\n    record = df['secondary_labels'].replace('[', '').replace(']', '').replace(\"'\", \"\").split(',')\n    return record\n\n\ndata_filtered['secondary_list'] = data_filtered.apply(split_secondary, axis=1)","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:31.318434Z","iopub.execute_input":"2022-05-23T08:11:31.318842Z","iopub.status.idle":"2022-05-23T08:11:31.342597Z","shell.execute_reply.started":"2022-05-23T08:11:31.318805Z","shell.execute_reply":"2022-05-23T08:11:31.341921Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Count the birds in the birds lists\ndef birds_number(df):\n    return len(df['secondary_list'])\n\n\ndata_filtered['birds_number'] = data_filtered.apply(birds_number, axis=1)","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:31.343793Z","iopub.execute_input":"2022-05-23T08:11:31.344097Z","iopub.status.idle":"2022-05-23T08:11:31.367932Z","shell.execute_reply.started":"2022-05-23T08:11:31.344060Z","shell.execute_reply":"2022-05-23T08:11:31.367292Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_filtered['secondary_list'] = data_filtered.apply(split_secondary, axis=1)\ndata_filtered['birds_number'] = data_filtered.apply(birds_number, axis=1)","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:31.368884Z","iopub.execute_input":"2022-05-23T08:11:31.369074Z","iopub.status.idle":"2022-05-23T08:11:31.410187Z","shell.execute_reply.started":"2022-05-23T08:11:31.369050Z","shell.execute_reply":"2022-05-23T08:11:31.409544Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fig = plt.figure(figsize=(5, 5))\nplt.bar(data_filtered['birds_number'].unique(), data_filtered['birds_number'].value_counts())\nplt.title('Birds per sound')\nplt.xlabel('Birds number')\nplt.ylabel('Occurences')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:31.411489Z","iopub.execute_input":"2022-05-23T08:11:31.411951Z","iopub.status.idle":"2022-05-23T08:11:31.588929Z","shell.execute_reply.started":"2022-05-23T08:11:31.411915Z","shell.execute_reply":"2022-05-23T08:11:31.588168Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Misc","metadata":{}},{"cell_type":"code","source":"data_filtered['primary_label'].value_counts()","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:31.590354Z","iopub.execute_input":"2022-05-23T08:11:31.590610Z","iopub.status.idle":"2022-05-23T08:11:31.597694Z","shell.execute_reply.started":"2022-05-23T08:11:31.590575Z","shell.execute_reply":"2022-05-23T08:11:31.596890Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_filtered.shape","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:31.599371Z","iopub.execute_input":"2022-05-23T08:11:31.600014Z","iopub.status.idle":"2022-05-23T08:11:31.607964Z","shell.execute_reply.started":"2022-05-23T08:11:31.599972Z","shell.execute_reply":"2022-05-23T08:11:31.607289Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Sounds characteristics","metadata":{}},{"cell_type":"code","source":"if not os.path.exists(SOUND_PATH + 'sample_rates.jl'):\n    # Instantiate the progress bar\n    max_count = data_filtered.shape[0]\n    f = IntProgress(min=0, max=max_count)\n    # Display the progress bar\n    display(f)\n\n    sample_rates = {}\n    durations = []\n\n    for index, row in data_filtered.iterrows():\n        # Increment the progress bar\n        f.value += 1\n\n        # Load sound\n        file_path = DATA_PATH + 'train_audio/' + row['filename']\n        audio, sr = librosa.load(file_path)\n\n        # Calculate duration\n        duration = len(audio)/sr\n\n        # Store\n        if sr in sample_rates.keys():\n            sample_rates[sr] += 1\n        else:\n            sample_rates[sr] = 1\n\n        durations.append(duration)\n        \n    # Save\n    joblib.dump(sample_rates, SOUND_PATH + 'sample_rates.jl')\n    joblib.dump(durations, SOUND_PATH + 'durations.jl')\n    \nelse:\n    sample_rates = joblib.load(SOUND_PATH + 'sample_rates.jl')\n    durations = joblib.load(SOUND_PATH + 'durations.jl')","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:31.612366Z","iopub.execute_input":"2022-05-23T08:11:31.612551Z","iopub.status.idle":"2022-05-23T08:11:31.626114Z","shell.execute_reply.started":"2022-05-23T08:11:31.612529Z","shell.execute_reply":"2022-05-23T08:11:31.625487Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('Audios sample rates:', sample_rates)","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:31.627091Z","iopub.execute_input":"2022-05-23T08:11:31.627355Z","iopub.status.idle":"2022-05-23T08:11:31.635849Z","shell.execute_reply.started":"2022-05-23T08:11:31.627318Z","shell.execute_reply":"2022-05-23T08:11:31.635190Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"durations = np.array(durations)\nprint('Audios minimum duration:', np.min(durations))\nprint('Audios maximum duration:', np.max(durations))\nprint('Audios average duration:', np.mean(durations))","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:31.639363Z","iopub.execute_input":"2022-05-23T08:11:31.639696Z","iopub.status.idle":"2022-05-23T08:11:31.649664Z","shell.execute_reply.started":"2022-05-23T08:11:31.639661Z","shell.execute_reply":"2022-05-23T08:11:31.648636Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Conclusion\n\n- The dataset is highly imbalanced \n- Most of the time, a sound contains 3 classes (multilabel)\n- Audios sample rate is always 22050\n- Audios average duration is 50.42 seconds","metadata":{}},{"cell_type":"markdown","source":"# Data preparation","metadata":{}},{"cell_type":"markdown","source":"## Split sounds\n\n- Split audios into 5 seconds chunks\n- If chunk lenght is less than 5 seconds, complete with 0","metadata":{}},{"cell_type":"code","source":"!mkdir -p '/kaggle/working/each5s'","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:31.651243Z","iopub.execute_input":"2022-05-23T08:11:31.651587Z","iopub.status.idle":"2022-05-23T08:11:32.356146Z","shell.execute_reply.started":"2022-05-23T08:11:31.651549Z","shell.execute_reply":"2022-05-23T08:11:32.355148Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Sample Data\ndata_frames = []\nfor label in labels:\n    tmp_df = data_filtered[data_filtered[\"primary_label\"] == label].sample(\n        n=1, replace=True).reset_index(drop=True)\n    data_frames.append(tmp_df)\nsample_df = pd.concat(data_frames).reset_index(drop=True)\nsample_df","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2022-05-23T08:11:32.358407Z","iopub.execute_input":"2022-05-23T08:11:32.358942Z","iopub.status.idle":"2022-05-23T08:11:32.427063Z","shell.execute_reply.started":"2022-05-23T08:11:32.358903Z","shell.execute_reply":"2022-05-23T08:11:32.426111Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def cutAudio(seconds, file_path, is_save):\n    # First load the file\n    filename = file_path.replace('/', '_')\n    file_path = DATA_PATH + 'train_audio/' + file_path\n    audio, sr = librosa.load(file_path)\n\n    # Get number of samples for x seconds\n    buffer = seconds * sr\n    block_min = seconds * sr\n\n    samples_total = len(audio)\n    samples_wrote = 0\n    counter = 1\n\n    audio_split = []\n    audio_filenames = []\n\n    while samples_wrote < samples_total:\n        # check if the buffer is not exceeding total samples\n        if buffer > (samples_total - samples_wrote):\n            buffer = samples_total - samples_wrote\n\n        block = audio[samples_wrote: (samples_wrote + buffer)]\n\n        # check if last block is as long as previous ones\n        if block.shape[0] < (block_min):\n            listofzeros = np.array([0] * (block_min - block.shape[0]))\n            block = np.hstack([block, listofzeros])\n\n        audio_split.append(block)\n\n        # Write segment\n        if is_save == True:\n            out_filename = WORKING_PATH + 'each' + str(seconds) + 's/split_' + \\\n                str(counter) + '_' + filename\n            audio_filenames.append(out_filename)\n            sf.write(out_filename, block, sr)\n\n        counter += 1\n        samples_wrote += buffer\n\n    return audio_split, sr, audio_filenames","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:32.428548Z","iopub.execute_input":"2022-05-23T08:11:32.428870Z","iopub.status.idle":"2022-05-23T08:11:32.438884Z","shell.execute_reply.started":"2022-05-23T08:11:32.428832Z","shell.execute_reply":"2022-05-23T08:11:32.437793Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def splitTrainAudio(seconds, _df):\n    # Instantiate the progress bar\n    max_count = _df.shape[0]\n    f = IntProgress(min=0, max=max_count)\n    # Display the progress bar\n    display(f)\n\n    data = []\n    for index, row in _df.iterrows():\n        # Increment the progress bar\n        f.value += 1\n\n        audio_lst, sr, filenames = cutAudio(seconds, row['filename'], True)\n        \n        for idx, y in enumerate(audio_lst):\n            data.append(\n                [row['primary_label'], row['secondary_labels'], row['filename'], filenames[idx]])\n\n    data_df = pd.DataFrame(\n        data, columns=['primary_label', 'secondary_labels', 'original_filename', 'filename'])\n    data_df.to_csv(WORKING_PATH + 'data_' + str(seconds) + '_df.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:32.440483Z","iopub.execute_input":"2022-05-23T08:11:32.441330Z","iopub.status.idle":"2022-05-23T08:11:32.450889Z","shell.execute_reply.started":"2022-05-23T08:11:32.441290Z","shell.execute_reply":"2022-05-23T08:11:32.450114Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if len(os.listdir(WORKING_PATH + 'each5s/')) == 0:\n    # If not already done, split audio into 5 seconds chunks\n    \n    # Split audio\n    splitTrainAudio(5, sample_df)\n    \n    # Load split result\n    data_df = pd.read_csv(WORKING_PATH + 'data_5_df.csv')\n    \nelse:\n    # If split done, load split result\n    data_df = pd.read_csv(WORKING_PATH + 'data_5_df.csv')","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2022-05-23T08:11:32.452196Z","iopub.execute_input":"2022-05-23T08:11:32.452587Z","iopub.status.idle":"2022-05-23T08:11:32.465447Z","shell.execute_reply.started":"2022-05-23T08:11:32.452492Z","shell.execute_reply":"2022-05-23T08:11:32.464558Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Create target","metadata":{}},{"cell_type":"code","source":"def to_list(df):\n    temp = []\n    primary_label = df['primary_label']\n    \n    if df['secondary_labels'] != '[]':\n        secondary_labels = df['secondary_labels'].replace(\n            '[', '').replace(']', '').replace(\"'\", '').replace(' ', '').split(',')\n    else:\n        secondary_labels = None\n\n    temp.append(primary_label)\n    \n    if secondary_labels != None:\n        for item in secondary_labels:\n            if item in labels:\n                if item not in temp:\n                    temp.append(item)\n                \n    return tuple(temp)","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:32.467045Z","iopub.execute_input":"2022-05-23T08:11:32.467557Z","iopub.status.idle":"2022-05-23T08:11:32.474696Z","shell.execute_reply.started":"2022-05-23T08:11:32.467516Z","shell.execute_reply":"2022-05-23T08:11:32.473994Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Create target\ndata_df['target'] = data_df.apply(to_list, axis=1)\ndata_df.to_pickle(WORKING_PATH + 'data.pkl')\ndata_df = pd.read_pickle(WORKING_PATH + 'data.pkl')\ndata_df","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2022-05-23T08:11:32.476289Z","iopub.execute_input":"2022-05-23T08:11:32.476876Z","iopub.status.idle":"2022-05-23T08:11:32.506499Z","shell.execute_reply.started":"2022-05-23T08:11:32.476840Z","shell.execute_reply":"2022-05-23T08:11:32.505811Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Fit a MultiLabelBinarizer\nmlb = MultiLabelBinarizer()\nmlb.fit(data_df['target'].values.tolist())","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:32.508226Z","iopub.execute_input":"2022-05-23T08:11:32.508660Z","iopub.status.idle":"2022-05-23T08:11:32.515268Z","shell.execute_reply.started":"2022-05-23T08:11:32.508625Z","shell.execute_reply":"2022-05-23T08:11:32.514449Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mlb.classes_","metadata":{"scrolled":true,"execution":{"iopub.status.busy":"2022-05-23T08:11:32.517039Z","iopub.execute_input":"2022-05-23T08:11:32.517479Z","iopub.status.idle":"2022-05-23T08:11:32.525215Z","shell.execute_reply.started":"2022-05-23T08:11:32.517444Z","shell.execute_reply":"2022-05-23T08:11:32.524427Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Modelization","metadata":{}},{"cell_type":"markdown","source":"## Preprocessing","metadata":{}},{"cell_type":"code","source":"def extractFeatures_trill(y, sr):\n    # Sound noise reduction\n    b, a = signal.butter(10, 1000/(sr/2), btype='highpass')\n    y = signal.lfilter(b, a, y)\n    # Resample\n    y = librosa.resample(y, sr, 16000)\n\n    return y","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:32.527100Z","iopub.execute_input":"2022-05-23T08:11:32.527464Z","iopub.status.idle":"2022-05-23T08:11:32.534416Z","shell.execute_reply.started":"2022-05-23T08:11:32.527424Z","shell.execute_reply":"2022-05-23T08:11:32.533725Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Model","metadata":{}},{"cell_type":"code","source":"def create_trill():\n    \n    model = tf.keras.models.Sequential()\n    model.add(tf.keras.Input((80000,)))\n\n    trill_layer = hub.KerasLayer(\n        handle=TRILL_PATH,\n        trainable=False,\n        arguments={'sample_rate': int(16000)},\n        output_key='embedding',\n        output_shape=[None, 2048]\n    )\n\n    model.add(trill_layer)\n    model.add(NetVLAD(num_clusters=8))\n    model.add(tf.keras.layers.BatchNormalization())\n    model.add(tf.keras.layers.Dense(256, activation='relu'))\n    model.add(tf.keras.layers.Dense(21, activation='sigmoid', kernel_regularizer=tf.keras.regularizers.l2(l=1e-5)))\n\n    return model","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:32.536005Z","iopub.execute_input":"2022-05-23T08:11:32.536320Z","iopub.status.idle":"2022-05-23T08:11:32.545615Z","shell.execute_reply.started":"2022-05-23T08:11:32.536282Z","shell.execute_reply":"2022-05-23T08:11:32.544887Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"markdown","source":"## Load model","metadata":{}},{"cell_type":"code","source":"# Model\nTrill = create_trill()\nTrill.load_weights(MODEL_PATH + 'finetuned_Trill.h5')\nTrill.compile(optimizer=tf.keras.optimizers.Adam(),\n              loss='binary_crossentropy',\n              metrics=[tfa.metrics.F1Score(name='f1macro', num_classes=len(labels), average='macro')])\nTrill.summary()","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:32.547042Z","iopub.execute_input":"2022-05-23T08:11:32.547415Z","iopub.status.idle":"2022-05-23T08:11:36.516244Z","shell.execute_reply.started":"2022-05-23T08:11:32.547347Z","shell.execute_reply":"2022-05-23T08:11:36.515521Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"## Process","metadata":{}},{"cell_type":"code","source":"test_path = DATA_PATH + '/test_soundscapes/'\nfiles = [f.split('.')[0] for f in sorted(os.listdir(test_path))]\nprint('Number of test soundscapes:', len(files))","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:36.518092Z","iopub.execute_input":"2022-05-23T08:11:36.518876Z","iopub.status.idle":"2022-05-23T08:11:36.526036Z","shell.execute_reply.started":"2022-05-23T08:11:36.518835Z","shell.execute_reply":"2022-05-23T08:11:36.525154Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = []\n\nfor f in files:\n    file_path = test_path + f + '.ogg'\n\n    # Load audio file\n    audio, sr = librosa.load(file_path)\n\n    # Get number of samples for 5 seconds\n    buffer = 5 * sr\n    block_min = 5 * sr\n\n    samples_total = len(audio)\n    samples_wrote = 0\n    counter = 1\n\n    while samples_wrote < samples_total:\n        # check if the buffer is not exceeding total samples\n        if buffer > (samples_total - samples_wrote):\n            buffer = samples_total - samples_wrote\n\n        block = audio[samples_wrote: (samples_wrote + buffer)]\n\n        # check if last block is as long as previous ones\n        if block.shape[0] < (block_min):\n            listofzeros = np.array([0] * (block_min - block.shape[0]))\n            block = np.hstack([block, listofzeros])\n\n        # Features extraction\n        block = extractFeatures_trill(block, sr)\n\n        X = np.empty((1, 80000))\n        X[0] = np.array(block)\n\n        # Prediction\n        pred = Trill.predict_on_batch(X)\n        #print('pred', pred)\n\n        countOK = list(filter(lambda score: score >= 1e-7, pred[0]))\n        #print('countOK', countOK)\n\n        label_indexes = []\n        for i in range(0, len(countOK)):\n            label_indexes.append(np.argsort(np.max(pred, axis=0))[-(i+1)])\n\n        print(label_indexes)\n\n        for b in scored_birds:\n            segment_end = counter * 5\n            row_id = f + '_' + b + '_' + str(segment_end)\n            target = False\n            for label_index in label_indexes:\n                if labels[label_index] == b:\n                    target = True\n            data.append([row_id, target])\n        counter += 1\n        samples_wrote += buffer\n\nsubmission_df = pd.DataFrame(data, columns=['row_id', 'target'])\nsubmission_df.head(21)","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:36.527434Z","iopub.execute_input":"2022-05-23T08:11:36.527757Z","iopub.status.idle":"2022-05-23T08:11:39.589864Z","shell.execute_reply.started":"2022-05-23T08:11:36.527721Z","shell.execute_reply":"2022-05-23T08:11:39.589137Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df.to_csv(WORKING_PATH + 'submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2022-05-23T08:11:39.591192Z","iopub.execute_input":"2022-05-23T08:11:39.591487Z","iopub.status.idle":"2022-05-23T08:11:39.599068Z","shell.execute_reply.started":"2022-05-23T08:11:39.591450Z","shell.execute_reply":"2022-05-23T08:11:39.596874Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}