{"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":24800,"databundleVersionId":1831594,"sourceType":"competition"}],"dockerImageVersionId":30648,"isInternetEnabled":true,"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\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n        break\n\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-02-03T20:34:33.382123Z","iopub.execute_input":"2024-02-03T20:34:33.382918Z","iopub.status.idle":"2024-02-03T20:35:00.133902Z","shell.execute_reply.started":"2024-02-03T20:34:33.382884Z","shell.execute_reply":"2024-02-03T20:35:00.132996Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"!pip install lightning","metadata":{"execution":{"iopub.status.busy":"2024-02-03T20:35:03.532817Z","iopub.execute_input":"2024-02-03T20:35:03.533658Z","iopub.status.idle":"2024-02-03T20:35:19.950885Z","shell.execute_reply.started":"2024-02-03T20:35:03.533626Z","shell.execute_reply":"2024-02-03T20:35:19.949888Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/vinbigdata-chest-xray-abnormalities-detection/train.csv')\ntrain.info()","metadata":{"execution":{"iopub.status.busy":"2024-02-03T20:35:22.741224Z","iopub.execute_input":"2024-02-03T20:35:22.741746Z","iopub.status.idle":"2024-02-03T20:35:22.94217Z","shell.execute_reply.started":"2024-02-03T20:35:22.741712Z","shell.execute_reply":"2024-02-03T20:35:22.941202Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import lightning as L\nfrom lightning.pytorch.loggers import CSVLogger\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport torch\nimport torch.nn.functional as F\nimport torchmetrics\nfrom torch.utils.data import DataLoader\nfrom torchvision import datasets, transforms\nimport torch\ntorch.set_float32_matmul_precision('medium')\nfrom torch.utils.data import DataLoader, Dataset\nfrom torch.utils.data.dataset import random_split\nfrom torchvision.io import ImageReadMode\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport os\nimport pandas as pd\nfrom torchvision.io import read_image\nfrom torchvision import transforms, datasets\nimport pydicom\nimport torch\nfrom torch.utils.data import DataLoader, Dataset\nfrom torch.utils.data.dataset import random_split\nfrom torchvision import datasets, transforms, utils\nfrom torchvision.io import ImageReadMode\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport os\nimport pandas as pd\nfrom torchvision.io import read_image\nfrom torchvision import transforms, datasets\nimport torchvision\nimport imageio\nfrom torchvision.transforms import PILToTensor, ConvertImageDtype\nimport PIL\nimport pydicom\nimport cv2\nfrom pydicom.pixel_data_handlers.util import apply_voi_lut\nimport warnings\nwarnings.filterwarnings('ignore')","metadata":{"execution":{"iopub.status.busy":"2024-02-03T20:35:38.69104Z","iopub.execute_input":"2024-02-03T20:35:38.691397Z","iopub.status.idle":"2024-02-03T20:35:46.828628Z","shell.execute_reply.started":"2024-02-03T20:35:38.691368Z","shell.execute_reply":"2024-02-03T20:35:46.827799Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CustomImageDataset(Dataset):\n    def __init__(self, annotations_file, transform=None, target_transform=None, size = 224):\n        self.img_labels = pd.read_csv(annotations_file)[['image_id', 'class_id']]\n        self.transform = transform\n        self.target_transform = target_transform\n        self.size = size\n        #print(self.img_labels.iloc[0, 1])\n\n    def __len__(self):\n        #print(\"getting labels ...\")\n        return len(self.img_labels)\n\n    def __getitem__(self, idx):\n        prefix_path = '/kaggle/input/vinbigdata-chest-xray-abnormalities-detection/train'\n        # constract file path\n        img_path = os.path.join(prefix_path, self.img_labels.iloc[idx, 0] +'.dicom')\n        #read image file \n        image_file = pydicom.dcmread(img_path)\n        img = apply_voi_lut(image_file.pixel_array, image_file)\n        img = (img - img.min())/(img.max() - img.min()) # Normalisation\n        if image_file.PhotometricInterpretation == \"MONOCHROME1\":\n            img = 1 - img # some images are inverted\n        img = cv2.resize(img, (self.size,self.size))\n        image = (img * 255).astype(np.float32)\n        #print(image.shape)\n        #print(type(image))\n        # plt.imshow(image, cmap='gray')\n        # plt.show()\n        image = image[np.newaxis]# Add channel dimension\n        image = torch.from_numpy(image)\n        #print(image.shape)\n        #print(type(image))\n        label = self.img_labels.iloc[idx, 1]\n        #print(type(label))\n        #print(label.shape)\n        if self.transform:\n            image = self.transform(image)\n            pass\n        if self.target_transform:\n            label = self.target_transform(label)\n        return image, label","metadata":{"execution":{"iopub.status.busy":"2024-02-03T20:35:55.499354Z","iopub.execute_input":"2024-02-03T20:35:55.499962Z","iopub.status.idle":"2024-02-03T20:35:55.510621Z","shell.execute_reply.started":"2024-02-03T20:35:55.499924Z","shell.execute_reply":"2024-02-03T20:35:55.509557Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = CustomImageDataset('/kaggle/input/vinbigdata-chest-xray-abnormalities-detection/train.csv')","metadata":{"execution":{"iopub.status.busy":"2024-02-03T20:36:02.317983Z","iopub.execute_input":"2024-02-03T20:36:02.318322Z","iopub.status.idle":"2024-02-03T20:36:02.426222Z","shell.execute_reply.started":"2024-02-03T20:36:02.318298Z","shell.execute_reply":"2024-02-03T20:36:02.425437Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_loader = DataLoader(\n        dataset=train_dataset,\n        batch_size=8,\n    )\nprint('Train ..........')\nfor image, label in train_loader:\n    print('This is label', label.shape, type(label))\n    print('This is image', image.shape, type(image))\n    break","metadata":{"execution":{"iopub.status.busy":"2024-02-03T20:36:06.366835Z","iopub.execute_input":"2024-02-03T20:36:06.367508Z","iopub.status.idle":"2024-02-03T20:36:17.926502Z","shell.execute_reply.started":"2024-02-03T20:36:06.367472Z","shell.execute_reply":"2024-02-03T20:36:17.925572Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def viz_batch_images(batch):\n\n    plt.figure(figsize=(8, 8))\n    plt.axis(\"off\")\n    plt.title(\"Training images\")\n    plt.imshow(\n        np.transpose(\n            utils.make_grid(batch[0][:64], padding=2, normalize=True), (1, 2, 0)\n        )\n    )\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2024-02-03T20:36:22.204868Z","iopub.execute_input":"2024-02-03T20:36:22.20521Z","iopub.status.idle":"2024-02-03T20:36:22.214969Z","shell.execute_reply.started":"2024-02-03T20:36:22.205185Z","shell.execute_reply":"2024-02-03T20:36:22.213991Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import time\n\nnum_epochs = 1\nfor epoch in range(num_epochs):\n\n    for batch_idx, (x, y) in enumerate(train_loader):\n        time.sleep(1)\n        if batch_idx >= 8:\n            break\n        print(\" Batch index:\", batch_idx, end=\"\")\n        print(\" | Batch size:\", y.shape[0], end=\"\")\n        print(\" | x shape:\", x.shape, end=\"\")\n        print(\" | y shape:\", y.shape)\n\nprint(\"Labels from current batch:\", y)\n\n# Uncomment to visualize a data batch:\nbatch = next(iter(train_loader))\nviz_batch_images(batch)","metadata":{"execution":{"iopub.status.busy":"2024-02-03T20:36:26.211032Z","iopub.execute_input":"2024-02-03T20:36:26.212358Z","iopub.status.idle":"2024-02-03T20:37:51.002317Z","shell.execute_reply.started":"2024-02-03T20:36:26.212276Z","shell.execute_reply":"2024-02-03T20:37:51.00122Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class MyCustomDataModuleMod(L.LightningDataModule):\n    def __init__(\n        self, data_path=\"./\", batch_size=64, num_workers=4, height_width=(32, 32)\n    ):\n        super().__init__()\n        self.batch_size = batch_size\n        self.data_path = data_path\n        self.num_workers = num_workers\n        self.height_width = height_width\n\n    def prepare_data(self):\n\n        self.train_transform = transforms.Compose(\n            [\n\n                transforms.Resize(self.height_width),\n                transforms.RandomHorizontalFlip(),\n                transforms.RandAugment(),\n\n            ]\n        )\n\n\n        self.test_transform = transforms.Compose(\n            [\n\n                transforms.Resize(self.height_width),\n\n            ]\n        )\n        return\n\n    def setup(self, stage=None):\n        train = CustomImageDataset(annotations_file = '/kaggle/input/vinbigdata-chest-xray-abnormalities-detection/train.csv')\n        print(train)\n        train, self.test = random_split(train, lengths=[60000, 7914])\n\n        self.train, self.valid = random_split(train, lengths=[50000, 10000])\n\n    def train_dataloader(self):\n        train_loader = DataLoader(\n            dataset=self.train,\n            batch_size=self.batch_size,\n            drop_last=True,\n            shuffle=True,\n            num_workers=self.num_workers,\n        )\n        return train_loader\n\n    def val_dataloader(self):\n        valid_loader = DataLoader(\n            dataset=self.valid,\n            batch_size=self.batch_size,\n            drop_last=False,\n            shuffle=False,\n            num_workers=self.num_workers,\n        )\n        return valid_loader\n\n    def test_dataloader(self):\n        test_loader = DataLoader(\n            dataset=self.test,\n            batch_size=self.batch_size,\n            drop_last=False,\n            shuffle=False,\n            num_workers=self.num_workers,\n        )\n        return test_loader","metadata":{"execution":{"iopub.status.busy":"2024-02-03T20:37:51.00481Z","iopub.execute_input":"2024-02-03T20:37:51.005228Z","iopub.status.idle":"2024-02-03T20:37:51.019766Z","shell.execute_reply.started":"2024-02-03T20:37:51.005189Z","shell.execute_reply":"2024-02-03T20:37:51.01858Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"HIGHT = 224\nWIDTH = 224\ndm = MyCustomDataModuleMod(batch_size=8, height_width=(HIGHT, WIDTH))\ndm.prepare_data()\ndm.setup()","metadata":{"execution":{"iopub.status.busy":"2024-02-03T20:37:51.147763Z","iopub.execute_input":"2024-02-03T20:37:51.148057Z","iopub.status.idle":"2024-02-03T20:37:51.259257Z","shell.execute_reply.started":"2024-02-03T20:37:51.148032Z","shell.execute_reply":"2024-02-03T20:37:51.258182Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for images, labels in dm.train_dataloader():  \n    #print(images, labels)\n    break\n\nplt.figure(figsize=(8, 8))\nplt.axis(\"off\")\nplt.title(\"Training images\")\nplt.imshow(np.transpose(utils.make_grid(\n    images[:64], \n    padding=1,\n    pad_value=1.0,\n    normalize=True),\n    (1, 2, 0)))\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2024-02-03T20:37:51.260541Z","iopub.execute_input":"2024-02-03T20:37:51.261513Z","iopub.status.idle":"2024-02-03T20:38:12.197884Z","shell.execute_reply.started":"2024-02-03T20:37:51.261481Z","shell.execute_reply":"2024-02-03T20:38:12.196658Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class DenseNet121(torch.nn.Module):\n    \n    def __init__(self):\n        super(DenseNet121, self).__init__()\n        self.model = torch.hub.load('pytorch/vision:v0.13.0', 'densenet121', weights='DenseNet121_Weights.IMAGENET1K_V1')\n        self.model.features.conv0 = torch.nn.Conv2d(1, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n        self.model.state_dict()['features.conv0.weight'] = self.model.state_dict()['features.conv0.weight'].sum(dim=1, keepdim=True)\n        num_ftrs = self.model.classifier.in_features\n        self.model.classifier = torch.nn.Linear(num_ftrs, 15)\n\n    def forward(self, x):\n        x = self.model(x)\n        return x","metadata":{"execution":{"iopub.status.busy":"2024-02-03T20:38:26.906364Z","iopub.execute_input":"2024-02-03T20:38:26.907151Z","iopub.status.idle":"2024-02-03T20:38:26.914631Z","shell.execute_reply.started":"2024-02-03T20:38:26.907116Z","shell.execute_reply":"2024-02-03T20:38:26.913666Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class LightningModel(L.LightningModule):\n    def __init__(self, model, learning_rate):\n        super().__init__()\n\n        self.learning_rate = learning_rate\n        self.model = model\n\n        self.save_hyperparameters(ignore=[\"model\"])\n\n        self.train_acc = torchmetrics.Accuracy(task=\"multiclass\", num_classes=15)\n        self.val_acc = torchmetrics.Accuracy(task=\"multiclass\", num_classes=15)\n        self.test_acc = torchmetrics.Accuracy(task=\"multiclass\", num_classes=15)\n\n    def forward(self, x):\n        return self.model(x)\n\n    def _shared_step(self, batch):\n        features, true_labels = batch\n        logits = self(features)\n\n        loss = F.cross_entropy(logits, true_labels)\n        predicted_labels = torch.argmax(logits, dim=1)\n        return loss, true_labels, predicted_labels\n\n    def training_step(self, batch, batch_idx):\n        loss, true_labels, predicted_labels = self._shared_step(batch)\n\n        self.log(\"train_loss\", loss)\n        self.train_acc(predicted_labels, true_labels)\n        self.log(\"train_acc\", self.train_acc, prog_bar=True, on_epoch=True, on_step=False\n        )\n        return loss\n\n    def validation_step(self, batch, batch_idx):\n        loss, true_labels, predicted_labels = self._shared_step(batch)\n\n        self.log(\"val_loss\", loss, prog_bar=True)\n        self.val_acc(predicted_labels, true_labels)\n        self.log(\"val_acc\", self.val_acc, prog_bar=True)\n\n    def test_step(self, batch, batch_idx):\n        loss, true_labels, predicted_labels = self._shared_step(batch)\n        self.test_acc(predicted_labels, true_labels)\n        self.log(\"test_acc\", self.test_acc)\n\n    def configure_optimizers(self):\n        optimizer = torch.optim.SGD(self.parameters(), lr=self.learning_rate)\n        return optimizer","metadata":{"execution":{"iopub.status.busy":"2024-02-03T20:38:32.527911Z","iopub.execute_input":"2024-02-03T20:38:32.528597Z","iopub.status.idle":"2024-02-03T20:38:32.542525Z","shell.execute_reply.started":"2024-02-03T20:38:32.528564Z","shell.execute_reply":"2024-02-03T20:38:32.5413Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"lightning_model_densenet121 = LightningModel(model=DenseNet121(), learning_rate=0.1)\ntrainer = L.Trainer(\n    max_epochs=10,\n    accelerator=\"gpu\",\n    devices=\"auto\",\n    logger=CSVLogger(save_dir=\"logs/\", name=\"my-model\"),\n    #deterministic=True,\n)\ntrainer.fit(model=lightning_model_densenet121, datamodule=dm)\ntrainer.test(model=lightning_model_densenet121, datamodule=dm)\n","metadata":{"execution":{"iopub.status.busy":"2024-02-03T20:49:12.355038Z","iopub.execute_input":"2024-02-03T20:49:12.355419Z"},"trusted":true},"execution_count":null,"outputs":[]}]}