{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":70203,"databundleVersionId":8068726,"sourceType":"competition"},{"sourceId":1308479,"sourceType":"datasetVersion","datasetId":741657},{"sourceId":1664376,"sourceType":"datasetVersion","datasetId":985270},{"sourceId":5181249,"sourceType":"datasetVersion","datasetId":3012199},{"sourceId":8036535,"sourceType":"datasetVersion","datasetId":4737648},{"sourceId":8052226,"sourceType":"datasetVersion","datasetId":4748711},{"sourceId":9377717,"sourceType":"datasetVersion","datasetId":5688585}],"dockerImageVersionId":30673,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install numpy librosa matplotlib\n\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T12:51:02.264240Z","iopub.execute_input":"2024-09-12T12:51:02.264611Z","iopub.status.idle":"2024-09-12T12:51:35.882530Z","shell.execute_reply.started":"2024-09-12T12:51:02.264579Z","shell.execute_reply":"2024-09-12T12:51:35.881263Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"markdown","source":"---------------------------------------","metadata":{}},{"cell_type":"markdown","source":"---------------------------------------------------------------------------------","metadata":{}},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\nimport librosa\nimport librosa.display\nfrom tqdm import tqdm\nimport matplotlib.pyplot as plt\nfrom sklearn.preprocessing import LabelEncoder\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout,Input\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T19:45:07.111387Z","iopub.execute_input":"2024-09-12T19:45:07.111859Z","iopub.status.idle":"2024-09-12T19:45:21.006214Z","shell.execute_reply.started":"2024-09-12T19:45:07.111830Z","shell.execute_reply":"2024-09-12T19:45:21.005405Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\n\n# Load metadata\nmetadata = pd.read_csv('/kaggle/input/birdclef-2024/train_metadata.csv')\nmetadata.head()\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T19:45:21.007590Z","iopub.execute_input":"2024-09-12T19:45:21.008127Z","iopub.status.idle":"2024-09-12T19:45:21.184078Z","shell.execute_reply.started":"2024-09-12T19:45:21.008101Z","shell.execute_reply":"2024-09-12T19:45:21.183087Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_and_preprocess_audio(file_path, sr=22050, n_mels=128, fmax=8000, max_len=128):\n    # Load audio file\n    y, sr = librosa.load(file_path, sr=sr)\n    \n    # Convert to Mel spectrogram\n    mel_spectrogram = librosa.feature.melspectrogram(y=y, sr=sr, n_mels=n_mels, fmax=fmax)\n    \n    # Convert to dB\n    mel_spectrogram_db = librosa.power_to_db(mel_spectrogram, ref=np.max)\n    \n    # Normalize the spectrogram\n    mel_spectrogram_db = (mel_spectrogram_db - mel_spectrogram_db.min()) / (mel_spectrogram_db.max() - mel_spectrogram_db.min())\n    \n    # Pad or truncate the spectrogram to ensure the same length\n    if mel_spectrogram_db.shape[1] < max_len:\n        pad_width = max_len - mel_spectrogram_db.shape[1]\n        mel_spectrogram_db = np.pad(mel_spectrogram_db, ((0, 0), (0, pad_width)), mode='constant')\n    else:\n        mel_spectrogram_db = mel_spectrogram_db[:, :max_len]\n    \n    return mel_spectrogram_db\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T17:39:22.127085Z","iopub.execute_input":"2024-09-12T17:39:22.127485Z","iopub.status.idle":"2024-09-12T17:39:22.136073Z","shell.execute_reply.started":"2024-09-12T17:39:22.127450Z","shell.execute_reply":"2024-09-12T17:39:22.134995Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def load_audio_data(metadata, audio_folder, sr=22050, n_mels=128, fmax=8000, max_len=128):\n    X = []\n    y = []\n    \n    \n    for _, row in tqdm(metadata.iterrows(), total=metadata.shape[0], desc=\"Processing Audio Files\"):\n        file_path = os.path.join(audio_folder, row['filename'])  # Adjust the column name for the file path\n        label = row['primary_label']  # Adjust the column name for the label\n        mel_spectrogram = load_and_preprocess_audio(file_path, sr, n_mels, fmax, max_len)\n        X.append(mel_spectrogram)\n        y.append(label)\n    \n    return np.array(X), np.array(y)\n\n\nmetadata = pd.read_csv('/kaggle/input/birdclef-2024/train_metadata.csv')\nX_train, y_train = load_audio_data(metadata, '/kaggle/input/birdclef-2024/train_audio')\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T17:39:25.257069Z","iopub.execute_input":"2024-09-12T17:39:25.258044Z","iopub.status.idle":"2024-09-12T18:53:28.547580Z","shell.execute_reply.started":"2024-09-12T17:39:25.258009Z","shell.execute_reply":"2024-09-12T18:53:28.546759Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"np.save('X_data2.npy', X_train)\nnp.save('Y_data2.npy', y_train)\n\nprint(\"Data processing complete and saved.\")","metadata":{"execution":{"iopub.status.busy":"2024-09-12T18:55:46.741852Z","iopub.execute_input":"2024-09-12T18:55:46.742502Z","iopub.status.idle":"2024-09-12T18:55:48.637382Z","shell.execute_reply.started":"2024-09-12T18:55:46.742466Z","shell.execute_reply":"2024-09-12T18:55:48.636027Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_train = np.load('/kaggle/input/xtrain-ytrain/X_data2.npy')\ny_train = np.load('/kaggle/input/xtrain-ytrain/Y_data2.npy')","metadata":{"execution":{"iopub.status.busy":"2024-09-12T19:45:57.466384Z","iopub.execute_input":"2024-09-12T19:45:57.467136Z","iopub.status.idle":"2024-09-12T19:45:57.964574Z","shell.execute_reply.started":"2024-09-12T19:45:57.467106Z","shell.execute_reply":"2024-09-12T19:45:57.963805Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Visualize numpy array of spectogram**","metadata":{}},{"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport librosa.display\n\n\ndef plot_spectrogram(spectrogram, label):\n    plt.figure(figsize=(10, 4))\n    librosa.display.specshow(spectrogram, sr=22050, hop_length=512, x_axis='time', y_axis='mel', cmap='coolwarm')\n    plt.colorbar(format='%+2.0f dB')\n    plt.title(f'Mel Spectrogram - {label}')\n    plt.tight_layout()\n    plt.show()\n\n\nplot_spectrogram(X_train[10].squeeze(), y_train[0])\nplot_spectrogram(X_train[65].squeeze(), y_train[1])","metadata":{"execution":{"iopub.status.busy":"2024-09-12T19:46:17.347149Z","iopub.execute_input":"2024-09-12T19:46:17.347521Z","iopub.status.idle":"2024-09-12T19:46:18.163804Z","shell.execute_reply.started":"2024-09-12T19:46:17.347492Z","shell.execute_reply":"2024-09-12T19:46:18.162872Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Encode labels to numeric format","metadata":{}},{"cell_type":"code","source":"\nlabel_encoder = LabelEncoder()\ny_train_encoded = label_encoder.fit_transform(y_train)\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T19:46:23.251223Z","iopub.execute_input":"2024-09-12T19:46:23.251577Z","iopub.status.idle":"2024-09-12T19:46:23.258099Z","shell.execute_reply.started":"2024-09-12T19:46:23.251553Z","shell.execute_reply":"2024-09-12T19:46:23.257166Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"print(\"Hello\")","metadata":{}},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"from tensorflow.keras.preprocessing.image import ImageDataGenerator\n\ndef create_data_generator(X, y, batch_size=32, img_size=(128, 128)):\n    datagen = ImageDataGenerator()\n    return datagen.flow(np.expand_dims(X, axis=-1), y, batch_size=batch_size)\n\ntrain_gen = create_data_generator(X_train, y_train_encoded)\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T19:46:26.491478Z","iopub.execute_input":"2024-09-12T19:46:26.492459Z","iopub.status.idle":"2024-09-12T19:46:26.497935Z","shell.execute_reply.started":"2024-09-12T19:46:26.492427Z","shell.execute_reply":"2024-09-12T19:46:26.497039Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\n\nmodel = Sequential([\n    Input(shape=(128, 128, 1)),  # Define the input shape explicitly\n    Conv2D(32, (3, 3), activation='relu'),\n    MaxPooling2D((2, 2)),\n    Conv2D(64, (3, 3), activation='relu'),\n    MaxPooling2D((2, 2)),\n    Conv2D(128, (3, 3), activation='relu'),\n    MaxPooling2D((2, 2)),\n    Flatten(),\n    Dense(128, activation='relu'),\n    Dropout(0.5),\n    Dense(len(label_encoder.classes_), activation='softmax')  # Number of classes\n])\n\n\nmodel.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])\n\n\nmodel.summary()\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T19:46:28.046016Z","iopub.execute_input":"2024-09-12T19:46:28.046897Z","iopub.status.idle":"2024-09-12T19:46:28.941765Z","shell.execute_reply.started":"2024-09-12T19:46:28.046867Z","shell.execute_reply":"2024-09-12T19:46:28.940810Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"history = model.fit(\n    train_gen,\n    steps_per_epoch=len(X_train) // 32,\n    epochs=100\n)\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T19:46:35.201241Z","iopub.execute_input":"2024-09-12T19:46:35.201596Z","iopub.status.idle":"2024-09-12T19:55:29.476435Z","shell.execute_reply.started":"2024-09-12T19:46:35.201569Z","shell.execute_reply":"2024-09-12T19:55:29.475615Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.save(\"5epochmodel.h5\")","metadata":{"execution":{"iopub.status.busy":"2024-09-12T19:16:50.675809Z","iopub.execute_input":"2024-09-12T19:16:50.676549Z","iopub.status.idle":"2024-09-12T19:16:50.796160Z","shell.execute_reply.started":"2024-09-12T19:16:50.676517Z","shell.execute_reply":"2024-09-12T19:16:50.795369Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = load_model('path_to_your_model.h5')","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict_audio(file_path, model, label_encoder):\n    mel_spectrogram = load_and_preprocess_audio(file_path)\n    mel_spectrogram = np.expand_dims(mel_spectrogram, axis=(0, -1))  # Add batch and channel dimensions\n    prediction = model.predict(mel_spectrogram)\n    predicted_class = np.argmax(prediction)\n    return label_encoder.inverse_transform([predicted_class])[0]\n\n\n# test_file_path = '/kaggle/input/birdclef-2024/train_audio/ashpri1/XC384390.ogg'\n# test_file_path = '/kaggle/input/birdclef-2024/train_audio/ashpri1/XC401869.ogg'\ntest_file_path = '/kaggle/input/birdclef-2024/train_audio/brnhao1/XC155373.ogg'\npredicted_species = predict_audio(test_file_path, model, label_encoder)\nprint(f\"Predicted species: {predicted_species}\")\n","metadata":{"execution":{"iopub.status.busy":"2024-09-12T19:10:08.852113Z","iopub.execute_input":"2024-09-12T19:10:08.853024Z","iopub.status.idle":"2024-09-12T19:10:09.470785Z","shell.execute_reply.started":"2024-09-12T19:10:08.852986Z","shell.execute_reply":"2024-09-12T19:10:09.469650Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"metadata.head()","metadata":{"execution":{"iopub.status.busy":"2024-09-12T19:13:26.565363Z","iopub.execute_input":"2024-09-12T19:13:26.566065Z","iopub.status.idle":"2024-09-12T19:13:26.584616Z","shell.execute_reply.started":"2024-09-12T19:13:26.566031Z","shell.execute_reply":"2024-09-12T19:13:26.583556Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(metadata[metadata['primary_label']=='brnhao1'])","metadata":{"execution":{"iopub.status.busy":"2024-09-12T19:15:39.721422Z","iopub.execute_input":"2024-09-12T19:15:39.721846Z","iopub.status.idle":"2024-09-12T19:15:39.745335Z","shell.execute_reply.started":"2024-09-12T19:15:39.721809Z","shell.execute_reply":"2024-09-12T19:15:39.744479Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}