{"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":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-10-10T05:37:41.694925Z","iopub.execute_input":"2023-10-10T05:37:41.696067Z","iopub.status.idle":"2023-10-10T05:37:43.094400Z","shell.execute_reply.started":"2023-10-10T05:37:41.696030Z","shell.execute_reply":"2023-10-10T05:37:43.093186Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\n#!pip install scipy\n!pip install --upgrade librosa","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:37:43.096263Z","iopub.execute_input":"2023-10-10T05:37:43.096608Z","iopub.status.idle":"2023-10-10T05:37:53.537935Z","shell.execute_reply.started":"2023-10-10T05:37:43.096581Z","shell.execute_reply":"2023-10-10T05:37:53.536636Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import librosa\naudio='/kaggle/input/birdclef-2023/train_audio/abethr1/XC128013.ogg'\ndata,samp_rate = librosa.load(audio)","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:37:53.539545Z","iopub.execute_input":"2023-10-10T05:37:53.539892Z","iopub.status.idle":"2023-10-10T05:37:58.001819Z","shell.execute_reply.started":"2023-10-10T05:37:53.539864Z","shell.execute_reply":"2023-10-10T05:37:58.000730Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nplt.figure(figsize=(12,4))\nplt.plot(data)","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:37:58.004679Z","iopub.execute_input":"2023-10-10T05:37:58.005006Z","iopub.status.idle":"2023-10-10T05:37:58.649174Z","shell.execute_reply.started":"2023-10-10T05:37:58.004980Z","shell.execute_reply":"2023-10-10T05:37:58.647698Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Feature Extraction with MFCC \nmfccs= librosa.feature.mfcc(y=data,sr=samp_rate, n_mfcc=40)\nprint(mfccs.shape)","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:37:58.650673Z","iopub.execute_input":"2023-10-10T05:37:58.650998Z","iopub.status.idle":"2023-10-10T05:37:58.754991Z","shell.execute_reply.started":"2023-10-10T05:37:58.650972Z","shell.execute_reply":"2023-10-10T05:37:58.753810Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"voices_per_bird = 12\nnum_classes_to_keep = 9","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:37:58.756781Z","iopub.execute_input":"2023-10-10T05:37:58.757545Z","iopub.status.idle":"2023-10-10T05:37:58.764609Z","shell.execute_reply.started":"2023-10-10T05:37:58.757505Z","shell.execute_reply":"2023-10-10T05:37:58.763286Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load metadata\nmetadata = pd.read_csv('/kaggle/input/birdclef-2023/train_metadata.csv')\n\nselected_metadata = metadata.groupby('primary_label').head(voices_per_bird)\n\n\n# Set a specific random state for reproducibility\nrandom_state = 42\n\n# Get a random sample of 10 unique classes\nunique_classes = selected_metadata['primary_label'].unique()\nnp.random.seed(random_state)\nselected_classes = np.random.choice(unique_classes, num_classes_to_keep, replace=False)\n\n# Filter the DataFrame to keep only the selected classes\nfiltered_df = selected_metadata[selected_metadata['primary_label'].isin(selected_classes)]\n\n# Save the filtered DataFrame to a new CSV file\nselected_metadata = filtered_df \n\nprint(len(selected_metadata))\nselected_metadata.head()\nprint(\"Selected classes to keep:\")\nfor selected_class in selected_classes:\n    print(selected_class)","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:37:58.767114Z","iopub.execute_input":"2023-10-10T05:37:58.768194Z","iopub.status.idle":"2023-10-10T05:37:58.915523Z","shell.execute_reply.started":"2023-10-10T05:37:58.768142Z","shell.execute_reply":"2023-10-10T05:37:58.914322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"desired_duration=10\ndef feature_extractor(filename):\n    data,sr = librosa.load(filename, duration = desired_duration)\n    if len(data) < sr * desired_duration:\n        data = np.pad(data, (0, sr * desired_duration - len(data)))\n         \n    \n    mfcc_features = librosa.feature.mfcc(y=data,sr=samp_rate, n_mfcc=40)\n    mfcc_scaled_features = mfcc_features\n    #mfcc_scaled_features = np.mean(mfcc_features.T, axis=0)\n    return mfcc_scaled_features","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:37:58.917086Z","iopub.execute_input":"2023-10-10T05:37:58.917540Z","iopub.status.idle":"2023-10-10T05:37:58.924949Z","shell.execute_reply.started":"2023-10-10T05:37:58.917502Z","shell.execute_reply":"2023-10-10T05:37:58.923659Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#Runtime - 2min 14 sec 775 iterations for 3 clips per bird\nfrom tqdm import tqdm #Allows to see progress\nextracted_features=[]\nfor index_num,row in tqdm(selected_metadata.iterrows()):\n    filename= \"/kaggle/input/birdclef-2023/train_audio/\" + row[\"filename\"] \n    final_class_labels=row[\"primary_label\"]\n    data=feature_extractor(filename)\n    extracted_features.append([data,final_class_labels])","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:37:58.926839Z","iopub.execute_input":"2023-10-10T05:37:58.927624Z","iopub.status.idle":"2023-10-10T05:38:06.721210Z","shell.execute_reply.started":"2023-10-10T05:37:58.927595Z","shell.execute_reply":"2023-10-10T05:38:06.719684Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"features_df = pd.DataFrame(extracted_features, columns=['features','class'])\nprint(features_df.shape)\nprint(features_df.head())","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:38:06.729303Z","iopub.execute_input":"2023-10-10T05:38:06.730194Z","iopub.status.idle":"2023-10-10T05:38:06.884211Z","shell.execute_reply.started":"2023-10-10T05:38:06.730135Z","shell.execute_reply":"2023-10-10T05:38:06.883247Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class_distribution = features_df['class'].value_counts()\n\n# Print the distribution\nprint(class_distribution)","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:38:06.885448Z","iopub.execute_input":"2023-10-10T05:38:06.885752Z","iopub.status.idle":"2023-10-10T05:38:06.893427Z","shell.execute_reply.started":"2023-10-10T05:38:06.885726Z","shell.execute_reply":"2023-10-10T05:38:06.892362Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Filter out classes with fewer than 3 instances to avoid class imbalance\nmin_instances = voices_per_bird\nfiltered_classes = class_distribution[class_distribution >= min_instances].index.tolist()\n\n# Create a new DataFrame with only the rows that belong to the filtered classes\nfiltered_dataframe = features_df[features_df['class'].isin(filtered_classes)].copy()  # Removed .tolist()\n\n# Calculate how many rows and unique classes were removed\nrows_removed = len(features_df) - len(filtered_dataframe)\nunique_classes_removed = len(class_distribution) - len(filtered_classes)\n\n# Print the filtered DataFrame\nprint(filtered_dataframe.head())\n\n# Print the number of rows and unique classes removed\nprint(f\"Rows removed: {rows_removed}\")\nprint(f\"Unique classes removed: {unique_classes_removed}\")\nprint(\"Final Shape: \",filtered_dataframe.shape)\nprint(\"Unique Birds:\",filtered_dataframe.shape[0]/voices_per_bird)","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:38:06.895120Z","iopub.execute_input":"2023-10-10T05:38:06.895689Z","iopub.status.idle":"2023-10-10T05:38:06.987968Z","shell.execute_reply.started":"2023-10-10T05:38:06.895660Z","shell.execute_reply":"2023-10-10T05:38:06.986734Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X = np.array(filtered_dataframe['features'].tolist())\ny = np.array(filtered_dataframe['class'].tolist())\nprint(X.shape)\nprint(y.shape)","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:38:06.989905Z","iopub.execute_input":"2023-10-10T05:38:06.990233Z","iopub.status.idle":"2023-10-10T05:38:06.998120Z","shell.execute_reply.started":"2023-10-10T05:38:06.990206Z","shell.execute_reply":"2023-10-10T05:38:06.996942Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.preprocessing import LabelEncoder\nlabel_encoder = LabelEncoder()\ny = label_encoder.fit_transform(y)\nprint(y.shape)","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:38:06.999703Z","iopub.execute_input":"2023-10-10T05:38:07.000029Z","iopub.status.idle":"2023-10-10T05:38:07.009640Z","shell.execute_reply.started":"2023-10-10T05:38:07.000003Z","shell.execute_reply":"2023-10-10T05:38:07.008369Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from sklearn.model_selection import train_test_split\nX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.18, random_state=42)","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:38:07.010896Z","iopub.execute_input":"2023-10-10T05:38:07.011254Z","iopub.status.idle":"2023-10-10T05:38:07.025937Z","shell.execute_reply.started":"2023-10-10T05:38:07.011219Z","shell.execute_reply":"2023-10-10T05:38:07.024411Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(X_train.shape)\nprint(X_test.shape)","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:38:07.027233Z","iopub.execute_input":"2023-10-10T05:38:07.028015Z","iopub.status.idle":"2023-10-10T05:38:07.034037Z","shell.execute_reply.started":"2023-10-10T05:38:07.027979Z","shell.execute_reply":"2023-10-10T05:38:07.033241Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import tensorflow as tf\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense,Dropout,Activation,Flatten\nfrom tensorflow.keras.optimizers import Adam\nfrom sklearn import metrics","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:38:07.035127Z","iopub.execute_input":"2023-10-10T05:38:07.035462Z","iopub.status.idle":"2023-10-10T05:38:07.046259Z","shell.execute_reply.started":"2023-10-10T05:38:07.035436Z","shell.execute_reply":"2023-10-10T05:38:07.045311Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"num_labels= int(y.shape[0]/voices_per_bird)","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:38:07.047482Z","iopub.execute_input":"2023-10-10T05:38:07.048108Z","iopub.status.idle":"2023-10-10T05:38:07.060329Z","shell.execute_reply.started":"2023-10-10T05:38:07.048079Z","shell.execute_reply":"2023-10-10T05:38:07.058863Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"using_model=None","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:38:07.062528Z","iopub.execute_input":"2023-10-10T05:38:07.063354Z","iopub.status.idle":"2023-10-10T05:38:07.072101Z","shell.execute_reply.started":"2023-10-10T05:38:07.063310Z","shell.execute_reply":"2023-10-10T05:38:07.070914Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#using_model=1\n# model=Sequential()\n# model.add(Dense(128,input_shape=(40,)))\n# model.add(Activation('relu'))\n# model.add(Dropout(0.5))\n\n# model.add(Dense(256))\n# model.add(Activation('relu'))\n# model.add(Dropout(0.5))\n\n# model.add(Dense(128))\n# model.add(Activation('relu'))\n# model.add(Dropout(0.5))\n\n# model.add(Dense(1))\n# model.add(Activation('sigmoid'))\n# model.compile(loss='binary_crossentropy', metrics=['accuracy'], optimizer='adam')","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:38:07.073682Z","iopub.execute_input":"2023-10-10T05:38:07.074817Z","iopub.status.idle":"2023-10-10T05:38:07.085478Z","shell.execute_reply.started":"2023-10-10T05:38:07.074776Z","shell.execute_reply":"2023-10-10T05:38:07.084458Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"using_model=2\nimport tensorflow as tf\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Reshape\nnum_classes = int(y.shape[0]/voices_per_bird)\nfrom tensorflow.keras.utils import to_categorical\nusing_model_2=True\n# Convert y_train and y_test into one-hot encoded format\ny_train_encoded = to_categorical(y_train, num_classes=num_classes)\ny_test_encoded = to_categorical(y_test, num_classes=num_classes)\nprint(y_train_encoded[:5])\n\n# Define and compile your model\nmodel = tf.keras.Sequential()\nmodel.add(Reshape((40, 431, 1), input_shape=(40, 431)))  # Add 1 channel for grayscale\nprint(X_train.shape, y_train.shape, X_test.shape, y_test.shape)\nmodel.add(Conv2D(32, (3, 3), activation='relu'))\nmodel.add(MaxPooling2D((2, 2)))\nmodel.add(Conv2D(32, (3, 3), activation='relu'))\nmodel.add(MaxPooling2D((2, 2)))\nmodel.add(Flatten())\nmodel.add(Dense(200, activation='relu'))\nmodel.add(Dropout(0.5))\nmodel.add(Dense(num_classes, activation='softmax'))\n\nmodel.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam')","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:38:07.087419Z","iopub.execute_input":"2023-10-10T05:38:07.088230Z","iopub.status.idle":"2023-10-10T05:38:07.237812Z","shell.execute_reply.started":"2023-10-10T05:38:07.088190Z","shell.execute_reply":"2023-10-10T05:38:07.236670Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"if using_model == 2:\n    print(\"using model 2\")\n    from tensorflow.keras.callbacks import ModelCheckpoint\n    from datetime import datetime\n    num_epochs=20\n    num_batch_size=32\n\n    checkpointer = ModelCheckpoint(filepath='/kaggle/working/audio_classification.hdf5', verbose=1, save_best_only=True)\n    start=datetime.now()\n    model.fit(X_train,y_train_encoded, batch_size=num_batch_size, epochs=num_epochs, validation_data=(X_test,y_test_encoded), callbacks=[checkpointer])\n    duration = datetime.now() - start\n    print(\"Training completed in time :\",duration)\nelif using_model==1:\n    from tensorflow.keras.callbacks import ModelCheckpoint\n    from datetime import datetime\n    num_epochs=20\n    num_batch_size=32\n\n    checkpointer = ModelCheckpoint(filepath='/kaggle/working/audio_classification.hdf5', verbose=1, save_best_only=True)\n    start=datetime.now()\n    model.fit(X_train,y_train, batch_size=num_batch_size, epochs=num_epochs, validation_data=(X_test,y_test), callbacks=[checkpointer])\n    duration = datetime.now() - start\n    print(\"Training completed in time :\",duration)","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:38:07.239726Z","iopub.execute_input":"2023-10-10T05:38:07.240561Z","iopub.status.idle":"2023-10-10T05:38:49.230047Z","shell.execute_reply.started":"2023-10-10T05:38:07.240521Z","shell.execute_reply":"2023-10-10T05:38:49.229129Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.summary()","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:38:49.231366Z","iopub.execute_input":"2023-10-10T05:38:49.231664Z","iopub.status.idle":"2023-10-10T05:38:49.265045Z","shell.execute_reply.started":"2023-10-10T05:38:49.231638Z","shell.execute_reply":"2023-10-10T05:38:49.264262Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_accuracy=model.evaluate(X_test,y_test_encoded,verbose=0)\nprint(test_accuracy[1]*100)\nif test_accuracy[1]*100 > 60:\n    print(\"YAY\")\nelse:\n    print(\"NOOOOOOOOO\")","metadata":{"execution":{"iopub.status.busy":"2023-10-10T05:38:49.266296Z","iopub.execute_input":"2023-10-10T05:38:49.267141Z","iopub.status.idle":"2023-10-10T05:38:49.382704Z","shell.execute_reply.started":"2023-10-10T05:38:49.267112Z","shell.execute_reply":"2023-10-10T05:38:49.381553Z"},"trusted":true},"execution_count":null,"outputs":[]}]}