{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceType":"competition","sourceId":112509,"databundleVersionId":14254895},{"sourceType":"kernelVersion","sourceId":282812030}],"dockerImageVersionId":31193,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\n\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-11-30T08:38:18.601333Z","iopub.execute_input":"2025-11-30T08:38:18.601503Z","iopub.status.idle":"2025-11-30T08:38:20.042372Z","shell.execute_reply.started":"2025-11-30T08:38:18.601480Z","shell.execute_reply":"2025-11-30T08:38:20.041803Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import sys\nimport os\nimport cv2\nimport pandas as pd\nimport numpy as np\nimport torch\nimport torch.nn as nn\nfrom torch.utils.data import Dataset, DataLoader\nfrom PIL import Image\nimport timm\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T08:38:20.043888Z","iopub.execute_input":"2025-11-30T08:38:20.044178Z","iopub.status.idle":"2025-11-30T08:39:04.051736Z","shell.execute_reply.started":"2025-11-30T08:38:20.044160Z","shell.execute_reply":"2025-11-30T08:39:04.050981Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class CFG:\n    model_name = 'tf_efficientnetv2_l'\n    img_size = 384   \n    n_classes = 5\n    batch_size = 32      \n    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')\n    target_cols = ['Dry_Green_g', 'Dry_Dead_g', 'Dry_Clover_g', 'GDM_g', 'Dry_Total_g']","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T08:39:04.052451Z","iopub.execute_input":"2025-11-30T08:39:04.052895Z","iopub.status.idle":"2025-11-30T08:39:04.126271Z","shell.execute_reply.started":"2025-11-30T08:39:04.052876Z","shell.execute_reply":"2025-11-30T08:39:04.125506Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"MODEL_PATH = '/kaggle/input/efficientnet-train/best_model_fold1.pth'","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T08:39:04.127047Z","iopub.execute_input":"2025-11-30T08:39:04.127358Z","iopub.status.idle":"2025-11-30T08:39:04.218447Z","shell.execute_reply.started":"2025-11-30T08:39:04.127290Z","shell.execute_reply":"2025-11-30T08:39:04.217683Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class PastureModel(nn.Module):\n    def __init__(self, model_name, pretrained=False):\n        super().__init__()\n        self.model = timm.create_model(model_name, pretrained=False, num_classes=CFG.n_classes)\n\n    def forward(self, x):\n        return self.model(x)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T08:39:04.219213Z","iopub.execute_input":"2025-11-30T08:39:04.219543Z","iopub.status.idle":"2025-11-30T08:39:04.228686Z","shell.execute_reply.started":"2025-11-30T08:39:04.219521Z","shell.execute_reply":"2025-11-30T08:39:04.228009Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class TestDataset(Dataset):\n    def __init__(self, df, transform=None):\n        self.df = df\n        self.image_paths = df['image_path'].values\n        self.transform = transform\n        \n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx):\n        path = '/kaggle/input/csiro-biomass/' + self.image_paths[idx]\n        image = Image.open(path).convert('RGB')\n        image = np.array(image)\n        \n        if self.transform:\n            augmented = self.transform(image=image)\n            image = augmented['image']\n        return image","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T08:39:04.229409Z","iopub.execute_input":"2025-11-30T08:39:04.229583Z","iopub.status.idle":"2025-11-30T08:39:04.240510Z","shell.execute_reply.started":"2025-11-30T08:39:04.229569Z","shell.execute_reply":"2025-11-30T08:39:04.239898Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def get_transforms():\n    return A.Compose([\n        A.Resize(CFG.img_size, CFG.img_size),\n        A.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n        ToTensorV2(),\n    ])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T08:39:04.242070Z","iopub.execute_input":"2025-11-30T08:39:04.242235Z","iopub.status.idle":"2025-11-30T08:39:04.253328Z","shell.execute_reply.started":"2025-11-30T08:39:04.242222Z","shell.execute_reply":"2025-11-30T08:39:04.252642Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_df = pd.read_csv('/kaggle/input/csiro-biomass/test.csv')\ntest_pivot = test_df[['image_path']].drop_duplicates().reset_index(drop=True)\n    \ntest_ds = TestDataset(test_pivot, transform=get_transforms())\ntest_loader = DataLoader(test_ds, batch_size=CFG.batch_size, shuffle=False, num_workers=2)\n    \nmodel = PastureModel(CFG.model_name, pretrained=False).to(CFG.device)    \n\nmodel.load_state_dict(torch.load(MODEL_PATH, map_location=CFG.device))\nprint(f\"Model loaded successfully from {MODEL_PATH}\")\n\nmodel.eval()\npreds = []\n    \nwith torch.no_grad():\n    for images in test_loader:\n        images = images.to(CFG.device)\n        outputs = model(images)\n        preds.append(outputs.cpu().numpy())\n    \npredictions = np.concatenate(preds, axis=0)\npredictions = np.clip(predictions, 0, None)\n    \npred_df = test_pivot.copy()\npred_df[CFG.target_cols] = predictions\n    \nsubmission_df = pred_df.melt(\n    id_vars=['image_path'],\n    value_vars=CFG.target_cols,\n    var_name='target_name',\n    value_name='target'\n)    \nfinal_submission = pd.merge(\n    test_df[['sample_id', 'image_path', 'target_name']],\n    submission_df,\n    on=['image_path', 'target_name'],\n    how='left'\n)  \nsubmission = final_submission[['sample_id', 'target']]\nsubmission.to_csv('submission.csv', index=False)\nprint(submission.head())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-11-30T08:39:04.254119Z","iopub.execute_input":"2025-11-30T08:39:04.254412Z","iopub.status.idle":"2025-11-30T08:39:15.463388Z","shell.execute_reply.started":"2025-11-30T08:39:04.254395Z","shell.execute_reply":"2025-11-30T08:39:15.462551Z"}},"outputs":[],"execution_count":null}]}