{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport numpy as np \nimport pandas as pd \nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom sklearn import preprocessing\nfrom sklearn.model_selection import KFold\nimport cv2 as cv\nimport plotly.express as px\nfrom tqdm.notebook import tqdm\n\n\n\n\nimport torch\nimport torchvision.transforms as transforms\nimport torch.optim as optim\nimport torch.nn.functional as F\nimport torch.nn as nn\nfrom torch.utils.data import Dataset, DataLoader\n\nimport albumentations as A\nfrom albumentations.pytorch.transforms import ToTensorV2\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-08-12T17:42:14.572140Z","iopub.execute_input":"2022-08-12T17:42:14.572685Z","iopub.status.idle":"2022-08-12T17:42:23.449134Z","shell.execute_reply.started":"2022-08-12T17:42:14.572487Z","shell.execute_reply":"2022-08-12T17:42:23.447917Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h1><div class=\"alert-info\">1. Show data</div><h1>","metadata":{}},{"cell_type":"code","source":"df = pd.read_csv('../input/paddy-disease-classification/train.csv')\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2022-08-12T17:42:23.452998Z","iopub.execute_input":"2022-08-12T17:42:23.455235Z","iopub.status.idle":"2022-08-12T17:42:23.499209Z","shell.execute_reply.started":"2022-08-12T17:42:23.455193Z","shell.execute_reply":"2022-08-12T17:42:23.497886Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dir = '../input/paddy-disease-classification/train_images/'\ndf['path_jpeg'] = df.apply(lambda row: train_dir + row['label'] + '/' + row['image_id'], axis=1)\ndf.head()","metadata":{"execution":{"iopub.status.busy":"2022-08-12T17:42:23.501028Z","iopub.execute_input":"2022-08-12T17:42:23.501903Z","iopub.status.idle":"2022-08-12T17:42:23.671805Z","shell.execute_reply.started":"2022-08-12T17:42:23.501865Z","shell.execute_reply":"2022-08-12T17:42:23.670609Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.rcParams[\"font.family\"] = 'serif'\nfig, axes = plt.subplots(nrows=3, ncols=4, figsize=(18, 15),\n                        subplot_kw={'xticks': [], 'yticks': []})\n\nfor ax in axes.flat:\n    i = np.random.randint(df.shape[0])\n    ax.imshow(plt.imread(df['path_jpeg'][i]))\n    ax.set_title(df['label'][i],fontsize=16)\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-12T17:42:23.676362Z","iopub.execute_input":"2022-08-12T17:42:23.677614Z","iopub.status.idle":"2022-08-12T17:42:25.228381Z","shell.execute_reply.started":"2022-08-12T17:42:23.677572Z","shell.execute_reply":"2022-08-12T17:42:25.226367Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"le = preprocessing.LabelEncoder()\nle.fit(df['label'])\ninteger_mapping = {i: l for i, l in enumerate(le.classes_)}\ndf['label'] = le.transform(df['label'])","metadata":{"execution":{"iopub.status.busy":"2022-08-12T17:42:25.230404Z","iopub.execute_input":"2022-08-12T17:42:25.231183Z","iopub.status.idle":"2022-08-12T17:42:25.246140Z","shell.execute_reply.started":"2022-08-12T17:42:25.231119Z","shell.execute_reply":"2022-08-12T17:42:25.244699Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"integer_mapping","metadata":{"execution":{"iopub.status.busy":"2022-08-12T17:42:25.248609Z","iopub.execute_input":"2022-08-12T17:42:25.249924Z","iopub.status.idle":"2022-08-12T17:42:25.261771Z","shell.execute_reply.started":"2022-08-12T17:42:25.249826Z","shell.execute_reply":"2022-08-12T17:42:25.260422Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_gr = df.value_counts(['label'])\ndf_gr = df_gr.reset_index()\nx = df_gr['label'].values\ny = df_gr[0].values\nplt.figure(figsize =(14, 7))\nplt.bar(x, y)\nplt.xticks(x, fontsize=14)\nplt.yticks([y.min(), y.max(), y.mean()],fontsize=14)\nplt.grid()\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2022-08-12T17:42:25.264418Z","iopub.execute_input":"2022-08-12T17:42:25.265693Z","iopub.status.idle":"2022-08-12T17:42:25.527655Z","shell.execute_reply.started":"2022-08-12T17:42:25.265652Z","shell.execute_reply":"2022-08-12T17:42:25.526401Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h1><div class=\"alert-info\">\n 2. K-Fold Stratified Data\n</div><h1>","metadata":{}},{"cell_type":"code","source":"df['k_fold'] = np.nan\n\nn_folds = 6\nreversed = False\n\nfor label in df.label.unique():\n    \n    folds = list(range(n_folds))\n    if reversed: folds.reverse()\n    \n    kf = KFold(n_splits=n_folds, random_state=42, shuffle=True)\n    \n    label_idxs = df[df.label==label].index\n    \n    kf.get_n_splits(label_idxs)\n\n    for _, valid_index in kf.split(label_idxs):\n\n        actual_fold = folds.pop(0)\n        df_index = label_idxs[valid_index]\n        df.loc[df_index, 'k_fold'] = actual_fold\n    reversed = not reversed\n        \n\n","metadata":{"execution":{"iopub.status.busy":"2022-08-12T17:42:25.529821Z","iopub.execute_input":"2022-08-12T17:42:25.530690Z","iopub.status.idle":"2022-08-12T17:42:25.594675Z","shell.execute_reply.started":"2022-08-12T17:42:25.530612Z","shell.execute_reply":"2022-08-12T17:42:25.593138Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"graphic = df.groupby(['label', 'k_fold']).size().reset_index()\ngraphic.columns = ['label', 'k_fold', 'count']\nfig = px.bar(\n    graphic, x=\"k_fold\", y=\"count\",\n    color='label', barmode='group',\n    height=400\n)\nfig.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-12T17:42:25.598343Z","iopub.execute_input":"2022-08-12T17:42:25.599689Z","iopub.status.idle":"2022-08-12T17:42:26.667001Z","shell.execute_reply.started":"2022-08-12T17:42:25.599648Z","shell.execute_reply":"2022-08-12T17:42:26.665598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h1><div class=\"alert-info\">3. Create Augmentations</div><h1>","metadata":{"execution":{"iopub.status.busy":"2022-08-11T09:11:16.986411Z","iopub.execute_input":"2022-08-11T09:11:16.987464Z","iopub.status.idle":"2022-08-11T09:11:16.995279Z","shell.execute_reply.started":"2022-08-11T09:11:16.987411Z","shell.execute_reply":"2022-08-11T09:11:16.993632Z"}}},{"cell_type":"markdown","source":"# How does it work? For example:\n\n","metadata":{}},{"cell_type":"code","source":"# create transform  \ntransform = A.Compose([\n    A.Rotate([-30,30]),\n    A.RandomCrop(width=360, height=360),\n    A.RandomBrightnessContrast(brightness_limit=[0.1,0.6], contrast_limit=[0.1,0.6], p=0.3),\n    A.HorizontalFlip(p=0.5)\n])\n# this method return image-array\n# transformed = transform(image=image)\n# transformed.keys()\n\n#create visualization\nrow, col = 3, 5\nnumber = 1\nplt.figure(figsize=(12, 8))\nfor r in range(row):\n    # choose a random picture \n    i = np.random.randint(df.shape[0])\n    image = cv.imread(df['path_jpeg'][i])\n    image = cv.cvtColor(image, cv.COLOR_BGR2RGB)\n    for c in range(col):\n        # create transform\n        if number % col == 1:\n            plt.subplot(row, col, number)\n            plt.imshow(image)\n            plt.title('original')\n        else:\n            transformed_image = transform(image=image)['image']\n            plt.subplot(row, col, number)\n            plt.imshow(transformed_image)\n            \n        plt.xticks([]);\n        plt.yticks([]);\n        number += 1\n                \nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-12T17:42:26.672152Z","iopub.execute_input":"2022-08-12T17:42:26.673541Z","iopub.status.idle":"2022-08-12T17:42:27.852991Z","shell.execute_reply.started":"2022-08-12T17:42:26.673493Z","shell.execute_reply":"2022-08-12T17:42:27.851649Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def transforms_method(image=None, image_size=360, train=True):\n#     if image is None:\n#         raise ValueError('image is NaN')\n    if train:\n        transforms = A.Compose([\n            A.Rotate([-30,30]),\n            A.RandomCrop(width=image_size, height=image_size),\n            A.RandomBrightnessContrast(brightness_limit=[0.1,0.6], contrast_limit=[0.1,0.6], p=0.3),\n            A.HorizontalFlip(p=0.5),\n            A.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225],),\n            ToTensorV2(),\n        ])\n    else:\n        transforms = A.Compose([\n        A.CenterCrop(height=image_size, width=image_size, always_apply=True),\n        A.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225],),\n        ToTensorV2(),\n        ])\n        \n    return transforms","metadata":{"execution":{"iopub.status.busy":"2022-08-12T17:42:27.854483Z","iopub.execute_input":"2022-08-12T17:42:27.855898Z","iopub.status.idle":"2022-08-12T17:42:27.867924Z","shell.execute_reply.started":"2022-08-12T17:42:27.855854Z","shell.execute_reply":"2022-08-12T17:42:27.865786Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"\ni = np.random.randint(df.shape[0])\nimage = cv.imread(df['path_jpeg'][i])\nimage = cv.cvtColor(image, cv.COLOR_BGR2RGB)\n\ntransform = transforms_method(image)\n\ntransformed_image = transform(image=image)['image']\n#PyTorch Tensor\nplt.imshow(transformed_image.permute(1, 2, 0));","metadata":{"execution":{"iopub.status.busy":"2022-08-12T17:42:27.869477Z","iopub.execute_input":"2022-08-12T17:42:27.870727Z","iopub.status.idle":"2022-08-12T17:42:28.385933Z","shell.execute_reply.started":"2022-08-12T17:42:27.870690Z","shell.execute_reply":"2022-08-12T17:42:28.384595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h1><div class=\"alert-info\">4. Create Dataset</div><h1>","metadata":{"execution":{"iopub.status.busy":"2022-08-11T18:23:04.865335Z","iopub.execute_input":"2022-08-11T18:23:04.866251Z","iopub.status.idle":"2022-08-11T18:23:04.873020Z","shell.execute_reply.started":"2022-08-11T18:23:04.866209Z","shell.execute_reply":"2022-08-11T18:23:04.871409Z"}}},{"cell_type":"code","source":"class PaddyDataset(Dataset):\n    def __init__(self, images_filepaths, targets, transform=None):\n        self.images_filepaths = images_filepaths\n        self.targets = targets\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.images_filepaths)\n\n    def __getitem__(self, idx):\n        image_filepath = self.images_filepaths[idx]\n        image = cv.imread(image_filepath)\n        image = cv.cvtColor(image, cv.COLOR_BGR2RGB)\n\n        if self.transform is not None:\n            image = self.transform(image=image)['image']\n        \n        label = torch.tensor(self.targets[idx]).long()\n        return image, label","metadata":{"execution":{"iopub.status.busy":"2022-08-12T17:42:28.387797Z","iopub.execute_input":"2022-08-12T17:42:28.389086Z","iopub.status.idle":"2022-08-12T17:42:28.399078Z","shell.execute_reply.started":"2022-08-12T17:42:28.389043Z","shell.execute_reply":"2022-08-12T17:42:28.397559Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h1><div class=\"alert-info\">5. Let's create a simple neural networks</div><h1>","metadata":{}},{"cell_type":"code","source":"\nif torch.cuda.is_available():\n    device = torch.device('cuda')\n    print('Thera are  %d GPU(s) available.' % torch.cuda.device_count())\nelse:\n    print('No GPU available, using the CPU instead.')\n    device = torch.device(\"cpu\")\n","metadata":{"execution":{"iopub.status.busy":"2022-08-12T17:42:28.401203Z","iopub.execute_input":"2022-08-12T17:42:28.401749Z","iopub.status.idle":"2022-08-12T17:42:28.505206Z","shell.execute_reply.started":"2022-08-12T17:42:28.401711Z","shell.execute_reply":"2022-08-12T17:42:28.503555Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class NeuralNetwork(nn.Module):\n    def __init__(self, n_neurons):\n        super().__init__()\n        self.conv1 = nn.Conv2d(in_channels=3, out_channels=7, kernel_size=5, padding=1)\n        self.act1 = nn.ReLU()\n        self.pool1 = nn.AvgPool2d(kernel_size=4, stride=2)\n        \n        self.conv2 = nn.Conv2d(in_channels=7, out_channels=10, kernel_size=3, padding=2)\n        self.act2 = nn.ReLU()\n        self.pool2 = nn.AvgPool2d(kernel_size=4, stride=2)\n        self.dr2 = nn.Dropout(p=0.2)\n        \n        self.conv3 = nn.Conv2d(in_channels=10, out_channels=18, kernel_size=3, padding=2)\n        self.act3 = nn.ReLU()\n        self.pool3 = nn.AvgPool2d(kernel_size=4, stride=2)\n        \n        self.conv4 = nn.Conv2d(in_channels=18, out_channels=15, kernel_size=3, padding=1)\n        self.act4 = nn.ReLU()\n        self.pool4 = nn.AvgPool2d(kernel_size=2, stride=2)\n        self.dr4 = nn.Dropout(p=0.2)\n        \n        self.conv5 = nn.Conv2d(in_channels=15, out_channels=10, kernel_size=3, padding=1)\n        self.act5 = nn.ReLU()\n        self.pool5 = nn.AvgPool2d(kernel_size=2, stride=2)\n\n        self.fc1 = nn.Linear(n_neurons,  n_neurons//6)\n        self.act_1 = nn.ReLU()\n        self.dr_1 = nn.Dropout(p=0.2)\n        \n        self.fc2 = nn.Linear(n_neurons//6,  n_neurons//8)\n        self.act_2 = nn.ReLU()\n\n        \n        self.fc3 = nn.Linear(n_neurons//8,  n_neurons//12)\n        self.act_3 = nn.ReLU()\n        self.dr_3 = nn.Dropout(p=0.2)\n        \n        self.fc4 = nn.Linear(n_neurons//12,  n_neurons//24)\n        self.act_4 = nn.ReLU()\n\n        self.fc5 = nn.Linear(n_neurons//24,  32)\n        self.act_5 = nn.ReLU()\n        self.dr_5 = nn.Dropout(p=0.2)\n\n        self.fc6 = nn.Linear(32,  16)\n        self.act_6 = nn.ReLU()\n         \n        self.fc7 = nn.Linear(16,  10)\n#         self.act_7 = nn.Softmax()\n\n        \n        \n    def forward(self, x):\n        x = self.conv1(x)\n        x = self.act1(x)\n        x = self.pool1(x)\n        \n        x = self.conv2(x)\n        x = self.act2(x)\n        x = self.pool2(x)  \n        x = self.dr2(x)\n        \n        x = self.conv3(x)\n        x = self.act3(x)\n        x = self.pool3(x)  \n        \n        x = self.conv4(x)\n        x = self.act4(x)\n        x = self.pool4(x)  \n        x = self.dr4(x)\n        \n        x = self.conv5(x)\n        x = self.act5(x)\n        x = self.pool5(x)  \n        \n        x = x.view(x.size(0), x.size(1) * x.size(2) * x.size(3))\n        x = self.fc1(x)\n        x = self.act_1(x)\n        x = self.dr_1(x)\n        \n        x = self.fc2(x)\n        x = self.act_2(x)\n        \n        x = self.fc3(x)\n        x = self.act_3(x)\n        x = self.dr_3(x)\n\n        x = self.fc4(x)\n        x = self.act_4(x)\n        \n        x = self.fc5(x)\n        x = self.act_5(x)\n        x = self.dr_5(x)\n        \n        x = self.fc6(x)\n        x = self.act_6(x)\n        \n        x = self.fc7(x)\n#         x = self.act_7(x)\n\n        return x","metadata":{"execution":{"iopub.status.busy":"2022-08-12T17:42:28.507846Z","iopub.execute_input":"2022-08-12T17:42:28.508276Z","iopub.status.idle":"2022-08-12T17:42:28.532081Z","shell.execute_reply.started":"2022-08-12T17:42:28.508232Z","shell.execute_reply":"2022-08-12T17:42:28.530596Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = NeuralNetwork(1210)\nmodel = model.to(device)\nloss = torch.nn.CrossEntropyLoss()\noptimizer = torch.optim.Adam(model.parameters(),  lr = 10 **(-3))\nepochs = 29\nbatch_size = 257","metadata":{"execution":{"iopub.status.busy":"2022-08-12T17:42:28.534719Z","iopub.execute_input":"2022-08-12T17:42:28.535310Z","iopub.status.idle":"2022-08-12T17:42:32.696076Z","shell.execute_reply.started":"2022-08-12T17:42:28.535182Z","shell.execute_reply":"2022-08-12T17:42:32.694793Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h1><div class=\"alert-info\">6. Training model</div><h1>","metadata":{}},{"cell_type":"code","source":"valid_fold = 3\ntrain = df[df['k_fold'] != valid_fold]\nvalid = df[df['k_fold'] == valid_fold]\n\nX_train = train['path_jpeg']\ny_train = train['label']\nX_valid = valid['path_jpeg']\ny_valid = valid['label']\n\n# Pytorch Dataset Creation\ntrain_dataset = PaddyDataset(\n    images_filepaths=X_train.values,\n    targets=y_train.values,\n    transform=transforms_method()\n)\n\nvalid_dataset = PaddyDataset(\n    images_filepaths=X_valid.values,\n    targets=y_valid.values,\n    transform=transforms_method(train=False)\n)\n\n# Pytorch Dataloader creation\ntrain_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\nvalid_dataset = DataLoader(valid_dataset, batch_size=batch_size)","metadata":{"execution":{"iopub.status.busy":"2022-08-12T17:42:32.698105Z","iopub.execute_input":"2022-08-12T17:42:32.698580Z","iopub.status.idle":"2022-08-12T17:42:32.713799Z","shell.execute_reply.started":"2022-08-12T17:42:32.698514Z","shell.execute_reply":"2022-08-12T17:42:32.712219Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"list_of_loss_train = []\nlist_of_loss_val = []\nlist_of_acc = []\nfor epoch_i in (range(1, epochs + 1)):\n    total_train_loss = 0\n    model.train()\n    print(f'---------------------epoch: {epoch_i}/{epochs}--------------------')\n    for batch in tqdm(train_loader):\n        X_batch = batch[0].to(device)\n        y_batch = batch[1].to(device)\n\n        optimizer.zero_grad()\n        res = model.forward(X_batch)\n        loss_value = loss(res, y_batch.long())\n        loss_value.backward()\n        \n        total_train_loss += loss_value\n\n        optimizer.step()\n    \n    avg_train_loss = total_train_loss / len(train_loader)  \n    model.eval()\n    \n    summa = 0\n    total_eval_loss = 0\n    for batch in tqdm(valid_dataset):\n        X_batch = batch[0].to(device)\n        y_batch = batch[1].to(device)\n        \n        with torch.no_grad(): \n            res = model.forward(X_batch)\n            preds = torch.max(F.softmax(res, dim=1), dim=1)\n            correct= torch.eq(preds[1], y_batch)\n            summa += torch.sum(correct).item()\n            loss_value = loss(res, y_batch.long())\n            total_eval_loss += loss_value\n        \n    avg_val_loss = total_eval_loss / len(valid_dataset)\n    acc = summa / len(valid_dataset)\n    list_of_loss_train.append(avg_train_loss.cpu().detach().numpy())\n    list_of_loss_val.append(avg_val_loss.cpu().detach().numpy())\n    list_of_acc.append(acc)\n    print(f'epoch: {epoch_i}, acc:{acc / 100:.2%}, loss_train:{avg_train_loss:.3f}, loss_valid:{avg_val_loss:.3f}')\n    ","metadata":{"execution":{"iopub.status.busy":"2022-08-12T17:42:32.716203Z","iopub.execute_input":"2022-08-12T17:42:32.717172Z","iopub.status.idle":"2022-08-12T19:06:54.366583Z","shell.execute_reply.started":"2022-08-12T17:42:32.717057Z","shell.execute_reply":"2022-08-12T19:06:54.364992Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h1><div class=\"alert-info\">7. Visualization of results</div><h1>","metadata":{}},{"cell_type":"code","source":"acc_max = max(list_of_acc)\nloss_train_min = min(list_of_loss_train)\nloss_val_min = min(list_of_loss_val)\n\n","metadata":{"execution":{"iopub.status.busy":"2022-08-12T19:06:54.368960Z","iopub.execute_input":"2022-08-12T19:06:54.369397Z","iopub.status.idle":"2022-08-12T19:06:54.376939Z","shell.execute_reply.started":"2022-08-12T19:06:54.369355Z","shell.execute_reply":"2022-08-12T19:06:54.375149Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(15, 5))\n\nplt.subplot(1,2,1)\nplt.title('Loss_score', fontsize = 15 );\nplt.grid(True)\nplt.xlabel('epoch', fontsize=14)\nplt.plot(list_of_loss_train, color='red', label = f'min_value:{loss_train_min:.3f}');\nplt.plot(list_of_loss_val, color='blue', label = f'min_value:{loss_val_min:.3f}');\nplt.xticks(range(epoch_i ));\nplt.legend();\n\nplt.subplot(1,2,2)\nplt.title('Acc_score', fontsize = 15 );\nplt.grid(True)\nplt.xlabel('epoch', fontsize=14);\nplt.plot(list_of_acc , color='darkblue', label = f'max_acc:{acc_max / 100:.2%}');\nplt.xticks(range(epoch_i ));\nplt.legend();\n\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2022-08-12T19:06:54.379058Z","iopub.execute_input":"2022-08-12T19:06:54.379633Z","iopub.status.idle":"2022-08-12T19:06:55.113637Z","shell.execute_reply.started":"2022-08-12T19:06:54.379577Z","shell.execute_reply":"2022-08-12T19:06:55.112246Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"<h1><div class=\"alert-info\">8. Submit predictions</div><h1>","metadata":{}},{"cell_type":"code","source":"submission_dir = '../input/paddy-disease-classification/test_images/'","metadata":{"execution":{"iopub.status.busy":"2022-08-12T19:06:55.115414Z","iopub.execute_input":"2022-08-12T19:06:55.115830Z","iopub.status.idle":"2022-08-12T19:06:55.123669Z","shell.execute_reply.started":"2022-08-12T19:06:55.115786Z","shell.execute_reply":"2022-08-12T19:06:55.122199Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"%%time\nmodel.eval()\nimage_ids, labels = [], []\nfor (dirpath, dirname, filenames) in os.walk(submission_dir):\n    filenames.sort()\n    for imade_id in tqdm(filenames):\n        image_filepath = dirpath + imade_id\n        \n        image = cv.imread(image_filepath)\n        image = cv.cvtColor(image, cv.COLOR_BGR2RGB)\n        \n        transform = transforms_method(image, train=False)\n        transformed_image = transform(image=image)['image']\n#       plt.imshow(transformed_image.permute(1, 2, 0));\n\n        res = model.forward(transformed_image.unsqueeze(0).to(device))\n        pred = torch.max(F.softmax(res, dim=1), dim=1)[1].to('cpu')\n        pred_label = integer_mapping[pred.numpy()[0]]\n\n        image_ids.append(imade_id)\n        labels.append(pred_label)","metadata":{"execution":{"iopub.status.busy":"2022-08-12T19:06:55.124931Z","iopub.execute_input":"2022-08-12T19:06:55.126086Z","iopub.status.idle":"2022-08-12T19:08:08.514197Z","shell.execute_reply.started":"2022-08-12T19:06:55.126047Z","shell.execute_reply":"2022-08-12T19:08:08.512800Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission = pd.DataFrame({\n    'image_id': image_ids,\n    'label': labels,\n})","metadata":{"execution":{"iopub.status.busy":"2022-08-12T19:08:08.516450Z","iopub.execute_input":"2022-08-12T19:08:08.517429Z","iopub.status.idle":"2022-08-12T19:08:08.526301Z","shell.execute_reply.started":"2022-08-12T19:08:08.517386Z","shell.execute_reply":"2022-08-12T19:08:08.524675Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.to_csv(\"submission.csv\", index=False, header=True)","metadata":{"execution":{"iopub.status.busy":"2022-08-12T19:08:08.528710Z","iopub.execute_input":"2022-08-12T19:08:08.529870Z","iopub.status.idle":"2022-08-12T19:08:08.546612Z","shell.execute_reply.started":"2022-08-12T19:08:08.529798Z","shell.execute_reply":"2022-08-12T19:08:08.544617Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"submission.head()","metadata":{"execution":{"iopub.status.busy":"2022-08-12T19:08:08.548219Z","iopub.execute_input":"2022-08-12T19:08:08.548710Z","iopub.status.idle":"2022-08-12T19:08:08.563110Z","shell.execute_reply.started":"2022-08-12T19:08:08.548682Z","shell.execute_reply":"2022-08-12T19:08:08.561298Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}