{"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":"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\n\nfrom IPython.display import Audio","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-03-07T23:58:25.369556Z","iopub.execute_input":"2023-03-07T23:58:25.370017Z","iopub.status.idle":"2023-03-07T23:58:37.388471Z","shell.execute_reply.started":"2023-03-07T23:58:25.369981Z","shell.execute_reply":"2023-03-07T23:58:37.386926Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load a sample audio files from two different species\naudio_abe, sr_abe = librosa.load(\"/kaggle/input/birdclef-2023/train_audio/abethr1/XC128013.ogg\")\naudio_abh, sr_abh = librosa.load(\"/kaggle/input/birdclef-2023/train_audio/abhori1/XC127317.ogg\")","metadata":{"execution":{"iopub.status.busy":"2023-03-07T23:58:37.391025Z","iopub.execute_input":"2023-03-07T23:58:37.392438Z","iopub.status.idle":"2023-03-07T23:58:50.597628Z","shell.execute_reply.started":"2023-03-07T23:58:37.392393Z","shell.execute_reply":"2023-03-07T23:58:50.595777Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Audio(data = audio_abe, rate = sr_abe)","metadata":{"execution":{"iopub.status.busy":"2023-03-07T23:58:50.603545Z","iopub.execute_input":"2023-03-07T23:58:50.604557Z","iopub.status.idle":"2023-03-07T23:58:50.693084Z","shell.execute_reply.started":"2023-03-07T23:58:50.604508Z","shell.execute_reply":"2023-03-07T23:58:50.691635Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"Audio(data = audio_abh, rate = sr_abh)","metadata":{"execution":{"iopub.status.busy":"2023-03-07T23:59:33.311114Z","iopub.execute_input":"2023-03-07T23:59:33.311600Z","iopub.status.idle":"2023-03-07T23:59:33.382292Z","shell.execute_reply.started":"2023-03-07T23:59:33.311562Z","shell.execute_reply":"2023-03-07T23:59:33.380101Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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":"2023-03-08T00:00:51.713467Z","iopub.execute_input":"2023-03-08T00:00:51.714039Z","iopub.status.idle":"2023-03-08T00:00:59.237935Z","shell.execute_reply.started":"2023-03-08T00:00:51.713996Z","shell.execute_reply":"2023-03-08T00:00:59.236771Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def class_names_from_csv(class_map_csv_text):\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\nclasses = class_names_from_csv(labels_path)","metadata":{"execution":{"iopub.status.busy":"2023-03-08T00:02:07.276247Z","iopub.execute_input":"2023-03-08T00:02:07.276760Z","iopub.status.idle":"2023-03-08T00:02:07.308811Z","shell.execute_reply.started":"2023-03-08T00:02:07.276725Z","shell.execute_reply":"2023-03-08T00:02:07.307427Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_metadata = pd.read_csv(\"/kaggle/input/birdclef-2023/train_metadata.csv\")\ntrain_metadata.head()\ncompetition_classes = sorted(train_metadata.primary_label.unique())\n\nforced_defaults = 0\ncompetition_class_map = []\n\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\nforced_defaults","metadata":{"execution":{"iopub.status.busy":"2023-03-08T00:03:52.331062Z","iopub.execute_input":"2023-03-08T00:03:52.331654Z","iopub.status.idle":"2023-03-08T00:03:52.512181Z","shell.execute_reply.started":"2023-03-08T00:03:52.331610Z","shell.execute_reply":"2023-03-08T00:03:52.510629Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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    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\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":"2023-03-08T00:08:08.223477Z","iopub.execute_input":"2023-03-08T00:08:08.224010Z","iopub.status.idle":"2023-03-08T00:08:08.238144Z","shell.execute_reply.started":"2023-03-08T00:08:08.223969Z","shell.execute_reply":"2023-03-08T00:08:08.236507Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"audio, sample_rate = librosa.load(\"/kaggle/input/birdclef-2023/train_audio/afghor1/XC156639.ogg\")\nsample_rate, wav_data = ensure_sample_rate(audio, sample_rate)\nAudio(wav_data, rate = sample_rate)","metadata":{"execution":{"iopub.status.busy":"2023-03-08T00:09:12.925801Z","iopub.execute_input":"2023-03-08T00:09:12.926300Z","iopub.status.idle":"2023-03-08T00:09:13.777982Z","shell.execute_reply.started":"2023-03-08T00:09:12.926262Z","shell.execute_reply":"2023-03-08T00:09:13.775949Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fixed_tm = frame_audio(wav_data)\nlogits, embeddings = model.infer_tf(fixed_tm[: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":"2023-03-08T00:10:44.811241Z","iopub.execute_input":"2023-03-08T00:10:44.811661Z","iopub.status.idle":"2023-03-08T00:10:56.078399Z","shell.execute_reply.started":"2023-03-08T00:10:44.811626Z","shell.execute_reply":"2023-03-08T00:10:56.077091Z"},"trusted":true},"execution_count":null,"outputs":[]},{"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        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":"2023-03-08T00:14:22.376110Z","iopub.execute_input":"2023-03-08T00:14:22.376613Z","iopub.status.idle":"2023-03-08T00:14:22.387951Z","shell.execute_reply.started":"2023-03-08T00:14:22.376576Z","shell.execute_reply":"2023-03-08T00:14:22.386766Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_samples = list(glob.glob(\"/kaggle/input/birdclef-2023/test_soundscapes/*.ogg\"))\ntest_samples","metadata":{"execution":{"iopub.status.busy":"2023-03-08T00:15:01.907902Z","iopub.execute_input":"2023-03-08T00:15:01.908418Z","iopub.status.idle":"2023-03-08T00:15:01.923013Z","shell.execute_reply.started":"2023-03-08T00:15:01.908378Z","shell.execute_reply":"2023-03-08T00:15:01.921592Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_sub = pd.read_csv(\"/kaggle/input/birdclef-2023/sample_submission.csv\")\nsample_sub[competition_classes] = sample_sub[competition_classes].astype(np.float32)\nsample_sub.head()","metadata":{"execution":{"iopub.status.busy":"2023-03-08T00:15:07.121115Z","iopub.execute_input":"2023-03-08T00:15:07.121558Z","iopub.status.idle":"2023-03-08T00:15:08.548404Z","shell.execute_reply.started":"2023-03-08T00:15:07.121523Z","shell.execute_reply":"2023-03-08T00:15:08.547360Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"frame_limit_secs = 15 if sample_sub.shape[0] == 3 else None\n\nfor sample_filename in test_samples:\n    predict_for_sample(sample_filename, sample_sub, frame_limit_secs = 15)","metadata":{"execution":{"iopub.status.busy":"2023-03-08T00:15:48.311172Z","iopub.execute_input":"2023-03-08T00:15:48.312363Z","iopub.status.idle":"2023-03-08T00:16:01.870958Z","shell.execute_reply.started":"2023-03-08T00:15:48.312300Z","shell.execute_reply":"2023-03-08T00:16:01.868306Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_sub","metadata":{"execution":{"iopub.status.busy":"2023-03-08T00:16:01.874888Z","iopub.execute_input":"2023-03-08T00:16:01.882097Z","iopub.status.idle":"2023-03-08T00:16:01.918807Z","shell.execute_reply.started":"2023-03-08T00:16:01.881998Z","shell.execute_reply":"2023-03-08T00:16:01.917278Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_sub.to_csv(\"submission.csv\", index = False)","metadata":{"execution":{"iopub.status.busy":"2023-03-08T00:16:03.744240Z","iopub.execute_input":"2023-03-08T00:16:03.744866Z","iopub.status.idle":"2023-03-08T00:16:03.761932Z","shell.execute_reply.started":"2023-03-08T00:16:03.744812Z","shell.execute_reply":"2023-03-08T00:16:03.760574Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}