{"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":"gpu","dataSources":[{"sourceId":59093,"databundleVersionId":7469972,"sourceType":"competition"},{"sourceId":7632713,"sourceType":"datasetVersion","datasetId":4447618},{"sourceId":7634796,"sourceType":"datasetVersion","datasetId":4448928},{"sourceId":7639841,"sourceType":"datasetVersion","datasetId":4452553},{"sourceId":7644579,"sourceType":"datasetVersion","datasetId":4455889},{"sourceId":7645105,"sourceType":"datasetVersion","datasetId":4456246},{"sourceId":7647997,"sourceType":"datasetVersion","datasetId":4458160},{"sourceId":7810039,"sourceType":"datasetVersion","datasetId":4574293},{"sourceId":7840589,"sourceType":"datasetVersion","datasetId":4596428},{"sourceId":7914635,"sourceType":"datasetVersion","datasetId":4650257}],"dockerImageVersionId":30648,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-03-23T15:10:12.874480Z","iopub.execute_input":"2024-03-23T15:10:12.875472Z","iopub.status.idle":"2024-03-23T15:10:13.282272Z","shell.execute_reply.started":"2024-03-23T15:10:12.875428Z","shell.execute_reply":"2024-03-23T15:10:13.281385Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import albumentations as A\nimport gc\nimport librosa\nimport matplotlib.pyplot as plt\nimport math\nimport multiprocessing\nimport numpy as np\nimport os\nimport pandas as pd\nimport pywt\nimport random\nimport time\nimport timm\nimport torch\nimport torch.nn as nn\n\n\nfrom albumentations.pytorch import ToTensorV2\nfrom glob import glob\nfrom torch.utils.data import DataLoader, Dataset\nfrom tqdm import tqdm\nfrom typing import Dict, List\n\nos.environ[\"CUDA_VISIBLE_DEVICES\"] = \"0,1\"\ndevice = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\nprint('Using', torch.cuda.device_count(), 'GPU(s)')","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:13.284435Z","iopub.execute_input":"2024-03-23T15:10:13.284910Z","iopub.status.idle":"2024-03-23T15:10:22.491641Z","shell.execute_reply.started":"2024-03-23T15:10:13.284876Z","shell.execute_reply":"2024-03-23T15:10:22.490818Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class config:\n    MODEL = \"resnet34d\"\n    model2 = \"tiny_vit_21m_512\"\n    model3 = \"resnet34d\"\n    epoch = 10\n    lr = 1e-3\n    batchsize = 32\n    splits = 5\n    momentum = 0.9\n    MAX_GRAD_NORM = 1e7\n    WEIGHT_DECAY = 0.01\n    device = \"cpu\"\n    FOLDS=5\n    AMP= True\nclass paths:\n    preloadedeeg = \"/kaggle/input/brain-eeg-spectrograms/eeg_specs.npy\"\n    train_eeg_dir = \"/kaggle/input/hms-harmful-brain-activity-classification/train_eegs\"\n    train_spec_dir = \"/kaggle/input/hms-harmful-brain-activity-classification/train_spectrograms\"\n    train_csv = \"/kaggle/input/hms-harmful-brain-activity-classification/train.csv\"\n    test_csv = \"/kaggle/input/hms-harmful-brain-activity-classification/test.csv\"\n    test_eeg = \"/kaggle/input/hms-harmful-brain-activity-classification/test_eegs\"\n    test_spec = \"/kaggle/input/hms-harmful-brain-activity-classification/test_spectrograms\"\n    out = \"/kaggle/working/\"","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:22.492900Z","iopub.execute_input":"2024-03-23T15:10:22.493272Z","iopub.status.idle":"2024-03-23T15:10:22.500292Z","shell.execute_reply.started":"2024-03-23T15:10:22.493238Z","shell.execute_reply":"2024-03-23T15:10:22.499419Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"USE_WAVELET = None\n\nNAMES = ['LL','LP','RP','RR']\n\nFEATS = [['Fp1','F7','T3','T5','O1'],\n         ['Fp1','F3','C3','P3','O1'],\n         ['Fp2','F8','T4','T6','O2'],\n         ['Fp2','F4','C4','P4','O2']]\ndef maddest(d, axis: int = None):\n    \"\"\"\n    Denoise function.\n    \"\"\"\n    return np.mean(np.absolute(d - np.mean(d, axis)), axis)\n\ndef denoise(x: np.ndarray, wavelet: str = 'haar', level: int = 1): \n    coeff = pywt.wavedec(x, wavelet, mode=\"per\") # multilevel 1D Discrete Wavelet Transform of data.\n    sigma = (1/0.6745) * maddest(coeff[-level])\n    uthresh = sigma * np.sqrt(2*np.log(len(x)))\n    coeff[1:] = (pywt.threshold(i, value=uthresh, mode='hard') for i in coeff[1:])\n    output = pywt.waverec(coeff, wavelet, mode='per')\n    return output\n\ndef spectrogram_from_eeg(parquet_path, display=False):\n    # LOAD MIDDLE 50 SECONDS OF EEG SERIES\n    eeg = pd.read_parquet(parquet_path)\n    middle = (len(eeg)-10_000)//2\n    eeg = eeg.iloc[middle:middle+10_000]\n    \n    # VARIABLE TO HOLD SPECTROGRAM\n    img = np.zeros((128,256,4),dtype='float32')\n    \n    if display:\n        plt.figure(figsize=(10,7))\n    signals = []\n    for k in range(4):\n        COLS = FEATS[k]\n        \n        for kk in range(4):\n        \n            # COMPUTE PAIR DIFFERENCES\n            x = eeg[COLS[kk]].values - eeg[COLS[kk+1]].values\n\n            # FILL NANS\n            m = np.nanmean(x)\n            if np.isnan(x).mean()<1: x = np.nan_to_num(x,nan=m)\n            else: x[:] = 0\n\n            # DENOISE\n            if USE_WAVELET:\n                x = denoise(x, wavelet=USE_WAVELET)\n            signals.append(x)\n\n            # RAW SPECTROGRAM\n            mel_spec = librosa.feature.melspectrogram(y=x, sr=200, hop_length=len(x)//256, \n                  n_fft=1024, n_mels=128, fmin=0, fmax=20, win_length=128)\n\n            # LOG TRANSFORM\n            width = (mel_spec.shape[1]//32)*32\n            mel_spec_db = librosa.power_to_db(mel_spec, ref=np.max).astype(np.float32)[:,:width]\n\n            # STANDARDIZE TO -1 TO 1\n            mel_spec_db = (mel_spec_db+40)/40 \n            img[:,:,k] += mel_spec_db\n                \n        # AVERAGE THE 4 MONTAGE DIFFERENCES\n        img[:,:,k] /= 4.0\n        \n        if display:\n            plt.subplot(2,2,k+1)\n            plt.imshow(img[:,:,k],aspect='auto',origin='lower')\n            plt.title(f'EEG {eeg_id} - Spectrogram {NAMES[k]}')\n            \n    if display: \n        plt.show()\n        plt.figure(figsize=(10,5))\n        offset = 0\n        for k in range(4):\n            if k>0: offset -= signals[3-k].min()\n            plt.plot(range(10_000),signals[k]+offset,label=NAMES[3-k])\n            offset += signals[3-k].max()\n        plt.legend()\n        plt.title(f'EEG {eeg_id} Signals')\n        plt.show()\n        print(); print('#'*25); print()\n        \n    return img","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:22.501507Z","iopub.execute_input":"2024-03-23T15:10:22.501760Z","iopub.status.idle":"2024-03-23T15:10:22.522088Z","shell.execute_reply.started":"2024-03-23T15:10:22.501739Z","shell.execute_reply":"2024-03-23T15:10:22.521166Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df = pd.read_csv(\"/kaggle/input/hms-harmful-brain-activity-classification/test.csv\")","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:22.524495Z","iopub.execute_input":"2024-03-23T15:10:22.524779Z","iopub.status.idle":"2024-03-23T15:10:22.544384Z","shell.execute_reply.started":"2024-03-23T15:10:22.524756Z","shell.execute_reply":"2024-03-23T15:10:22.543617Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_eegs = {}\n\nfor i in os.listdir(paths.test_eeg):\n    sp = spectrogram_from_eeg(os.path.join(paths.test_eeg,i))\n    name = int(i.split('.')[0])\n    all_eegs[name] = np.array(sp)","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:22.545517Z","iopub.execute_input":"2024-03-23T15:10:22.545819Z","iopub.status.idle":"2024-03-23T15:10:32.051876Z","shell.execute_reply.started":"2024-03-23T15:10:22.545798Z","shell.execute_reply":"2024-03-23T15:10:32.050566Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_eegs","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:32.053931Z","iopub.execute_input":"2024-03-23T15:10:32.055589Z","iopub.status.idle":"2024-03-23T15:10:32.069870Z","shell.execute_reply.started":"2024-03-23T15:10:32.055537Z","shell.execute_reply":"2024-03-23T15:10:32.068728Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df = pd.read_csv(paths.test_csv)\nprint(f\"Test dataframe shape is: {test_df.shape}\")\ntest_df.head()","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:32.071805Z","iopub.execute_input":"2024-03-23T15:10:32.072648Z","iopub.status.idle":"2024-03-23T15:10:32.100814Z","shell.execute_reply.started":"2024-03-23T15:10:32.072604Z","shell.execute_reply":"2024-03-23T15:10:32.099594Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os \nall_spectrograms = {}\n\nfor i in os.listdir(paths.test_spec):\n    sp = pd.read_parquet(os.path.join(paths.test_spec,i))\n    name = int(i.split('.')[0])\n    all_spectrograms[name] = np.array(sp)","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:32.106497Z","iopub.execute_input":"2024-03-23T15:10:32.109852Z","iopub.status.idle":"2024-03-23T15:10:32.195785Z","shell.execute_reply.started":"2024-03-23T15:10:32.109803Z","shell.execute_reply":"2024-03-23T15:10:32.194945Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"all_spectrograms","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:32.197089Z","iopub.execute_input":"2024-03-23T15:10:32.197964Z","iopub.status.idle":"2024-03-23T15:10:32.205879Z","shell.execute_reply.started":"2024-03-23T15:10:32.197925Z","shell.execute_reply":"2024-03-23T15:10:32.204840Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CustomDataset():\n    def __init__(self,traindf:pd.DataFrame,config,mode:str=\"train\",specs:dict[int,np.ndarray]=all_spectrograms,eegs:dict[int,np.ndarray]=all_eegs):\n        self.traindf = traindf;\n        self.specs = specs;\n        self.eeg = eegs;\n        self.mode = mode;\n    def __len__(self):\n        return len(self.traindf)\n    def __getitem__(self,idx):\n        X = np.zeros((128, 256, 8), dtype='float32')\n        y = np.zeros(6, dtype='float32')\n        img = np.ones((128,256), dtype='float32')\n        row = self.traindf.iloc[idx]\n        if self.mode=='test': \n            r = 0\n        else: \n            r = int((row['min'] + row['max']) // 4)\n            \n        print(r)\n        for region in range(4):\n            img = self.specs[row.spectrogram_id][r:r+300, region*100:(region+1)*100].T\n            \n            # Log transform spectogram\n            img = np.clip(img, np.exp(-4), np.exp(8))\n            img = np.log(img)\n\n            # Standarize per image\n            ep = 1e-6\n            mu = np.nanmean(img.flatten())\n            std = np.nanstd(img.flatten())\n            img = (img-mu)/(std+ep)\n            img = np.nan_to_num(img, nan=0.0)\n            X[14:-14, :, region] = img[:, 22:-22] / 2.0\n            img = self.eeg[row.eeg_id]\n            X[:, :, 4:] = img\n        \n        X = torch.tensor(X)\n        spectograms = [X[:, :, i:i+1] for i in range(4)]\n        spectograms = torch.cat(spectograms, dim=0)\n        \n        # === Get EEG spectograms ===\n        eegs = [X[:, :, i:i+1] for i in range(4,8)]\n        eegs = torch.cat(eegs, dim=0)\n        \n        # === Reshape (512,512,3) ===\n        x = torch.cat([spectograms, eegs], dim=1)\n        x = torch.cat([x,x,x], dim=2)\n        x = x.permute(2, 0, 1)\n        if self.mode != 'test':\n            y = row[targets].values.astype(np.float32)\n            \n            \n        return {\"data\":x,\n                \"target\":y}\n        ","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:32.207145Z","iopub.execute_input":"2024-03-23T15:10:32.207439Z","iopub.status.idle":"2024-03-23T15:10:32.223231Z","shell.execute_reply.started":"2024-03-23T15:10:32.207415Z","shell.execute_reply":"2024-03-23T15:10:32.222330Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"customdataset = CustomDataset(test_df,config,mode=\"test\")","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:32.224335Z","iopub.execute_input":"2024-03-23T15:10:32.224574Z","iopub.status.idle":"2024-03-23T15:10:32.236294Z","shell.execute_reply.started":"2024-03-23T15:10:32.224554Z","shell.execute_reply":"2024-03-23T15:10:32.235426Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"customdataset[0]","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:32.237549Z","iopub.execute_input":"2024-03-23T15:10:32.237837Z","iopub.status.idle":"2024-03-23T15:10:32.343249Z","shell.execute_reply.started":"2024-03-23T15:10:32.237815Z","shell.execute_reply":"2024-03-23T15:10:32.342348Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_df.iloc[0].spectrogram_id","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:32.346777Z","iopub.execute_input":"2024-03-23T15:10:32.347037Z","iopub.status.idle":"2024-03-23T15:10:32.353128Z","shell.execute_reply.started":"2024-03-23T15:10:32.347014Z","shell.execute_reply":"2024-03-23T15:10:32.352230Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from torch.utils.data import DataLoader\ntest_loader = DataLoader(\n    customdataset,\n    batch_size=config.batchsize,\n)\nX= customdataset[0][\"data\"]\ny = customdataset[0][\"target\"]\ny\n\n","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:32.354385Z","iopub.execute_input":"2024-03-23T15:10:32.354733Z","iopub.status.idle":"2024-03-23T15:10:32.385054Z","shell.execute_reply.started":"2024-03-23T15:10:32.354705Z","shell.execute_reply":"2024-03-23T15:10:32.384171Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CustomModel(nn.Module):\n    def __init__(self, config, num_classes: int = 6, pretrained: bool = True):\n        super(CustomModel, self).__init__()\n        self.USE_KAGGLE_SPECTROGRAMS = True\n        self.USE_EEG_SPECTROGRAMS = True\n        self.model = timm.create_model(\n            config.MODEL,\n            pretrained=False,\n            drop_rate = 0.1,\n            drop_path_rate = 0.2,\n        )\n        self.features = nn.Sequential(*list(self.model.children())[:-2])\n        self.custom_layers = nn.Sequential(\n            nn.AdaptiveAvgPool2d(1),\n            nn.Flatten(),\n            nn.Linear(512, num_classes)\n        )\n    \n    def forward(self, x):\n        x = self.features(x)\n        x = self.custom_layers(x)\n        return x","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:32.386410Z","iopub.execute_input":"2024-03-23T15:10:32.386722Z","iopub.status.idle":"2024-03-23T15:10:32.394721Z","shell.execute_reply.started":"2024-03-23T15:10:32.386700Z","shell.execute_reply":"2024-03-23T15:10:32.393682Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def inference_function(test_loader, model, device):\n    model.eval()\n    softmax = nn.Softmax(dim=1)\n    prediction_dict = {}\n    preds = []\n    for i in test_loader:\n        x = i[\"data\"].to(device)\n        y = i[\"target\"].to(device)\n        batchsize = len(y)\n        with torch.no_grad():\n            ypred = model(x)\n        ypred = softmax(ypred)\n        preds.append(ypred.to('cpu').numpy()) \n                \n    prediction_dict[\"predictions\"] = np.concatenate(preds) \n    return prediction_dict\n","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:32.395904Z","iopub.execute_input":"2024-03-23T15:10:32.396228Z","iopub.status.idle":"2024-03-23T15:10:32.406635Z","shell.execute_reply.started":"2024-03-23T15:10:32.396171Z","shell.execute_reply":"2024-03-23T15:10:32.405714Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"predictions = []\nfor i in os.listdir(\"/kaggle/input/resnet34newcode\"):\n    dd = torch.load(os.path.join(\"/kaggle/input/resnet34newcode\",i))\n    model = CustomModel(config)\n    model.load_state_dict(dd['model'])\n    testdataset = CustomDataset(test_df,config,mode = \"test\")\n    testloader = DataLoader(testdataset,batch_size = config.batchsize)\n    model.to(device)\n    prediction_dict = inference_function(testloader, model, device)\n    predictions.append(prediction_dict[\"predictions\"])\npredictions = np.array(predictions)\npredictions = np.mean(predictions,axis=0)\n","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:32.407710Z","iopub.execute_input":"2024-03-23T15:10:32.408026Z","iopub.status.idle":"2024-03-23T15:10:42.099621Z","shell.execute_reply.started":"2024-03-23T15:10:32.407995Z","shell.execute_reply":"2024-03-23T15:10:42.098654Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TARGETS = ['seizure_vote', 'lpd_vote', 'gpd_vote', 'lrda_vote', 'grda_vote', 'other_vote']\nsub = pd.DataFrame({'eeg_id': test_df.eeg_id.values})\nsub[TARGETS] = predictions\nsub.to_csv('submission.csv',index=False)\nprint(f'Submissionn shape: {sub.shape}')\nsub.head()","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:42.102741Z","iopub.execute_input":"2024-03-23T15:10:42.103052Z","iopub.status.idle":"2024-03-23T15:10:42.122981Z","shell.execute_reply.started":"2024-03-23T15:10:42.103025Z","shell.execute_reply":"2024-03-23T15:10:42.121909Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(np.sum(predictions))","metadata":{"execution":{"iopub.status.busy":"2024-03-23T15:10:42.123972Z","iopub.execute_input":"2024-03-23T15:10:42.124237Z","iopub.status.idle":"2024-03-23T15:10:42.138221Z","shell.execute_reply.started":"2024-03-23T15:10:42.124209Z","shell.execute_reply":"2024-03-23T15:10:42.137237Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}