{"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":"none","dataSources":[{"sourceId":70203,"databundleVersionId":8068726,"sourceType":"competition"},{"sourceId":8521651,"sourceType":"datasetVersion","datasetId":5088228}],"dockerImageVersionId":30698,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# import librosa\n# import os\n# import numpy as np\n# import cv2\n# import glob\n# import tensorflow as tf\n# import pandas as pd\n# import pickle\n# from tensorflow.keras.models import Model\n# from tensorflow.keras.layers import GlobalAveragePooling2D, Dense, Input\n# from tensorflow.keras.applications import MobileNetV2\n\n# # Define the model (assumed structure based on typical CNN for spectrograms)\n# def create_model(input_shape, num_classes):\n#     inputs = Input(shape=input_shape)\n#     base_model = MobileNetV2(weights='imagenet', include_top=False, input_tensor=inputs)  # Load pre-trained MobileNetV2\n#     x = GlobalAveragePooling2D()(base_model.output)\n#     x = Dense(256, activation='relu')(x)\n#     outputs = Dense(num_classes, activation='softmax')(x)\n    \n#     model = Model(inputs, outputs)\n#     return model\n\n# # Load the model weights\n# input_shape = (224, 224, 3)\n# num_classes = 182\n# model = create_model(input_shape, num_classes)\n# model.load_weights('/kaggle/input/bird-clef-inputs/best_model.keras')\n\n# # Function to preprocess audio to spectrogram using librosa and cv2\n# def preprocess_audio_to_spectrogram(audio_chunk, img_size=224):\n#     n_fft = 2048  # Length of the FFT window\n#     hop_length = 512  # Number of samples between successive frames\n#     n_mels = 128  # Number of Mel bands\n#     fmin = 1000  # Min frequency (Hz)\n#     fmax = 9000  # Max frequency (Hz)\n\n#     # Convert to Mel Spectrogram\n#     ms = librosa.feature.melspectrogram(y=audio_chunk, sr=sr, n_fft=n_fft, hop_length=hop_length, n_mels=n_mels, fmin=fmin, fmax=fmax)\n#     log_ms = librosa.power_to_db(ms, ref=np.max)\n    \n#     # Normalize log_ms to be between 0 and 1\n#     log_ms_normalized = (log_ms - log_ms.min()) / (log_ms.max() - log_ms.min())\n    \n#     # Convert log_ms_normalized to 8-bit unsigned integer format\n#     log_ms_normalized_uint8 = (log_ms_normalized * 255).astype(np.uint8)\n    \n#     # Convert single-channel image to three-channel RGB image\n#     log_ms_rgb = cv2.cvtColor(log_ms_normalized_uint8, cv2.COLOR_GRAY2RGB)\n    \n#     # Resize to the target image size for the model\n#     log_ms_rgb_resized = cv2.resize(log_ms_rgb, (img_size, img_size))\n    \n#     # Normalize the image array\n#     log_ms_rgb_resized = log_ms_rgb_resized / 255.0\n    \n#     return log_ms_rgb_resized\n\n# # Load class names from the pkl file\n# with open('/kaggle/input/bird-clef-inputs/class_names.pkl', 'rb') as f:\n#     class_names = pickle.load(f)\n\n# # Step 1: Read .ogg files from the test folder\n# test_folder = '/kaggle/input/birdclef-2024/unlabeled_soundscapes'\n# ogg_files = glob.glob(os.path.join(test_folder, '*.ogg'))\n\n# # Step 2: Use the trained model to make predictions directly\n# predictions = {}\n# for ogg_file in ogg_files:\n#     audio, sr = librosa.load(ogg_file)\n#     chunk_length = sr * 5  # 5-second chunk length in samples\n#     total_length = len(audio)\n#     num_chunks = total_length // chunk_length  # Number of full 5-second chunks\n\n#     for i in range(num_chunks):\n#         chunk_start = i * chunk_length\n#         chunk_end = (i + 1) * chunk_length\n#         audio_chunk = audio[chunk_start:chunk_end]\n        \n#         # Preprocess the audio chunk to a spectrogram\n#         spectrogram = preprocess_audio_to_spectrogram(audio_chunk)\n#         spectrogram = np.expand_dims(spectrogram, axis=0)  # Create batch axis\n\n#         # Make a prediction\n#         prediction = model.predict(spectrogram)\n        \n#         # Create the filename suffix based on the chunk number\n#         suffix = f\"_{(i+1)*5:02d}\"\n#         print(suffix)\n#         predictions[os.path.basename(ogg_file).replace('.ogg', suffix)] = prediction\n\n# # Step 3: Create a CSV file with predictions\n# output_file = '/kaggle/working/submission.csv'\n# columns = ['row_id'] + class_names\n# data = []\n\n# for filename, prediction in predictions.items():\n#     row_id = f\"soundscape_{filename}\"\n#     row = [row_id] + prediction.tolist()[0]\n#     data.append(row)\n\n# df = pd.DataFrame(data, columns=columns)\n# df.to_csv(output_file, index=False)\n\n# print(f'Predictions saved to {output_file}')","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-05-27T03:47:05.137449Z","iopub.execute_input":"2024-05-27T03:47:05.137871Z","iopub.status.idle":"2024-05-27T03:47:05.176993Z","shell.execute_reply.started":"2024-05-27T03:47:05.137838Z","shell.execute_reply":"2024-05-27T03:47:05.175739Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import librosa\n# import os\n# import numpy as np\n# import cv2\n# import glob\n# import tensorflow as tf\n# import pandas as pd\n# import pickle\n# from tensorflow.keras.models import Model\n# from tensorflow.keras.layers import GlobalAveragePooling2D, Dense, Input\n# from tensorflow.keras.applications import MobileNetV2\n# from concurrent.futures import ThreadPoolExecutor\n\n# # Define the model (assumed structure based on typical CNN for spectrograms)\n# def create_model(input_shape, num_classes):\n#     inputs = Input(shape=input_shape)\n#     base_model = MobileNetV2(weights='imagenet', include_top=False, input_tensor=inputs)  # Load pre-trained MobileNetV2\n#     x = GlobalAveragePooling2D()(base_model.output)\n#     x = Dense(256, activation='relu')(x)\n#     outputs = Dense(num_classes, activation='softmax')(x)\n    \n#     model = Model(inputs, outputs)\n#     return model\n\n# # Load the model weights\n# input_shape = (224, 224, 3)\n# num_classes = 182\n# model = create_model(input_shape, num_classes)\n# model.load_weights('/kaggle/input/bird-clef-inputs/best_model.keras')\n\n# # Function to preprocess audio to spectrogram using librosa and cv2\n# def preprocess_audio_to_spectrogram(audio_chunk, sr, img_size=224):\n#     n_fft = 2048  # Length of the FFT window\n#     hop_length = 512  # Number of samples between successive frames\n#     n_mels = 128  # Number of Mel bands\n#     fmin = 1000  # Min frequency (Hz)\n#     fmax = 9000  # Max frequency (Hz)\n\n#     # Convert to Mel Spectrogram\n#     ms = librosa.feature.melspectrogram(y=audio_chunk, sr=sr, n_fft=n_fft, hop_length=hop_length, n_mels=n_mels, fmin=fmin, fmax=fmax)\n#     log_ms = librosa.power_to_db(ms, ref=np.max)\n    \n#     # Normalize log_ms to be between 0 and 1\n#     log_ms_normalized = (log_ms - log_ms.min()) / (log_ms.max() - log_ms.min())\n    \n#     # Convert log_ms_normalized to 8-bit unsigned integer format\n#     log_ms_normalized_uint8 = (log_ms_normalized * 255).astype(np.uint8)\n    \n#     # Convert single-channel image to three-channel RGB image\n#     log_ms_rgb = cv2.cvtColor(log_ms_normalized_uint8, cv2.COLOR_GRAY2RGB)\n    \n#     # Resize to the target image size for the model\n#     log_ms_rgb_resized = cv2.resize(log_ms_rgb, (img_size, img_size))\n    \n#     # Normalize the image array\n#     log_ms_rgb_resized = log_ms_rgb_resized / 255.0\n    \n#     return log_ms_rgb_resized\n\n# # Load class names from the pkl file\n# with open('/kaggle/input/bird-clef-inputs/class_names.pkl', 'rb') as f:\n#     class_names = pickle.load(f)\n\n# # Step 1: Read .ogg files from the test folder\n# test_folder = '/kaggle/input/birdclef-2024/unlabeled_soundscapes'\n# ogg_files = glob.glob(os.path.join(test_folder, '*.ogg'))\n\n# # Function to process each audio file\n# def process_audio_file(ogg_file):\n#     audio, sr = librosa.load(ogg_file)\n#     chunk_length = sr * 5  # 5-second chunk length in samples\n#     total_length = len(audio)\n#     num_chunks = total_length // chunk_length  # Number of full 5-second chunks\n\n#     file_predictions = {}\n#     for i in range(num_chunks):\n#         chunk_start = i * chunk_length\n#         chunk_end = (i + 1) * chunk_length\n#         audio_chunk = audio[chunk_start:chunk_end]\n        \n#         # Preprocess the audio chunk to a spectrogram\n#         spectrogram = preprocess_audio_to_spectrogram(audio_chunk, sr)\n#         spectrogram = np.expand_dims(spectrogram, axis=0)  # Create batch axis\n\n#         # Make a prediction\n#         prediction = model.predict(spectrogram)\n        \n#         # Create the filename suffix based on the chunk number\n#         suffix = f\"_{(i+1)*5:02d}\"\n#         file_predictions[os.path.basename(ogg_file).replace('.ogg', suffix)] = prediction\n    \n#     return file_predictions\n\n# # Step 2: Use ThreadPoolExecutor to process files in parallel\n# predictions = {}\n# with ThreadPoolExecutor() as executor:\n#     results = executor.map(process_audio_file, ogg_files)\n#     for result in results:\n#         predictions.update(result)\n\n# # Step 3: Create a CSV file with predictions\n# output_file = '/kaggle/working/submission.csv'\n# columns = ['row_id'] + class_names\n# data = []\n\n# for filename, prediction in predictions.items():\n#     row_id = f\"soundscape_{filename}\"\n#     row = [row_id] + prediction.tolist()[0]\n#     data.append(row)\n\n# df = pd.DataFrame(data, columns=columns)\n# df.to_csv(output_file, index=False)\n\n# print(f'Predictions saved to {output_file}')\n","metadata":{"execution":{"iopub.status.busy":"2024-05-27T03:47:05.180384Z","iopub.execute_input":"2024-05-27T03:47:05.180870Z","iopub.status.idle":"2024-05-27T03:51:18.684787Z","shell.execute_reply.started":"2024-05-27T03:47:05.180824Z","shell.execute_reply":"2024-05-27T03:51:18.631299Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import librosa\n# import os\n# import numpy as np\n# import cv2\n# import glob\n# import tensorflow as tf\n# import pandas as pd\n# import pickle\n# from tensorflow.keras.models import Model\n# from tensorflow.keras.layers import GlobalAveragePooling2D, Dense, Input\n# from tensorflow.keras.applications import MobileNetV2\n# from concurrent.futures import ThreadPoolExecutor\n\n# # Define the model (assumed structure based on typical CNN for spectrograms)\n# def create_model(input_shape, num_classes):\n#     inputs = Input(shape=input_shape)\n#     base_model = MobileNetV2(weights='imagenet', include_top=False, input_tensor=inputs)  # Load pre-trained MobileNetV2\n#     x = GlobalAveragePooling2D()(base_model.output)\n#     x = Dense(256, activation='relu')(x)\n#     outputs = Dense(num_classes, activation='softmax')(x)\n    \n#     model = Model(inputs, outputs)\n#     return model\n\n# # Load the model weights\n# input_shape = (224, 224, 3)\n# num_classes = 182\n# model = create_model(input_shape, num_classes)\n# model.load_weights('/kaggle/input/bird-clef-inputs/best_model.keras')\n\n# # Function to preprocess audio to spectrogram using librosa and cv2\n# def preprocess_audio_to_spectrogram(audio_chunk, sr, img_size=224):\n#     n_fft = 2048  # Length of the FFT window\n#     hop_length = 512  # Number of samples between successive frames\n#     n_mels = 128  # Number of Mel bands\n#     fmin = 1000  # Min frequency (Hz)\n#     fmax = 9000  # Max frequency (Hz)\n\n#     # Convert to Mel Spectrogram\n#     ms = librosa.feature.melspectrogram(y=audio_chunk, sr=sr, n_fft=n_fft, hop_length=hop_length, n_mels=n_mels, fmin=fmin, fmax=fmax)\n#     log_ms = librosa.power_to_db(ms, ref=np.max)\n    \n#     # Normalize log_ms to be between 0 and 1\n#     log_ms_normalized = (log_ms - log_ms.min()) / (log_ms.max() - log_ms.min())\n    \n#     # Convert log_ms_normalized to 8-bit unsigned integer format\n#     log_ms_normalized_uint8 = (log_ms_normalized * 255).astype(np.uint8)\n    \n#     # Convert single-channel image to three-channel RGB image\n#     log_ms_rgb = cv2.cvtColor(log_ms_normalized_uint8, cv2.COLOR_GRAY2RGB)\n    \n#     # Resize to the target image size for the model\n#     log_ms_rgb_resized = cv2.resize(log_ms_rgb, (img_size, img_size))\n    \n#     # Normalize the image array\n#     log_ms_rgb_resized = log_ms_rgb_resized / 255.0\n    \n#     return log_ms_rgb_resized\n\n# # Load class names from the pkl file\n# with open('/kaggle/input/bird-clef-inputs/class_names.pkl', 'rb') as f:\n#     class_names = pickle.load(f)\n\n# # Step 1: Read .ogg files from the test folder\n# test_folder = '/kaggle/input/birdclef-2024/unlabeled_soundscapes'\n# ogg_files = glob.glob(os.path.join(test_folder, '*.ogg'))\n\n# # Function to process each audio file\n# def process_audio_file(ogg_file):\n#     audio, sr = librosa.load(ogg_file)\n#     chunk_length = sr * 5  # 5-second chunk length in samples\n#     total_length = len(audio)\n#     num_chunks = total_length // chunk_length  # Number of full 5-second chunks\n\n#     file_spectrograms = []\n#     file_metadata = []\n\n#     for i in range(num_chunks):\n#         chunk_start = i * chunk_length\n#         chunk_end = (i + 1) * chunk_length\n#         audio_chunk = audio[chunk_start:chunk_end]\n        \n#         # Preprocess the audio chunk to a spectrogram\n#         spectrogram = preprocess_audio_to_spectrogram(audio_chunk, sr)\n#         file_spectrograms.append(spectrogram)\n        \n#         # Store metadata for mapping predictions\n#         suffix = f\"_{(i+1)*5:02d}\"\n#         filename = os.path.basename(ogg_file).replace('.ogg', suffix)\n#         file_metadata.append(filename)\n\n#     return file_spectrograms, file_metadata\n\n# # Step 2: Use ThreadPoolExecutor to process files in parallel\n# all_spectrograms = []\n# all_metadata = []\n\n# with ThreadPoolExecutor() as executor:\n#     results = executor.map(process_audio_file, ogg_files)\n#     for spectrograms, metadata in results:\n#         all_spectrograms.extend(spectrograms)\n#         all_metadata.extend(metadata)\n\n# # Convert lists to numpy arrays for batch processing\n# all_spectrograms = np.array(all_spectrograms)\n\n# # Step 3: Batch predictions\n# batch_size = 32  # Define an appropriate batch size\n# predictions = model.predict(all_spectrograms, batch_size=batch_size)\n\n# # Step 4: Create a CSV file with predictions\n# output_file = '/kaggle/working/submission.csv'\n# columns = ['row_id'] + class_names\n# data = []\n\n# for filename, prediction in zip(all_metadata, predictions):\n#     row_id = f\"soundscape_{filename}\"\n#     row = [row_id] + prediction.tolist()\n#     data.append(row)\n\n# df = pd.DataFrame(data, columns=columns)\n# df.to_csv(output_file, index=False)\n\n# print(f'Predictions saved to {output_file}')\n","metadata":{"execution":{"iopub.status.busy":"2024-05-27T03:55:22.393310Z","iopub.execute_input":"2024-05-27T03:55:22.394330Z","iopub.status.idle":"2024-05-27T04:01:59.323777Z","shell.execute_reply.started":"2024-05-27T03:55:22.394288Z","shell.execute_reply":"2024-05-27T04:01:59.322043Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import librosa\nimport os\nimport numpy as np\nimport cv2\nimport glob\nimport tensorflow as tf\nimport pandas as pd\nimport pickle\nfrom tensorflow.keras.models import Model\nfrom tensorflow.keras.layers import GlobalAveragePooling2D, Dense, Input\nfrom tensorflow.keras.applications import MobileNetV2\nfrom concurrent.futures import ThreadPoolExecutor\n\n# Define the model (assumed structure based on typical CNN for spectrograms)\ndef create_model(input_shape, num_classes):\n    inputs = Input(shape=input_shape)\n    base_model = MobileNetV2(weights='imagenet', include_top=False, input_tensor=inputs)  # Load pre-trained MobileNetV2\n    x = GlobalAveragePooling2D()(base_model.output)\n    x = Dense(256, activation='relu')(x)\n    outputs = Dense(num_classes, activation='softmax')(x)\n    \n    model = Model(inputs, outputs)\n    return model\n\n# Load the model weights\ninput_shape = (224, 224, 3)\nnum_classes = 182\nmodel = create_model(input_shape, num_classes)\nmodel.load_weights('/kaggle/input/bird-clef-inputs/best_model.keras')\n\n# Function to preprocess audio to spectrogram using librosa and cv2\ndef preprocess_audio_to_spectrogram(audio_chunk, sr, img_size=224):\n    n_fft = 2048  # Length of the FFT window\n    hop_length = 512  # Number of samples between successive frames\n    n_mels = 128  # Number of Mel bands\n    fmin = 1000  # Min frequency (Hz)\n    fmax = 9000  # Max frequency (Hz)\n\n    # Convert to Mel Spectrogram\n    ms = librosa.feature.melspectrogram(y=audio_chunk, sr=sr, n_fft=n_fft, hop_length=hop_length, n_mels=n_mels, fmin=fmin, fmax=fmax)\n    log_ms = librosa.power_to_db(ms, ref=np.max)\n    \n    # Normalize log_ms to be between 0 and 1\n    log_ms_normalized = (log_ms - log_ms.min()) / (log_ms.max() - log_ms.min())\n    \n    # Convert log_ms_normalized to 8-bit unsigned integer format\n    log_ms_normalized_uint8 = (log_ms_normalized * 255).astype(np.uint8)\n    \n    # Convert single-channel image to three-channel RGB image\n    log_ms_rgb = cv2.cvtColor(log_ms_normalized_uint8, cv2.COLOR_GRAY2RGB)\n    \n    # Resize to the target image size for the model\n    log_ms_rgb_resized = cv2.resize(log_ms_rgb, (img_size, img_size))\n    \n    # Normalize the image array\n    log_ms_rgb_resized = log_ms_rgb_resized / 255.0\n    \n    return log_ms_rgb_resized\n\n# Load class names from the pkl file\nwith open('/kaggle/input/bird-clef-inputs/class_names.pkl', 'rb') as f:\n    class_names = pickle.load(f)\n\n# Step 1: Read .ogg files from the test folder\ntest_folder = '/kaggle/input/birdclef-2024/unlabeled_soundscapes'\nogg_files = glob.glob(os.path.join(test_folder, '*.ogg'))\n\n# Function to process each audio file\ndef process_audio_file(ogg_file):\n    audio, sr = librosa.load(ogg_file)\n    chunk_length = sr * 5  # 5-second chunk length in samples\n    total_length = len(audio)\n    num_chunks = min(total_length // chunk_length, 5)  # Limit to 5 chunks per file\n\n    file_predictions = {}\n    for i in range(num_chunks):\n        chunk_start = i * chunk_length\n        chunk_end = (i + 1) * chunk_length\n        audio_chunk = audio[chunk_start:chunk_end]\n        \n        # Preprocess the audio chunk to a spectrogram\n        spectrogram = preprocess_audio_to_spectrogram(audio_chunk, sr)\n        spectrogram = np.expand_dims(spectrogram, axis=0)  # Create batch axis\n\n        # Make a prediction\n        prediction = model.predict(spectrogram)\n        \n        # Create the filename suffix based on the chunk number\n        suffix = f\"_{(i+1)*5:02d}\"\n        file_predictions[os.path.basename(ogg_file).replace('.ogg', suffix)] = prediction\n    \n    return file_predictions\n\n# Step 2: Use ThreadPoolExecutor to process files in parallel\npredictions = {}\nwith ThreadPoolExecutor() as executor:\n    results = executor.map(process_audio_file, ogg_files)\n    for result in results:\n        predictions.update(result)\n\n# Step 3: Create a CSV file with predictions\noutput_file = '/kaggle/working/submission.csv'\ncolumns = ['row_id'] + class_names\ndata = []\n\nfor filename, prediction in predictions.items():\n    row_id = f\"soundscape_{filename}\"\n    row = [row_id] + prediction.tolist()[0]\n    data.append(row)\n\ndf = pd.DataFrame(data, columns=columns)\ndf.to_csv(output_file, index=False)\n\nprint(f'Predictions saved to {output_file}')\n","metadata":{},"execution_count":null,"outputs":[]}]}