{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# Put testing data in data loader, wrap data loader in tqdm for loop, evaluate each batch and save\n# predictions in an array. Copy array to a dataframe that has testing photo IDs. Save to submission.csv\npackage_paths = [\n    '../input/pytorch-image-models/pytorch-image-models-master' #'../input/efficientnet-pytorch-07/efficientnet_pytorch-0.7.0'\n]\nimport sys; \n\nfor pth in package_paths:\n    sys.path.append(pth)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"'''\nIMPORTS\n'''\n\nimport cv2\nimport torch\nimport os\nfrom torch import nn\nfrom datetime import datetime\nimport time\nimport random\nimport torchvision\nfrom torchvision import transforms\nimport pandas as pd\nimport numpy as np\nfrom tqdm import tqdm\n\n\nimport matplotlib.pyplot as plt\nfrom torch.utils.data import Dataset, DataLoader\nfrom torch.utils.data import SequentialSampler, RandomSampler, WeightedRandomSampler\nfrom torch.cuda.amp import autocast, GradScaler\nimport torch.nn.functional as F\n\nimport timm\n\nimport sklearn\nfrom sklearn.metrics import roc_auc_score, log_loss\nfrom sklearn import metrics\nfrom sklearn.model_selection import GroupKFold, StratifiedKFold","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"submission = pd.read_csv('../input/cassava-leaf-disease-classification/sample_submission.csv')\nsubmission.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"'''\nCONFIGURATION\n'''\n\nconfig = {\n    'seed': 419,\n    'img_size': 512,\n    'tta':3,\n    'num_folds': 5,\n    'num_classes':5,\n    \n    # input_size = 3, 380, 380. pool_size = 12, 12.\n    # DOC: https://github.com/rwightman/pytorch-image-models/blob/master/timm/models/efficientnet.py\n    'model_arch':'tf_efficientnet_b4_ns',    \n    \n    'train_bs':16,\n    'valid_bs':32,\n    'test_bs': 4,\n    'num_workers': 1,\n    'epochs':10,\n    'device':'cuda:0',\n    \n    'T1':0.2,\n    'T2':1.0,\n    'label_smooth': 0.2,\n    \n    'lr':1e-4,\n    'min_lr':1e-6,\n    'T_0': 10,\n    'weight_decay':1e-6,\n    'ep_patience':4,\n    'factor':0.2,\n    'num_workers':2,\n    #'accum_iter':2,\n    'update_on_batch':True,\n    'use_wrs':False\n}","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"'''\nHELPER FUNCTIONS\n'''\n\ndef seed_everything(seed):\n    random.seed(seed)\n    os.environ['PYTHONHASHSEED'] = str(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.backends.cudnn.deterministic = True\n    torch.backends.cudnn.benchmark = True\n    \ndef get_img(path):\n    im_bgr = cv2.imread(path)\n    #if not im_bgr:\n    #    return np.zeros([config['img_size'], config['img_size'], 3])\n    #im_rgb = cv2.cvtColor(im_bgr, cv2.COLOR_BGR2RGB)\n    im_rgb = im_bgr[:, :, ::-1]\n    \n    return im_rgb\n\nfrom albumentations import (\n    ShiftScaleRotate, Normalize, Compose, CenterCrop, Resize, HorizontalFlip,\n    VerticalFlip, Transpose, RandomResizedCrop, HueSaturationValue, RandomBrightnessContrast,\n    CoarseDropout, Cutout\n)\n\nfrom albumentations.pytorch import ToTensorV2\n\ndef get_infer_transforms():\n    return Compose([\n                CenterCrop(config['img_size'], config['img_size'], p=1.0),\n                Resize(config['img_size'], config['img_size']),\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        ], p=1.0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"'''\nDATASET\n'''\n\nclass LeafDataset(Dataset):\n    def __init__(self, df, img_dir, transforms=None, include_labels=True):\n        super().__init__()\n        self.df = df     #.reset_index(drop=True).copy()\n        self.img_dir = img_dir\n        self.transforms = transforms\n        self.include_labels = include_labels\n        \n        if include_labels:\n            self.labels = self.df['label'].values\n        \n    def __len__(self):\n        return len(self.df)\n    \n    def __getitem__(self, index: int):\n        img = get_img(\"{}/{}\".format(self.img_dir, self.df.loc[index]['image_id']))\n        if self.transforms:\n            img = self.transforms(image=img)['image']\n        \n        if self.include_labels:\n            label = self.labels[index]\n            return img, label\n        else:\n            return img;","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"'''\nMODEL\n'''\n\nclass LeafDiseaseClassifier(nn.Module):\n    def __init__(self, model_arch, num_classes, pretrained=False):\n        super().__init__()\n        self.model = timm.create_model(model_arch, pretrained=pretrained)\n        n_features = self.model.classifier.in_features\n        self.model.classifier = nn.Linear(n_features, num_classes)\n\n    \n    def forward(self, x):\n        x = self.model(x)\n        return x\n        \n    def freeze_batch_norm(self):\n        layers = [mod for mod in self.model.children()]\n        for layer in layers:\n            if isinstance(layer, nn.BatchNorm2d):\n                #print(layer)\n                for param in layer.parameters():\n                    param.requires_grad = False\n                \n            elif isinstance(layer, nn.Sequential):\n                for seq_layers in layer.children():\n                    if isinstance(layer, nn.BatchNorm2d):\n                        #print(layer)\n                        param.requires_grad = False","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"'''\nMAIN\n'''\n\nif __name__ == '__main__':\n    seed_everything(config['seed'])\n    \n    test = pd.DataFrame()\n    test['image_id'] = list(os.listdir('../input/cassava-leaf-disease-classification/test_images/'))\n    test_ds = LeafDataset(test, '../input/cassava-leaf-disease-classification/test_images/', transforms=get_infer_transforms(), include_labels=False)\n    #print(len(test_ds))\n    \n    test_loader = torch.utils.data.DataLoader(\n        test_ds,\n        batch_size=config['test_bs'],\n        num_workers=config['num_workers'],\n        shuffle=False,\n    )\n    \n    device = torch.device(config['device'])\n    model = LeafDiseaseClassifier(config['model_arch'], config['num_classes']).to(device)\n    model.load_state_dict(torch.load('../input/effnet-b4/tf_efficientnet_b4_ns_Fold4_Epoch5_Acc_0.8952.pth'))\n    model.eval()\n    \n    preds = []\n    #print(len(test_loader))\n    pbar = tqdm(enumerate(test_loader), total=len(test_loader))\n    for step, (test_batch) in pbar:\n        test_batch = test_batch.to(device).float()\n        \n        test_preds = model(test_batch)\n        preds += [torch.softmax(test_preds, 1).detach().cpu().numpy()]\n        \n        #if step > 5000:\n        #    break\n        \n    preds = np.concatenate(preds, axis=0)\n    #print(preds)\n    #print(np.argmax(preds, axis=1))\n    #del model\n    #torch.cuda.empty_cache()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"test['label'] = np.argmax(preds, axis=1)\ntest.head()\n\ntest.to_csv('submission.csv', index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"del model\ntorch.cuda.empty_cache()","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}