{"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":1669520,"sourceType":"datasetVersion","datasetId":988768},{"sourceId":8688245,"sourceType":"datasetVersion","datasetId":5207337}],"dockerImageVersionId":30732,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# import os\n# for dirname, _, filenames in os.walk('/kaggle/input/birdclef-2024'):\n#     for filename in filenames:\n        # print(os.path.join(dirname, filename))","metadata":{"execution":{"iopub.status.busy":"2024-06-14T06:19:33.225832Z","iopub.execute_input":"2024-06-14T06:19:33.226281Z","iopub.status.idle":"2024-06-14T06:19:33.233496Z","shell.execute_reply.started":"2024-06-14T06:19:33.226241Z","shell.execute_reply":"2024-06-14T06:19:33.231961Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import sys\nsys.path.insert(0, '/kaggle/input/einops/einops-master')\nsys.path.insert(0, '/kaggle/input/ssamba-trained')\nsys.path.insert(0, '/kaggle/input/ssamba-trained/Vim')\nsys.path.insert(0, '/kaggle/input/ssamba-trained/Vim/vim')\nsys.path.insert(0, '/kaggle/input/ssamba-trained/Vim/mamba-1p1p1')\nsys.path.insert(0, '/kaggle/input/ssamba-trained/causal-conv1d')\nsys.path.insert(0, '/kaggle/input/ssamba-trained/amt-transfer')\nfrom models_mamba import VisionMamba","metadata":{"execution":{"iopub.status.busy":"2024-06-14T06:19:33.235966Z","iopub.execute_input":"2024-06-14T06:19:33.236477Z","iopub.status.idle":"2024-06-14T06:19:38.146333Z","shell.execute_reply.started":"2024-06-14T06:19:33.236423Z","shell.execute_reply":"2024-06-14T06:19:38.145031Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from pyha_analyzer.models.ssamba_model import SSAMBAAudioModel\nMODEL_SIZE = 'base'\nfrom pyha_analyzer.config import cfg\ncfg.ssamba_config\ncfg.ssamba_config['model_size'] = MODEL_SIZE","metadata":{"execution":{"iopub.status.busy":"2024-06-14T06:19:38.148558Z","iopub.execute_input":"2024-06-14T06:19:38.149116Z","iopub.status.idle":"2024-06-14T06:19:40.970770Z","shell.execute_reply.started":"2024-06-14T06:19:38.149084Z","shell.execute_reply":"2024-06-14T06:19:40.969488Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = SSAMBAAudioModel(num_classes=182,\n                         model_name='ssamba',\n                         pretrained=True)\n\nfor layer in model.audio_model.v.layers:\n    layer.mixer.use_fast_path = False","metadata":{"execution":{"iopub.status.busy":"2024-06-14T06:19:40.972246Z","iopub.execute_input":"2024-06-14T06:19:40.972857Z","iopub.status.idle":"2024-06-14T06:19:41.270194Z","shell.execute_reply.started":"2024-06-14T06:19:40.972821Z","shell.execute_reply":"2024-06-14T06:19:41.268971Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import torch\nstate_dict_path = f'/kaggle/input/ssamba-trained/ssamba-{MODEL_SIZE}.pt'\nmodel.load_state_dict(torch.load(state_dict_path, map_location=torch.device('cpu')))","metadata":{"execution":{"iopub.status.busy":"2024-06-14T06:19:41.273048Z","iopub.execute_input":"2024-06-14T06:19:41.273432Z","iopub.status.idle":"2024-06-14T06:19:41.360114Z","shell.execute_reply.started":"2024-06-14T06:19:41.273398Z","shell.execute_reply":"2024-06-14T06:19:41.358976Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nfrom pathlib import Path\nfrom joblib import Parallel, delayed\nfrom tqdm import tqdm\nimport glob\nimport pandas as pd\nimport torch\nimport torch.nn as nn\nimport torchaudio","metadata":{"execution":{"iopub.status.busy":"2024-06-14T06:19:41.361689Z","iopub.execute_input":"2024-06-14T06:19:41.362128Z","iopub.status.idle":"2024-06-14T06:19:41.396161Z","shell.execute_reply.started":"2024-06-14T06:19:41.362087Z","shell.execute_reply":"2024-06-14T06:19:41.395201Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import sys\n# sys.path.append('/kaggle/working/pyha-analyzer/')\nsys.argv = [\"\"]\nfrom pyha_analyzer import config\n# from pyha_analyzer.models.timm_model import TimmModel\nfrom pyha_analyzer.utils import set_seed","metadata":{"execution":{"iopub.status.busy":"2024-06-14T06:19:41.397793Z","iopub.execute_input":"2024-06-14T06:19:41.398259Z","iopub.status.idle":"2024-06-14T06:19:41.404400Z","shell.execute_reply.started":"2024-06-14T06:19:41.398215Z","shell.execute_reply":"2024-06-14T06:19:41.403033Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv('/kaggle/input/birdclef-2024/train_metadata.csv')\ncompetition_classes = sorted(df.primary_label.unique())\n\nfilepaths = glob.glob('/kaggle/input/birdclef-2024/test_soundscapes/*.ogg')\n# filepaths = glob.glob('/kaggle/input/birdclef-2024/unlabeled_soundscapes/*.ogg')[:4]","metadata":{"execution":{"iopub.status.busy":"2024-06-14T06:19:41.405925Z","iopub.execute_input":"2024-06-14T06:19:41.406287Z","iopub.status.idle":"2024-06-14T06:19:41.555905Z","shell.execute_reply.started":"2024-06-14T06:19:41.406256Z","shell.execute_reply":"2024-06-14T06:19:41.554728Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset_mean = -2.518\ndataset_std = 6.498\n\ndef to_image(audio):\n    \"\"\"\n    Convert audio clip to 3-channel spectrogram image\n    \"\"\"\n    convert_to_mel = audtr.MelSpectrogram(\n            sample_rate=cfg.sample_rate,\n            n_mels=cfg.n_mels,\n            n_fft=cfg.n_fft)\n    mel = convert_to_mel(audio)\n    # Convert to Image\n    # image = torch.stack([mel, mel, mel])\n\n    # Convert to decibels\n    # Log scale the power\n    decibel_convert = audtr.AmplitudeToDB(stype=\"power\")\n    image = decibel_convert(mel)\n\n    # Normalize Image\n    # Inspired by\n    # https://medium.com/@hasithsura/audio-classification-d37a82d6715\n    mean = image.mean()\n    std = image.std()\n    image = (image - dataset_mean) / (dataset_std + 1e-6)\n\n    # Sigmoid to get 0 to 1 scaling (0.5 becomes mean)\n    image = torch.sigmoid(image)\n    return image.unsqueeze(0)","metadata":{"execution":{"iopub.status.busy":"2024-06-14T06:19:41.557855Z","iopub.execute_input":"2024-06-14T06:19:41.558341Z","iopub.status.idle":"2024-06-14T06:19:41.567854Z","shell.execute_reply.started":"2024-06-14T06:19:41.558294Z","shell.execute_reply":"2024-06-14T06:19:41.566588Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import time\n\n# make predictions\nMIN_WINDOW = 32_000 * 5\nfrom torchaudio import transforms as audtr\nimport torch.nn.functional as F\n\ndef process(filepath):\n    all_predictions = []\n    name = Path(filepath).stem\n    audio = torchaudio.load(filepath)[0][0]\n    \n    for i in tqdm(range(0, 48)):\n        crop = audio[i*MIN_WINDOW:(i+1)*MIN_WINDOW]\n        image = to_image(crop)\n\n        with torch.no_grad():\n            #pred = F.softmax(model(image[None]))\n            pred = torch.sigmoid(model(image))\n\n            pred = pred.squeeze().tolist()\n\n        t = (i + 1) * 5\n\n        all_predictions.append({\"row_id\": f'{name}_{t}',\"predictions\": pred})\n    return all_predictions\n\n\nif filepaths:\n\n\n    start = time.time()\n    all_predictions = Parallel(n_jobs=os.cpu_count())(\n         delayed(process)(filepath)\n         for filepath in tqdm(filepaths, 'Processing files')\n    )\n    end = time.time()\n    print(end - start)\n    all_preds_2 = [p2 for p in all_predictions for p2 in p]\n    import numpy as np\n    df = pd.concat([\n        pd.DataFrame({'row_id': [p['row_id'] for p in all_preds_2]}), \n        pd.DataFrame(np.vstack([p['predictions'] for p in all_preds_2]), columns=competition_classes)\n    ], axis=1)\n\n    df.to_csv('submission.csv', index=False)\nelse:\n    with open('submission.csv', 'w') as f:\n        f.write(' ')","metadata":{"execution":{"iopub.status.busy":"2024-06-14T06:19:41.569333Z","iopub.execute_input":"2024-06-14T06:19:41.569763Z","iopub.status.idle":"2024-06-14T06:19:41.588523Z","shell.execute_reply.started":"2024-06-14T06:19:41.569730Z","shell.execute_reply":"2024-06-14T06:19:41.586916Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# all_preds_2","metadata":{"execution":{"iopub.status.busy":"2024-06-14T06:19:41.592294Z","iopub.execute_input":"2024-06-14T06:19:41.592829Z","iopub.status.idle":"2024-06-14T06:19:41.602365Z","shell.execute_reply.started":"2024-06-14T06:19:41.592784Z","shell.execute_reply":"2024-06-14T06:19:41.601084Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}