{"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":"markdown","source":"This notebook uses model trained in [this training notebook](https://www.kaggle.com/motloch/sorghum-pytorch-starter) to predict crop varietals for Sorghum -100 Cultivar Identification - FGVC 9. Based on Resnet34. Achieves 0.275 on the leaderboard.\n\nPlease upvote if you find this notebook useful. Thank you!","metadata":{}},{"cell_type":"markdown","source":"# Import libraries","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport matplotlib.pyplot as plt\nfrom PIL import Image\nimport torch\nimport random\nimport os\nimport sys\nsys.path.append('../input/pytorch-image-models/pytorch-image-models-master')\nimport timm\nfrom torch.utils.data import Dataset, DataLoader\nfrom torch import Tensor\nfrom torchvision.transforms import ToTensor\nimport torch.nn as nn\nfrom torchvision import transforms","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2022-03-18T00:36:37.346607Z","iopub.execute_input":"2022-03-18T00:36:37.347152Z","iopub.status.idle":"2022-03-18T00:36:37.355531Z","shell.execute_reply.started":"2022-03-18T00:36:37.347104Z","shell.execute_reply":"2022-03-18T00:36:37.354119Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Load data","metadata":{}},{"cell_type":"code","source":"train_df = pd.read_csv('../input/sorghum-id-fgvc-9/train_cultivar_mapping.csv', index_col = 'image')","metadata":{"execution":{"iopub.status.busy":"2022-03-18T00:36:37.358340Z","iopub.execute_input":"2022-03-18T00:36:37.359260Z","iopub.status.idle":"2022-03-18T00:36:37.417589Z","shell.execute_reply.started":"2022-03-18T00:36:37.359215Z","shell.execute_reply":"2022-03-18T00:36:37.416598Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"images_present = os.listdir('../input/sorghum-id-fgvc-9/train_images')\ntrain_df = train_df.loc[images_present]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"classes = train_df['cultivar'].unique()","metadata":{"execution":{"iopub.status.busy":"2022-03-18T00:36:38.032739Z","iopub.execute_input":"2022-03-18T00:36:38.033302Z","iopub.status.idle":"2022-03-18T00:36:38.047694Z","shell.execute_reply.started":"2022-03-18T00:36:38.033242Z","shell.execute_reply":"2022-03-18T00:36:38.046445Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_sub = pd.read_csv('../input/sorghum-id-fgvc-9/sample_submission.csv', index_col = 'filename')","metadata":{"execution":{"iopub.status.busy":"2022-03-18T00:37:27.381277Z","iopub.execute_input":"2022-03-18T00:37:27.381578Z","iopub.status.idle":"2022-03-18T00:37:27.418347Z","shell.execute_reply.started":"2022-03-18T00:37:27.381547Z","shell.execute_reply":"2022-03-18T00:37:27.417199Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"X_test = sample_sub.index.values","metadata":{"execution":{"iopub.status.busy":"2022-03-18T00:37:50.505680Z","iopub.execute_input":"2022-03-18T00:37:50.506038Z","iopub.status.idle":"2022-03-18T00:37:50.512142Z","shell.execute_reply.started":"2022-03-18T00:37:50.505998Z","shell.execute_reply":"2022-03-18T00:37:50.511044Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Set up Pytorch","metadata":{}},{"cell_type":"code","source":"device = 'cuda' if torch.cuda.is_available() else 'cpu'\nvalid_bs = 8\nnum_workers = 2\nmodel_arch = 'resnet34'\nn_class = 100\nx_size = 224\ny_size = 224","metadata":{"execution":{"iopub.status.busy":"2022-03-18T00:37:59.097406Z","iopub.execute_input":"2022-03-18T00:37:59.097701Z","iopub.status.idle":"2022-03-18T00:37:59.104371Z","shell.execute_reply.started":"2022-03-18T00:37:59.097671Z","shell.execute_reply":"2022-03-18T00:37:59.103026Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Data loader","metadata":{}},{"cell_type":"code","source":"dir_name = '../input/sorghum-id-fgvc-9/test/'","metadata":{"execution":{"iopub.status.busy":"2022-03-18T00:39:22.849205Z","iopub.execute_input":"2022-03-18T00:39:22.849513Z","iopub.status.idle":"2022-03-18T00:39:22.854337Z","shell.execute_reply.started":"2022-03-18T00:39:22.849475Z","shell.execute_reply":"2022-03-18T00:39:22.853048Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"test_transform = transforms.Compose([\n    transforms.Resize(256),\n    transforms.CenterCrop(224),\n    transforms.ToTensor(),\n    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n])","metadata":{"execution":{"iopub.status.busy":"2022-03-18T00:39:25.140447Z","iopub.execute_input":"2022-03-18T00:39:25.141232Z","iopub.status.idle":"2022-03-18T00:39:25.150643Z","shell.execute_reply.started":"2022-03-18T00:39:25.141145Z","shell.execute_reply":"2022-03-18T00:39:25.149513Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class TestDataset(Dataset):\n    def __init__(self):\n        super().__init__()\n    \n    def __len__(self):\n        return len(X_test)\n\n    def __getitem__(self, idx):\n        name = X_test[idx]\n        x = Image.open(dir_name + name)\n        x = test_transform(x)\n        return x\n    \ntest = TestDataset()\ntest_dl = DataLoader(test, batch_size = valid_bs, shuffle = False, num_workers = num_workers)","metadata":{"execution":{"iopub.status.busy":"2022-03-18T00:39:26.177683Z","iopub.execute_input":"2022-03-18T00:39:26.178090Z","iopub.status.idle":"2022-03-18T00:39:26.185746Z","shell.execute_reply.started":"2022-03-18T00:39:26.178055Z","shell.execute_reply":"2022-03-18T00:39:26.184298Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Model","metadata":{}},{"cell_type":"code","source":"class OurModel(nn.Module):\n    def __init__(self, model_arch, pretrained=False):\n        super().__init__()\n        self.model = timm.create_model(model_arch, pretrained=pretrained)\n        n_features = self.model.fc.in_features\n        self.model.fc = nn.Linear(n_features, n_class)\n        \n    def forward(self, x):\n        x = self.model(x)\n        return x","metadata":{"execution":{"iopub.status.busy":"2022-03-18T00:41:25.071902Z","iopub.execute_input":"2022-03-18T00:41:25.072234Z","iopub.status.idle":"2022-03-18T00:41:25.080362Z","shell.execute_reply.started":"2022-03-18T00:41:25.072202Z","shell.execute_reply":"2022-03-18T00:41:25.078960Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = OurModel(model_arch, pretrained = False)\nmodel.load_state_dict(torch.load('../input/sorghum-pytorch-starter/epoch_4.pth'))\nmodel.to('cuda')","metadata":{"execution":{"iopub.status.busy":"2022-03-18T00:44:04.078499Z","iopub.execute_input":"2022-03-18T00:44:04.078785Z","iopub.status.idle":"2022-03-18T00:44:09.329124Z","shell.execute_reply.started":"2022-03-18T00:44:04.078757Z","shell.execute_reply":"2022-03-18T00:44:09.328163Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict class probabilities","metadata":{}},{"cell_type":"code","source":"PREDS = []\n\nmodel.eval()\nwith torch.no_grad():\n    for i, x in enumerate(test_dl):\n        x = x.to(device)\n        logits = model(x)        \n        PREDS += [logits.sigmoid()]\n\nPREDS = torch.cat(PREDS).cpu().numpy()","metadata":{"execution":{"iopub.status.busy":"2022-03-18T00:59:10.029529Z","iopub.execute_input":"2022-03-18T00:59:10.030391Z","iopub.status.idle":"2022-03-18T00:59:11.551355Z","shell.execute_reply.started":"2022-03-18T00:59:10.030350Z","shell.execute_reply":"2022-03-18T00:59:11.550118Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Predict classes and save","metadata":{}},{"cell_type":"code","source":"argmaxes = np.argmax(PREDS, axis = 1)\npredictions = [classes[a] for a in argmaxes]","metadata":{"execution":{"iopub.status.busy":"2022-03-18T01:01:00.361922Z","iopub.execute_input":"2022-03-18T01:01:00.362286Z","iopub.status.idle":"2022-03-18T01:01:00.367888Z","shell.execute_reply.started":"2022-03-18T01:01:00.362253Z","shell.execute_reply":"2022-03-18T01:01:00.366636Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_sub['cultivar'] = predictions","metadata":{"execution":{"iopub.status.busy":"2022-03-18T01:02:52.937934Z","iopub.execute_input":"2022-03-18T01:02:52.938298Z","iopub.status.idle":"2022-03-18T01:02:52.964953Z","shell.execute_reply.started":"2022-03-18T01:02:52.938268Z","shell.execute_reply":"2022-03-18T01:02:52.963591Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"sample_sub.to_csv('submission.csv')","metadata":{},"execution_count":null,"outputs":[]}]}