{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Predict with Pre-trained Model\n", " \n", "This notebook shows how to load a pre-trained model and to use this for predicting multi-pitch estimates of an unknown audio file.\n", "\n", "© Christof Weiss and Geoffroy Peeters, Télécom Paris 2021" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import os\n", "import sys\n", "basepath = os.path.abspath(os.path.dirname(os.path.dirname('.')))\n", "sys.path.append(basepath)\n", "import numpy as np, os, scipy, scipy.spatial, matplotlib.pyplot as plt, IPython.display as ipd\n", "from numba import jit\n", "import librosa\n", "import libfmp.b, libfmp.c3, libfmp.c5\n", "import pandas as pd, pickle, re\n", "from numba import jit\n", "import torch.utils.data\n", "import torch.nn as nn\n", "import libdl.data_preprocessing\n", "from libdl.data_loaders import dataset_context\n", "from libdl.nn_models import basic_cnn_segm_sigmoid, deep_cnn_segm_sigmoid, simple_u_net_largekernels\n", "from libdl.nn_models import simple_u_net_doubleselfattn, simple_u_net_doubleselfattn_twolayers\n", "from libdl.nn_models import u_net_blstm_varlayers, simple_u_net_polyphony_classif_softmax\n", "from libdl.data_preprocessing import compute_hopsize_cqt, compute_hcqt, compute_efficient_hcqt, compute_annotation_array_nooverlap\n", "from torchinfo import summary" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 1. Specify and load model (Example)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/plain": [ "==========================================================================================\n", "Layer (type:depth-idx) Output Shape Param #\n", "==========================================================================================\n", "├─LayerNorm: 1-1 [1, 174, 6, 216] 2,592\n", "├─double_conv: 1-2 [1, 32, 174, 216] --\n", "| └─Sequential: 2-1 [1, 32, 174, 216] --\n", "| | └─Conv2d: 3-1 [1, 32, 174, 216] 43,232\n", "| | └─BatchNorm2d: 3-2 [1, 32, 174, 216] 64\n", "| | └─ReLU: 3-3 [1, 32, 174, 216] --\n", "| | └─Dropout: 3-4 [1, 32, 174, 216] --\n", "| | └─Conv2d: 3-5 [1, 32, 174, 216] 230,432\n", "| | └─BatchNorm2d: 3-6 [1, 32, 174, 216] 64\n", "| | └─ReLU: 3-7 [1, 32, 174, 216] --\n", "| | └─Dropout: 3-8 [1, 32, 174, 216] --\n", "├─Sequential: 1-3 [1, 64, 87, 108] --\n", "| └─MaxPool2d: 2-2 [1, 32, 87, 108] --\n", "| └─double_conv: 2-3 [1, 64, 87, 108] --\n", "| | └─Sequential: 3-9 [1, 64, 87, 108] 1,382,784\n", "├─Sequential: 1-4 [1, 128, 43, 54] --\n", "| └─MaxPool2d: 2-4 [1, 64, 43, 54] --\n", "| └─double_conv: 2-5 [1, 128, 43, 54] --\n", "| | └─Sequential: 3-10 [1, 128, 43, 54] 1,991,424\n", "├─Sequential: 1-5 [1, 256, 21, 27] --\n", "| └─MaxPool2d: 2-6 [1, 128, 21, 27] --\n", "| └─double_conv: 2-7 [1, 256, 21, 27] --\n", "| | └─Sequential: 3-11 [1, 256, 21, 27] 2,459,136\n", "├─Sequential: 1-6 [1, 256, 10, 13] --\n", "| └─MaxPool2d: 2-8 [1, 256, 10, 13] --\n", "| └─double_conv: 2-9 [1, 256, 10, 13] --\n", "| | └─Sequential: 3-12 [1, 256, 10, 13] 1,181,184\n", "├─unet_up_concat_padding: 1-7 [1, 512, 21, 27] --\n", "| └─Upsample: 2-10 [1, 256, 20, 26] --\n", "├─double_conv: 1-8 [1, 128, 21, 27] --\n", "| └─Sequential: 2-11 [1, 128, 21, 27] --\n", "| | └─Conv2d: 3-13 [1, 256, 21, 27] 1,179,904\n", "| | └─BatchNorm2d: 3-14 [1, 256, 21, 27] 512\n", "| | └─ReLU: 3-15 [1, 256, 21, 27] --\n", "| | └─Dropout: 3-16 [1, 256, 21, 27] --\n", "| | └─Conv2d: 3-17 [1, 128, 21, 27] 295,040\n", "| | └─BatchNorm2d: 3-18 [1, 128, 21, 27] 256\n", "| | └─ReLU: 3-19 [1, 128, 21, 27] --\n", "| | └─Dropout: 3-20 [1, 128, 21, 27] --\n", "├─unet_up_concat_padding: 1-9 [1, 256, 43, 54] --\n", "| └─Upsample: 2-12 [1, 128, 42, 54] --\n", "├─double_conv: 1-10 [1, 64, 43, 54] --\n", "| └─Sequential: 2-13 [1, 64, 43, 54] --\n", "| | └─Conv2d: 3-21 [1, 128, 43, 54] 819,328\n", "| | └─BatchNorm2d: 3-22 [1, 128, 43, 54] 256\n", "| | └─ReLU: 3-23 [1, 128, 43, 54] --\n", "| | └─Dropout: 3-24 [1, 128, 43, 54] --\n", "| | └─Conv2d: 3-25 [1, 64, 43, 54] 204,864\n", "| | └─BatchNorm2d: 3-26 [1, 64, 43, 54] 128\n", "| | └─ReLU: 3-27 [1, 64, 43, 54] --\n", "| | └─Dropout: 3-28 [1, 64, 43, 54] --\n", "├─unet_up_concat_padding: 1-11 [1, 128, 87, 108] --\n", "| └─Upsample: 2-14 [1, 64, 86, 108] --\n", "├─double_conv: 1-12 [1, 32, 87, 108] --\n", "| └─Sequential: 2-15 [1, 32, 87, 108] --\n", "| | └─Conv2d: 3-29 [1, 64, 87, 108] 663,616\n", "| | └─BatchNorm2d: 3-30 [1, 64, 87, 108] 128\n", "| | └─ReLU: 3-31 [1, 64, 87, 108] --\n", "| | └─Dropout: 3-32 [1, 64, 87, 108] --\n", "| | └─Conv2d: 3-33 [1, 32, 87, 108] 165,920\n", "| | └─BatchNorm2d: 3-34 [1, 32, 87, 108] 64\n", "| | └─ReLU: 3-35 [1, 32, 87, 108] --\n", "| | └─Dropout: 3-36 [1, 32, 87, 108] --\n", "├─unet_up_concat_padding: 1-13 [1, 64, 174, 216] --\n", "| └─Upsample: 2-16 [1, 32, 174, 216] --\n", "├─double_conv: 1-14 [1, 128, 174, 216] --\n", "| └─Sequential: 2-17 [1, 128, 174, 216] --\n", "| | └─Conv2d: 3-37 [1, 32, 174, 216] 460,832\n", "| | └─BatchNorm2d: 3-38 [1, 32, 174, 216] 64\n", "| | └─ReLU: 3-39 [1, 32, 174, 216] --\n", "| | └─Dropout: 3-40 [1, 32, 174, 216] --\n", "| | └─Conv2d: 3-41 [1, 128, 174, 216] 921,728\n", "| | └─BatchNorm2d: 3-42 [1, 128, 174, 216] 256\n", "| | └─ReLU: 3-43 [1, 128, 174, 216] --\n", "| | └─Dropout: 3-44 [1, 128, 174, 216] --\n", "├─Sequential: 1-15 [1, 180, 174, 72] --\n", "| └─Conv2d: 2-18 [1, 180, 174, 72] 207,540\n", "| └─LeakyReLU: 2-19 [1, 180, 174, 72] --\n", "| └─MaxPool2d: 2-20 [1, 180, 174, 72] --\n", "| └─Dropout: 2-21 [1, 180, 174, 72] --\n", "├─Sequential: 1-16 [1, 150, 100, 72] --\n", "| └─Conv2d: 2-22 [1, 150, 100, 72] 2,025,150\n", "| └─LeakyReLU: 2-23 [1, 150, 100, 72] --\n", "| └─Dropout: 2-24 [1, 150, 100, 72] --\n", "├─Sequential: 1-17 [1, 1, 100, 72] --\n", "| └─Conv2d: 2-25 [1, 100, 100, 72] 15,100\n", "| └─LeakyReLU: 2-26 [1, 100, 100, 72] --\n", "| └─Dropout: 2-27 [1, 100, 100, 72] --\n", "| └─Conv2d: 2-28 [1, 1, 100, 72] 101\n", "| └─Sigmoid: 2-29 [1, 1, 100, 72] --\n", "├─Sequential: 1-18 [1, 24, 7, 1] --\n", "| └─Conv2d: 2-30 [1, 128, 9, 9] 327,808\n", "| └─LeakyReLU: 2-31 [1, 128, 9, 9] --\n", "| └─MaxPool2d: 2-32 [1, 128, 8, 3] --\n", "| └─Dropout: 2-33 [1, 128, 8, 3] --\n", "| └─Conv2d: 2-34 [1, 24, 7, 1] 18,456\n", "==========================================================================================\n", "Total params: 14,597,963\n", "Trainable params: 14,597,963\n", "Non-trainable params: 0\n", "Total mult-adds (G): 109.75\n", "==========================================================================================\n", "Input size (MB): 0.90\n", "Forward/backward pass size (MB): 228.60\n", "Params size (MB): 58.39\n", "Estimated Total Size (MB): 287.89\n", "==========================================================================================" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dir_models = os.path.join(basepath, 'models_pretrained')\n", "num_octaves_inp = 6\n", "num_output_bins, min_pitch = 72, 24\n", "\n", "\n", "# Polyphony U-Net trained in recommended MusicNet split (test set MuN-10full):\n", "model_params = {'n_chan_input': 6,\n", " 'n_chan_layers': [128,180,150,100],\n", " 'n_ch_out': 2,\n", " 'n_bins_in': num_octaves_inp*12*3,\n", " 'n_bins_out': num_output_bins,\n", " 'a_lrelu': 0.3,\n", " 'p_dropout': 0.2,\n", " 'scalefac': 2,\n", " 'num_polyphony_steps': 24\n", " }\n", "mp = model_params\n", "\n", "fn_model = 'RETRAIN4_exp195f_musicnet_aligned_unet_extremelylarge_polyphony_softmax_rerun1.pt'\n", "model = simple_u_net_polyphony_classif_softmax(n_chan_input=mp['n_chan_input'], n_chan_layers=mp['n_chan_layers'], \\\n", " n_bins_in=mp['n_bins_in'], n_bins_out=mp['n_bins_out'], a_lrelu=mp['a_lrelu'], p_dropout=mp['p_dropout'], \\\n", " scalefac=mp['scalefac'], num_polyphony_steps=mp['num_polyphony_steps'])\n", "\n", "\n", "path_trained_model = os.path.join(dir_models, fn_model)\n", "\n", "model.load_state_dict(torch.load(path_trained_model, map_location=torch.device('cpu')))\n", "\n", "model.eval()\n", "summary(model, input_size=(1, 6, 174, 216))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2. Load Test Audio and compute HCQT" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "fs = 22050\n", "\n", "audio_folder = os.path.join(basepath, 'data', 'MusicNet', 'audio')\n", "fn_audio = '2382_Beethoven_OP130_StringQuartet.wav'\n", "\n", "path_audio = os.path.join(audio_folder, fn_audio)\n", "f_audio, fs_load = librosa.load(path_audio, sr=fs)\n", "\n", "bins_per_semitone = 3\n", "num_octaves = 6\n", "n_bins = bins_per_semitone*12*num_octaves\n", "num_harmonics = 5\n", "num_subharmonics = 1\n", "center_bins=True\n", "\n", "f_hcqt, fs_hcqt, hopsize_cqt = compute_efficient_hcqt(f_audio, fs=22050, fmin=librosa.note_to_hz('C1'), fs_hcqt_target=50, \\\n", " bins_per_octave=bins_per_semitone*12, num_octaves=num_octaves, \\\n", " num_harmonics=num_harmonics, num_subharmonics=num_subharmonics, center_bins=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3. Predict Pitches" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(160, 72)\n" ] } ], "source": [ "# Set test parameters\n", "test_params = {'batch_size': 1,\n", " 'shuffle': False,\n", " 'num_workers': 1\n", " }\n", "device = 'cpu'\n", "\n", "test_dataset_params = {'context': 75,\n", " 'stride': 1,\n", " 'compression': 10\n", " }\n", "half_context = test_dataset_params['context']//2\n", "\n", "inputs = np.transpose(f_hcqt, (2, 1, 0))\n", "targets = np.zeros(inputs.shape[1:]) # need dummy targets to use dataset object\n", "\n", "inputs_context = torch.from_numpy(np.pad(inputs, ((0, 0), (half_context, half_context+1), (0, 0))))\n", "targets_context = torch.from_numpy(np.pad(targets, ((half_context, half_context+1), (0, 0))))\n", "\n", "test_set = dataset_context(inputs_context, targets_context, test_dataset_params)\n", "test_generator = torch.utils.data.DataLoader(test_set, **test_params)\n", "\n", "pred_tot = np.zeros((0, num_output_bins))\n", "\n", "max_frames = 160\n", "k=0\n", "for test_batch, test_labels in test_generator:\n", " k+=1\n", " if k>max_frames:\n", " break\n", " # Model computations\n", " y_pred, n_pred = model(test_batch)\n", " pred_log = torch.squeeze(torch.squeeze(y_pred.to('cpu'),2),1).detach().numpy()\n", " # pred_log = torch.squeeze(y_pred.to('cpu')).detach().numpy()\n", " pred_tot = np.append(pred_tot, pred_log, axis=0)\n", " \n", "predictions = pred_tot\n", "\n", "print(predictions.shape)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4. Plot Predictions and Annotations (Ground truth)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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wSZ+ETiWthXkiDit2umuwP0RsaVKr2AwE15vtH28UArSa5ufpulJPy4s7b/p8ds+/szXd8uWLSPTmzZtqqWvu+66WvrSSy+tpdeuXVtLX3jhhbX0rbfeOjJ/hxxySC198MEH19KrV6+upffYY49aeq+99qqld9lll1p6t912q6V32GGHkevncZx33nnnkem8/7y/nXbaqZZuWj5LXYByl6Smy0utE21nEizp2+PDPpj2uL75HvDDH/6wln7ggXqPv9JsmU3zV+pSkfNXKoM5XerGt/322zdK5+0nPZvmcv9MNO0GOenvwEl34WlafpuY4TBvGyJizSLLFiqg+SL+HfAHEbFl3PI8Th/kc4EXAVtrKTsDXwJ+YqwjmJmZmdmy0MMfTOuB4ZatVcBNaZ01wCervK8EXippc0R8drGdjlNB3ikiftSEFxGbJO0yaoNJi4jaL56mw7I1ba0opUu/zpr+usqtH7l15O67766lb7vttlr6qquuqqWvuKLe7eZb3/pWLb1+/fpa+s4776yld9xxx1o6tzg+8pGPrKVzi+V+++1XS++7774j03vuuWctvc8+tdnJH9ZCmltEH//4x9fSz3ve80bmL7fYllpfmrZYtm296XqWq1kH9JQ+fw8++GAtvXHjxlr6mmuuqaW/9rWv1dLnn18fgfI73/lOLZ0/X/kJwGGHHVZLH3roobX0qlWraulcXvP+cvld6P6QX8ufuVzmd99995Hr56cOpRbIUit/U00/M1mphTWfb1ttn5rl75jc4n3//ffX0rmMb9iwoZZet25dLf3Vr361lj7vvPNq6RtvvLGWzmW89FTpwAMPrKXzU7D999+/ls7lL6+fy3z+TOR7fv5OyPktled8T297Dy/J39ml7/B8D7v22mtr6XPOOaeW/tKXvlRLf//736+lc/nJ12vlypW1dL5nHXTQQbTRwwryWuBISYcBNwLHA68ZXiEifnRjl/QR4POjKscwXgX5HklPj4iLqx0/A7ivWd7NzMzMbKnrW5BeRGyW9BYGo1OsAE6NiMslvalaftK27HecCvKJwD9L2tpcfSCD2rmZmZmZzYk+DvMGEBFnAWel1xasGEfEG8bZp8bonP4I4CHgKAYdoa8CtpvmxCFr1qyJr3/962Ov33SmvKZdNkomPVNd25kA2wakdD2rT+nxbinApWmXhkkHRXY9BuWk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\n", "text/plain": [ "<Figure size 720x252 with 2 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "start_sec = 0\n", "show_sec = 3.5\n", "\n", "fig, ax = plt.subplots(1, 2, gridspec_kw={'width_ratios': [1, 0.05]}, figsize=(10, 3.5))\n", "im = libfmp.b.plot_matrix(predictions.T[:, int(start_sec*fs_hcqt):int(show_sec*fs_hcqt)], Fs=fs_hcqt, ax=ax, cmap='gray_r', ylabel='MIDI pitch')\n", "ax[0].set_yticks(np.arange(0, 73, 12))\n", "ax[0].set_yticklabels([str(24+12*octave) for octave in range(0, num_octaves+1)])\n", "ax[0].set_title('Multi-pitch predictions')\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 6. Compare with annotations" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 720x252 with 2 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "annot_folder = os.path.join(basepath, 'data', 'MusicNet', 'csv')\n", "fn_annot = os.path.join(annot_folder, fn_audio[:-4]+'.csv')\n", "\n", "df = pd.read_csv(fn_annot, sep=',')\n", "note_events = df.to_numpy()[:,(0,1,3)]\n", "note_events[:,:2] /= 44100\n", "note_events = np.append(note_events, np.zeros((note_events.shape[0], 1)), axis=1)\n", " \n", "f_annot_pitch = compute_annotation_array_nooverlap(note_events.copy(), f_hcqt, fs_hcqt, annot_type='pitch', shorten=1.0)\n", "plt.rcParams.update({'font.size': 12})\n", "fig, ax = plt.subplots(1, 2, gridspec_kw={'width_ratios': [1, 0.05]}, figsize=(10, 3.5))\n", "\n", "cfig, cax, cim = libfmp.b.plot_matrix(f_annot_pitch[24:97, int(start_sec*fs_hcqt):int(show_sec*fs_hcqt)], ax=ax, Fs=fs_hcqt, cmap='gray_r', ylabel='MIDI pitch')\n", "plt.ylim([0, 73])\n", "ax[0].set_yticks(np.arange(0, 73, 12))\n", "ax[0].set_yticklabels([str(24+12*octave) for octave in range(0, num_octaves+1)])\n", "ax[0].set_title('Multi-pitch annotations (piano roll)')\n", "ax[1].set_ylim([0, 1])\n", "plt.tight_layout()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.9" } }, "nbformat": 4, "nbformat_minor": 4 }