{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import sys\nsys.path.append('../input/timmdataset/pytorch-image-models-master')\nimport timm","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport torch\nimport torch.nn as nn\nimport torchvision.transforms as transforms\nfrom torch.autograd import Variable\nfrom PIL import Image\nimport matplotlib.pyplot as plt\nimport torchvision\nfrom tqdm import tqdm\nimport cv2\nfrom skimage import io\nimport time\n\nfrom albumentations import (\n    HorizontalFlip, VerticalFlip, IAAPerspective, ShiftScaleRotate, CLAHE, RandomRotate90, RandomCrop,\n    Transpose, ShiftScaleRotate, Blur, OpticalDistortion, GridDistortion, HueSaturationValue,\n    IAAAdditiveGaussianNoise, GaussNoise, MotionBlur, MedianBlur, IAAPiecewiseAffine, RandomResizedCrop,\n    IAASharpen, IAAEmboss, RandomBrightnessContrast, Flip, OneOf, Compose, Normalize, Cutout, CoarseDropout, ShiftScaleRotate, CenterCrop, Resize\n)\n\nfrom albumentations.pytorch import ToTensorV2\nfrom sklearn.metrics import accuracy_score\n\nfrom sklearn.model_selection import GroupKFold, StratifiedKFold\nimport tqdm.notebook as tq\nfrom sklearn.model_selection import train_test_split\nfrom scipy.special import softmax","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"CFG = {\n    'img_size': 512,\n    'vit_img': 384,\n    'tta': 3,\n    'valid_bs': 48,\n    'device': 'cuda' if torch.cuda.is_available() else 'cpu',\n    'effnet_model_b3' : ['tf_efficientnet_b3_ns_model_2.pth','tf_efficientnet_b3_ns_model_5.pth','tf_efficientnet_b3_ns_model_4.pth','tf_efficientnet_b3_ns_model_1.pth','tf_efficientnet_b3_ns_model_3.pth'],\n    'effnet_model_b4' : ['tf_efficientnet_b4_ns_model_3.pth','tf_efficientnet_b4_ns_model_5.pth','tf_efficientnet_b4_ns_model_2.pth','tf_efficientnet_b4_ns_model_1.pth','tf_efficientnet_b4_ns_model_4.pth'],\n    'resnet_models' : ['resnet50d_model_1.pth','resnet50d_model_4.pth','resnet50d_model_3.pth','resnet50d_model_2.pth','resnet50d_model_5.pth'],\n    'resnext_models' : ['resnext50d_32x4d_model_5.pth','resnext50d_32x4d_model_3.pth','resnext50d_32x4d_model_1.pth','resnext50d_32x4d_model_2.pth','resnext50d_32x4d_model_4.pth'],\n    'resnext101_models' : ['ig_resnext101_32x8d_model_1.pth','ig_resnext101_32x8d_model_2.pth','ig_resnext101_32x8d_model_3.pth','ig_resnext101_32x8d_model_4.pth','ig_resnext101_32x8d_model_5.pth'],\n    'vit_models' : ['vit_base_patch16_384_model_2.pth','vit_base_patch16_384_model_5.pth','vit_base_patch16_384_model_1.pth','vit_base_patch16_384_model_3.pth','vit_base_patch16_384_model_4.pth']\n}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class DiseaseDatasetInference(torch.utils.data.Dataset):\n\n    def __init__ (self, df, transform=None, opt_label=True):\n        self.df = df.reset_index(drop=True).copy()\n        self.transform = transform\n        self.opt_label = opt_label\n\n        if self.opt_label:\n            self.data = [(row['image_id'], row['label']) for _, row in self.df.iterrows()]\n\n        else:\n            self.data = [(row['image_id']) for _, row in self.df.iterrows()]\n\n        self.data = np.asarray(self.data)\n  \n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__ (self, index):\n            # np.random.shuffle(self.data)\n        if self.opt_label:\n            image_path, label = self.data[index]    \n        else:\n            image_path = self.data[index]\n\n        image = cv2.imread(image_path)\n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n\n        if self.transform is not None:\n            image = self.transform(image=image)['image']\n\n        if self.opt_label == True:\n            return (image, int(label))\n\n        else:\n            return image","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_inference_Vit_transforms():\n    return Compose([\n#             RandomCrop(CFG['vit_img'], CFG['vit_img'], p=0.5),\n            CenterCrop(CFG['vit_img'], CFG['vit_img'], p=0.5),\n            Resize(CFG['vit_img'], CFG['vit_img']),\n            Transpose(p=0.5),\n            HorizontalFlip(p=0.5),\n            VerticalFlip(p=0.5),\n            HueSaturationValue(hue_shift_limit=0.2, sat_shift_limit=0.2, val_shift_limit=0.2, p=0.5),\n            RandomBrightnessContrast(brightness_limit=(-0.1,0.1), contrast_limit=(-0.1, 0.1), p=0.5),\n            Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225], max_pixel_value=255.0, p=1.0),\n            ToTensorV2(p=1.0),\n            \n        ], p=1.)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_inference_transforms():\n    return Compose([\n#             RandomCrop(CFG['img_size'], CFG['img_size'], p=0.5),\n            CenterCrop(CFG['img_size'], CFG['img_size'], p=0.5),\n            Resize(CFG['img_size'], CFG['img_size']),\n            Transpose(p=0.5),\n            HorizontalFlip(p=0.5),\n            VerticalFlip(p=0.5),\n            HueSaturationValue(hue_shift_limit=0.2, sat_shift_limit=0.2, val_shift_limit=0.2, p=0.5),\n            RandomBrightnessContrast(brightness_limit=(-0.1,0.1), contrast_limit=(-0.1, 0.1), p=0.5),\n            Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225], max_pixel_value=255.0, p=1.0),\n            ToTensorV2(p=1.0),\n            \n        ], p=1.)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.read_csv('/kaggle/input/cassava-leaf-disease-classification/sample_submission.csv')\nPATH = '/kaggle/input/cassava-leaf-disease-classification/test_images/'","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"test_csv = df.copy()\ntest_csv['image_id'] = PATH + test_csv['image_id']\n\ntest_ds = DiseaseDatasetInference(test_csv, transform=get_inference_transforms(), opt_label=False)\ntest_ds_vit = DiseaseDatasetInference(test_csv, transform=get_inference_Vit_transforms(), opt_label=False)\n\ntest_loader = torch.utils.data.DataLoader(test_ds, batch_size=CFG['valid_bs'], shuffle=False, pin_memory=False) \ntest_loader_vit = torch.utils.data.DataLoader(test_ds_vit, batch_size=CFG['valid_bs'], shuffle=False, pin_memory=False) ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def inference (model, data_loader, device):\n    preds = []\n    model.eval()\n    test_tqdm = tq.tqdm(data_loader, total=len(data_loader), desc=\"Testing\", position=0, leave=True)\n    for images in test_tqdm:\n        images = images.to(device)\n        preds.extend(model(images).detach().cpu().numpy())\n    return preds","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# **EfficientNet**"},{"metadata":{"trusted":true},"cell_type":"code","source":"class Effnet(nn.Module):\n    def __init__(self, model_name = 'tf_efficientnet_b3_ns', pretrained = False):\n        super().__init__()\n        self.model = timm.create_model(model_name, pretrained = pretrained)\n        n_features = self.model.classifier.in_features\n        self.model.classifier = nn.Linear(n_features, 5)\n        \n    def forward(self, x):\n        x = self.model(x)\n        return x","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# EfficientNet B3"},{"metadata":{"trusted":true},"cell_type":"code","source":"path_effnet = '../input/torch-my-cassava-effnetb3/'\n\nmodel_name = 'tf_efficientnet_b3_ns'\neffnet_preds = []\neffnet_model = Effnet(model_name = model_name)\nfor effnet_model_name in CFG['effnet_model_b3']:\n    print(\"Model: \", effnet_model_name)\n    effnet_model.to(CFG['device'])\n    effnet_model.load_state_dict(torch.load(path_effnet+effnet_model_name, map_location=torch.device(CFG['device'])))\n    with torch.no_grad():\n        for i in range(CFG['tta']):\n            effnet_preds += [inference(effnet_model, test_loader, CFG['device'])]\neffnet_preds = np.mean(effnet_preds, axis=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"effnet_outcomes_b3 = pd.concat([df['image_id'], pd.DataFrame(effnet_preds)], axis=1).sort_values(['image_id'])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# EfficientNet B4"},{"metadata":{"trusted":true},"cell_type":"code","source":"# path_effnet = '../input/torch-my-cassava-effnetb4/'\n\n\n# model_name = 'tf_efficientnet_b4_ns'\n# effnet_preds = []\n# effnet_model = Effnet(model_name = model_name)\n# for effnet_model_name in CFG['effnet_model_b4']:\n#     print(\"Model: \", effnet_model_name)\n#     effnet_model.to(CFG['device'])\n#     effnet_model.load_state_dict(torch.load(path_effnet+effnet_model_name, map_location=torch.device(CFG['device'])))\n#     with torch.no_grad():\n#         for i in range(CFG['tta']):\n#             effnet_preds += [inference(effnet_model, test_loader, CFG['device'])]\n# effnet_preds = np.mean(effnet_preds, axis=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# effnet_outcomes_b4 = pd.concat([df['image_id'], pd.DataFrame(effnet_preds)], axis=1).sort_values(['image_id'])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# **ResNet**"},{"metadata":{"trusted":true},"cell_type":"code","source":"class CustomResNet(nn.Module):\n    def __init__(self, model_name='resnext50_32x4d', pretrained=False):\n        super().__init__()\n        self.model = timm.create_model(model_name, pretrained=pretrained)\n        n_features = self.model.fc.in_features\n        self.model.fc = nn.Linear(n_features, 5)\n\n    def forward(self, x):\n        x = self.model(x)\n        return x","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# ResNet50d"},{"metadata":{"trusted":true},"cell_type":"code","source":"# resnet_preds = []\n# path_resnet = '../input/torch-my-cassava-resnet50d/'\n\n# model_name = 'resnet50d'\n\n# resnet_model = CustomResNet(model_name = model_name)\n# resnet_model.to(CFG['device'])\n# for resnet_model_name in CFG['resnet_models']:\n#     print(\"Model: \", resnet_model_name)\n#     resnet_model.load_state_dict(torch.load(path_resnet + resnet_model_name, \n#                                              map_location=torch.device(CFG['device'])))\n#     with torch.no_grad():\n#         for i in range(CFG['tta']):\n#             resnet_preds += [inference(resnet_model, test_loader, CFG['device'])]\n# resnet_preds = np.mean(resnet_preds, axis=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# resnet_outcomes = pd.concat([df['image_id'], pd.DataFrame(resnet_preds)], axis=1).sort_values(['image_id'])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# ResNext50d"},{"metadata":{"trusted":true},"cell_type":"code","source":"resnet_preds = []\npath_resnet = '../input/torch-my-cassava-resnext50d/'\n\nmodel_name = 'resnext50d_32x4d'\n\nresnet_model = CustomResNet(model_name = model_name)\nresnet_model.to(CFG['device'])\nfor resnet_model_name in CFG['resnext_models']:\n    print(\"Model: \", resnet_model_name)\n    resnet_model.load_state_dict(torch.load(path_resnet + resnet_model_name, \n                                             map_location=torch.device(CFG['device'])))\n    with torch.no_grad():\n        for i in range(CFG['tta']):\n            resnet_preds += [inference(resnet_model, test_loader, CFG['device'])]\nresnet_preds = np.mean(resnet_preds, axis=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"resnext_outcomes = pd.concat([df['image_id'], pd.DataFrame(resnet_preds)], axis=1).sort_values(['image_id'])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# ResNext 101"},{"metadata":{"trusted":true},"cell_type":"code","source":"# resnet_preds = []\n# path_resnet = '../input/torch-my-cassava-resnext101/'\n\n# model_name = 'ig_resnext101_32x8d'\n\n# resnet_model = CustomResNet(model_name = model_name)\n# resnet_model.to(CFG['device'])\n# for resnet_model_name in CFG['resnext101_models']:\n#     print(\"Model: \", resnet_model_name)\n#     resnet_model.load_state_dict(torch.load(path_resnet + resnet_model_name, \n#                                              map_location=torch.device(CFG['device'])))\n#     with torch.no_grad():\n#         for i in range(CFG['tta']):\n#             resnet_preds += [inference(resnet_model, test_loader, CFG['device'])]\n# resnet_preds = np.mean(resnet_preds, axis=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"# resnext_outcomes = pd.concat([df['image_id'], pd.DataFrame(resnet_preds)], axis=1).sort_values(['image_id'])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# ViT"},{"metadata":{"trusted":true},"cell_type":"code","source":"class ViTClassifier(nn.Module):\n    def __init__(self, model_name = 'vit_base_patch16_384', pretrained=False):\n        super().__init__()\n        self.model = timm.create_model(model_name, pretrained=pretrained)\n        n_features = self.model.head.in_features\n        self.model.head = nn.Linear(n_features, 5)\n\n    def forward(self, x):\n        x = self.model(x)\n        return x","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"path_vit = '../input/torch-my-cassava-vit-16-384/'\n\n\nmodel_name = 'vit_base_patch16_384'\nvit_preds = []\nvit_model = ViTClassifier(model_name = model_name)\nfor vit_model_name in CFG['vit_models']:\n    print(\"Model: \", vit_model_name)\n    vit_model.to(CFG['device'])\n    vit_model.load_state_dict(torch.load(path_vit+vit_model_name, map_location=torch.device(CFG['device'])))\n    with torch.no_grad():\n        for i in range(CFG['tta']):\n            vit_preds += [inference(vit_model, test_loader_vit, CFG['device'])]\nvit_preds = np.mean(vit_preds, axis=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"vit_outcomes = pd.concat([df['image_id'], pd.DataFrame(vit_preds)], axis=1).sort_values(['image_id'])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Ensemble"},{"metadata":{"trusted":true},"cell_type":"code","source":"# final_preds = (effnet_outcomes_b3.drop('image_id', axis=1) * 0.25 + effnet_outcomes_b4.drop('image_id', axis=1) * 0.25 + resnet_outcomes.drop('image_id', axis=1) * 0.25 + resnext_outcomes.drop('image_id', axis=1) * 0.25).to_numpy()\nfinal_preds = (resnext_outcomes.drop('image_id', axis=1) * 0.4 + vit_outcomes.drop('image_id', axis=1) * 0.3 + effnet_outcomes_b3.drop('image_id', axis=1) * 0.3).to_numpy()\n# final_preds = (resnext_outcomes.drop('image_id', axis=1) * 0.5 + effnet_outcomes_b3.drop('image_id', axis=1) * 0.5).to_numpy()\nfinal_preds = softmax(final_preds).argmax(1)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submit = pd.DataFrame({'image_id': df['image_id'].values, 'label': final_preds})\nsubmit.to_csv('submission.csv', index=False)","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}