{"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":"!pip install -q efficientnet_pytorch noisereduce --no-index --find-links='../input/wrapping-5/frozen_packages'","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-05-20T01:37:28.914457Z","iopub.execute_input":"2022-05-20T01:37:28.914990Z","iopub.status.idle":"2022-05-20T01:37:37.544835Z","shell.execute_reply.started":"2022-05-20T01:37:28.914903Z","shell.execute_reply":"2022-05-20T01:37:37.544024Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport gc\nimport ast\nimport random\nimport numpy as np \nimport pandas as pd \nimport json\nimport matplotlib.pyplot as plt\n%matplotlib inline\nimport seaborn as sns\nfrom tqdm import tqdm\nimport noisereduce as nr\n\nimport torchaudio\n# from torchvision.models.resnet import ResNet, BasicBlock\nfrom efficientnet_pytorch import EfficientNet\nfrom torchvision import transforms\nimport IPython.display as ipd\nfrom collections import Counter\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.model_selection import StratifiedKFold\n\nimport torch\nimport torch.nn as nn\nfrom torch.optim import Adam\nimport torch.nn.functional as F\nfrom torch.utils.data import Dataset, DataLoader,IterableDataset\n\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"execution":{"iopub.status.busy":"2022-05-20T01:37:37.546986Z","iopub.execute_input":"2022-05-20T01:37:37.547237Z","iopub.status.idle":"2022-05-20T01:37:41.194327Z","shell.execute_reply.started":"2022-05-20T01:37:37.547211Z","shell.execute_reply":"2022-05-20T01:37:41.193401Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class config:\n    seed=2022 # to change and get 5 trained models\n    num_fold = 5 # change to 1\n    n_fft=1024\n    hop_length=512\n    n_mels=512\n    duration=5\n    sample_rate=160000//duration\n    num_classes = 21\n    train_batch_size = 32\n    valid_batch_size = 64\n    epochs = 5 # to change and plot\n    device = 'cuda' if torch.cuda.is_available() else 'cpu'\n    learning_rate = 1e-3\n    \ndef seed_everything(seed):\n    random.seed(seed)\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.backends.cudnn.deterministic = True\nseed_everything(config.seed)","metadata":{"execution":{"iopub.status.busy":"2022-05-20T01:37:41.195811Z","iopub.execute_input":"2022-05-20T01:37:41.196057Z","iopub.status.idle":"2022-05-20T01:37:41.253455Z","shell.execute_reply.started":"2022-05-20T01:37:41.196022Z","shell.execute_reply":"2022-05-20T01:37:41.252627Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv('../input/birdclef-2022/train_metadata.csv')\nbirds_path = \"/kaggle/input/birdclef-2022/scored_birds.json\"\nwith open(birds_path) as bf:\n    birds = json.load(bf)\n\ndf = df[df['primary_label'].isin(birds)].reset_index(drop=True)\n# df = df[df['secondary_labels']=='[]'].reset_index(drop=True)\nencoder = LabelEncoder()\ndf['primary_label_encoded'] = encoder.fit_transform(df['primary_label'])\ndf.head(3)","metadata":{"execution":{"iopub.status.busy":"2022-05-20T01:37:41.257450Z","iopub.execute_input":"2022-05-20T01:37:41.257995Z","iopub.status.idle":"2022-05-20T01:37:41.392105Z","shell.execute_reply.started":"2022-05-20T01:37:41.257962Z","shell.execute_reply":"2022-05-20T01:37:41.391375Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = EfficientNet.from_name('efficientnet-b3').to(config.device)\nnum_ftrs = model._fc.in_features\nmodel._fc = nn.Linear(num_ftrs, config.num_classes).to(config.device)","metadata":{"execution":{"iopub.status.busy":"2022-05-20T01:37:41.393132Z","iopub.execute_input":"2022-05-20T01:37:41.393506Z","iopub.status.idle":"2022-05-20T01:37:44.346243Z","shell.execute_reply.started":"2022-05-20T01:37:41.393469Z","shell.execute_reply":"2022-05-20T01:37:44.345535Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mel_spectrogram = torchaudio.transforms.MelSpectrogram(sample_rate=config.sample_rate, \n                                                      n_fft=config.n_fft, \n                                                      hop_length=config.hop_length,                                                       \n                                                      n_mels=config.n_mels)","metadata":{"execution":{"iopub.status.busy":"2022-05-20T01:37:44.348361Z","iopub.execute_input":"2022-05-20T01:37:44.348764Z","iopub.status.idle":"2022-05-20T01:37:44.425376Z","shell.execute_reply.started":"2022-05-20T01:37:44.348728Z","shell.execute_reply":"2022-05-20T01:37:44.424683Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def imshow(tensor):\n    unloader = transforms.ToPILImage()\n    image = tensor.cpu().clone()  # we clone the tensor to not do changes on it\n    image = image.squeeze(0)  # remove the fake batch dimension\n    image = unloader(image)\n    plt.imshow(image)\n    plt.pause(0.001)  # pause a bit so that plots are updated\n    \ndef trans(signal):\n        mel = mel_spectrogram(signal)\n        mel = mel[:,113:426,:].log1p()\n#         print(mel.shape)\n#         tfms = transforms.Compose([transforms.ToPILImage(),transforms.Resize([300,300]), transforms.ToTensor()])\n#         mel = tfms(mel)\n        return mel\n    \ndef trans_img(mels=config.n_mels,n_fft=config.n_fft,hop_length=config.hop_length,stride_sec=5):\n    test_paths = \"/kaggle/input/birdclef-2022/test_soundscapes/\"\n    files = [f.split('.')[0] for f in sorted(os.listdir(test_paths))]\n#     files=[\"../input/birdclef-2022/train_audio/iiwi/XC219960.ogg\",\"../input/birdclef-2022/train_audio/akikik/XC317034.ogg\"]\n    num_samples = config.sample_rate*config.duration\n    stride = config.sample_rate*stride_sec\n    reduce_noise = True\n    thres=nn.Threshold(0.001, 0)\n    threshold=0.04\n    img_list=[]\n    \n    \n    for f in files:\n#         flag=0\n        audio_path = test_paths+f+'.ogg'\n#         audio_path = \"../input/birdclef-2022/train_audio/akiapo/XC306424.ogg\"\n        signal, sr = torchaudio.load(audio_path)\n        \n        # norm all signal to sr, post_nr, 3 channel, >=5sec\n        if sr != config.sample_rate:\n            resampler = torchaudio.transforms.Resample(sr, self.target_sample_rate)\n            signal = resampler(signal)\n    \n        if reduce_noise:\n            signal = torch.tensor(nr.reduce_noise(y=signal, sr=config.sample_rate, win_length=n_fft, use_tqdm=True, n_jobs=-1))\n        if signal.shape[1] <= num_samples:\n            num_missing_samples = num_samples - signal.shape[1]\n            last_dim_padding = (0, num_missing_samples)\n            signal = F.pad(signal, last_dim_padding)\n            \n        if signal.shape[0]==1:\n            signal=signal.repeat(3,1)\n        elif signal.shape[0]==2:\n            signal=torch.cat((signal,torch.mean(signal,dim=0,keepdim=True)),0)\n        else:\n            signal=signal[0:3]\n        # split to 5sec frame\n        length = signal.shape[1]\n        end = 5\n        start_index = 0 \n        preds=torch.zeros([1,config.num_classes])\n        while start_index + num_samples <= length: # at least once\n            frame = signal[:,start_index:start_index + num_samples]\n            img = trans(frame)\n            # at least give one prediction in validation using flag\n            if torch.count_nonzero(thres(img[0]))>=int(threshold*img[0].numel()):\n#                 flag=1\n#                 imshow(img)\n                x = torch.unsqueeze(img,dim=0).to(config.device)\n                pred = model(x).detach().cpu()\n                preds+=pred\n                \n            \n            # update pointer\n            end += stride_sec\n            start_index += stride\n        label_index = preds.topk(5,dim=1)[1]  \n        pred_label = encoder.inverse_transform(torch.squeeze(label_index)) \n        img_dict={}\n        img_dict.update({\"path\":f,\"pred_label\":pred_label})\n        img_list.append(img_dict)\n#         if flag==0:\n#             while start_index + num_samples <= length: # at least once\n#             frame = signal[:,start_index:start_index + num_samples]\n#             img = trans(frame)\n            \n            \n    return img_list","metadata":{"execution":{"iopub.status.busy":"2022-05-20T01:53:00.719582Z","iopub.execute_input":"2022-05-20T01:53:00.720012Z","iopub.status.idle":"2022-05-20T01:53:00.738398Z","shell.execute_reply.started":"2022-05-20T01:53:00.719975Z","shell.execute_reply":"2022-05-20T01:53:00.736912Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"fold=0\nmodel.load_state_dict(torch.load(f'../input/wrapping-5/model_{fold}.bin'))\nmodel.eval()\npred_df=pd.DataFrame(trans_img())\npred_df","metadata":{"execution":{"iopub.status.busy":"2022-05-20T01:53:01.204459Z","iopub.execute_input":"2022-05-20T01:53:01.205146Z","iopub.status.idle":"2022-05-20T01:53:02.354125Z","shell.execute_reply.started":"2022-05-20T01:53:01.205110Z","shell.execute_reply":"2022-05-20T01:53:02.353475Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"pred_dict=dict(zip(pred_df['path'],pred_df['pred_label']))\n# pred_dict.update({'soundscape_1000170626':[\"sdaf\"]})\nsample_submission = pd.read_csv('../input/birdclef-2022/sample_submission.csv')\n\nfor i in range(len(sample_submission)):\n    sample = sample_submission.row_id[i]\n    sample_submission.iat[i,1]=False\n    sample_split=sample.split('_')[0]+'_'+sample.split('_')[1]\n    sample_label=sample.split('_')[2]\n\n    if sample_split in pred_dict and sample_label in pred_dict[sample_split]:\n        sample_submission.iat[i,1]=True\n\nsample_submission.to_csv(\"submission.csv\", index=False)\n!head submission.csv","metadata":{"execution":{"iopub.status.busy":"2022-05-20T01:58:04.221193Z","iopub.execute_input":"2022-05-20T01:58:04.221482Z","iopub.status.idle":"2022-05-20T01:58:04.937321Z","shell.execute_reply.started":"2022-05-20T01:58:04.221453Z","shell.execute_reply":"2022-05-20T01:58:04.936421Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}