{"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":15853,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":2739}],"dockerImageVersionId":30699,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport librosa\nimport tensorflow as tf\nimport tensorflow_io as tfio\nimport tensorflow_hub as hub\nimport seaborn as sns\nimport librosa.display as lid","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-05-08T16:21:32.496971Z","iopub.execute_input":"2024-05-08T16:21:32.497418Z","iopub.status.idle":"2024-05-08T16:21:49.282914Z","shell.execute_reply.started":"2024-05-08T16:21:32.497382Z","shell.execute_reply":"2024-05-08T16:21:49.281830Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_url = 'https://www.kaggle.com/models/google/bird-vocalization-classifier/TensorFlow2/bird-vocalization-classifier/8'\nclass_names = sorted(os.listdir('/kaggle/input/birdclef-2024/train_audio/'))\nnum_classes = len(class_names)","metadata":{"execution":{"iopub.status.busy":"2024-05-08T16:23:42.659145Z","iopub.execute_input":"2024-05-08T16:23:42.660177Z","iopub.status.idle":"2024-05-08T16:23:42.669064Z","shell.execute_reply.started":"2024-05-08T16:23:42.660132Z","shell.execute_reply":"2024-05-08T16:23:42.667818Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import glob\n\naudio_files = glob.glob(\"/kaggle/input/birdclef-2024/train_audio/**/*.ogg\")\nlen(audio_files)","metadata":{"execution":{"iopub.status.busy":"2024-05-08T16:23:46.893221Z","iopub.execute_input":"2024-05-08T16:23:46.893643Z","iopub.status.idle":"2024-05-08T16:23:47.104213Z","shell.execute_reply.started":"2024-05-08T16:23:46.893609Z","shell.execute_reply":"2024-05-08T16:23:47.102971Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv(\"/kaggle/input/birdclef-2024/train_metadata.csv\")","metadata":{"execution":{"iopub.status.busy":"2024-05-08T16:24:14.812920Z","iopub.execute_input":"2024-05-08T16:24:14.813904Z","iopub.status.idle":"2024-05-08T16:24:14.991373Z","shell.execute_reply.started":"2024-05-08T16:24:14.813855Z","shell.execute_reply":"2024-05-08T16:24:14.989928Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import random\nimport IPython.display as ipd\n\naudio = random.choice(audio_files)\nipd.Audio(audio)","metadata":{"execution":{"iopub.status.busy":"2024-05-08T16:24:16.089307Z","iopub.execute_input":"2024-05-08T16:24:16.090309Z","iopub.status.idle":"2024-05-08T16:24:16.116709Z","shell.execute_reply.started":"2024-05-08T16:24:16.090246Z","shell.execute_reply":"2024-05-08T16:24:16.115488Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load the model\n\nmodel = hub.Module(model_url,signature='serving_default')\n\nlabels_path = hub.resolve(model_url) + '/assets/label.csv'","metadata":{"execution":{"iopub.status.busy":"2024-05-08T17:13:25.688169Z","iopub.execute_input":"2024-05-08T17:13:25.688626Z","iopub.status.idle":"2024-05-08T17:13:25.728327Z","shell.execute_reply.started":"2024-05-08T17:13:25.688594Z","shell.execute_reply":"2024-05-08T17:13:25.726245Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"primary_labels = df[\"primary_label\"].unique()\n\nlen(primary_labels)","metadata":{"execution":{"iopub.status.busy":"2024-05-08T16:24:42.111301Z","iopub.execute_input":"2024-05-08T16:24:42.111709Z","iopub.status.idle":"2024-05-08T16:24:42.129091Z","shell.execute_reply.started":"2024-05-08T16:24:42.111677Z","shell.execute_reply":"2024-05-08T16:24:42.127880Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels_df = pd.read_csv(labels_path)\nlabels = sorted(labels_df['ebird2021'].values.tolist())","metadata":{"execution":{"iopub.status.busy":"2024-05-08T16:24:44.209853Z","iopub.execute_input":"2024-05-08T16:24:44.210265Z","iopub.status.idle":"2024-05-08T16:24:44.232919Z","shell.execute_reply.started":"2024-05-08T16:24:44.210234Z","shell.execute_reply":"2024-05-08T16:24:44.231305Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from collections import Counter\n\nlabel_counter = Counter(labels)\nprimary_labels_counter = Counter(primary_labels)\nprimary_labels_map = [label_counter[label] if label_counter[label] > 0 else 0 for label in primary_labels]\nforced_defaults = primary_labels_map.count(0)\n\nforced_defaults\n","metadata":{"execution":{"iopub.status.busy":"2024-05-08T16:26:06.990095Z","iopub.execute_input":"2024-05-08T16:26:06.991020Z","iopub.status.idle":"2024-05-08T16:26:07.001156Z","shell.execute_reply.started":"2024-05-08T16:26:06.990978Z","shell.execute_reply":"2024-05-08T16:26:06.999773Z"},"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    \"\"\"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\n","metadata":{"execution":{"iopub.status.busy":"2024-05-08T16:26:11.795414Z","iopub.execute_input":"2024-05-08T16:26:11.796220Z","iopub.status.idle":"2024-05-08T16:26:11.804798Z","shell.execute_reply.started":"2024-05-08T16:26:11.796178Z","shell.execute_reply":"2024-05-08T16:26:11.803382Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import glob\n\naudios_path = glob.glob(\"/kaggle/input/birdclef-2024/train_audio/*/*.ogg\")\naudios_path[:3]","metadata":{"execution":{"iopub.status.busy":"2024-05-08T16:26:12.335339Z","iopub.execute_input":"2024-05-08T16:26:12.335733Z","iopub.status.idle":"2024-05-08T16:26:12.539522Z","shell.execute_reply.started":"2024-05-08T16:26:12.335704Z","shell.execute_reply":"2024-05-08T16:26:12.538296Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import random\n\nrandom_audio = random.choice(audios_path)","metadata":{"execution":{"iopub.status.busy":"2024-05-08T16:26:47.523075Z","iopub.execute_input":"2024-05-08T16:26:47.523622Z","iopub.status.idle":"2024-05-08T16:26:47.529582Z","shell.execute_reply.started":"2024-05-08T16:26:47.523574Z","shell.execute_reply":"2024-05-08T16:26:47.528157Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"audio, sample_rate = librosa.load(random_audio)\nsample_rate, wav_data = ensure_sample_rate(audio, sample_rate)","metadata":{"execution":{"iopub.status.busy":"2024-05-08T16:26:47.991248Z","iopub.execute_input":"2024-05-08T16:26:47.992425Z","iopub.status.idle":"2024-05-08T16:26:49.659502Z","shell.execute_reply.started":"2024-05-08T16:26:47.992383Z","shell.execute_reply":"2024-05-08T16:26:49.658178Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fixed_tm = frame_audio(wav_data)\npredict = model.signatures['serving_default']\nlogits = model.infer_tf(fixed_tm[:1])[\"label\"]\nprobabilities = tf.nn.softmax(logits)\nargmax = np.argmax(probabilities)\n\ntrue_label = random_audio.split(\"/\")[-2]\nprint(f\"True Label | {true_label}\")\nprint(f\"Predicted Label | {labels[argmax]} (element:{argmax} in the labels.csv file) \\n with probability of {probabilities[0][argmax]}\")\n\nbird_name = df[df[\"primary_label\"]==labels[argmax]].common_name.unique()[0]\nprint(f\"Name of the bird | {bird_name}\")","metadata":{"execution":{"iopub.status.busy":"2024-05-08T16:26:49.661673Z","iopub.execute_input":"2024-05-08T16:26:49.662038Z","iopub.status.idle":"2024-05-08T16:26:51.085349Z","shell.execute_reply.started":"2024-05-08T16:26:49.662006Z","shell.execute_reply":"2024-05-08T16:26:51.083598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.signatures.keys()","metadata":{"execution":{"iopub.status.busy":"2024-05-08T17:10:36.432983Z","iopub.execute_input":"2024-05-08T17:10:36.433410Z","iopub.status.idle":"2024-05-08T17:10:36.442360Z","shell.execute_reply.started":"2024-05-08T17:10:36.433376Z","shell.execute_reply":"2024-05-08T17:10:36.440792Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def predict_audio(audio_path:str)-> tuple[str,float]:\n    loaded_audio, sample_rate = librosa.load(random_audio)\n    sample_rate, wav_data = ensure_sample_rate(loaded_audio, sample_rate)\n    predict_fn = model.signatures['serving_default']\n    logits = predict_fn(fixed_tm[:1])['label']\n    probabilities = tf.nn.softmax(logits)\n    argmax = np.argmax(probabilities)\n\n    return labels[argmax], probabilities[0][argmax]","metadata":{"execution":{"iopub.status.busy":"2024-05-08T16:58:35.526358Z","iopub.execute_input":"2024-05-08T16:58:35.526756Z","iopub.status.idle":"2024-05-08T16:58:35.533998Z","shell.execute_reply.started":"2024-05-08T16:58:35.526729Z","shell.execute_reply":"2024-05-08T16:58:35.532649Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Testing memory usage\nimport psutil\n\n\na , b = predict_audio(random_audio)\n\ncpu_memory = get_cpu_memory() / (1024 * 1024 * 1024)\nprint(f\"Memory Usage: {cpu_memory:.2f} GB\")","metadata":{"execution":{"iopub.status.busy":"2024-05-08T16:35:05.347305Z","iopub.execute_input":"2024-05-08T16:35:05.347814Z","iopub.status.idle":"2024-05-08T16:35:08.468955Z","shell.execute_reply.started":"2024-05-08T16:35:05.347773Z","shell.execute_reply":"2024-05-08T16:35:08.467822Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cpu_memory = get_cpu_memory() / (1024 * 1024 * 1024)\nprint(f\"Memory Usage: {cpu_memory:.2f} GB\")","metadata":{"execution":{"iopub.status.busy":"2024-05-08T16:35:20.078876Z","iopub.execute_input":"2024-05-08T16:35:20.079322Z","iopub.status.idle":"2024-05-08T16:35:20.086541Z","shell.execute_reply.started":"2024-05-08T16:35:20.079264Z","shell.execute_reply":"2024-05-08T16:35:20.085128Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"a ,b = predict_audio(random_audio)\na","metadata":{"execution":{"iopub.status.busy":"2024-05-08T16:58:46.493755Z","iopub.execute_input":"2024-05-08T16:58:46.494545Z","iopub.status.idle":"2024-05-08T16:58:49.493000Z","shell.execute_reply.started":"2024-05-08T16:58:46.494505Z","shell.execute_reply":"2024-05-08T16:58:49.491820Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model_b = model.signatures['serving_default']\n","metadata":{"execution":{"iopub.status.busy":"2024-05-08T17:04:33.123263Z","iopub.execute_input":"2024-05-08T17:04:33.124474Z","iopub.status.idle":"2024-05-08T17:04:33.130323Z","shell.execute_reply.started":"2024-05-08T17:04:33.124428Z","shell.execute_reply":"2024-05-08T17:04:33.129035Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":" model = tf.keras.Sequential([\n    hub.KerasLayer(model_url), # Layer 1 (input layer)\n    tf.keras.layers.Dense(units=num_classes, \n                          activation=\"softmax\") # Layer 2 (output layer)\n])\n","metadata":{"execution":{"iopub.status.busy":"2024-05-08T17:04:47.124542Z","iopub.execute_input":"2024-05-08T17:04:47.125452Z","iopub.status.idle":"2024-05-08T17:04:52.678182Z","shell.execute_reply.started":"2024-05-08T17:04:47.125414Z","shell.execute_reply":"2024-05-08T17:04:52.676535Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}