{"cells":[{"metadata":{"id":"hcF8LRgOrb93"},"cell_type":"markdown","source":"#Project\nStudents: Hamza Shafi 201654120, Anas Hashem 201624760"},{"metadata":{"trusted":true},"cell_type":"code","source":"!mkdir -p /tmp/pip/cache/\n!cp ../input/resources-for-google-landmark-recognition-2020/efficientnet_pytorch-0.6.3-py3-none-any.whl /tmp/pip/cache/\n!pip install --no-index --find-links /tmp/pip/cache/ efficientnet_pytorch","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"tez_path = '../input/tez-lib/'\nimport sys\nsys.path.append(tez_path)","execution_count":null,"outputs":[]},{"metadata":{"id":"hsfFLO1zRP5w","trusted":true},"cell_type":"code","source":"import os\nimport albumentations\nimport pandas as pd\nimport numpy as np\n\n\nimport tez\nfrom tez.datasets import ImageDataset\nfrom tez.callbacks import EarlyStopping\n\nimport torch\nimport torch.nn as nn\nfrom torch.nn import functional as F\n\nfrom efficientnet_pytorch import EfficientNet\nfrom sklearn import metrics, model_selection, preprocessing","execution_count":null,"outputs":[]},{"metadata":{"id":"6EvkjaNEYPgj","trusted":true},"cell_type":"code","source":"class LeafModel(tez.Model):\n    def __init__(self, num_classes):\n        super().__init__()\n\n        self.effnet = EfficientNet.from_pretrained(\"efficientnet-b4\")\n        self.dropout = nn.Dropout(0.1)\n        self.out = nn.Linear(1792, num_classes)\n        self.step_scheduler_after = \"epoch\"\n        \n    def monitor_metrics(self, outputs, targets):\n        if targets is None:\n            return {}\n        outputs = torch.argmax(outputs, dim=1).cpu().detach().numpy()\n        targets = targets.cpu().detach().numpy()\n        accuracy = metrics.accuracy_score(targets, outputs)\n        return {\"accuracy\": accuracy}\n    \n    def fetch_optimizer(self):\n        opt = torch.optim.Adam(self.parameters(), lr=3e-4)\n        return opt\n    \n    def fetch_scheduler(self):\n        sch = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(\n            self.optimizer, T_0=10, T_mult=1, eta_min=1e-6, last_epoch=-1\n        )\n        return sch\n\n    def forward(self, image, targets=None):\n        batch_size, _, _, _ = image.shape\n\n        x = self.effnet.extract_features(image)\n        x = F.adaptive_avg_pool2d(x, 1).reshape(batch_size, -1)\n        outputs = self.out(self.dropout(x))\n        \n        if targets is not None:\n            loss = nn.CrossEntropyLoss()(outputs, targets)\n            metrics = self.monitor_metrics(outputs, targets)\n            return outputs, loss, metrics\n        return outputs, None, None","execution_count":null,"outputs":[]},{"metadata":{"id":"pW_IBYBdQXjh"},"cell_type":"markdown","source":"###Data preprocessing and Configurations"},{"metadata":{"id":"37ntGuOdXgJc","trusted":true},"cell_type":"code","source":"# Source: https://www.kaggle.com/khyeh0719/pytorch-efficientnet-baseline-train-amp-aug\n\ntrain_aug = albumentations.Compose([\n            albumentations.RandomResizedCrop(256, 256),\n            albumentations.Transpose(p=0.5),\n            albumentations.HorizontalFlip(p=0.5),\n            albumentations.VerticalFlip(p=0.5),\n            albumentations.ShiftScaleRotate(p=0.5),\n            albumentations.HueSaturationValue(\n                hue_shift_limit=0.2, \n                sat_shift_limit=0.2, \n                val_shift_limit=0.2, \n                p=0.5\n            ),\n            albumentations.RandomBrightnessContrast(\n                brightness_limit=(-0.1,0.1), \n                contrast_limit=(-0.1, 0.1), \n                p=0.5\n            ),\n            albumentations.Normalize(\n                mean=[0.485, 0.456, 0.406], \n                std=[0.229, 0.224, 0.225], \n                max_pixel_value=255.0, \n                p=1.0\n            ),\n            albumentations.CoarseDropout(p=0.5),\n            albumentations.Cutout(p=0.5)], p=1.)\n  \n        \nvalid_aug = albumentations.Compose([\n            albumentations.CenterCrop(256, 256, p=1.),\n            albumentations.Resize(256, 256),\n            albumentations.Normalize(\n                mean=[0.485, 0.456, 0.406], \n                std=[0.229, 0.224, 0.225], \n                max_pixel_value=255.0, \n                p=1.0\n            )], p=1.)","execution_count":null,"outputs":[]},{"metadata":{"id":"P1yk0Q3IetLt","trusted":true},"cell_type":"code","source":"dfx = pd.read_csv('../input/cassava-leaf-disease-classification/train.csv')\ndf_train, df_valid = model_selection.train_test_split(\n        dfx, test_size=0.1, random_state=42, stratify=dfx.label.values\n)\n\ndf_train = df_train.reset_index(drop=True)\ndf_valid = df_valid.reset_index(drop=True)\n\nimage_path = '../input/cassava-leaf-disease-classification/train_images'\ntrain_image_paths = [os.path.join(image_path, x) for x in df_train.image_id.values]\nvalid_image_paths = [os.path.join(image_path, x) for x in df_valid.image_id.values]\ntrain_targets = df_train.label.values\nvalid_targets = df_valid.label.values\n\ntrain_dataset = ImageDataset(\n    image_paths=train_image_paths,\n    targets=train_targets,\n    resize=None,\n    augmentations=train_aug,\n)\n\nvalid_dataset = ImageDataset(\n    image_paths=valid_image_paths,\n    targets=valid_targets,\n    resize=None,\n    augmentations=valid_aug,\n)\n","execution_count":null,"outputs":[]},{"metadata":{"id":"IBa6kNaZb9v4","outputId":"4eb0b6f6-4b0b-472e-d7eb-b35f04c2bdb9","trusted":true},"cell_type":"code","source":"model = LeafModel(num_classes=dfx.label.nunique())\nes = EarlyStopping(\n    monitor=\"valid_loss\", model_path=\"model.bin\", patience=3, mode=\"min\"\n)\nmodel.fit(\n    train_dataset,\n    valid_dataset=valid_dataset,\n    train_bs=16,\n    valid_bs=32,\n    device=\"cuda\",\n    epochs=5,\n    callbacks=[es],\n    fp16=True,\n)\nmodel.save(\"model.bin\")\n# model.load('model.bin', device='cuda')","execution_count":null,"outputs":[]},{"metadata":{"id":"nge79FcSYWeZ"},"cell_type":"markdown","source":"##CNN Training"},{"metadata":{"id":"WwjLmF8RBkHF","trusted":true},"cell_type":"code","source":"df_test = pd.read_csv('../input/cassava-leaf-disease-classification/sample_submission.csv')\ntest_path = \"../input/cassava-leaf-disease-classification/test_images/\"\ntest_image_paths = [os.path.join(test_path, x) for x in df_test.image_id.values]\ntest_targets = df_test.label.values\n\ntest_dataset = ImageDataset(\n    image_paths=test_image_paths,\n    targets=test_targets,\n    resize=None,\n    augmentations=valid_aug,\n)\n\npreds = model.predict(test_dataset, batch_size=32, n_jobs=-1, device=\"cuda\")","execution_count":null,"outputs":[]},{"metadata":{"id":"zjY_6sE_VmrF","outputId":"c668c839-3fb8-422d-9ac6-32d8bbeaae81","trusted":true},"cell_type":"code","source":"final_preds = None\nfor p in preds:\n    if final_preds is None:\n        final_preds = p\n    else:\n        final_preds = np.vstack((final_preds, p))\nfinal_preds = final_preds.argmax(axis=1)\ndf_test.label = final_preds\ndf_test.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}