{"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":"gpu","dataSources":[{"sourceType":"competition","sourceId":112509,"databundleVersionId":14254895},{"sourceType":"datasetVersion","sourceId":14647091,"datasetId":9190542,"databundleVersionId":15487047},{"sourceType":"datasetVersion","sourceId":14655659,"datasetId":9188721,"databundleVersionId":15496476},{"sourceType":"datasetVersion","sourceId":14578530,"datasetId":9190614,"databundleVersionId":15412084}],"dockerImageVersionId":31260,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip -q install /kaggle/input/offline-environment-stuff/wheel_files/scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl\n!pip -q install /kaggle/input/offline-environment-stuff/wheel_files/segmentation_models_pytorch-0.5.0-py3-none-any.whl --no-deps\n!pip -q install /kaggle/input/offline-environment-stuff/wheel_files/timm-1.0.22-py3-none-any.whl --no-deps\n!cp /kaggle/input/csiro-biomass-regression/* -r ./","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-01-28T19:35:04.280443Z","iopub.execute_input":"2026-01-28T19:35:04.280763Z","iopub.status.idle":"2026-01-28T19:35:18.446578Z","shell.execute_reply.started":"2026-01-28T19:35:04.280735Z","shell.execute_reply":"2026-01-28T19:35:18.445461Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nos.environ[\"NO_ALBUMENTATIONS_UPDATE\"] = \"1\"\n\nIMAGE_SIZE = 768\n\nTARGETS = ['Dry_Total_g', 'GDM_g', 'Dry_Green_g'] \nTARGET_WEIGHTS = [0.5, 0.2, 0.1, 0.1, 0.1]\n# TARGET_MEANS = [45.31809663865546, 33.2744137254902, 26.62472240896359] # norm\n# TARGET_STDS = [27.984014597186558, 24.93582156642061, 25.401232186417978] # norm\nTARGET_MEANS = [3.6171854219925024, 3.217874424165861, 2.832479241567281] # log norm\nTARGET_STDS = [0.5573042636308412, 0.8185179833598041, 1.2134970356508157] # log norm\n\nAUX_TARGETS = ['Pre_GSHH_NDVI', 'Height_Ave_cm']\n# AUX_MEANS = [0.6574229691876751, 7.595985434173669] # norm\n# AUX_STDS = [0.15192904443339472, 10.285262364329936] # norm\nAUX_MEANS = [0.6574229691876751, 1.7949544186979798] # log norm\nAUX_STDS = [0.15192904443339472, 0.7399843934368923] # log norm\n\n\nSPECIES = [\"clover\", \"ryegrass\", \"phalaris\", \"grass\", \"fescue\", \"lucerne\", \"weed\", \"whiteclover\"]\n# SPECIES_WEIGHTS = [2.82, 3.47, 7.64, 12.89, 16.7, 25.06, 34.69, 50.11] # not root (N / Nc)\nSPECIES_WEIGHTS = [1.68, 1.86, 2.76, 3.59, 4.09, 5.01, 5.89, 7.08] # roots sqrt(N / Nc)\n\n\n# create attention init states\nSEGM_CLASS_NAMES = [\n    'background', 'soil', 'clover', 'grass', 'weeds', 'white_clover', \n    'red_clover', 'dandelion', 'shepherds_purse', 'thisLtle', \n    'white_clover_flower', 'white_clover_leaf', 'red_clover_flower', \n    'red_clover_leaf', 'unknown_clover_leaf', 'unknown_clover_flower'\n]\nrelevant_categories = ['grass', 'weeds', 'white_clover', 'red_clover', 'dandelion', 'shepherds_purse', 'white_clover_leaf', 'red_clover_leaf', 'unknown_clover_leaf']\ninit_attn_state = [1 for _ in range(16)]\nfor category in SEGM_CLASS_NAMES:\n    cat_idx = SEGM_CLASS_NAMES.index(category)\n    if category in relevant_categories:\n        init_attn_state[cat_idx] = 0.95\n    elif category in 'soil':\n        init_attn_state[cat_idx] = 0.3\n    elif category in 'background':\n        init_attn_state[cat_idx] = 0.0\n    else:\n        init_attn_state[cat_idx] = 0.9","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-28T19:35:18.448814Z","iopub.execute_input":"2026-01-28T19:35:18.449134Z","iopub.status.idle":"2026-01-28T19:35:18.458918Z","shell.execute_reply.started":"2026-01-28T19:35:18.449098Z","shell.execute_reply":"2026-01-28T19:35:18.457996Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from predictors import MetaEnsembleBioMassPredictor\n\n\n# model_kwargs = {\n#     \"type\": \"BioMassMetaRegresor\",\n#     \"backbone_cfg\": {\n#         \"model_name\": \"convnext_base\",\n#         \"pretrained\": False,\n#         \"num_classes\": 0,\n#         \"drop_path_rate\": 0.0,\n#         \"output_stride\": 32,\n#     },\n#     \"segm_cfg\": {\n#         \"arch\": \"upernet\",\n#         \"encoder_name\": \"tu-convnext_tiny\",\n#         \"encoder_weights\": None,\n#         \"classes\": len(SEGM_CLASS_NAMES),\n#         \"weight_file\": None,\n#     },\n#     \"biomass_cfg\": {\n#         \"num_targets\": len(TARGETS),\n#         \"out_feats\": 768,\n#         \"drop_rate\": 0.5,\n#         \"conv_drop_rate\": 0.1,\n#         \"channel_factor\": 1,\n#         \"create_specialists\": False,\n#         \"pool_mode\": \"mean\",\n#         \"use_modulation\": True,\n#         \"num_extra_feats\": len(AUX_TARGETS) + len(SPECIES_WEIGHTS),\n#         \"use_attention\": True,\n#         \"attn_temp\": 1.0,\n#         \"attn_init\": init_attn_state,\n#     },\n#     \"aux_cfg\": {\n#         \"num_targets\": len(AUX_TARGETS), \n#         \"num_blocks\": 2,\n#         \"drop_rate\": 0.5\n#     },\n#     \"species_cfg\": {\n#         \"num_targets\": len(SPECIES), \n#         \"num_blocks\": 2, \n#         \"drop_rate\": 0.5\n#     },\n#     \"image_size\": IMAGE_SIZE,\n#     \"patch_w\": 2,\n#     \"patch_h\": 1,\n#     \"backbone_eval_mode\": True,\n#     \"cp\": True\n# }\n\nfrom predictors import MetaEnsembleBioMassPredictor\n\n\nmodel_kwargs_run13 = {\n    \"type\": \"BioMassViTMetaRegressor\",\n    \"backbone_cfg\": {\n        \"model_name\": \"vit_large_patch16_dinov3_qkvb\",\n        \"pretrained\": False,\n        \"checkpoint_path\": \"/kaggle/input/csiro-submission-model-runs/run15_vit_large_dinov3_frozen_sorted_splits/backbone_weights.pth\", # same backbonee\n        \"num_classes\": 0\n    },\n    \"biomass_targets\": len(TARGETS),\n    \"aux_targets\": len(AUX_TARGETS),\n    \"speceis_targets\": len(SPECIES),\n    \"channel_factor\": 1,\n    \"patch_w\": 2,\n    \"patch_h\": 1,\n    \"reduce_hidden\": 1,\n    \"head_dropout\": 0.0,\n    \"backbone_eval_mode\": True,\n    \"use_modulation\": True,\n    \"cp\": True\n}\nmodel_kwargs_run15 = {\n    \"type\": \"BioMassViTMetaRegressor\",\n    \"backbone_cfg\": {\n        \"model_name\": \"vit_large_patch16_dinov3_qkvb\",\n        \"pretrained\": False,\n        \"checkpoint_path\": \"/kaggle/input/csiro-submission-model-runs/run15_vit_large_dinov3_frozen_sorted_splits/backbone_weights.pth\", # same backbonee\n        \"num_classes\": 0\n    },\n    \"biomass_targets\": len(TARGETS),\n    \"aux_targets\": len(AUX_TARGETS),\n    \"speceis_targets\": len(SPECIES),\n    \"channel_factor\": 1,\n    \"patch_w\": 2,\n    \"patch_h\": 1,\n    \"reduce_hidden\": 2,\n    \"head_dropout\": 0.0,\n    \"backbone_eval_mode\": True,\n    \"use_modulation\": True,\n    \"cp\": True\n}\n\nmodels_run13 = [\n    {\"model_kwargs\": model_kwargs_run13, \"weights_path\": weight_path}\n    for weight_path in [\n        \"/kaggle/input/csiro-submission-model-runs/vit_large_dinov3_frozen_restored/TotalStateDate_foldA/checkpoints/best_val_r2.pth\",\n        \"/kaggle/input/csiro-submission-model-runs/vit_large_dinov3_frozen_restored/TotalStateDate_foldB/checkpoints/best_val_r2.pth\",\n        \"/kaggle/input/csiro-submission-model-runs/vit_large_dinov3_frozen_restored/TotalStateDate_foldB/checkpoints/least_val_biomass_loss.pth\",\n        \"/kaggle/input/csiro-submission-model-runs/vit_large_dinov3_frozen_restored/TotalStateDate_foldC/checkpoints/best_val_r2.pth\",\n        \"/kaggle/input/csiro-submission-model-runs/vit_large_dinov3_frozen_restored/TotalStateDate_foldC/checkpoints/least_val_biomass_loss.pth\",\n        \"/kaggle/input/csiro-submission-model-runs/vit_large_dinov3_frozen_restored/TotalStateDate_foldD/checkpoints/best_val_r2.pth\",\n        \"/kaggle/input/csiro-submission-model-runs/vit_large_dinov3_frozen_restored/TotalStateDate_foldD/checkpoints/least_val_biomass_loss.pth\",\n        \"/kaggle/input/csiro-submission-model-runs/vit_large_dinov3_frozen_restored/TotalStateDate_foldE/checkpoints/best_val_r2.pth\",\n        \"/kaggle/input/csiro-submission-model-runs/vit_large_dinov3_frozen_restored/TotalStateDate_foldE/checkpoints/least_val_biomass_loss.pth\",\n    ]\n]\nmodel_run13_weights = [1.0 for _ in models_run13]\nmodels_run15 = [\n    {\"model_kwargs\": model_kwargs_run15, \"weights_path\": weight_path}\n    for weight_path in  [\n        \"/kaggle/input/csiro-submission-model-runs/run15_vit_large_dinov3_frozen_sorted_splits/Sorted_foldA/checkpoints/best_val_r2.pth\",\n        \"/kaggle/input/csiro-submission-model-runs/run15_vit_large_dinov3_frozen_sorted_splits/Sorted_foldA/checkpoints/best_val_r2.pth\",\n        \"/kaggle/input/csiro-submission-model-runs/run15_vit_large_dinov3_frozen_sorted_splits/Sorted_foldA/checkpoints/best_val_r2.pth\",\n        \"/kaggle/input/csiro-submission-model-runs/run15_vit_large_dinov3_frozen_sorted_splits/Sorted_foldC/checkpoints/least_val_biomass_loss.pth\"\n    ]\n]\nmodel_run15_weights = [0.5 for _ in models_run15]\n\n\nensemble_cfg = {\n    \"derive_targets\": [\"Dry_Clover_g\", \"Dry_Dead_g\"],\n    \"species\": SPECIES,\n    \"data_info\": {\n        \"proc_type\": \"combined\",\n        \"biomass_stats\": {\"type\": \"log_zscore\", \"key\": \"biomass\", \"targets\": TARGETS, \"means\": TARGET_MEANS, \"stds\": TARGET_STDS},\n        \"aux_stats\": {\"type\": \"aux_log_zscore\", \"key\": \"aux\", \"targets\": AUX_TARGETS, \"means\": AUX_MEANS, \"stds\": AUX_STDS, \"skip_target\": \"Pre_GSHH_NDVI\"}\n    },\n    \"models_cfgs\": models_run13 + models_run15,\n    \"test_transforms\": {\n        \"target_size\": [IMAGE_SIZE, IMAGE_SIZE*2], \n        \"mean\": [0.485, 0.456, 0.406], \n        \"std\": [0.229, 0.224, 0.225], \n        \"hflip\": True, \n        \"vflip\": True, \n        \"saturate\": None\n    }\n}\n\npredictor = MetaEnsembleBioMassPredictor(ensemble_cfg, common_backbone=True, heads_separations=True, ensemble_weights=model_run13_weights+model_run15_weights)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-28T19:35:18.460024Z","iopub.execute_input":"2026-01-28T19:35:18.460248Z","iopub.status.idle":"2026-01-28T19:36:59.883847Z","shell.execute_reply.started":"2026-01-28T19:35:18.460228Z","shell.execute_reply":"2026-01-28T19:36:59.882956Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import time\n\ntest_df = predictor.run_on_dataset(image_dir=\"/kaggle/input/csiro-biomass/test\", batch_size=4)\nif 'Height_Ave_cm' in test_df.columns:\n    test_df = test_df.drop(columns=['Pre_GSHH_NDVI', 'Height_Ave_cm', 'species'])\ntest_df.to_csv('submission.csv', index=False)\ntest_df","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-01-28T19:36:59.885674Z","iopub.execute_input":"2026-01-28T19:36:59.886232Z","iopub.status.idle":"2026-01-28T19:37:03.650516Z","shell.execute_reply.started":"2026-01-28T19:36:59.886203Z","shell.execute_reply":"2026-01-28T19:37:03.649588Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}