{"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":"# Intro","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19"}},{"cell_type":"markdown","source":"In this competition, you are given audio files that include sounds from numerous species. Your task is, for each test audio file, to predict the probability that each of the given species is audible in the audio clip. While the training files contain both the species identification as well as the time the species was heard, the time localization is not part of the test predictions.","metadata":{"execution":{"iopub.status.busy":"2021-10-16T11:59:48.197299Z","iopub.execute_input":"2021-10-16T11:59:48.197643Z","iopub.status.idle":"2021-10-16T11:59:48.222911Z","shell.execute_reply.started":"2021-10-16T11:59:48.197551Z","shell.execute_reply":"2021-10-16T11:59:48.221683Z"}}},{"cell_type":"markdown","source":"In this section, I will use Deep Learning from Tensorflow keras","metadata":{}},{"cell_type":"markdown","source":"# Libraries","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport matplotlib.pyplot as plt\nimport soundfile as sf\nimport librosa\nimport librosa.display\nimport IPython.display as display\n\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.utils import Sequence\nfrom tensorflow.keras.layers import Dense, Dropout, Flatten, Conv1D, MaxPool1D, BatchNormalization\nfrom tensorflow.keras.optimizers import RMSprop,Adam\n\nimport warnings\nwarnings.filterwarnings(\"ignore\")","metadata":{"execution":{"iopub.status.busy":"2021-10-16T13:34:25.915475Z","iopub.execute_input":"2021-10-16T13:34:25.916621Z","iopub.status.idle":"2021-10-16T13:34:25.925423Z","shell.execute_reply.started":"2021-10-16T13:34:25.916564Z","shell.execute_reply":"2021-10-16T13:34:25.924065Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load Data","metadata":{"execution":{"iopub.status.busy":"2021-10-16T12:15:14.9137Z","iopub.execute_input":"2021-10-16T12:15:14.914026Z","iopub.status.idle":"2021-10-16T12:15:14.920281Z","shell.execute_reply.started":"2021-10-16T12:15:14.913994Z","shell.execute_reply":"2021-10-16T12:15:14.919063Z"}}},{"cell_type":"code","source":"path = '/kaggle/input/rfcx-species-audio-detection/'\nos.listdir(path)","metadata":{"execution":{"iopub.status.busy":"2021-10-16T13:35:16.649904Z","iopub.execute_input":"2021-10-16T13:35:16.650244Z","iopub.status.idle":"2021-10-16T13:35:16.662763Z","shell.execute_reply.started":"2021-10-16T13:35:16.650210Z","shell.execute_reply":"2021-10-16T13:35:16.662026Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_fp = pd.read_csv(path+'train_fp.csv')\ntrain_tp = pd.read_csv(path+'train_tp.csv')\nsamp_subm = pd.read_csv(path+'sample_submission.csv')","metadata":{"execution":{"iopub.status.busy":"2021-10-16T13:35:16.980673Z","iopub.execute_input":"2021-10-16T13:35:16.981029Z","iopub.status.idle":"2021-10-16T13:35:17.043233Z","shell.execute_reply.started":"2021-10-16T13:35:16.980996Z","shell.execute_reply":"2021-10-16T13:35:17.042189Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_audio_files = os.listdir(path+'train')\ntest_audio_files = os.listdir(path+'test')","metadata":{"execution":{"iopub.status.busy":"2021-10-16T13:35:17.253508Z","iopub.execute_input":"2021-10-16T13:35:17.253860Z","iopub.status.idle":"2021-10-16T13:35:17.635278Z","shell.execute_reply.started":"2021-10-16T13:35:17.253789Z","shell.execute_reply":"2021-10-16T13:35:17.634202Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Read flac audio file and return numpay array and samplerate\ndef read_flac_file(path, file):\n    data, samplerate = sf.read(path+file)\n    return data, samplerate","metadata":{"execution":{"iopub.status.busy":"2021-10-16T13:35:17.637049Z","iopub.execute_input":"2021-10-16T13:35:17.637261Z","iopub.status.idle":"2021-10-16T13:35:17.642675Z","shell.execute_reply.started":"2021-10-16T13:35:17.637234Z","shell.execute_reply":"2021-10-16T13:35:17.641600Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data, samplerate = read_flac_file(path+'train/', train_audio_files[0])\nprint('data array:', data)\nprint('samplerate:', samplerate) \nprint('number of data values:', len(data))","metadata":{"execution":{"iopub.status.busy":"2021-10-16T13:35:17.781266Z","iopub.execute_input":"2021-10-16T13:35:17.781557Z","iopub.status.idle":"2021-10-16T13:35:17.942297Z","shell.execute_reply.started":"2021-10-16T13:35:17.781525Z","shell.execute_reply":"2021-10-16T13:35:17.939836Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print('number of false positive:', len(train_fp))\nprint('number of true positive:', len(train_tp))\nprint('number of samp_subm rows:', len(samp_subm))\nprint('number of train audio files:', len(train_audio_files))\nprint('number of test audio files:', len(test_audio_files))","metadata":{"execution":{"iopub.status.busy":"2021-10-16T13:35:18.029070Z","iopub.execute_input":"2021-10-16T13:35:18.029959Z","iopub.status.idle":"2021-10-16T13:35:18.040655Z","shell.execute_reply.started":"2021-10-16T13:35:18.029907Z","shell.execute_reply":"2021-10-16T13:35:18.038883Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_tp.describe()","metadata":{"execution":{"iopub.status.busy":"2021-10-16T13:35:18.233851Z","iopub.execute_input":"2021-10-16T13:35:18.234365Z","iopub.status.idle":"2021-10-16T13:35:18.291779Z","shell.execute_reply.started":"2021-10-16T13:35:18.234327Z","shell.execute_reply":"2021-10-16T13:35:18.291154Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_tp.head(10)","metadata":{"execution":{"iopub.status.busy":"2021-10-16T13:35:18.440981Z","iopub.execute_input":"2021-10-16T13:35:18.441485Z","iopub.status.idle":"2021-10-16T13:35:18.459012Z","shell.execute_reply.started":"2021-10-16T13:35:18.441447Z","shell.execute_reply":"2021-10-16T13:35:18.458213Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"recording_id = '003bec244'\ndata, samplerate = read_flac_file(path+'train/', recording_id+'.flac')\n\ndisplay.Audio(path+'train/'+recording_id+'.flac')","metadata":{"execution":{"iopub.status.busy":"2021-10-16T13:35:18.600624Z","iopub.execute_input":"2021-10-16T13:35:18.601231Z","iopub.status.idle":"2021-10-16T13:35:18.859770Z","shell.execute_reply.started":"2021-10-16T13:35:18.601190Z","shell.execute_reply":"2021-10-16T13:35:18.858091Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data Preparation ","metadata":{}},{"cell_type":"code","source":"y_train_index = [file.split('.')[0] for file in train_audio_files]\ny_train_columns = ['s'+str(i) for i in range(24)]\ny_train = pd.DataFrame(0, index=y_train_index, columns=y_train_columns)\n\nfor row in train_fp.index:\n    index = train_fp.loc[row, 'recording_id']\n    column = 's'+str(train_fp.loc[row, 'species_id'])\n    y_train.loc[index, column] = 1\n\nfor row in train_tp.index:\n    index = train_tp.loc[row, 'recording_id']\n    column = 's'+str(train_tp.loc[row, 'species_id'])\n    y_train.loc[index, column] = 1","metadata":{"execution":{"iopub.status.busy":"2021-10-16T13:35:18.996603Z","iopub.execute_input":"2021-10-16T13:35:18.996952Z","iopub.status.idle":"2021-10-16T13:35:19.932113Z","shell.execute_reply.started":"2021-10-16T13:35:18.996913Z","shell.execute_reply":"2021-10-16T13:35:19.931157Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class DataGenerator(Sequence):\n    def __init__(self, path, list_IDs, labels, batch_size):\n        self.path = path\n        self.list_IDs = list_IDs\n        self.labels = labels\n        self.batch_size = batch_size\n        self.indexes = np.arange(len(self.list_IDs))\n        \n    def __len__(self):\n        len_ = int(len(self.list_IDs)/self.batch_size)\n        if len_*self.batch_size < len(self.list_IDs):\n            len_ += 1\n        return len_\n    \n    def __getitem__(self, index):\n        indexes = self.indexes[index*self.batch_size:(index+1)*self.batch_size]\n        list_IDs_temp = [self.list_IDs[k] for k in indexes]\n        X, y = self.__data_generation(list_IDs_temp)\n        X = X.reshape((self.batch_size, 1000, 2880//2))\n        return X, y\n    \n    def __data_generation(self, list_IDs_temp):\n        X = np.zeros((self.batch_size, 2880000//2))\n        y = np.zeros((self.batch_size, 24))\n        for i, ID in enumerate(list_IDs_temp):\n            audio_file, audio_sr = read_flac_file(self.path, ID)\n            audio_file_fft = data_fft = np.abs(np.fft.fft(audio_file)[: len(audio_file)//2])\n            # scale data\n            audio_file_fft = (audio_file_fft-audio_file_fft.mean())/audio_file_fft.std()\n            X[i, ] = audio_file_fft\n            y[i, ] = self.labels.loc[ID.split('.')[0]]\n        return X, y","metadata":{"execution":{"iopub.status.busy":"2021-10-16T13:35:19.934113Z","iopub.execute_input":"2021-10-16T13:35:19.934376Z","iopub.status.idle":"2021-10-16T13:35:19.947611Z","shell.execute_reply.started":"2021-10-16T13:35:19.934344Z","shell.execute_reply":"2021-10-16T13:35:19.946696Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Define Model","metadata":{}},{"cell_type":"code","source":"model = Sequential()\nmodel.add(Conv1D(128, input_shape=(1000, 2880//2,), kernel_size=5, strides=4, activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPool1D(pool_size=(4)))\nmodel.add(Conv1D(128, kernel_size=3, activation='relu'))\nmodel.add(BatchNormalization())\nmodel.add(MaxPool1D(pool_size=(4)))\nmodel.add(Conv1D(128, kernel_size=3, activation='relu'))\nmodel.add(BatchNormalization())\n\nmodel.add(Flatten())\nmodel.add(Dense(512, activation='relu'))\nmodel.add(Dense(24, activation='softmax'))","metadata":{"execution":{"iopub.status.busy":"2021-10-16T13:35:19.948952Z","iopub.execute_input":"2021-10-16T13:35:19.949791Z","iopub.status.idle":"2021-10-16T13:35:20.205847Z","shell.execute_reply.started":"2021-10-16T13:35:19.949723Z","shell.execute_reply":"2021-10-16T13:35:20.204880Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.compile(optimizer = Adam(lr=2e-3),\n              loss='binary_crossentropy',\n              metrics=['binary_accuracy'])","metadata":{"execution":{"iopub.status.busy":"2021-10-16T13:35:20.208024Z","iopub.execute_input":"2021-10-16T13:35:20.208956Z","iopub.status.idle":"2021-10-16T13:35:20.230118Z","shell.execute_reply.started":"2021-10-16T13:35:20.208896Z","shell.execute_reply":"2021-10-16T13:35:20.229023Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2021-10-16T13:35:21.546263Z","iopub.execute_input":"2021-10-16T13:35:21.546623Z","iopub.status.idle":"2021-10-16T13:35:21.561614Z","shell.execute_reply.started":"2021-10-16T13:35:21.546586Z","shell.execute_reply":"2021-10-16T13:35:21.560347Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Train Model","metadata":{}},{"cell_type":"code","source":"train_generator = DataGenerator(path+'train/', train_audio_files, y_train, batch_size = 64)","metadata":{"execution":{"iopub.status.busy":"2021-10-16T13:35:26.232620Z","iopub.execute_input":"2021-10-16T13:35:26.233521Z","iopub.status.idle":"2021-10-16T13:35:26.238232Z","shell.execute_reply.started":"2021-10-16T13:35:26.233477Z","shell.execute_reply":"2021-10-16T13:35:26.237328Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit_generator(generator=train_generator,\n                              epochs = 15,\n                              workers=4)","metadata":{"execution":{"iopub.status.busy":"2021-10-16T13:35:28.509263Z","iopub.execute_input":"2021-10-16T13:35:28.510275Z","iopub.status.idle":"2021-10-16T18:08:46.120607Z","shell.execute_reply.started":"2021-10-16T13:35:28.510230Z","shell.execute_reply":"2021-10-16T18:08:46.108768Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict","metadata":{}},{"cell_type":"code","source":"y_test = pd.read_csv(path+'sample_submission.csv', index_col=0)","metadata":{"execution":{"iopub.status.busy":"2021-10-16T18:08:48.405925Z","iopub.execute_input":"2021-10-16T18:08:48.415740Z","iopub.status.idle":"2021-10-16T18:08:48.613156Z","shell.execute_reply.started":"2021-10-16T18:08:48.415585Z","shell.execute_reply":"2021-10-16T18:08:48.611187Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_generator = DataGenerator(path+'test/', test_audio_files, y_test, batch_size = 64)","metadata":{"execution":{"iopub.status.busy":"2021-10-16T18:09:13.293030Z","iopub.execute_input":"2021-10-16T18:09:13.293504Z","iopub.status.idle":"2021-10-16T18:09:13.301920Z","shell.execute_reply.started":"2021-10-16T18:09:13.293452Z","shell.execute_reply":"2021-10-16T18:09:13.300485Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"y_pred = model.predict_generator(test_generator, verbose=1)","metadata":{"execution":{"iopub.status.busy":"2021-10-16T18:09:27.960063Z","iopub.execute_input":"2021-10-16T18:09:27.960409Z","iopub.status.idle":"2021-10-16T18:27:22.424149Z","shell.execute_reply.started":"2021-10-16T18:09:27.960374Z","shell.execute_reply":"2021-10-16T18:27:22.422943Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Write Output","metadata":{}},{"cell_type":"code","source":"output = pd.DataFrame(y_pred, columns = samp_subm.columns[1:25])\noutput.insert(0, 'recording_id', samp_subm['recording_id'])\noutput.dropna(inplace=True)","metadata":{"execution":{"iopub.status.busy":"2021-10-16T18:27:28.597078Z","iopub.execute_input":"2021-10-16T18:27:28.598230Z","iopub.status.idle":"2021-10-16T18:27:28.632791Z","shell.execute_reply.started":"2021-10-16T18:27:28.598174Z","shell.execute_reply":"2021-10-16T18:27:28.631819Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Submission","metadata":{}},{"cell_type":"code","source":"output.to_csv('submission.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2021-10-16T18:27:31.267770Z","iopub.execute_input":"2021-10-16T18:27:31.268095Z","iopub.status.idle":"2021-10-16T18:27:31.368583Z","shell.execute_reply.started":"2021-10-16T18:27:31.268057Z","shell.execute_reply":"2021-10-16T18:27:31.367652Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}