{"cells":[{"metadata":{},"cell_type":"markdown","source":"# Introduction"},{"metadata":{},"cell_type":"markdown","source":"* All the paper and code adopted from [COVID deterioration prediction based on chest X-ray radiographs via MoCo-trained image representations](https://arxiv.org/abs/2101.04909) and [github](https://github.com/facebookresearch/CovidPrognosis) respectively. \n  * Here Single Image Prediction(SIP) method is suitable from the paper, hence its implemented.\n  * pretrained models are used for finetuning\n  * MoCo adopted from [Momentum Contrast for Unsupervised Visual Representation Learning](https://arxiv.org/abs/1911.05722) paper."},{"metadata":{},"cell_type":"markdown","source":"**Self-supervised Learning based on the Momentum Contrast:**\n\nBelow figure shows the method MoCo uses to optimize.\n\nMoCo Method:\n1. Apply two different augmentation on same image. \n2. Choose the Machine Learning model and input augmented images to models, output will be the encoded features. \n3. Apply the loss function within them and optimize it by gradient descient \n \n\n\n![image.png](data:image/png;base64,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)\n\n\n"},{"metadata":{},"cell_type":"markdown","source":"# Importing Libraries"},{"metadata":{"trusted":true},"cell_type":"code","source":"import pytorch_lightning as pl\nfrom pytorch_lightning.callbacks import early_stopping,ModelCheckpoint\nimport torch \nfrom torch import nn \nimport torchvision.models as models \nfrom PIL import Image\nimport os \nfrom tqdm import tqdm \nimport requests\nfrom pathlib import Path\nfrom sklearn.metrics import roc_auc_score\n\nfrom typing import Callable, Dict, List, Tuple, Union\n\nimport numpy as np\nimport matplotlib.pyplot as plt \nfrom scipy.ndimage import gaussian_filter\n\n\nfrom torchvision import transforms, utils \nimport pandas as pd \nfrom sklearn.model_selection import train_test_split\nfrom torch.utils.data import Dataset,DataLoader","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class configs:\n    N_CLASSES = 11\n    TRAIN_CSV = \"../input/ranzcr-clip-catheter-line-classification/train.csv\"\n    TEST_CSV = \"../input/ranzcr-clip-catheter-line-classification/sample_submission.csv\"\n    IMG_DIR = \"../input/ranzcr-clip-catheter-line-classification/train/\"\n    BATCH_SIZE = 64\n    NUM_WORKERS = 4\n    EPOCHS = 20","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# About the dataset"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_file = pd.read_csv(configs.TRAIN_CSV)\ntest_file = pd.read_csv(configs.TEST_CSV)\nprint(\"train head\")\nprint(train_file.head())\nprint(\"-\"*100)\nprint(f\"train shape {train_file.shape}, test shape {test_file.shape}\")\nprint(f\"train columns {train_file.columns}, \\ntest columns {test_file.columns}\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Creating Dataset Generator"},{"metadata":{"trusted":true},"cell_type":"code","source":"class ImageDataset(Dataset):\n  def __init__(self,image_dir,image_ids,labels=None,transform=None):\n    super().__init__()\n    self.image_dir = image_dir\n    self.image_ids = image_ids\n    self.labels = labels\n    self.transform = transform\n  \n  def __len__(self):\n    return len(self.image_ids)\n  \n  def __getitem__(self,idx):\n    img_id = str(self.image_ids[idx])\n    image = Image.open(os.path.join(self.image_dir,img_id+\".jpg\"))\n    img = self.transform(image) \n    if self.labels is not None:\n      labels = self.labels[idx,:]\n      return {\"image\":img,\"labels\":torch.tensor(labels,dtype=torch.float)}          \n    else:\n      return {\"image\":img}","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Image Transformation"},{"metadata":{"trusted":true},"cell_type":"code","source":"class XRayTransform:\n    \"\"\"XRayTransform base class.\"\"\"\n\n    def __repr__(self):\n        return \"XRayTransform: {}\".format(self.__class__.__name__)\n\n\nclass HistogramNormalize(XRayTransform):\n    \"\"\"\n    Apply histogram normalization.\n\n    Args:\n        number_bins: Number of bins to use in histogram.\n    \"\"\"\n\n    def __init__(self, number_bins: int = 256):\n        self.number_bins = number_bins\n\n    def __call__(self, sample: Dict) -> Dict:\n        image = sample.numpy()\n\n        # get image histogram\n        image_histogram, bins = np.histogram(\n            image.flatten(), self.number_bins, density=True\n        )\n        cdf = image_histogram.cumsum()  # cumulative distribution function\n        cdf = 255 * cdf / cdf[-1]  # normalize\n\n        # use linear interpolation of cdf to find new pixel values\n        image_equalized = np.interp(image.flatten(), bins[:-1], cdf)\n        image_equalized.reshape(image.shape)\n\n        sample = torch.tensor(image_equalized.reshape(image.shape)).to(\n            sample\n        )\n\n        return sample\n\n\nclass TensorToRGB(XRayTransform):\n    \"\"\"\n    Convert Tensor to RGB by replicating channels.\n\n    Args:\n        num_output_channels: Number of output channels (3 for RGB).\n    \"\"\"\n\n    def __init__(self, num_output_channels: int = 3):\n        self.num_output_channels = num_output_channels\n\n    def __call__(self, sample: Dict) -> Dict:\n        expands = list()\n        for i in range(sample.ndim):\n            if i == 0:\n                expands.append(self.num_output_channels)\n            else:\n                expands.append(-1)\n        sample = sample.expand(*expands)\n\n        return sample\n\ntrain_transform = transforms.Compose([transforms.Resize(224),\n                                        transforms.CenterCrop(224),\n                                        transforms.RandomHorizontalFlip(),\n                                        transforms.RandomVerticalFlip(),\n                                        transforms.ToTensor(),\n                                        HistogramNormalize(),\n                                        TensorToRGB()])\nval_transform = transforms.Compose([transforms.Resize(224),\n                                    transforms.CenterCrop(224),\n                                    transforms.ToTensor(),\n                                    HistogramNormalize(),\n                                    TensorToRGB()])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Prepare DataModule"},{"metadata":{"trusted":true},"cell_type":"code","source":"class XrayDataModule(pl.LightningDataModule):\n  def __init__(self,images_path,train_data,val_data,batchsize=32,n_workers=2,train_transform=None,val_transform=None):\n    super().__init__()\n    train_ids,train_labels= train_data\n    val_ids,val_labels = val_data\n    self.batchsize = batchsize\n    self.n_workers = n_workers\n    self.train_dataset = ImageDataset(image_dir=images_path,\n                                      image_ids=train_ids,\n                                      labels=train_labels,\n                                      transform=train_transform)\n    self.val_dataset = ImageDataset(image_dir=images_path,\n                                    image_ids=val_ids,\n                                    labels=val_labels,\n                                    transform=train_transform)\n  \n  def train_dataloader(self):\n    return DataLoader(self.train_dataset,batch_size=self.batchsize,num_workers=self.n_workers,shuffle=True)\n  \n  def val_dataloader(self):\n    return DataLoader(self.val_dataset,batch_size=self.batchsize,num_workers=self.n_workers,shuffle=False)\n\ndef get_data():\n    dfx = pd.read_csv(configs.TRAIN_CSV)\n    train,val = train_test_split(dfx,test_size=0.25)\n    train_labels =  train.drop([\"StudyInstanceUID\",\"PatientID\"],axis=1).values\n    val_labels =  val.drop([\"StudyInstanceUID\",\"PatientID\"],axis=1).values\n    train_ids = train.StudyInstanceUID.values\n    val_ids = val.StudyInstanceUID.values\n    return {\"train_data\":(train_ids,train_labels),\"val_data\":(val_ids,val_labels)}\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data = get_data()\ndata_module = XrayDataModule(images_path=configs.IMG_DIR,\n                             train_data=data[\"train_data\"],\n                             val_data=data[\"val_data\"],\n                             train_transform=train_transform,\n                             batchsize=configs.BATCH_SIZE,\n                             n_workers=configs.NUM_WORKERS,\n                             val_transform=val_transform)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Data Visualization"},{"metadata":{"trusted":true},"cell_type":"code","source":"data_loader = data_module.val_dataloader()\ndata = next(iter(data_loader))\ndef show(img):\n    npimg = img.numpy()\n    plt.figure(figsize=(100, 100))\n    plt.imshow(np.transpose(npimg, (1,2,0)))\n    \nshow(utils.make_grid(data[\"image\"][:8],padding=10,normalize=True))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Creating the Model"},{"metadata":{"trusted":true},"cell_type":"code","source":"class SipModule(pl.LightningModule):\n    \n  def __init__(self,arch,num_classes,pretrained_file=None):\n    super().__init__()\n    self.pretrained_file = str(pretrained_file)\n    \n    # load the pretrained model\n    if pretrained_file is not None:\n\n        self.pretrained_file = str(self.pretrained_file)\n        pretrained_dict = torch.load(self.pretrained_file,map_location=self.device)[\"state_dict\"]\n        state_dict = {}\n        for k, v in pretrained_dict.items():\n            if k.startswith(\"model.encoder_q.\"):\n                k = k.replace(\"model.encoder_q.\", \"\")\n                state_dict[k] = v\n        if \"model.encoder_q.classifier.weight\" in pretrained_dict.keys():\n            feature_dim = pretrained_dict[\n                \"model.encoder_q.classifier.weight\"\n            ].shape[0]\n            in_features = pretrained_dict[\n                \"model.encoder_q.classifier.weight\"\n            ].shape[1]\n\n            self.model = models.__dict__[arch](num_classes=feature_dim)\n            self.model.load_state_dict(state_dict)\n            del self.model.classifier\n            self.model.add_module(\n                \"classifier\", torch.nn.Linear(in_features, num_classes)\n            )\n        else:\n            raise RuntimeError(\"Unrecognized classifier.\")\n    else:\n        self.model = models.__dict__[arch](num_classes=num_classes) \n            \n  def forward(self,image):\n      return self.model(image) \n  \n  def loss(self,output,target):\n    return nn.BCEWithLogitsLoss()(output,target)\n\n  def training_step(self,batch,batch_idx):\n    output = self(batch[\"image\"])\n    target = batch[\"labels\"]\n    loss = self.loss(output,target)\n    self.log(\"train_loss\",loss,prog_bar=True)\n    return loss\n  \n  def validation_step(self,batch,batch_idx):\n    output = self(batch[\"image\"])\n    target = batch[\"labels\"]\n    loss = self.loss(output,target)\n    self.log(\"val_loss\",loss,prog_bar=True)\n    return {\"output\": output, \"target\": target}\n  \n  def validation_epoch_end(self,validation_step_outputs):\n    output=[]\n    target=[]\n    for pred in validation_step_outputs:\n      output.extend(pred[\"output\"].cpu().detach().numpy())\n      target.extend(pred[\"target\"].cpu().detach().numpy())\n    self.log(\"Valid_AUC_SCORE\",roc_auc_score(target,output, average=\"micro\"),prog_bar=True) \n  \n  def configure_optimizers(self):\n    optimizer = torch.optim.Adam(self.parameters())\n    scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, configs.EPOCHS) \n    return [optimizer], [scheduler]  \n  \nmodel = SipModule(\n        arch=\"DenseNet\",\n        num_classes = configs.N_CLASSES,\n        pretrained_file=\"../input/sip-moco-pretrained-models/mimic-chexpert_lr_0.01_bs_128_fd_128_qs_65536.pt\"\n    )","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Training the model"},{"metadata":{"trusted":true},"cell_type":"code","source":"early_stop_callback = early_stopping.EarlyStopping(monitor='val_loss',verbose=True)\ntrainer = pl.Trainer(gpus=-1,max_epochs=configs.EPOCHS,callbacks=[early_stop_callback])\n#--uncomment below lines to train\n#trainer.fit(model, datamodule=data_module)\n#trainer.save_checkpoint(\"two_data_pretrains_dense.ckpt\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Test data- Inference"},{"metadata":{},"cell_type":"markdown","source":"Used pretrained models from another notebook for 7 epoch and 0.001 learning rate. "},{"metadata":{"trusted":true},"cell_type":"code","source":"test = pd.read_csv(configs.TEST_CSV)\ntest_ids = test[\"StudyInstanceUID\"].values\ntest_dataset = ImageDataset(image_dir=\"../input/ranzcr-clip-catheter-line-classification/test\",\n                                    image_ids=test_ids,\n                                    transform=val_transform)\ntest_loader = DataLoader(test_dataset,\n                        batch_size=64,\n                        shuffle=False,\n                        num_workers=4)\n\ndevice = torch.device(\"cuda\")\nmodel = SipModule.load_from_checkpoint(\"../input/ranzcr-trained/two_data_pretrains_dense.ckpt\",arch=\"DenseNet\",num_classes=11)\nmodel.to(device)\nmodel.eval()\nmodel.freeze()\nsub = []\nwith torch.no_grad():\n    for data in tqdm(test_loader):\n        data = data[\"image\"].to(device)\n        out = model(data)\n        sub.extend(out.cpu().detach().numpy())\nlabels = pd.DataFrame(data=sub,columns=test.columns[1:]) \nsubmit = pd.concat([test.iloc[:,0],labels],axis=1)\nsubmit.to_csv(\"submission.csv\",index=False)\nsubmit.head()","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}