{"cells":[{"metadata":{},"cell_type":"markdown","source":"## This Notebook is inspired by this Kernel : \n\n- https://www.kaggle.com/alincijov/ranzcr-resnet200d-seresnet152d-inference \n\nThe wieghts were imported from : \n- https://www.kaggle.com/ammarali32/resnet200d-public for (Resnet200d) \n- https://www.kaggle.com/ammarali32/seresnet152d-cv9615 for (Seresnet152d) \n\n- https://www.kaggle.com/yasufuminakama/pytorch-image-models (for Timm Libraries )\n\nThanks for all those persons"},{"metadata":{},"cell_type":"markdown","source":"## Import the libraries "},{"metadata":{"trusted":true},"cell_type":"code","source":"#!pip install timm \nimport sys \nsys.path.append('../input/pytorch-images-seresnet')\nsys.path.append('../input/pytorch-image-models/pytorch-image-models-master')\n","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import os \nfrom tqdm.notebook import tqdm  \n\nimport numpy as np \nimport pandas as pd \nimport seaborn as sns \nimport matplotlib.pyplot as plt \n\nfrom sklearn import model_selection \nfrom sklearn import preprocessing \nfrom sklearn import metrics \nimport torch \nfrom torch.utils.data import Dataset, DataLoader \nfrom torch.nn.parameter import Parameter \nimport torch.nn as nn \nimport torchvision\nfrom torchvision import models\nimport albumentations \nfrom albumentations import * \nfrom albumentations.pytorch import ToTensorV2 \n\nimport timm \nfrom torch.cuda.amp import autocast, GradScaler \n\nfrom PIL import Image, ImageFile\nimport cv2\n\ndevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Path for Models "},{"metadata":{},"cell_type":"markdown","source":"## Define Paths for pretrained models "},{"metadata":{"trusted":true},"cell_type":"code","source":"Resnet_model_path = '../input/resnet200d-public/resnet200d_320_CV9632.pth'\nSeresnet_model_path = '../input/seresnet152d-cv9615/seresnet152d_320_CV96.15.pth'\nResnet50_32_4D_path = '../input/pretrained-resnext50-32x4d/resnext50_32x4d-7cdf4587.pth'\nEffnet_B5 = '../input/efficientnet-pytorch/efficientnet-b5-586e6cc6.pth'\nTEST_PATH = '../input/ranzcr-clip-catheter-line-classification/test/'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"os.listdir('../input/ranzcr-clip-catheter-line-classification/train_tfrecords//')[:10]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"DIR = '../input/ranzcr-clip-catheter-line-classification'\ntrain_dir = os.path.join(DIR,'train.csv')\ntest_dir = os.path.join(DIR, 'sample_submission.csv')","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Read files "},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = pd.read_csv(train_dir)\ntest_df = pd.read_csv(test_dir)\ntrain_df.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Quick EDA"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df[(train_df['ETT - Normal'] == 1) & (train_df['NGT - Normal'] == 1) & (train_df['CVC - Normal'] == 1)].sum()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.isnull().sum()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Create target columns ****"},{"metadata":{"trusted":true},"cell_type":"code","source":"target_columns = []\n[target_columns.append(x) for x in test_df.columns if x not in ['StudyInstanceUID','PatientID']]\ntarget_columns","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Simple EDA "},{"metadata":{},"cell_type":"markdown","source":"### We see that the data is skewed ****"},{"metadata":{"trusted":true},"cell_type":"code","source":"for c in range(len(target_columns)):\n    plt.figure()\n    train_df[target_columns[c]].hist()\n    plt.title(target_columns[c])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df['PatientID'].unique().shape[0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_annotate = pd.read_csv('../input/ranzcr-clip-catheter-line-classification/train_annotations.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_annotate.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df_annotate.label.value_counts()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Just checking if the first image is on test or on sample_submission csv "},{"metadata":{"trusted":true},"cell_type":"code","source":"if (\"1.2.826.0.1.3680043.8.498.10003659706701445041816900371598078663\" in test_df.StudyInstanceUID.values) : \n    print (\"True\")\nelse : \n    print('False')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"output_dir = './'\nif not os.path.exists(output_dir): \n    os.makedirs(output_dir)\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"IMAGE_SIZE = 640 \nBATCH_SIZE = 32 ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class TestDataset(Dataset): \n    def __init__(self,df,resize=None,transform=None): \n        self.df = df \n        self.file_name = df['StudyInstanceUID'].values \n        self.transform = transform\n        self.resize = resize \n        \n    def __len__(self): \n        return len(self.df)\n    \n    def __getitem__(self,idx): \n        file_name = self.file_name[idx] \n        file_path = f'{TEST_PATH}/{file_name}.jpg' \n        image = cv2.imread(file_path)\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        \n        if self.resize is not None : \n            image.resize = [\n                self.resize[1],\n                self.resize[0]\n            ]\n        \n        if self.transform is not None: \n            augmented = self.transform(image=image)\n            image = augmented['image']\n        return image \n        ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_transforms():\n        return Compose([\n            Resize(IMAGE_SIZE, IMAGE_SIZE),\n            Normalize(\n            mean = [0.485, 0.456, 0.406], \n            std = [0.229, 0.224, 0.225],\n            ),\n            ToTensorV2(),\n        ])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_aug = Compose([\n        Resize(IMAGE_SIZE,IMAGE_SIZE),\n        Normalize (\n            mean = [0.485, 0.456, 0.406], \n            std = [0.229, 0.224, 0.225],\n        ), \n        ToTensorV2(),\n    ])\n    \n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Resnet Model "},{"metadata":{"trusted":true},"cell_type":"code","source":"#m1 = timm.create_model(model_name='resnet200d_320',pretrained=False)\n#timm.list_models()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class Resnet200D(nn.Module) : \n    def __init__(self, model_name='resnet200d_320'):\n        super().__init__()\n        self.model = timm.create_model(model_name, pretrained=False)\n        n_features = self.model.fc.in_features\n        self.model.global_pool = nn.Identity()\n        self.model.fc = nn.Identity()\n        self.pooling = nn.AdaptiveAvgPool2d(1)\n        self.fc = nn.Linear(n_features, 11)\n\n    def forward(self, x):\n        bs = x.size(0)\n        features = self.model(x)\n        pooled_features = self.pooling(features).view(bs, -1)\n        output = self.fc(pooled_features)\n        return output","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#m2 = timm.create_model('seresnet152d')\n#m2","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class SeResnet152D(nn.Module): \n    def __init__(self, model_name='seresnet152d_320'):\n        super().__init__()\n        self.model = timm.create_model(model_name, pretrained=False)\n        n_features = self.model.fc.in_features\n        self.model.global_pool = nn.Identity()\n        self.model.fc = nn.Identity()\n        self.pooling = nn.AdaptiveAvgPool2d(1)\n        self.fc = nn.Linear(n_features, 11)\n\n    def forward(self, x):\n        bs = x.size(0)\n        features = self.model(x)\n        pooled_features = self.pooling(features).view(bs, -1)\n        output = self.fc(pooled_features)\n        return output\n        ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#m3 = timm.create_model('resnext50_32x4d')\n#m3","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class Resnet5032(nn.Module): \n    def __init__(self,model_name = 'resnext50_32x4d'): \n        super().__init__()\n        self.model = timm.create_model(model_name,pretrained=False)\n        n_features = self.model.fc.in_features\n        self.model.global_pool = nn.Identity()\n        self.model.fc = nn.Identity()\n        self.pooling = nn.AdaptiveAvgPool2d(1)\n        self.fc = nn.Linear(n_features,11)\n    def forward(self,x): \n        bs = x.size(0)\n        features = self.model(x)\n        pooled_features = self.pooling(features).view(bs,-1)\n        output = self.fc(pooled_features)\n        return output ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class EffB5(nn.Module): \n    def __init__(self,model_name = 'efficientnet_b5'): \n        super().__init__()\n        self.model = timm.create_model(model_name,pretrained=False)\n        n_features = self.model.classifier.in_features\n        self.model.global_pool = nn.Identity()\n        self.model.classifier = nn.Identity()\n        self.pooling = nn.AdaptiveAvgPool2d(1)\n        self.fc = nn.Linear(n_features,11)\n    def forward(self,x): \n        bs = x.size(0)\n        features = self.model(x)\n        pooled_features = self.pooling(features).view(bs,-1)\n        output = self.fc(pooled_features)\n        return output ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#EfficientNet = EffB5()\n#EfficientNet.load_state_dict(torch.load(Effnet_B5))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Load Pretrained models weights "},{"metadata":{"trusted":true},"cell_type":"code","source":"seresnet_model = SeResnet152D()\nseresnet_model.load_state_dict(torch.load(Seresnet_model_path)['model'])\nseresnet_model.eval()\nseresnet_model.to(device)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"resnet_model = Resnet200D()\nresnet_model.load_state_dict(torch.load(Resnet_model_path)['model'])\nresnet_model.eval() \nresnet_model.to(device)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"\n#resnext5032.load_state_dict(torch.load(Resnet50_32_4D_path))\n#weightss= torch.load(Resnet50_32_4D_path)\n#resnext5032 = Resnet5032() \n#resnext5032.load_state_dict(weightss)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Merge Models into list "},{"metadata":{"trusted":true},"cell_type":"code","source":"models = [resnet_model,seresnet_model]","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Inference function "},{"metadata":{"trusted":true},"cell_type":"code","source":"def inference(models, test_loader, device): \n    probs = []\n    for i, (images) in tqdm(enumerate(test_loader),total= len(test_loader)) : \n        images = images.to(device)\n        avg_preds = []\n        for model in models : \n            with torch.no_grad():\n                y_preds1 = model(images)\n                y_preds2 = model(images.flip(-1))\n            y_preds = (y_preds1.sigmoid().to('cpu').numpy() + y_preds2.sigmoid().to('cpu').numpy()) / 2 \n            avg_preds.append(y_preds)\n        avg_preds = np.mean(avg_preds,axis=0)\n        probs.append(avg_preds)\n    probs = np.concatenate(probs)\n    return probs\n            ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"resnet_model","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test_dataset = TestDataset(test_df, transform=test_aug)\ntest_loader = DataLoader(test_dataset, batch_size=32, shuffle=False, \n                         num_workers=4 , pin_memory=True)\nmodel200D = []\nmodel200D.append(resnet_model)\nmodel152D = []\nmodel152D.append(seresnet_model)\nprediction200D = inference(model200D, test_loader, device)\nprediction152D = inference(model152D, test_loader, device)\npredictions = (2 * prediction200D + prediction152D) / 3.0\n#predictions200d = inference(models200D, test_loader, device)\n#predictions152d = inference(models152D, test_loader, device)\n#predictions = (2 * predictions200d + predictions152d) / 3.0","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"target_cols = test_df.iloc[:, 1:12].columns.tolist()\ntest_df[target_cols] = predictions\ntest_df[['StudyInstanceUID'] + target_cols].to_csv('submission.csv', index=False)\ntest_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","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}