{"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":"code","source":"import os\n\nimport warnings\nwarnings.filterwarnings(action='ignore')\n\nimport pandas as pd\nimport librosa\nimport numpy as np\n\nfrom sklearn.utils import shuffle\nfrom PIL import Image\nfrom tqdm import tqdm\nimport matplotlib.pyplot as plt\n\nimport tensorflow as tf\n\n# Global vars\nRANDOM_SEED = 1337\nSAMPLE_RATE = 32000\nSIGNAL_LENGTH = 5 # seconds\nSPEC_SHAPE = (224, 224) # height x width\nFMIN = 500\nFMAX = 12500","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TRAIN = pd.read_csv('../input/birdclef-2021/train_metadata.csv')\nLABELS = sorted(TRAIN.primary_label.unique())","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Adapted from https://www.kaggle.com/stefankahl/birdclef2021-model-training/data\ndef get_spectrograms(filepath, primary_label, output_dir):\n    \n    # Open the file with librosa (limited to the first 15 seconds)\n    sig, rate = librosa.load(filepath, sr=SAMPLE_RATE, offset=None, duration=15)\n    \n    # Split signal into five second chunks\n    sig_splits = []\n    for i in range(0, len(sig), int(SIGNAL_LENGTH * SAMPLE_RATE)):\n        split = sig[i:i + int(SIGNAL_LENGTH * SAMPLE_RATE)]\n\n        # End of signal?\n        if len(split) < int(SIGNAL_LENGTH * SAMPLE_RATE):\n            break\n        \n        sig_splits.append(split)\n        \n    # Extract mel spectrograms for each audio chunk\n    s_cnt = 0\n    saved_samples = []\n    for chunk in sig_splits:\n        \n        hop_length = int(SIGNAL_LENGTH * SAMPLE_RATE / (SPEC_SHAPE[1] - 1))\n        mel_spec = librosa.feature.melspectrogram(y=chunk, \n                                                  sr=SAMPLE_RATE, \n                                                  n_fft=1024, \n                                                  hop_length=hop_length, \n                                                  n_mels=SPEC_SHAPE[0], \n                                                  fmin=FMIN, \n                                                  fmax=FMAX)\n    \n        mel_spec = librosa.power_to_db(mel_spec, ref=np.max) \n        \n        # Normalize\n        mel_spec -= mel_spec.min()\n        mel_spec /= mel_spec.max()\n        \n        # Save as image file\n        save_dir = os.path.join(output_dir, primary_label)\n        if not os.path.exists(save_dir):\n            os.makedirs(save_dir)\n        save_path = os.path.join(save_dir, filepath.rsplit(os.sep, 1)[-1].rsplit('.', 1)[0] + \n                                 '_' + str(s_cnt) + '.png')\n        im = Image.fromarray(mel_spec * 255.0).convert(\"L\")\n        im.save(save_path)\n        \n        saved_samples.append(save_path)\n        s_cnt += 1\n        \n        \n    return saved_samples","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from joblib import Parallel, delayed\nimport multiprocessing as mp\n\ndef create_data(paths, output_dir, parallel=False):\n    count = 0\n    for path in paths:\n        for dirname, _, filenames in os.walk(path):\n            count += 1\n            labels = []\n            features = []\n            print(\"doing \" + dirname + \" number: \" + str(count) + \"\\t\")\n            primary_label = dirname.split(\"/\")[-1]\n            if parallel:\n                all_paths = []\n                for i, filename in enumerate(filenames):\n                    all_paths.append(os.path.join(path, primary_label, filename))\n                Parallel(prefer='threads', n_jobs=mp.cpu_count(), verbose=0)(delayed(get_spectrograms)(path, primary_label, output_dir) for path in all_paths)        \n            else:\n                all_paths = []\n                for i, filename in enumerate(filenames):\n                    print(\"done \" + str(filename), end=\"\\r\")\n                    all_paths.append(os.path.join(path, primary_label, filename))\n                    get_spectrograms(os.path.join(path, primary_label, filename), primary_label, output_dir)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"OUTPUT_DIR = '/kaggle/working/birdclef_2021/melspectrogram_dataset/'\nfor label in LABELS:\n    if not os.path.exists(os.path.join(OUTPUT_DIR, label)):\n        os.makedirs(os.path.join(OUTPUT_DIR, label))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import warnings\nwarnings.filterwarnings(\"ignore\")\nINPUT_DIR = '../input/birdclef-2021/train_short_audio/'\n# path = '/kaggle/input/birdsong-recognition/train_audio'\n# paths = ['/kaggle/input/xeno-canto-bird-recordings-extended-a-m/A-M', '/kaggle/input/xeno-canto-bird-recordings-extended-n-z/N-Z']\npaths = [INPUT_DIR]\ncreate_data(paths, OUTPUT_DIR, parallel=True)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# EXAMPLE_SPECIES = 'yetvir'\n# files = []\n# OUTPUT_DIR = '/kaggle/working/melspectrogram_dataset/'\n# for (dirpath, dirnames, filenames) in os.walk(os.path.join(OUTPUT_DIR, EXAMPLE_SPECIES)):\n#     files.extend(filenames)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Plot the first 12 spectrograms of TRAIN_SPECS\n# plt.figure(figsize=(15, 7))\n# for i in range(12):\n#     file_path = os.path.join(OUTPUT_DIR, EXAMPLE_SPECIES, files[i])\n#     spec = Image.open(file_path)\n#     plt.subplot(3, 4, i + 1)\n#     plt.title(file_path.split(os.sep)[-1])\n#     plt.imshow(spec, origin='lower')\n#     plt.savefig(f'{EXAMPLE_SPECIES}: {files[i]}', dpi=400, bbox_inches='tight',pad_inches=0)\n#     plt.close('all')","metadata":{"trusted":true},"execution_count":null,"outputs":[]}]}