{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":112509,"databundleVersionId":14254895,"sourceType":"competition"},{"sourceId":288478750,"sourceType":"kernelVersion"},{"sourceId":698890,"sourceType":"modelInstanceVersion","isSourceIdPinned":true,"modelInstanceId":530184,"modelId":544127}],"dockerImageVersionId":31234,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Import Library","metadata":{}},{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport torch\nfrom PIL import Image\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler\nimport torch.nn as nn\nimport torch.nn.functional as F\nimport torchvision.transforms as transforms\nimport torchvision.models as models\nimport torch.optim as optim\nfrom torch.utils.data import Dataset, DataLoader\nimport joblib","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-12-26T05:18:08.950620Z","iopub.execute_input":"2025-12-26T05:18:08.951007Z","iopub.status.idle":"2025-12-26T05:18:08.956638Z","shell.execute_reply.started":"2025-12-26T05:18:08.950975Z","shell.execute_reply":"2025-12-26T05:18:08.955788Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Prepare Data","metadata":{}},{"cell_type":"markdown","source":"### Make Transform","metadata":{}},{"cell_type":"code","source":"transform = transforms.Compose([\n        transforms.Resize((512, 512)),\n        transforms.ToTensor(),\n        transforms.Normalize(mean=(0.485,0.456,0.406),\n                             std=(0.229,0.224,0.225)),\n])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-26T05:18:08.959143Z","iopub.execute_input":"2025-12-26T05:18:08.959441Z","iopub.status.idle":"2025-12-26T05:18:08.973866Z","shell.execute_reply.started":"2025-12-26T05:18:08.959414Z","shell.execute_reply":"2025-12-26T05:18:08.973087Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Load Scaler","metadata":{}},{"cell_type":"code","source":"scaler = joblib.load('/kaggle/input/csiro-convnext-tiny-demo/pytorch/default/1/scaler.joblib')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-26T05:18:08.975421Z","iopub.execute_input":"2025-12-26T05:18:08.975796Z","iopub.status.idle":"2025-12-26T05:18:08.999754Z","shell.execute_reply.started":"2025-12-26T05:18:08.975756Z","shell.execute_reply":"2025-12-26T05:18:08.998930Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Model Settings","metadata":{}},{"cell_type":"markdown","source":"### Define Model","metadata":{}},{"cell_type":"code","source":"class BiomassModel(nn.Module):\n    def __init__(self, pretrained=True):\n        super(BiomassModel, self).__init__()\n        if pretrained:\n            weights = models.ConvNeXt_Tiny_Weights.DEFAULT\n            model = models.convnext_tiny(weights=weights)\n        else:\n            model = models.convnext_tiny(weights=None)\n        self.model = model.features\n        \n        self.head = nn.Sequential(\n            nn.Linear(768, 512),             \n            nn.Dropout(0.1),     \n\n            nn.Linear(512, 128),                 \n            nn.Dropout(0.1),     \n\n            nn.Linear(128, 5)\n        )\n        \n    def forward(self, images):\n        x = self.model(images)\n        x = x.mean(dim=(2,3))\n        return self.head(x)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-26T05:18:09.000862Z","iopub.execute_input":"2025-12-26T05:18:09.001222Z","iopub.status.idle":"2025-12-26T05:18:09.007832Z","shell.execute_reply.started":"2025-12-26T05:18:09.001174Z","shell.execute_reply":"2025-12-26T05:18:09.007085Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Load Model","metadata":{}},{"cell_type":"code","source":"device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n\nbest_model = BiomassModel(pretrained=False)\nbest_model.load_state_dict(torch.load('/kaggle/input/csiro-convnext-tiny-demo/pytorch/default/1/model.pth', map_location = 'cpu'))\nbest_model.to(device)\nbest_model.eval() # for predict","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-26T05:18:09.009467Z","iopub.execute_input":"2025-12-26T05:18:09.009745Z","iopub.status.idle":"2025-12-26T05:18:10.860508Z","shell.execute_reply.started":"2025-12-26T05:18:09.009719Z","shell.execute_reply":"2025-12-26T05:18:10.859741Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Make Submission File","metadata":{}},{"cell_type":"markdown","source":"### Predict","metadata":{}},{"cell_type":"code","source":"df_test = pd.read_csv('/kaggle/input/csiro-biomass/test.csv')\ntest_path = df_test[\"image_path\"].values.tolist()\ntest_target = df_test[\"target_name\"].values.tolist()\n\nres = []\nwith torch.no_grad():\n    for img_path,target in zip(test_path,test_target):\n        img_path = os.path.join('/kaggle/input/csiro-biomass', img_path)\n        image = Image.open(img_path).convert(\"RGB\")\n        image = transform(image).to(device).unsqueeze(0)\n\n        preds = best_model(image)\n        preds = scaler.inverse_transform(preds.detach().cpu())\n        preds=preds.reshape(-1)\n        if target == 'Dry_Clover_g':\n            res.append(preds[0])\n        elif target == 'Dry_Dead_g':\n            res.append(preds[1])\n        elif target == 'Dry_Green_g':\n            res.append(preds[2])\n        elif target == 'Dry_Total_g':\n            res.append(preds[3])\n        else: #GDM_g\n            res.append(preds[4])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-26T05:18:10.861430Z","iopub.execute_input":"2025-12-26T05:18:10.861709Z","iopub.status.idle":"2025-12-26T05:18:13.988616Z","shell.execute_reply.started":"2025-12-26T05:18:10.861676Z","shell.execute_reply":"2025-12-26T05:18:13.987693Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"### Make csv File","metadata":{}},{"cell_type":"code","source":"submission = pd.DataFrame({'sample_id':df_test['sample_id'],'target':res})\nsubmission.to_csv('submission.csv', index = False)\nprint(submission)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-26T05:18:13.989602Z","iopub.execute_input":"2025-12-26T05:18:13.989924Z","iopub.status.idle":"2025-12-26T05:18:14.009518Z","shell.execute_reply.started":"2025-12-26T05:18:13.989843Z","shell.execute_reply":"2025-12-26T05:18:14.008661Z"}},"outputs":[],"execution_count":null}]}