{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","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":5203358,"sourceType":"datasetVersion","datasetId":3026132},{"sourceId":158849929,"sourceType":"kernelVersion"}],"dockerImageVersionId":30636,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Note\n\nI made this notebook in hurry and I believe there is alot of room for improvement.\n\n***Data preparation: [Data Prepare - Separate Spectogram](https://www.kaggle.com/code/muhammad4hmed/hms-data-prepare-separate-spectogram)***\n\n***Training Notebook: [Train - ResNet18 on Spectrograms](https://www.kaggle.com/code/muhammad4hmed/hms-train-spectogram-images)***\n\n> Upvote if you like the approach!","metadata":{}},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nimport torch.optim as optim\nfrom torchvision import datasets, transforms\nfrom torch.utils.data import DataLoader\nimport os\nimport pandas as pd\nfrom PIL import Image\nimport torchvision.models as models\nfrom tqdm import tqdm\nfrom torch.nn.functional import softmax, one_hot, log_softmax\nfrom io import BytesIO\nimport matplotlib.pyplot as plt\nfrom transformers import ViTModel\nimport numpy as np\nimport matplotlib.cm as cm\nfrom PIL import Image","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-01-13T15:29:21.208681Z","iopub.execute_input":"2024-01-13T15:29:21.209600Z","iopub.status.idle":"2024-01-13T15:29:21.216029Z","shell.execute_reply.started":"2024-01-13T15:29:21.209564Z","shell.execute_reply":"2024-01-13T15:29:21.214830Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/hms-harmful-brain-activity-classification/train.csv')\ntest = pd.read_csv('/kaggle/input/hms-harmful-brain-activity-classification/test.csv')\nclasses = train['expert_consensus'].unique()\nmapping = {\n    c:i for i, c in enumerate(classes)\n}\nnum_classes = classes.shape[0]","metadata":{"execution":{"iopub.status.busy":"2024-01-13T15:29:21.220854Z","iopub.execute_input":"2024-01-13T15:29:21.221203Z","iopub.status.idle":"2024-01-13T15:29:21.392924Z","shell.execute_reply.started":"2024-01-13T15:29:21.221164Z","shell.execute_reply":"2024-01-13T15:29:21.391970Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"cmap = cm.get_cmap(\"viridis\")","metadata":{"execution":{"iopub.status.busy":"2024-01-13T15:29:21.394419Z","iopub.execute_input":"2024-01-13T15:29:21.394812Z","iopub.status.idle":"2024-01-13T15:29:21.400013Z","shell.execute_reply.started":"2024-01-13T15:29:21.394762Z","shell.execute_reply":"2024-01-13T15:29:21.399096Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ImageDataset(torch.utils.data.Dataset):\n    def __init__(self, data, transform=None):\n        self.data = data\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, idx):\n        specto_id = self.data.loc[idx, 'spectrogram_id']\n        specto_path = f'/kaggle/input/hms-harmful-brain-activity-classification/test_spectrograms/{specto_id}.parquet'\n        specto = pd.read_parquet(specto_path)\n        spectrogram = Image.fromarray((cmap(specto) * 255).astype(np.uint8))\n        if self.transform:\n            spectrogram = self.transform(spectrogram)[:3, :, :]\n        return spectrogram","metadata":{"execution":{"iopub.status.busy":"2024-01-13T15:29:21.401354Z","iopub.execute_input":"2024-01-13T15:29:21.401664Z","iopub.status.idle":"2024-01-13T15:29:21.410722Z","shell.execute_reply.started":"2024-01-13T15:29:21.401638Z","shell.execute_reply":"2024-01-13T15:29:21.409794Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transform = transforms.Compose([\n    transforms.Resize((224, 224)),  # Resize to 224x224\n#     transforms.CenterCrop(224),  # Center crop to maintain aspect ratio\n    transforms.ToTensor(),  # Convert to PyTorch tensor\n#     transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])  # Normalize (optional)\n])","metadata":{"execution":{"iopub.status.busy":"2024-01-13T15:29:21.413423Z","iopub.execute_input":"2024-01-13T15:29:21.413806Z","iopub.status.idle":"2024-01-13T15:29:21.423573Z","shell.execute_reply.started":"2024-01-13T15:29:21.413755Z","shell.execute_reply":"2024-01-13T15:29:21.422637Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_dataset = ImageDataset(test, transform=transform)\ntest_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T15:29:21.424795Z","iopub.execute_input":"2024-01-13T15:29:21.425090Z","iopub.status.idle":"2024-01-13T15:29:21.434337Z","shell.execute_reply.started":"2024-01-13T15:29:21.425064Z","shell.execute_reply":"2024-01-13T15:29:21.433315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ViTClassifier(torch.nn.Module):\n    def __init__(self, num_classes=1000):\n        super().__init__()\n        self.vit = ViTModel.from_pretrained(\"/kaggle/input/google-vit-base-patch16-224-in21k\")\n        self.classifier = torch.nn.Linear(self.vit.config.hidden_size, num_classes)\n\n    def forward(self, images):\n        output = self.vit(images)\n        output = self.classifier(output.last_hidden_state[:, 0]) \n        output = softmax(output, dim = 1)\n        return output","metadata":{"execution":{"iopub.status.busy":"2024-01-13T15:29:21.435554Z","iopub.execute_input":"2024-01-13T15:29:21.435877Z","iopub.status.idle":"2024-01-13T15:29:21.444906Z","shell.execute_reply.started":"2024-01-13T15:29:21.435852Z","shell.execute_reply":"2024-01-13T15:29:21.443823Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nmodel = ViTClassifier(num_classes).to(device)\nmodel.load_state_dict(torch.load('/kaggle/input/hms-train-spectogram-images/trained_model.pt'))","metadata":{"execution":{"iopub.status.busy":"2024-01-13T15:29:21.446067Z","iopub.execute_input":"2024-01-13T15:29:21.446380Z","iopub.status.idle":"2024-01-13T15:29:22.137234Z","shell.execute_reply.started":"2024-01-13T15:29:21.446354Z","shell.execute_reply":"2024-01-13T15:29:22.136090Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model.eval()\nout = []\npbar = tqdm(test_loader)\nfor images in pbar:\n    images = images.to(device)\n    with torch.no_grad():\n        outputs = model(images)\n    outputs = outputs.detach().cpu().numpy()\n    out.append(outputs)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T15:29:22.138568Z","iopub.execute_input":"2024-01-13T15:29:22.138969Z","iopub.status.idle":"2024-01-13T15:29:22.222164Z","shell.execute_reply.started":"2024-01-13T15:29:22.138931Z","shell.execute_reply":"2024-01-13T15:29:22.221100Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"outputs = np.vstack(out)","metadata":{"execution":{"iopub.status.busy":"2024-01-13T15:29:22.223864Z","iopub.execute_input":"2024-01-13T15:29:22.224237Z","iopub.status.idle":"2024-01-13T15:29:22.230664Z","shell.execute_reply.started":"2024-01-13T15:29:22.224200Z","shell.execute_reply":"2024-01-13T15:29:22.229820Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"mapping","metadata":{"execution":{"iopub.status.busy":"2024-01-13T15:29:22.233935Z","iopub.execute_input":"2024-01-13T15:29:22.234315Z","iopub.status.idle":"2024-01-13T15:29:22.243528Z","shell.execute_reply.started":"2024-01-13T15:29:22.234278Z","shell.execute_reply":"2024-01-13T15:29:22.242561Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = test[['eeg_id']]\nsubmission['seizure_vote'] = outputs[:, 0]\nsubmission['lpd_vote'] = outputs[:, 5]\nsubmission['gpd_vote'] = outputs[:, 1]\nsubmission['lrda_vote'] = outputs[:, 2]\nsubmission['grda_vote'] = outputs[:, 4]\nsubmission['other_vote'] = outputs[:, 3]","metadata":{"execution":{"iopub.status.busy":"2024-01-13T15:29:22.244935Z","iopub.execute_input":"2024-01-13T15:29:22.245562Z","iopub.status.idle":"2024-01-13T15:29:22.256871Z","shell.execute_reply.started":"2024-01-13T15:29:22.245523Z","shell.execute_reply":"2024-01-13T15:29:22.255708Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv('submission.csv', index =- False)\nsubmission","metadata":{"execution":{"iopub.status.busy":"2024-01-13T15:29:22.258260Z","iopub.execute_input":"2024-01-13T15:29:22.259012Z","iopub.status.idle":"2024-01-13T15:29:22.277482Z","shell.execute_reply.started":"2024-01-13T15:29:22.258974Z","shell.execute_reply":"2024-01-13T15:29:22.276351Z"},"trusted":true},"execution_count":null,"outputs":[]}]}