{"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","modelInstanceId":2739}],"dockerImageVersionId":30407,"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-04-24T07:12:10.495994Z","iopub.execute_input":"2024-04-24T07:12:10.496554Z","iopub.status.idle":"2024-04-24T07:12:10.507065Z","shell.execute_reply.started":"2024-04-24T07:12:10.496494Z","shell.execute_reply":"2024-04-24T07:12:10.504800Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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-04-24T07:12:10.509901Z","iopub.execute_input":"2024-04-24T07:12:10.511078Z","iopub.status.idle":"2024-04-24T07:12:10.693318Z","shell.execute_reply.started":"2024-04-24T07:12:10.510991Z","shell.execute_reply":"2024-04-24T07:12:10.691816Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Play the audio\nAudio(data=audio_abe, rate=sr_abe)","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:10.696168Z","iopub.execute_input":"2024-04-24T07:12:10.696640Z","iopub.status.idle":"2024-04-24T07:12:10.737658Z","shell.execute_reply.started":"2024-04-24T07:12:10.696597Z","shell.execute_reply":"2024-04-24T07:12:10.736153Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Play the audio\nAudio(data=audio_abh, rate=sr_abh)","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:10.739786Z","iopub.execute_input":"2024-04-24T07:12:10.740317Z","iopub.status.idle":"2024-04-24T07:12:10.822949Z","shell.execute_reply.started":"2024-04-24T07:12:10.740270Z","shell.execute_reply":"2024-04-24T07:12:10.820501Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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/1')\nlabels_path = hub.resolve('https://kaggle.com/models/google/bird-vocalization-classifier/frameworks/tensorFlow2/variations/bird-vocalization-classifier/versions/1') + \"/assets/label.csv\"","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:10.827467Z","iopub.execute_input":"2024-04-24T07:12:10.828864Z","iopub.status.idle":"2024-04-24T07:12:19.472013Z","shell.execute_reply.started":"2024-04-24T07:12:10.828806Z","shell.execute_reply":"2024-04-24T07:12:19.470855Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Find the name of the class with the top score when mean-aggregated across frames.\ndef class_names_from_csv(class_map_csv_text):\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        class_names = [mid for mid, desc in csv_reader]\n        return class_names[1:]\n\n## note that the bird classifier classifies a much larger set of birds than the\n## competition, so we need to load the model's set of class names or else our \n## indices will be off.\nclasses = class_names_from_csv(labels_path)","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:19.473484Z","iopub.execute_input":"2024-04-24T07:12:19.473877Z","iopub.status.idle":"2024-04-24T07:12:19.490798Z","shell.execute_reply.started":"2024-04-24T07:12:19.473838Z","shell.execute_reply":"2024-04-24T07:12:19.489504Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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-04-24T07:12:19.492758Z","iopub.execute_input":"2024-04-24T07:12:19.493275Z","iopub.status.idle":"2024-04-24T07:12:19.682508Z","shell.execute_reply.started":"2024-04-24T07:12:19.493220Z","shell.execute_reply":"2024-04-24T07:12:19.681118Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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-04-24T07:12:19.684524Z","iopub.execute_input":"2024-04-24T07:12:19.685741Z","iopub.status.idle":"2024-04-24T07:12:19.696278Z","shell.execute_reply.started":"2024-04-24T07:12:19.685691Z","shell.execute_reply":"2024-04-24T07:12:19.694933Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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-04-24T07:12:19.697843Z","iopub.execute_input":"2024-04-24T07:12:19.698229Z","iopub.status.idle":"2024-04-24T07:12:19.944417Z","shell.execute_reply.started":"2024-04-24T07:12:19.698192Z","shell.execute_reply":"2024-04-24T07:12:19.942712Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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)\nlogits, embeddings = model.infer_tf(fixed_tm[0:1])\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-04-24T07:12:19.946813Z","iopub.execute_input":"2024-04-24T07:12:19.947295Z","iopub.status.idle":"2024-04-24T07:12:31.631075Z","shell.execute_reply.started":"2024-04-24T07:12:19.947248Z","shell.execute_reply":"2024-04-24T07:12:31.629347Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict_for_sample(idx, 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        sample_submission.loc[idx] = [file_id + \"_\" + str(frame)] + list(probabilities[competition_class_map])\n        idx += 1\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\n    return idx","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:31.636620Z","iopub.execute_input":"2024-04-24T07:12:31.638056Z","iopub.status.idle":"2024-04-24T07:12:31.650599Z","shell.execute_reply.started":"2024-04-24T07:12:31.638002Z","shell.execute_reply":"2024-04-24T07:12:31.649159Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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\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-04-24T07:12:31.652285Z","iopub.execute_input":"2024-04-24T07:12:31.652754Z","iopub.status.idle":"2024-04-24T07:12:31.904975Z","shell.execute_reply.started":"2024-04-24T07:12:31.652704Z","shell.execute_reply":"2024-04-24T07:12:31.903601Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict(x):\n    Y_true = []\n    y_audio = []\n    y_audio_type = []\n    y_predict = []\n    y_prob = []\n    for audio in tqdm(x):\n        Y_true.append(df.loc[df['filename'] == audio, 'primary_label'].iloc[0])\n        y_audio.append(audio)\n        y_audio_type.append(df.loc[df['filename'] == audio, 'type'].iloc[0])\n        path = os.path.join(base_path, audio)\n        audio, sample_rate = librosa.load(path)\n        sample_rate, wav_data = ensure_sample_rate(audio, sample_rate)\n        fixed_tm = frame_audio(wav_data)\n        i = 0\n        max_prob = 0\n        max_pred = 0\n               \n        while(i+1<=fixed_tm.shape[0]):\n            logits, embeddings = model.infer_tf(fixed_tm[i:i+1])\n            probabilities = tf.nn.softmax(logits)\n            argmax = np.argmax(probabilities)\n            i += 1\n            if (probabilities[0][argmax] > max_prob):\n                max_prob = probabilities[0][argmax]\n                max_pred = classes[argmax]\n        y_predict.append(max_pred)\n        y_prob.append(float(max_prob))\n    \n    return Y_true, y_audio, y_audio_type, y_predict, y_prob","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:31.906620Z","iopub.execute_input":"2024-04-24T07:12:31.907104Z","iopub.status.idle":"2024-04-24T07:12:31.922884Z","shell.execute_reply.started":"2024-04-24T07:12:31.907058Z","shell.execute_reply":"2024-04-24T07:12:31.921152Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def evaluate_model(y_true, y_pred):\n    # Calculate accuracy\n    accuracy = accuracy_score(y_true, y_pred)\n    # Calculate precision\n    precision = precision_score(y_true, y_pred, average='weighted')\n    # Calculate recall\n    recall = recall_score(y_true, y_pred, average='weighted')\n    # Calculate F1 score\n    f1 = f1_score(y_true, y_pred, average='weighted')\n    \n    return accuracy, precision, recall, f1","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:31.924761Z","iopub.execute_input":"2024-04-24T07:12:31.925260Z","iopub.status.idle":"2024-04-24T07:12:31.942758Z","shell.execute_reply.started":"2024-04-24T07:12:31.925206Z","shell.execute_reply":"2024-04-24T07:12:31.941334Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def evaluation_analysis(evaluate = False):\n    if evaluate:\n        Y_true, y_audio, y_audio_type, y_predict, y_prob = predict(X)\n        accuracy, precision, recall, f1 = evaluate_model(Y_true, y_predict)\n        print('Accuracy: ',accuracy)\n        print('Precision: ', precision)\n        print('Recall: ', recall)\n        print('F1: ', f1)\n\n        d = {'Audio': y_audio, 'Audio_type': y_audio_type, 'Ground_truth':Y_true,'Prediction': y_predict, 'Probability':y_prob}\n        df_predict = pd.DataFrame(data=d)\n        df_predict.to_csv('/kaggle/working/prediction.csv',index=False)\n","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:31.944343Z","iopub.execute_input":"2024-04-24T07:12:31.944777Z","iopub.status.idle":"2024-04-24T07:12:31.969302Z","shell.execute_reply.started":"2024-04-24T07:12:31.944736Z","shell.execute_reply":"2024-04-24T07:12:31.967410Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# evaluation_analysis(evaluate = True)","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:31.970972Z","iopub.execute_input":"2024-04-24T07:12:31.971484Z","iopub.status.idle":"2024-04-24T07:12:31.990887Z","shell.execute_reply.started":"2024-04-24T07:12:31.971408Z","shell.execute_reply":"2024-04-24T07:12:31.989225Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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":{"execution":{"iopub.status.busy":"2024-04-24T07:12:31.992725Z","iopub.execute_input":"2024-04-24T07:12:31.993311Z","iopub.status.idle":"2024-04-24T07:12:32.094348Z","shell.execute_reply.started":"2024-04-24T07:12:31.993212Z","shell.execute_reply":"2024-04-24T07:12:32.092799Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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":{"execution":{"iopub.status.busy":"2024-04-24T07:12:32.096084Z","iopub.execute_input":"2024-04-24T07:12:32.096590Z","iopub.status.idle":"2024-04-24T07:12:32.108481Z","shell.execute_reply.started":"2024-04-24T07:12:32.096534Z","shell.execute_reply":"2024-04-24T07:12:32.106986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# prediction_analysis1()","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:32.110391Z","iopub.execute_input":"2024-04-24T07:12:32.111227Z","iopub.status.idle":"2024-04-24T07:12:32.124907Z","shell.execute_reply.started":"2024-04-24T07:12:32.111169Z","shell.execute_reply":"2024-04-24T07:12:32.123508Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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":{"execution":{"iopub.status.busy":"2024-04-24T07:12:32.126924Z","iopub.execute_input":"2024-04-24T07:12:32.127352Z","iopub.status.idle":"2024-04-24T07:12:32.141339Z","shell.execute_reply.started":"2024-04-24T07:12:32.127299Z","shell.execute_reply":"2024-04-24T07:12:32.139814Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# prediction_analysis2('asbfly')","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:32.143001Z","iopub.execute_input":"2024-04-24T07:12:32.143382Z","iopub.status.idle":"2024-04-24T07:12:32.163456Z","shell.execute_reply.started":"2024-04-24T07:12:32.143344Z","shell.execute_reply":"2024-04-24T07:12:32.162095Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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":"sample_sub = pd.read_csv(\"/kaggle/input/birdclef-2024/sample_submission.csv\")\nsubmission_df = pd.DataFrame(columns = list(sample_sub.columns))\nsubmission_df","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:32.165128Z","iopub.execute_input":"2024-04-24T07:12:32.165625Z","iopub.status.idle":"2024-04-24T07:12:32.212192Z","shell.execute_reply.started":"2024-04-24T07:12:32.165574Z","shell.execute_reply":"2024-04-24T07:12:32.210647Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# First, load list of audio files by parsing the test_soundscape folder.\ntest_audio_dir = '../input/birdclef-2024/test_soundscapes/'\n\nfile_list = [f for f in sorted(os.listdir(test_audio_dir))]\nfile_list = [file.split('.')[0] for file in file_list if file.endswith('.ogg')]\n\nprint('Number of test soundscapes:', len(file_list))","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:32.214156Z","iopub.execute_input":"2024-04-24T07:12:32.214696Z","iopub.status.idle":"2024-04-24T07:12:32.227420Z","shell.execute_reply.started":"2024-04-24T07:12:32.214643Z","shell.execute_reply":"2024-04-24T07:12:32.225860Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import time\nframe_limit_secs = 10 if sample_sub.shape[0] == 3 else None\nidx = 0\nfor afile in tqdm(file_list):\n    start = time.time()\n    path = test_audio_dir + afile + '.ogg'\n    print(path)\n    idx = predict_for_sample(idx, path, submission_df, frame_limit_secs=frame_limit_secs)\n    end = time.time()\n    print('time: ', (end-start)/60)\n","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:32.229410Z","iopub.execute_input":"2024-04-24T07:12:32.230031Z","iopub.status.idle":"2024-04-24T07:12:32.244056Z","shell.execute_reply.started":"2024-04-24T07:12:32.229976Z","shell.execute_reply":"2024-04-24T07:12:32.242425Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df.head()","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:32.245940Z","iopub.execute_input":"2024-04-24T07:12:32.246322Z","iopub.status.idle":"2024-04-24T07:12:32.267035Z","shell.execute_reply.started":"2024-04-24T07:12:32.246284Z","shell.execute_reply":"2024-04-24T07:12:32.265541Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission_df.to_csv(\"submission.csv\", index=False)    ","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:32.269016Z","iopub.execute_input":"2024-04-24T07:12:32.269520Z","iopub.status.idle":"2024-04-24T07:12:32.279305Z","shell.execute_reply.started":"2024-04-24T07:12:32.269462Z","shell.execute_reply":"2024-04-24T07:12:32.278027Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# import time\n# # This is where we will store our results\n# pred = {'row_id': []}\n# train_audio_dir = '../input/birdclef-2024/train_audio/'\n# species_list = sorted(os.listdir(train_audio_dir))\n# for species_code in species_list:\n#     pred[species_code] = []\n\n# # Process audio files and make predictions\n# for afile in tqdm(file_list):\n# #     start = time.time()\n#     # Complete file path\n#     path = test_audio_dir + afile + '.ogg'\n    \n#     # Open file with librosa and split signal into 5-second chunks\n#     sig, rate = librosa.load(path, sr=32000)\n#     # ...\n    \n#     # Let's assume we have a list of 48 audio chunks (4min / 5s == 48 segments)\n#     num_chunks = int((sig.shape[0]/rate)/5)\n#     chunk_size = int(sig.shape[0]/num_chunks)\n#     chunks = [sig[i*chunk_size:(i+1)*chunk_size] for i in range(num_chunks)]\n    \n#     # Make prediction for each chunk\n#     # Each bird gets a random value in our case\n#     # since we don't actually have a model\n#     start = time.time()\n#     for i in range(len(chunks)):  \n        \n#         logits, embeddings = model.infer_tf(tf.convert_to_tensor([chunks[i]]))\n#         probabilities = tf.nn.softmax(logits)\n        \n#         chunk_end_time = (i + 1) * 5\n        \n#         # Assign the row_id which we need to do for each chunk\n#         row_id = afile + '_' + str(chunk_end_time)\n#         pred['row_id'].append(row_id)\n        \n#         for bird in species_list:\n            \n#             if bird in classes:\n#                 idx = classes.index(bird)\n#                 score = tf.keras.backend.get_value(probabilities[0, idx])\n#             else:\n#                 score = 0\n            \n#             # Put the result into our prediction dict            \n#             pred[bird].append(score)\n#     end = time.time()\n#     print('Time: ', (end-start))\n    ","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:32.280926Z","iopub.execute_input":"2024-04-24T07:12:32.281303Z","iopub.status.idle":"2024-04-24T07:12:32.294634Z","shell.execute_reply.started":"2024-04-24T07:12:32.281257Z","shell.execute_reply":"2024-04-24T07:12:32.292869Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# # Make a new data frame and look at some results        \n# results = pd.DataFrame(pred, columns = ['row_id'] + species_list)\n\n# # Quick sanity check\n# print(results.head()) \n    \n# # Convert our results to csv\n# results.to_csv(\"submission.csv\", index=False)    ","metadata":{"execution":{"iopub.status.busy":"2024-04-24T07:12:32.296546Z","iopub.execute_input":"2024-04-24T07:12:32.296994Z","iopub.status.idle":"2024-04-24T07:12:32.322649Z","shell.execute_reply.started":"2024-04-24T07:12:32.296950Z","shell.execute_reply":"2024-04-24T07:12:32.320704Z"},"trusted":true},"execution_count":null,"outputs":[]}]}