{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.12","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":8098641,"sourceType":"datasetVersion","datasetId":4782229},{"sourceId":3836,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":2739,"modelId":319},{"sourceId":15853,"sourceType":"modelInstanceVersion","modelInstanceId":2739,"modelId":319}],"dockerImageVersionId":30408,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"In this notebook, I have evaluated the pretrained [Google-bird-vocalization-classifier-model](https://www.kaggle.com/models/google/bird-vocalization-classifier) on the train_audio of [BirdCLEF 2024](https://www.kaggle.com/models/google/bird-vocalization-classifier) dataset.","metadata":{}},{"cell_type":"markdown","source":"## Step 1: Imports","metadata":{}},{"cell_type":"code","source":"import tensorflow as tf\nimport tensorflow_hub as hub\nimport tensorflow_io as tfio\n\nimport pandas as pd\nimport numpy as np\nimport librosa\nimport glob\n\nimport csv\nimport io\nfrom tqdm import tqdm\nimport os\n\nimport plotly.express as px\nfrom matplotlib import pyplot as plt \n\nfrom IPython.display import Audio","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-11-22T15:34:34.931684Z","iopub.execute_input":"2024-11-22T15:34:34.932394Z","iopub.status.idle":"2024-11-22T15:34:44.554246Z","shell.execute_reply.started":"2024-11-22T15:34:34.932365Z","shell.execute_reply":"2024-11-22T15:34:44.55343Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Step 2: Explore the training data\n\nWe'll start by loading a couple of training examples and using the IPython.display.Audio module to play them!","metadata":{}},{"cell_type":"code","source":"# Load a sample audio files from two different species\naudio_abe, sr_abe = librosa.load(\"/kaggle/input/birdclef-2024/train_audio/asbfly/XC134896.ogg\")\naudio_abh, sr_abh = librosa.load(\"//kaggle/input/birdclef-2024/train_audio/ashdro1/XC114598.ogg\")","metadata":{"execution":{"iopub.status.busy":"2024-11-22T15:34:44.555724Z","iopub.execute_input":"2024-11-22T15:34:44.555996Z","iopub.status.idle":"2024-11-22T15:34:52.522623Z","shell.execute_reply.started":"2024-11-22T15:34:44.555971Z","shell.execute_reply":"2024-11-22T15:34:52.521678Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Play the audio\nAudio(data=audio_abe, rate=sr_abe)","metadata":{"execution":{"iopub.status.busy":"2024-11-22T15:34:52.523883Z","iopub.execute_input":"2024-11-22T15:34:52.524989Z","iopub.status.idle":"2024-11-22T15:34:52.56646Z","shell.execute_reply.started":"2024-11-22T15:34:52.524947Z","shell.execute_reply":"2024-11-22T15:34:52.56517Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Play the audio\nAudio(data=audio_abh, rate=sr_abh)","metadata":{"execution":{"iopub.status.busy":"2024-11-22T15:34:52.5685Z","iopub.execute_input":"2024-11-22T15:34:52.568926Z","iopub.status.idle":"2024-11-22T15:34:52.636855Z","shell.execute_reply.started":"2024-11-22T15:34:52.5689Z","shell.execute_reply":"2024-11-22T15:34:52.635498Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Step 3: Match the model's output with the bird species in the competition\n\nThe competition includes 264 classes of birds, 261 of which exist in this model. We'll set up a way to map the model's output logits to our competition.","metadata":{}},{"cell_type":"code","source":"model = hub.load('https://kaggle.com/models/google/bird-vocalization-classifier/frameworks/tensorFlow2/variations/bird-vocalization-classifier/versions/8')\nlabels_path = hub.resolve('https://kaggle.com/models/google/bird-vocalization-classifier/frameworks/tensorFlow2/variations/bird-vocalization-classifier/versions/8') + \"/assets/label.csv\"","metadata":{"execution":{"iopub.status.busy":"2024-11-22T15:34:52.637969Z","iopub.execute_input":"2024-11-22T15:34:52.63822Z","iopub.status.idle":"2024-11-22T15:35:01.048144Z","shell.execute_reply.started":"2024-11-22T15:34:52.638197Z","shell.execute_reply":"2024-11-22T15:35:01.047369Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Your function remains the same\ndef class_names_from_csv():\n    \"\"\"Returns list of class names corresponding to score vector.\"\"\"\n    with open(labels_path) as csv_file:\n        csv_reader = csv.reader(csv_file, delimiter=',')\n        next(csv_reader)  # Skip header row if present\n        class_names = [row[0] for row in csv_reader]\n    return class_names\n\n# Call the function without passing any arguments\nclasses = class_names_from_csv()\n","metadata":{"execution":{"iopub.status.busy":"2024-11-22T15:35:01.04925Z","iopub.execute_input":"2024-11-22T15:35:01.049613Z","iopub.status.idle":"2024-11-22T15:35:01.063884Z","shell.execute_reply.started":"2024-11-22T15:35:01.049553Z","shell.execute_reply":"2024-11-22T15:35:01.062794Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_metadata = pd.read_csv(\"/kaggle/input/birdclef-2024/train_metadata.csv\")\ntrain_metadata.head()\ncompetition_classes = sorted(train_metadata.primary_label.unique())\n\nforced_defaults = 0\ncompetition_class_map = []\nfor c in competition_classes:\n    try:\n        i = classes.index(c)\n        competition_class_map.append(i)\n    except:\n        competition_class_map.append(0)\n        forced_defaults += 1\n        \n## this is the count of classes not supported by our pretrained model\n## you could choose to simply not predict these, set a default as above,\n## or create your own model using the pretrained model as a base.\nforced_defaults","metadata":{"execution":{"iopub.status.busy":"2024-11-22T15:35:01.065251Z","iopub.execute_input":"2024-11-22T15:35:01.065508Z","iopub.status.idle":"2024-11-22T15:35:01.236667Z","shell.execute_reply.started":"2024-11-22T15:35:01.065484Z","shell.execute_reply":"2024-11-22T15:35:01.23565Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Step 4: Preprocess the data\n\nThe following functions are one way to load the audio provided and break it up into the five-second samples with a sample rate of 32,000 required by the competition.","metadata":{}},{"cell_type":"code","source":"def frame_audio(\n      audio_array: np.ndarray,\n      window_size_s: float = 5.0,\n      hop_size_s: float = 5.0,\n      sample_rate = 32000,\n      ) -> np.ndarray:\n    \n    \"\"\"Helper function for framing audio for inference.\"\"\"\n    \"\"\" using tf.signal \"\"\"\n    if window_size_s is None or window_size_s < 0:\n        return audio_array[np.newaxis, :]\n    frame_length = int(window_size_s * sample_rate)\n    hop_length = int(hop_size_s * sample_rate)\n    framed_audio = tf.signal.frame(audio_array, frame_length, hop_length, pad_end=True)\n    return framed_audio\n\ndef ensure_sample_rate(waveform, original_sample_rate,\n                       desired_sample_rate=32000):\n    \"\"\"Resample waveform if required.\"\"\"\n    if original_sample_rate != desired_sample_rate:\n        waveform = tfio.audio.resample(waveform, original_sample_rate, desired_sample_rate)\n    return desired_sample_rate, waveform","metadata":{"execution":{"iopub.status.busy":"2024-11-22T15:35:01.237736Z","iopub.execute_input":"2024-11-22T15:35:01.238002Z","iopub.status.idle":"2024-11-22T15:35:01.245323Z","shell.execute_reply.started":"2024-11-22T15:35:01.237976Z","shell.execute_reply":"2024-11-22T15:35:01.244234Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"Below we load one training sample - use the Audio function to listen to the samples inside the notebook!","metadata":{}},{"cell_type":"code","source":"audio, sample_rate = librosa.load(\"/kaggle/input/birdclef-2024/train_audio/asbfly/XC134896.ogg\")\nsample_rate, wav_data = ensure_sample_rate(audio, sample_rate)\nAudio(wav_data, rate=sample_rate)","metadata":{"execution":{"iopub.status.busy":"2024-11-22T15:35:01.246498Z","iopub.execute_input":"2024-11-22T15:35:01.246847Z","iopub.status.idle":"2024-11-22T15:35:01.845057Z","shell.execute_reply.started":"2024-11-22T15:35:01.246812Z","shell.execute_reply":"2024-11-22T15:35:01.843394Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Step 5: Make predictions\n\nEach test sample is cut into 5-second chunks. We use the pretrained model to return probabilities for all 10k birds included in the model, then pull out the classes used in this competition to create a final submission row. Note that we are NOT doing anything special to handle the 3 missing classes; those will need fine-tuning / transfer learning, which will be handled in a separate notebook.","metadata":{}},{"cell_type":"code","source":"fixed_tm = frame_audio(wav_data)\noutputs = model.infer_tf(fixed_tm[0:1])\n# Extract the logits for species classification\nlogits = outputs['label']\n# Extract embeddings if needed\nembeddings = outputs['embedding']\nprobabilities = tf.nn.softmax(logits)\nargmax = np.argmax(probabilities)\nprint(f\"The audio is from the class {classes[argmax]} (element:{argmax} in the label.csv file), with probability of {probabilities[0][argmax]}\")","metadata":{"execution":{"iopub.status.busy":"2024-11-22T15:37:54.583317Z","iopub.execute_input":"2024-11-22T15:37:54.583806Z","iopub.status.idle":"2024-11-22T15:37:54.611627Z","shell.execute_reply.started":"2024-11-22T15:37:54.583773Z","shell.execute_reply":"2024-11-22T15:37:54.610629Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-22T15:36:02.561004Z","iopub.execute_input":"2024-11-22T15:36:02.561739Z","iopub.status.idle":"2024-11-22T15:36:02.574096Z","shell.execute_reply.started":"2024-11-22T15:36:02.561703Z","shell.execute_reply":"2024-11-22T15:36:02.573078Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Run inference\noutputs = model.infer_tf(fixed_tm[0:1])\n\n# Print the type and content of the outputs\nprint(\"Type of outputs:\", type(outputs))\nprint(\"Outputs:\", outputs)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-22T15:36:04.415205Z","iopub.execute_input":"2024-11-22T15:36:04.416031Z","iopub.status.idle":"2024-11-22T15:36:04.43894Z","shell.execute_reply.started":"2024-11-22T15:36:04.415995Z","shell.execute_reply":"2024-11-22T15:36:04.437906Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tensorflow as tf\nimport tensorflow_hub as hub\nimport tensorflow_io as tfio\nimport pandas as pd\nimport numpy as np\nimport librosa\nimport os\nimport csv\nfrom IPython.display import Audio\n\n# Load the model\nmodel = hub.load('https://kaggle.com/models/google/bird-vocalization-classifier/frameworks/tensorFlow2/variations/bird-vocalization-classifier/versions/8')\n\n# Resolve labels path\nlabels_path = hub.resolve('https://kaggle.com/models/google/bird-vocalization-classifier/frameworks/tensorFlow2/variations/bird-vocalization-classifier/versions/8') + \"/assets/label.csv\"\n\n# Function to load class names\ndef class_names_from_csv():\n    \"\"\"Returns list of class names corresponding to score vector.\"\"\"\n    with open(labels_path) as csv_file:\n        csv_reader = csv.reader(csv_file, delimiter=',')\n        next(csv_reader)  # Skip header row if present\n        class_names = [row[0] for row in csv_reader]\n    return class_names\n\n# Load class names\nclasses = class_names_from_csv()\n\nprint(f\"Number of classes: {len(classes)}\")\n\n# Load and preprocess audio\naudio, sample_rate = librosa.load(\"/kaggle/input/birdclef-2024/train_audio/asbfly/XC134896.ogg\")\nsample_rate, wav_data = sample_rate, audio  # Assuming sample_rate is already 32000\nAudio(wav_data, rate=sample_rate)\n\n# Helper functions\ndef frame_audio(audio_array: np.ndarray, window_size_s: float = 5.0, hop_size_s: float = 5.0, sample_rate=32000) -> np.ndarray:\n    if window_size_s is None or window_size_s < 0:\n        return audio_array[np.newaxis, :]\n    frame_length = int(window_size_s * sample_rate)\n    hop_length = int(hop_size_s * sample_rate)\n    framed_audio = tf.signal.frame(audio_array, frame_length, hop_length, pad_end=True)\n    return framed_audio\n\ndef ensure_sample_rate(waveform, original_sample_rate, desired_sample_rate=32000):\n    if original_sample_rate != desired_sample_rate:\n        waveform = tfio.audio.resample(waveform, original_sample_rate, desired_sample_rate)\n    return desired_sample_rate, waveform\n\n# Ensure the sample rate is correct\nsample_rate, wav_data = ensure_sample_rate(wav_data, sample_rate)\n\n# Frame the audio\nfixed_tm = frame_audio(wav_data)\n\n# Run inference\noutputs = model.infer_tf(fixed_tm[0:1])\n\n# Extract logits and embeddings\nlogits = outputs['label']          # Species-level logits\nembeddings = outputs['embedding']  # Embedding vector (optional)\n\n# Proceed with probabilities\nprobabilities = tf.nn.softmax(logits)\n\n# Get the predicted class index\nargmax = np.argmax(probabilities)\n\n# Get the predicted class name\npredicted_class = classes[argmax]\n\n# Get the confidence score\nconfidence = probabilities[0][argmax]\n\nprint(f\"The audio is from the class {predicted_class} (element: {argmax} in the label.csv file), with probability of {confidence}\")\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-22T15:36:10.15464Z","iopub.execute_input":"2024-11-22T15:36:10.15546Z","iopub.status.idle":"2024-11-22T15:36:18.85842Z","shell.execute_reply.started":"2024-11-22T15:36:10.155428Z","shell.execute_reply":"2024-11-22T15:36:18.857288Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def predict_for_sample(filename, sample_submission, frame_limit_secs=None):\n    file_id = filename.split(\".ogg\")[0].split(\"/\")[-1]\n    \n    audio, sample_rate = librosa.load(filename)\n    sample_rate, wav_data = ensure_sample_rate(audio, sample_rate)\n    \n    fixed_tm = frame_audio(wav_data)\n    \n    frame = 5\n    all_logits, all_embeddings = model.infer_tf(fixed_tm[:1])\n    for window in fixed_tm[1:]:\n        if frame_limit_secs and frame > frame_limit_secs:\n            continue\n        \n        logits, embeddings = model.infer_tf(window[np.newaxis, :])\n        all_logits = np.concatenate([all_logits, logits], axis=0)\n        frame += 5\n    \n    frame = 5\n    all_probabilities = []\n    for frame_logits in all_logits:\n        probabilities = tf.nn.softmax(frame_logits).numpy()\n        \n        ## set the appropriate row in the sample submission\n        sample_submission.loc[sample_submission.row_id == file_id + \"_\" + str(frame), competition_classes] = probabilities[competition_class_map]\n        frame += 5","metadata":{"execution":{"iopub.status.busy":"2024-11-22T15:39:44.229525Z","iopub.execute_input":"2024-11-22T15:39:44.229902Z","iopub.status.idle":"2024-11-22T15:39:44.238223Z","shell.execute_reply.started":"2024-11-22T15:39:44.229871Z","shell.execute_reply":"2024-11-22T15:39:44.237141Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Step 6: Evaluation","metadata":{}},{"cell_type":"code","source":"from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, confusion_matrix\nimport os\nfrom tqdm import tqdm\n\ndf = pd.read_csv('/kaggle/input/birdclef-2024/train_metadata.csv')\nX = list(df['filename'])\nbase_path = \"/kaggle/input/birdclef-2024/train_audio/\"","metadata":{"execution":{"iopub.status.busy":"2024-11-22T15:46:11.005718Z","iopub.execute_input":"2024-11-22T15:46:11.006461Z","iopub.status.idle":"2024-11-22T15:46:11.089668Z","shell.execute_reply.started":"2024-11-22T15:46:11.006427Z","shell.execute_reply":"2024-11-22T15:46:11.08878Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ndef predict(x):\n    Y_true = []\n    y_audio = []\n    y_audio_type = []\n    y_predict = []\n    y_prob = []\n    \n    # Counter to keep track of the number of samples processed\n    counter = 0\n    \n    for audio_file in tqdm(x):\n        # Increment counter\n        counter += 1\n        \n        # Get the true label and other metadata\n        true_label = df.loc[df['filename'] == audio_file, 'primary_label'].iloc[0]\n        Y_true.append(true_label)\n        y_audio.append(audio_file)\n        y_audio_type.append(df.loc[df['filename'] == audio_file, 'type'].iloc[0])\n        \n        # Load the audio file\n        path = os.path.join(base_path, audio_file)\n        audio_data, sample_rate = librosa.load(path)\n        sample_rate, wav_data = ensure_sample_rate(audio_data, sample_rate)\n        fixed_tm = frame_audio(wav_data)\n        \n        max_prob = 0\n        max_pred = None  # Initialize to None\n        \n        # Run inference on all frames at once\n        outputs = model.infer_tf(fixed_tm)\n        logits_batch = outputs['label']\n        \n        # Compute probabilities for all frames\n        probabilities_batch = tf.nn.softmax(logits_batch, axis=1)\n        \n        # Find the frame with the maximum probability\n        max_probs = np.max(probabilities_batch.numpy(), axis=1)\n        argmaxs = np.argmax(probabilities_batch.numpy(), axis=1)\n        \n        # Find the overall maximum\n        idx = np.argmax(max_probs)\n        max_prob = max_probs[idx]\n        max_pred = classes[argmaxs[idx]]\n        \n        # Append predictions and probabilities\n        y_predict.append(max_pred)\n        y_prob.append(float(max_prob))\n        \n        # After every 1000 samples, evaluate and display results\n        if counter % 1000 == 0:\n            # Evaluate the model on the samples processed so far\n            accuracy, precision, recall, f1 = evaluate_model(Y_true, y_predict)\n            print(f\"\\nAfter {counter} samples:\")\n            print('Accuracy: ', accuracy)\n            print('Precision: ', precision)\n            print('Recall: ', recall)\n            print('F1 Score: ', f1)\n            print('-------------------------')\n    \n    # Return the complete results after all samples are processed\n    return Y_true, y_audio, y_audio_type, y_predict, y_prob","metadata":{"execution":{"iopub.status.busy":"2024-11-22T15:46:12.013853Z","iopub.execute_input":"2024-11-22T15:46:12.014734Z","iopub.status.idle":"2024-11-22T15:46:12.02553Z","shell.execute_reply.started":"2024-11-22T15:46:12.014699Z","shell.execute_reply":"2024-11-22T15:46:12.02464Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def evaluate_model(y_true, y_pred):\n    # Filter out cases where predictions are None\n    valid_indices = [i for i, pred in enumerate(y_pred) if pred is not None]\n    y_true_filtered = [y_true[i] for i in valid_indices]\n    y_pred_filtered = [y_pred[i] for i in valid_indices]\n    \n    # Check if there are any valid predictions\n    if not y_true_filtered:\n        print(\"No valid predictions to evaluate.\")\n        return 0, 0, 0, 0\n    \n    # Calculate metrics\n    accuracy = accuracy_score(y_true_filtered, y_pred_filtered)\n    precision = precision_score(y_true_filtered, y_pred_filtered, average='weighted', zero_division=0)\n    recall = recall_score(y_true_filtered, y_pred_filtered, average='weighted', zero_division=0)\n    f1 = f1_score(y_true_filtered, y_pred_filtered, average='weighted', zero_division=0)\n    \n    return accuracy, precision, recall, f1","metadata":{"execution":{"iopub.status.busy":"2024-11-22T15:46:12.976774Z","iopub.execute_input":"2024-11-22T15:46:12.977368Z","iopub.status.idle":"2024-11-22T15:46:12.984021Z","shell.execute_reply.started":"2024-11-22T15:46:12.977333Z","shell.execute_reply":"2024-11-22T15:46:12.982989Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Run the prediction and evaluation\nY_true, y_audio, y_audio_type, y_predict, y_prob = predict(X)\n\n# Final evaluation after all samples are processed\naccuracy, precision, recall, f1 = evaluate_model(Y_true, y_predict)\nprint('\\nFinal Results:')\nprint('Accuracy: ', accuracy)\nprint('Precision: ', precision)\nprint('Recall: ', recall)\nprint('F1: ', f1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-11-22T15:46:15.112435Z","iopub.execute_input":"2024-11-22T15:46:15.113022Z","iopub.status.idle":"2024-11-22T16:02:53.560805Z","shell.execute_reply.started":"2024-11-22T15:46:15.112987Z","shell.execute_reply":"2024-11-22T16:02:53.559243Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"d = {'Audio': y_audio, 'Audio_type': y_audio_type, 'Ground_truth':Y_true,'Prediction': y_predict, 'Probability':y_prob}\ndf_predict = pd.DataFrame(data=d)\ndf_predict.to_csv('/kaggle/working/prediction.csv',index=False)","metadata":{"execution":{"iopub.status.busy":"2024-11-22T16:02:57.674149Z","iopub.execute_input":"2024-11-22T16:02:57.674969Z","iopub.status.idle":"2024-11-22T16:02:57.702099Z","shell.execute_reply.started":"2024-11-22T16:02:57.674927Z","shell.execute_reply":"2024-11-22T16:02:57.700121Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Step 7: Prediction Analysis","metadata":{}},{"cell_type":"markdown","source":"From previous section \"Evaluation\", I have saved the \"prediction.csv\" file locally from previous run. In the dataset section, I have uploaded the previously saved file.","metadata":{}},{"cell_type":"code","source":"path = '/kaggle/working/prediction.csv'\nif not os.path.isfile(path):\n    path = \"/kaggle/input/google-bvc-prediction/prediction.csv\"\ndf_predict = pd.read_csv(path)\ndf_predict.head()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# This function is for analyzing prediction for all the birds\ndef prediction_analysis1():\n    data = []\n    for bird in tqdm(competition_classes):\n        temp_df1 = df_predict[df_predict['Ground_truth']==bird].Prediction == bird\n        true_pred = temp_df1.sum()\n        false_pred = len(temp_df1) - true_pred\n        data.extend([[bird, 'True', true_pred], [bird, 'False', false_pred]])\n    pred_df = pd.DataFrame(data, columns=['Bird', 'Prediction', 'Number'])\n    fig = px.bar(pred_df, x=\"Bird\", y=\"Number\", color=\"Prediction\", title=\"Prediction analysis for all birds\")\n    fig.update_layout(xaxis=dict(rangeslider=dict(visible=True)))\n    fig.update_layout(width=1000,height=800) \n    fig.show(renderer='iframe')  ","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"prediction_analysis1()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# This function is for analyzing prediction for the Chirping type of one bird\ndef prediction_analysis2(bird_name):\n    temp_df1 = df_predict[df_predict['Ground_truth']==bird_name]\n    audio_type = list(temp_df1['Audio_type'].unique())\n    data = []\n    for a in audio_type:\n        temp_df2 = temp_df1[temp_df1['Audio_type']==a]\n        true_pred = len(temp_df2[temp_df2['Prediction'] == bird_name])\n        false_pred = len(temp_df2)-true_pred\n        data.extend([[a, 'True', true_pred], [a, 'False', false_pred]])\n        \n    pred_df = pd.DataFrame(data, columns=['Audio', 'Prediction', 'Number'])\n    fig = px.bar(pred_df, x=\"Audio\", y=\"Number\", color=\"Prediction\", title=bird_name+\" prediction analysis\")\n    fig.update_layout(xaxis=dict(rangeslider=dict(visible=True)))\n    fig.update_layout(width=1000,height=800) \n    fig.show(renderer='iframe')  \n        \n        \n    ","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"prediction_analysis2('asbfly')","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"## Step 8: Generate a submission\n\nNow we process all of the test samples as discussed above, creating output rows, and saving them in the provided `sample_submission.csv`. Finally, we save these rows to our final output file: `submission.csv`. This is the file that gets submitted and scored when you submit the notebook.","metadata":{}},{"cell_type":"code","source":"test_samples = list(glob.glob(\"/kaggle/input/birdclef-2024/test_soundscapes/*.ogg\"))\ntest_samples","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample_sub = pd.read_csv(\"/kaggle/input/birdclef-2024/sample_submission.csv\")\nsample_sub","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# frame_limit_secs = 15 if sample_sub.shape[0] == 3 else None\n# for sample_filename in test_samples:\n#     predict_for_sample(sample_filename, sample_sub, frame_limit_secs=15)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# sample_sub.to_csv(\"submission.csv\", index=False)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}