{"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":[{"sourceType":"competition","sourceId":112509,"databundleVersionId":14254895}],"dockerImageVersionId":31328,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"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\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\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":"2026-04-24T12:53:25.109029Z","iopub.execute_input":"2026-04-24T12:53:25.10929Z","iopub.status.idle":"2026-04-24T12:53:25.324799Z","shell.execute_reply.started":"2026-04-24T12:53:25.109266Z","shell.execute_reply":"2026-04-24T12:53:25.324073Z"}},"outputs":[{"name":"stdout","text":"/kaggle/input/competitions/csiro-biomass/sample_submission.csv\n/kaggle/input/competitions/csiro-biomass/train.csv\n/kaggle/input/competitions/csiro-biomass/test.csv\n/kaggle/input/competitions/csiro-biomass/test/ID1001187975.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2099464826.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2037861084.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1211362607.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1853508321.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID193102215.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID698608346.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1859251563.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1880764911.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID853954911.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1403107574.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1781353117.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID384648061.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1563418511.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2125100696.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID482555369.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID638711343.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID779628955.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1876271942.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1692894460.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID746335827.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1136169672.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1471216911.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID846154859.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1294770420.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1183807388.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID423506847.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1889150649.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1140993511.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1413758094.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1545077474.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID95050718.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID528010569.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1645161155.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID786365141.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID896386823.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1025234388.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID663006174.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1509266870.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1496750796.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID471758347.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID740402124.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1624268863.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1098771283.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID710341728.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2086966681.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1573329652.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID54128926.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID50027657.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1559189397.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID290369222.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1590632667.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID552040066.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID488873801.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID363069566.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1839139621.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1131079710.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2010625680.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID152157478.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1357758282.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1498398599.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID679913293.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID697718693.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID4464212.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1275072698.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1579942839.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID799079114.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1415329644.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1510574031.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1078930021.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1456861072.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID930534670.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID13162390.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID567744300.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID344618040.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID566966892.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1437386574.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID667059550.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID72895391.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1193692654.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1386202352.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID871463897.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2096636211.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2003438517.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID21377800.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID230058600.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1753847361.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1512751450.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID12390962.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1746343319.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID978026131.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID383231615.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID146920896.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1036339023.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1168534540.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1859792585.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1251029854.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1113329413.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1874904894.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1671844336.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1831254380.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1103883611.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID797502182.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1784585001.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1058383417.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1488408526.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID429799190.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1291116815.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1516374298.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1618597318.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1345375788.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID686797154.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1139866256.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1149598723.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID212206250.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID112966473.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1540480250.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID544444725.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1513184765.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID668330410.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1444674500.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1962379474.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID605134229.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID914754166.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID354528442.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID950496197.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1395011773.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1357768767.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID210865340.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID936984905.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1976436386.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1215977190.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID803479541.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1244346858.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID158170916.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1208644039.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1314135397.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1012260530.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1053972079.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID656251220.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1084819986.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1337107565.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1268934251.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID617132135.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1472525822.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID668475812.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID681680726.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1476045099.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1570190541.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1403078396.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2030696575.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1782608354.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID194823383.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID196516535.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID212206832.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1638922597.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1457700382.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1989506559.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID789169173.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1634731537.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1428837636.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2006686196.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID885388135.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1789853061.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1655778545.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID697059386.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID121331988.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2099742797.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID342818398.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID317990700.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID706288721.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1159071020.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID755710743.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1254829053.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID475010202.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1693880739.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1894998379.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID48303557.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1385921939.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID147528735.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID407646960.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1035947949.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1119761112.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1988033238.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1857489997.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID742198710.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID588120964.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID431471530.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID353424190.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID380752847.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2069766023.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID600602588.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID560946727.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1011485656.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID808079729.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1217108125.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1623964968.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID980878870.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID793526563.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID397994621.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID975115267.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1237349078.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID684383343.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID866684633.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1665142816.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2048645043.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1953171547.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1451025862.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID71885430.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID307060225.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID969218269.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID980538882.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1028611175.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID670276799.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2002797732.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1374789439.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID473494649.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1993907137.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1962197151.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID828217731.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID972274220.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1954669045.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1354190372.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1458758610.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID40849327.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1952813879.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID572336285.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1473228876.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1963715583.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1463690813.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1899025384.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID386216505.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1789265307.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID315357834.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2089023774.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID520514019.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1970522802.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1139918758.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1051144034.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1370004842.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID761508093.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2052993274.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1277756619.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID6269659.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1574125908.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID135365668.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1182523622.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID554314721.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1049634115.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1127246618.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID900012207.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID574213894.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID415656958.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID61833032.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2053315094.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID550623196.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID657448172.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1675365449.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2014192906.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID162394992.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID968643034.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID684062938.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID802547515.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID294150104.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1618145129.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID956512130.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID142751858.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID325799913.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID443091455.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID661372352.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1062837331.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID498304885.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID187238869.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1450399782.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2056023629.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID576621307.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1199150612.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1411613934.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID105271783.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1703304524.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID875119737.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1176292407.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1729002155.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2091439402.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID576137678.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1946311744.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1982662138.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID983582017.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID661817669.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID753699705.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1789834546.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID529933668.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID490139972.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID743847993.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID7850481.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1088965591.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID629980789.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1119739385.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1477176296.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1113121340.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2131261930.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2145635095.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1414371018.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1148666289.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID839432753.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID157479394.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1761544403.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID846984946.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID751517087.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID577112774.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID353997899.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID748979397.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1070112260.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1108283583.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1868719645.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1980675327.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1163061745.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1148528732.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID534966093.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1717006117.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1953218650.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID633775166.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID808093827.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1997244125.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1920959057.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1948354837.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID364856705.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID249042826.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID332742639.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1680597197.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1421714468.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID905397692.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1782509721.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID141370843.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2056982009.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID94564238.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID8209776.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID908524512.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID610397481.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID750820644.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1515990019.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1547945326.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID587125778.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1620371305.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1474775613.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID545360459.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1783499590.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1249094008.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1525817840.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID227847873.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1052620238.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1888700589.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID2052442675.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID963903358.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1121692672.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1343327476.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID1667778338.jpg\n/kaggle/input/competitions/csiro-biomass/train/ID257822026.jpg\n","output_type":"stream"}],"execution_count":163},{"cell_type":"code","source":"import pandas as pd\n\ntrain_long = pd.read_csv('/kaggle/input/competitions/csiro-biomass/train.csv')\nprint(train_long.shape)\ntrain_long.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:25.326192Z","iopub.execute_input":"2026-04-24T12:53:25.326422Z","iopub.status.idle":"2026-04-24T12:53:25.34393Z","shell.execute_reply.started":"2026-04-24T12:53:25.326399Z","shell.execute_reply":"2026-04-24T12:53:25.343208Z"}},"outputs":[{"name":"stdout","text":"(1785, 9)\n","output_type":"stream"},{"execution_count":164,"output_type":"execute_result","data":{"text/plain":"                    sample_id              image_path Sampling_Date State  \\\n0  ID1011485656__Dry_Clover_g  train/ID1011485656.jpg      2015/9/4   Tas   \n1    ID1011485656__Dry_Dead_g  train/ID1011485656.jpg      2015/9/4   Tas   \n2   ID1011485656__Dry_Green_g  train/ID1011485656.jpg      2015/9/4   Tas   \n3   ID1011485656__Dry_Total_g  train/ID1011485656.jpg      2015/9/4   Tas   \n4         ID1011485656__GDM_g  train/ID1011485656.jpg      2015/9/4   Tas   \n\n           Species  Pre_GSHH_NDVI  Height_Ave_cm   target_name   target  \n0  Ryegrass_Clover           0.62         4.6667  Dry_Clover_g   0.0000  \n1  Ryegrass_Clover           0.62         4.6667    Dry_Dead_g  31.9984  \n2  Ryegrass_Clover           0.62         4.6667   Dry_Green_g  16.2751  \n3  Ryegrass_Clover           0.62         4.6667   Dry_Total_g  48.2735  \n4  Ryegrass_Clover           0.62         4.6667         GDM_g  16.2750  ","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>sample_id</th>\n      <th>image_path</th>\n      <th>Sampling_Date</th>\n      <th>State</th>\n      <th>Species</th>\n      <th>Pre_GSHH_NDVI</th>\n      <th>Height_Ave_cm</th>\n      <th>target_name</th>\n      <th>target</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>ID1011485656__Dry_Clover_g</td>\n      <td>train/ID1011485656.jpg</td>\n      <td>2015/9/4</td>\n      <td>Tas</td>\n      <td>Ryegrass_Clover</td>\n      <td>0.62</td>\n      <td>4.6667</td>\n      <td>Dry_Clover_g</td>\n      <td>0.0000</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>ID1011485656__Dry_Dead_g</td>\n      <td>train/ID1011485656.jpg</td>\n      <td>2015/9/4</td>\n      <td>Tas</td>\n      <td>Ryegrass_Clover</td>\n      <td>0.62</td>\n      <td>4.6667</td>\n      <td>Dry_Dead_g</td>\n      <td>31.9984</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>ID1011485656__Dry_Green_g</td>\n      <td>train/ID1011485656.jpg</td>\n      <td>2015/9/4</td>\n      <td>Tas</td>\n      <td>Ryegrass_Clover</td>\n      <td>0.62</td>\n      <td>4.6667</td>\n      <td>Dry_Green_g</td>\n      <td>16.2751</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>ID1011485656__Dry_Total_g</td>\n      <td>train/ID1011485656.jpg</td>\n      <td>2015/9/4</td>\n      <td>Tas</td>\n      <td>Ryegrass_Clover</td>\n      <td>0.62</td>\n      <td>4.6667</td>\n      <td>Dry_Total_g</td>\n      <td>48.2735</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>ID1011485656__GDM_g</td>\n      <td>train/ID1011485656.jpg</td>\n      <td>2015/9/4</td>\n      <td>Tas</td>\n      <td>Ryegrass_Clover</td>\n      <td>0.62</td>\n      <td>4.6667</td>\n      <td>GDM_g</td>\n      <td>16.2750</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}],"execution_count":164},{"cell_type":"code","source":"\nprint(train_long.columns.tolist())\nprint(train_long['target_name'].value_counts())\nprint(train_long.head(10))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:25.344845Z","iopub.execute_input":"2026-04-24T12:53:25.345096Z","iopub.status.idle":"2026-04-24T12:53:25.357386Z","shell.execute_reply.started":"2026-04-24T12:53:25.345066Z","shell.execute_reply":"2026-04-24T12:53:25.356766Z"}},"outputs":[{"name":"stdout","text":"['sample_id', 'image_path', 'Sampling_Date', 'State', 'Species', 'Pre_GSHH_NDVI', 'Height_Ave_cm', 'target_name', 'target']\ntarget_name\nDry_Clover_g    357\nDry_Dead_g      357\nDry_Green_g     357\nDry_Total_g     357\nGDM_g           357\nName: count, dtype: int64\n                    sample_id              image_path Sampling_Date State  \\\n0  ID1011485656__Dry_Clover_g  train/ID1011485656.jpg      2015/9/4   Tas   \n1    ID1011485656__Dry_Dead_g  train/ID1011485656.jpg      2015/9/4   Tas   \n2   ID1011485656__Dry_Green_g  train/ID1011485656.jpg      2015/9/4   Tas   \n3   ID1011485656__Dry_Total_g  train/ID1011485656.jpg      2015/9/4   Tas   \n4         ID1011485656__GDM_g  train/ID1011485656.jpg      2015/9/4   Tas   \n5  ID1012260530__Dry_Clover_g  train/ID1012260530.jpg      2015/4/1   NSW   \n6    ID1012260530__Dry_Dead_g  train/ID1012260530.jpg      2015/4/1   NSW   \n7   ID1012260530__Dry_Green_g  train/ID1012260530.jpg      2015/4/1   NSW   \n8   ID1012260530__Dry_Total_g  train/ID1012260530.jpg      2015/4/1   NSW   \n9         ID1012260530__GDM_g  train/ID1012260530.jpg      2015/4/1   NSW   \n\n           Species  Pre_GSHH_NDVI  Height_Ave_cm   target_name   target  \n0  Ryegrass_Clover           0.62         4.6667  Dry_Clover_g   0.0000  \n1  Ryegrass_Clover           0.62         4.6667    Dry_Dead_g  31.9984  \n2  Ryegrass_Clover           0.62         4.6667   Dry_Green_g  16.2751  \n3  Ryegrass_Clover           0.62         4.6667   Dry_Total_g  48.2735  \n4  Ryegrass_Clover           0.62         4.6667         GDM_g  16.2750  \n5          Lucerne           0.55        16.0000  Dry_Clover_g   0.0000  \n6          Lucerne           0.55        16.0000    Dry_Dead_g   0.0000  \n7          Lucerne           0.55        16.0000   Dry_Green_g   7.6000  \n8          Lucerne           0.55        16.0000   Dry_Total_g   7.6000  \n9          Lucerne           0.55        16.0000         GDM_g   7.6000  \n","output_type":"stream"}],"execution_count":165},{"cell_type":"code","source":"\nprint(train_long['image_path'].head(10).tolist())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:25.358894Z","iopub.execute_input":"2026-04-24T12:53:25.359091Z","iopub.status.idle":"2026-04-24T12:53:25.37247Z","shell.execute_reply.started":"2026-04-24T12:53:25.35907Z","shell.execute_reply":"2026-04-24T12:53:25.371394Z"}},"outputs":[{"name":"stdout","text":"['train/ID1011485656.jpg', 'train/ID1011485656.jpg', 'train/ID1011485656.jpg', 'train/ID1011485656.jpg', 'train/ID1011485656.jpg', 'train/ID1012260530.jpg', 'train/ID1012260530.jpg', 'train/ID1012260530.jpg', 'train/ID1012260530.jpg', 'train/ID1012260530.jpg']\n","output_type":"stream"}],"execution_count":166},{"cell_type":"code","source":"\nmeta_cols = [\n    'image_path',\n    'Sampling_Date',\n    'State',\n    'Species',\n    'Pre_GSHH_NDVI',\n    'Height_Ave_cm'\n]\n\ndf_wide = train_long.pivot_table(\n    index=meta_cols,\n    columns='target_name',\n    values='target',\n    aggfunc='first'\n).reset_index()\n\ndf_wide.columns.name = None\n\nprint(df_wide.shape)\ndf_wide.head()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:25.373484Z","iopub.execute_input":"2026-04-24T12:53:25.373769Z","iopub.status.idle":"2026-04-24T12:53:25.405676Z","shell.execute_reply.started":"2026-04-24T12:53:25.373746Z","shell.execute_reply":"2026-04-24T12:53:25.405042Z"}},"outputs":[{"name":"stdout","text":"(357, 11)\n","output_type":"stream"},{"execution_count":167,"output_type":"execute_result","data":{"text/plain":"               image_path Sampling_Date State            Species  \\\n0  train/ID1011485656.jpg      2015/9/4   Tas    Ryegrass_Clover   \n1  train/ID1012260530.jpg      2015/4/1   NSW            Lucerne   \n2  train/ID1025234388.jpg      2015/9/1    WA  SubcloverDalkeith   \n3  train/ID1028611175.jpg     2015/5/18   Tas           Ryegrass   \n4  train/ID1035947949.jpg     2015/9/11   Tas           Ryegrass   \n\n   Pre_GSHH_NDVI  Height_Ave_cm  Dry_Clover_g  Dry_Dead_g  Dry_Green_g  \\\n0           0.62         4.6667        0.0000     31.9984      16.2751   \n1           0.55        16.0000        0.0000      0.0000       7.6000   \n2           0.38         1.0000        6.0500      0.0000       0.0000   \n3           0.66         5.0000        0.0000     30.9703      24.2376   \n4           0.54         3.5000        0.4343     23.2239      10.5261   \n\n   Dry_Total_g    GDM_g  \n0      48.2735  16.2750  \n1       7.6000   7.6000  \n2       6.0500   6.0500  \n3      55.2079  24.2376  \n4      34.1844  10.9605  ","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>image_path</th>\n      <th>Sampling_Date</th>\n      <th>State</th>\n      <th>Species</th>\n      <th>Pre_GSHH_NDVI</th>\n      <th>Height_Ave_cm</th>\n      <th>Dry_Clover_g</th>\n      <th>Dry_Dead_g</th>\n      <th>Dry_Green_g</th>\n      <th>Dry_Total_g</th>\n      <th>GDM_g</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>train/ID1011485656.jpg</td>\n      <td>2015/9/4</td>\n      <td>Tas</td>\n      <td>Ryegrass_Clover</td>\n      <td>0.62</td>\n      <td>4.6667</td>\n      <td>0.0000</td>\n      <td>31.9984</td>\n      <td>16.2751</td>\n      <td>48.2735</td>\n      <td>16.2750</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>train/ID1012260530.jpg</td>\n      <td>2015/4/1</td>\n      <td>NSW</td>\n      <td>Lucerne</td>\n      <td>0.55</td>\n      <td>16.0000</td>\n      <td>0.0000</td>\n      <td>0.0000</td>\n      <td>7.6000</td>\n      <td>7.6000</td>\n      <td>7.6000</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>train/ID1025234388.jpg</td>\n      <td>2015/9/1</td>\n      <td>WA</td>\n      <td>SubcloverDalkeith</td>\n      <td>0.38</td>\n      <td>1.0000</td>\n      <td>6.0500</td>\n      <td>0.0000</td>\n      <td>0.0000</td>\n      <td>6.0500</td>\n      <td>6.0500</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>train/ID1028611175.jpg</td>\n      <td>2015/5/18</td>\n      <td>Tas</td>\n      <td>Ryegrass</td>\n      <td>0.66</td>\n      <td>5.0000</td>\n      <td>0.0000</td>\n      <td>30.9703</td>\n      <td>24.2376</td>\n      <td>55.2079</td>\n      <td>24.2376</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>train/ID1035947949.jpg</td>\n      <td>2015/9/11</td>\n      <td>Tas</td>\n      <td>Ryegrass</td>\n      <td>0.54</td>\n      <td>3.5000</td>\n      <td>0.4343</td>\n      <td>23.2239</td>\n      <td>10.5261</td>\n      <td>34.1844</td>\n      <td>10.9605</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}],"execution_count":167},{"cell_type":"code","source":"\nTARGET_COLS = [\n    'Dry_Green_g',\n    'Dry_Dead_g',\n    'Dry_Clover_g',\n    'GDM_g',\n    'Dry_Total_g'\n]\n\nprint(df_wide[TARGET_COLS].head())\nprint(df_wide[TARGET_COLS].isnull().sum())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:25.406441Z","iopub.execute_input":"2026-04-24T12:53:25.406705Z","iopub.status.idle":"2026-04-24T12:53:25.414385Z","shell.execute_reply.started":"2026-04-24T12:53:25.406676Z","shell.execute_reply":"2026-04-24T12:53:25.413704Z"}},"outputs":[{"name":"stdout","text":"   Dry_Green_g  Dry_Dead_g  Dry_Clover_g    GDM_g  Dry_Total_g\n0      16.2751     31.9984        0.0000  16.2750      48.2735\n1       7.6000      0.0000        0.0000   7.6000       7.6000\n2       0.0000      0.0000        6.0500   6.0500       6.0500\n3      24.2376     30.9703        0.0000  24.2376      55.2079\n4      10.5261     23.2239        0.4343  10.9605      34.1844\nDry_Green_g     0\nDry_Dead_g      0\nDry_Clover_g    0\nGDM_g           0\nDry_Total_g     0\ndtype: int64\n","output_type":"stream"}],"execution_count":168},{"cell_type":"code","source":"\nprint(train_long['image_path'].head(10).tolist())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:25.415194Z","iopub.execute_input":"2026-04-24T12:53:25.415443Z","iopub.status.idle":"2026-04-24T12:53:25.43629Z","shell.execute_reply.started":"2026-04-24T12:53:25.415414Z","shell.execute_reply":"2026-04-24T12:53:25.435647Z"}},"outputs":[{"name":"stdout","text":"['train/ID1011485656.jpg', 'train/ID1011485656.jpg', 'train/ID1011485656.jpg', 'train/ID1011485656.jpg', 'train/ID1011485656.jpg', 'train/ID1012260530.jpg', 'train/ID1012260530.jpg', 'train/ID1012260530.jpg', 'train/ID1012260530.jpg', 'train/ID1012260530.jpg']\n","output_type":"stream"}],"execution_count":169},{"cell_type":"code","source":"\nBASE_IMAGE_DIR = '/kaggle/input/competitions/csiro-biomass'\ndf_wide['image_path'] = df_wide['image_path'].apply(lambda x: os.path.join(BASE_IMAGE_DIR, x))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:25.437113Z","iopub.execute_input":"2026-04-24T12:53:25.437302Z","iopub.status.idle":"2026-04-24T12:53:25.454347Z","shell.execute_reply.started":"2026-04-24T12:53:25.437281Z","shell.execute_reply":"2026-04-24T12:53:25.453609Z"}},"outputs":[],"execution_count":170},{"cell_type":"code","source":"\nfrom PIL import Image\n\nsample_path = df_wide.iloc[0]['image_path']\nprint(sample_path)\n\nimg = Image.open(sample_path)\nprint(img.size, img.mode)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:25.455129Z","iopub.execute_input":"2026-04-24T12:53:25.45533Z","iopub.status.idle":"2026-04-24T12:53:25.476364Z","shell.execute_reply.started":"2026-04-24T12:53:25.455307Z","shell.execute_reply":"2026-04-24T12:53:25.475261Z"}},"outputs":[{"name":"stdout","text":"/kaggle/input/competitions/csiro-biomass/train/ID1011485656.jpg\n(2000, 1000) RGB\n","output_type":"stream"}],"execution_count":171},{"cell_type":"code","source":"\n!pip install timm albumentations --quiet\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:25.479254Z","iopub.execute_input":"2026-04-24T12:53:25.479536Z","iopub.status.idle":"2026-04-24T12:53:28.564927Z","shell.execute_reply.started":"2026-04-24T12:53:25.479515Z","shell.execute_reply":"2026-04-24T12:53:28.564151Z"}},"outputs":[],"execution_count":172},{"cell_type":"code","source":"\nimport random\nimport numpy as np\n\nimport torch\nimport torch.nn as nn\nfrom torch.utils.data import Dataset, DataLoader\n\nfrom sklearn.model_selection import train_test_split\n\nimport timm\n\nimport albumentations as A\nfrom albumentations.pytorch import ToTensorV2\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:28.565873Z","iopub.execute_input":"2026-04-24T12:53:28.566057Z","iopub.status.idle":"2026-04-24T12:53:28.570779Z","shell.execute_reply.started":"2026-04-24T12:53:28.566034Z","shell.execute_reply":"2026-04-24T12:53:28.56994Z"}},"outputs":[],"execution_count":173},{"cell_type":"code","source":"\ndef seed_everything(seed=42):\n    random.seed(seed)\n    np.random.seed(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed_all(seed)\n\nseed_everything(42)\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(device)\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:28.571739Z","iopub.execute_input":"2026-04-24T12:53:28.571957Z","iopub.status.idle":"2026-04-24T12:53:28.591446Z","shell.execute_reply.started":"2026-04-24T12:53:28.571934Z","shell.execute_reply":"2026-04-24T12:53:28.590734Z"}},"outputs":[{"name":"stdout","text":"cpu\n","output_type":"stream"}],"execution_count":174},{"cell_type":"code","source":"\nTARGET_WEIGHTS = np.array([0.1, 0.1, 0.1, 0.2, 0.5], dtype=np.float32)\n\nIMG_SIZE = 224\nBATCH_SIZE = 32\nLR = 1e-4\nEPOCHS = 5\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:28.592385Z","iopub.execute_input":"2026-04-24T12:53:28.592669Z","iopub.status.idle":"2026-04-24T12:53:28.6095Z","shell.execute_reply.started":"2026-04-24T12:53:28.592622Z","shell.execute_reply":"2026-04-24T12:53:28.608805Z"}},"outputs":[],"execution_count":175},{"cell_type":"code","source":"\ntrain_df, val_df = train_test_split(\n    df_wide,\n    test_size=0.2,\n    random_state=42\n)\n\nprint('train:', len(train_df))\nprint('val:', len(val_df))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:28.610377Z","iopub.execute_input":"2026-04-24T12:53:28.610588Z","iopub.status.idle":"2026-04-24T12:53:28.63202Z","shell.execute_reply.started":"2026-04-24T12:53:28.610567Z","shell.execute_reply":"2026-04-24T12:53:28.630979Z"}},"outputs":[{"name":"stdout","text":"train: 285\nval: 72\n","output_type":"stream"}],"execution_count":176},{"cell_type":"code","source":"train_transforms = A.Compose([\n    A.Resize(IMG_SIZE, IMG_SIZE),\n    A.HorizontalFlip(p=0.5),\n    A.VerticalFlip(p=0.5),\n    A.RandomRotate90(p=0.5),\n    A.RandomBrightnessContrast(p=0.3),\n    A.Normalize(mean=(0.485, 0.456, 0.406),\n                std=(0.229, 0.224, 0.225)),\n    ToTensorV2(),\n])\n\nval_transforms = A.Compose([\n    A.Resize(IMG_SIZE, IMG_SIZE),\n    A.Normalize(mean=(0.485, 0.456, 0.406),\n                std=(0.229, 0.224, 0.225)),\n    ToTensorV2(),\n])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:28.632959Z","iopub.execute_input":"2026-04-24T12:53:28.633191Z","iopub.status.idle":"2026-04-24T12:53:28.653588Z","shell.execute_reply.started":"2026-04-24T12:53:28.633159Z","shell.execute_reply":"2026-04-24T12:53:28.652706Z"}},"outputs":[],"execution_count":177},{"cell_type":"code","source":"class BiomassDataset(Dataset):\n    def __init__(self, df, transforms=None):\n        self.df = df.reset_index(drop=True)\n        self.transforms = transforms\n\n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, idx):\n        row = self.df.iloc[idx]\n\n        image = np.array(Image.open(row['image_path']).convert('RGB'))\n\n        if self.transforms is not None:\n            image = self.transforms(image=image)['image']\n\n        targets = torch.tensor(\n            np.log1p(row[TARGET_COLS].values.astype(np.float32)),\n            dtype=torch.float32\n        )\n\n        return image, targets","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:28.654505Z","iopub.execute_input":"2026-04-24T12:53:28.654783Z","iopub.status.idle":"2026-04-24T12:53:28.672342Z","shell.execute_reply.started":"2026-04-24T12:53:28.654755Z","shell.execute_reply":"2026-04-24T12:53:28.671104Z"}},"outputs":[],"execution_count":178},{"cell_type":"code","source":"train_dataset = BiomassDataset(train_df, transforms=train_transforms)\nval_dataset = BiomassDataset(val_df, transforms=val_transforms)\n\ntrain_loader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=2)\nval_loader = DataLoader(val_dataset, batch_size=BATCH_SIZE, shuffle=False, num_workers=2)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:28.673347Z","iopub.execute_input":"2026-04-24T12:53:28.673594Z","iopub.status.idle":"2026-04-24T12:53:28.710231Z","shell.execute_reply.started":"2026-04-24T12:53:28.673567Z","shell.execute_reply":"2026-04-24T12:53:28.709396Z"}},"outputs":[],"execution_count":179},{"cell_type":"code","source":"images, targets = next(iter(train_loader))\nprint(images.shape)\nprint(targets.shape)\nprint(targets[:2])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:28.71097Z","iopub.execute_input":"2026-04-24T12:53:28.71113Z","iopub.status.idle":"2026-04-24T12:53:31.425075Z","shell.execute_reply.started":"2026-04-24T12:53:28.711111Z","shell.execute_reply":"2026-04-24T12:53:31.424077Z"}},"outputs":[{"name":"stdout","text":"torch.Size([32, 3, 224, 224])\ntorch.Size([32, 5])\ntensor([[3.5134, 2.9252, 0.0000, 3.5134, 3.9357],\n        [3.0477, 1.3524, 1.3524, 3.1753, 3.2884]])\n","output_type":"stream"}],"execution_count":180},{"cell_type":"code","source":"model = timm.create_model(\n    'resnet18',\n    pretrained=True,\n    num_classes=5\n)\n\nmodel = model.to(device)\nprint(type(model))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:31.426196Z","iopub.execute_input":"2026-04-24T12:53:31.426426Z","iopub.status.idle":"2026-04-24T12:53:31.777781Z","shell.execute_reply.started":"2026-04-24T12:53:31.426401Z","shell.execute_reply":"2026-04-24T12:53:31.776901Z"}},"outputs":[{"name":"stdout","text":"<class 'timm.models.resnet.ResNet'>\n","output_type":"stream"}],"execution_count":181},{"cell_type":"code","source":"class WeightedSmoothL1Loss(nn.Module):\n    def __init__(self, weights):\n        super().__init__()\n        self.weights = torch.tensor(weights, dtype=torch.float32)\n        self.loss_fn = nn.SmoothL1Loss(reduction='none')\n\n    def forward(self, preds, targets):\n        weights = self.weights.to(preds.device)\n        loss = self.loss_fn(preds, targets)\n        loss = loss * weights\n        return loss.mean()\n\n\n\ncriterion = WeightedSmoothL1Loss(TARGET_WEIGHTS)\noptimizer = torch.optim.AdamW(model.parameters(), lr=LR, weight_decay=1e-4)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:31.77862Z","iopub.execute_input":"2026-04-24T12:53:31.778859Z","iopub.status.idle":"2026-04-24T12:53:31.798052Z","shell.execute_reply.started":"2026-04-24T12:53:31.778837Z","shell.execute_reply":"2026-04-24T12:53:31.797179Z"}},"outputs":[],"execution_count":182},{"cell_type":"code","source":"def weighted_r2_score(y_true, y_pred, weights):\n    y_true = np.asarray(y_true)\n    y_pred = np.asarray(y_pred)\n    weights = np.asarray(weights)\n\n    y_true_flat = y_true.reshape(-1)\n    y_pred_flat = y_pred.reshape(-1)\n    repeated_weights = np.tile(weights, y_true.shape[0])\n\n    y_mean = np.sum(repeated_weights * y_true_flat) / np.sum(repeated_weights)\n    ss_res = np.sum(repeated_weights * (y_true_flat - y_pred_flat) ** 2)\n    ss_tot = np.sum(repeated_weights * (y_true_flat - y_mean) ** 2)\n\n    return 1.0 - ss_res / ss_tot","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:31.799489Z","iopub.execute_input":"2026-04-24T12:53:31.799867Z","iopub.status.idle":"2026-04-24T12:53:31.804989Z","shell.execute_reply.started":"2026-04-24T12:53:31.79983Z","shell.execute_reply":"2026-04-24T12:53:31.804373Z"}},"outputs":[],"execution_count":183},{"cell_type":"code","source":"def train_one_epoch(model, loader, optimizer, criterion, device):\n    model.train()\n    running_loss = 0.0\n\n    for images, targets in loader:\n        images = images.to(device)\n        targets = targets.to(device)\n\n        optimizer.zero_grad()\n        preds = model(images)\n        loss = criterion(preds, targets)\n        loss.backward()\n        optimizer.step()\n\n        running_loss += loss.item() * images.size(0)\n\n    return running_loss / len(loader.dataset)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:31.805765Z","iopub.execute_input":"2026-04-24T12:53:31.805972Z","iopub.status.idle":"2026-04-24T12:53:31.825965Z","shell.execute_reply.started":"2026-04-24T12:53:31.805952Z","shell.execute_reply":"2026-04-24T12:53:31.824985Z"}},"outputs":[],"execution_count":184},{"cell_type":"code","source":"\ndef validate(model, loader, criterion, device, weights):\n    model.eval()\n    running_loss = 0.0\n    all_targets = []\n    all_preds = []\n\n    with torch.no_grad():\n        for images, targets in loader:\n            images = images.to(device)\n            targets = targets.to(device)\n\n            preds = model(images)\n            loss = criterion(preds, targets)\n\n            running_loss += loss.item() * images.size(0)\n\n            preds_real = torch.expm1(preds)\n            targets_real = torch.expm1(targets)\n\n            all_targets.append(targets_real.cpu().numpy())\n            all_preds.append(preds_real.cpu().numpy())\n\n    val_loss = running_loss / len(loader.dataset)\n    all_targets = np.concatenate(all_targets, axis=0)\n    all_preds = np.concatenate(all_preds, axis=0)\n\n    val_r2 = weighted_r2_score(all_targets, all_preds, weights)\n\n    return val_loss, val_r2\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:31.82698Z","iopub.execute_input":"2026-04-24T12:53:31.82725Z","iopub.status.idle":"2026-04-24T12:53:31.837762Z","shell.execute_reply.started":"2026-04-24T12:53:31.827223Z","shell.execute_reply":"2026-04-24T12:53:31.836962Z"}},"outputs":[],"execution_count":185},{"cell_type":"code","source":"history = []\nbest_r2 = -999\n\nfor epoch in range(EPOCHS):\n    train_loss = train_one_epoch(model, train_loader, optimizer, criterion, device)\n    val_loss, val_r2 = validate(model, val_loader, criterion, device, TARGET_WEIGHTS)\n\n    history.append({\n        'epoch': epoch + 1,\n        'train_loss': train_loss,\n        'val_loss': val_loss,\n        'val_weighted_r2': val_r2\n    })\n\n    print(f'Epoch {epoch+1}/{EPOCHS}')\n    print(f'train_loss = {train_loss:.5f}')\n    print(f'val_loss   = {val_loss:.5f}')\n    print(f'val_wR2    = {val_r2:.5f}')\n    print('------------------------------')\n\n    if val_r2 > best_r2:\n        best_r2 = val_r2\n        torch.save(model.state_dict(), 'best_resnet18_baseline.pth')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:53:31.839037Z","iopub.execute_input":"2026-04-24T12:53:31.839352Z","iopub.status.idle":"2026-04-24T12:56:22.004533Z","shell.execute_reply.started":"2026-04-24T12:53:31.839319Z","shell.execute_reply":"2026-04-24T12:56:22.003731Z"}},"outputs":[{"name":"stdout","text":"Epoch 1/5\ntrain_loss = 0.51999\nval_loss   = 0.51554\nval_wR2    = -1.64890\n------------------------------\nEpoch 2/5\ntrain_loss = 0.49857\nval_loss   = 0.49429\nval_wR2    = -1.63489\n------------------------------\nEpoch 3/5\ntrain_loss = 0.47728\nval_loss   = 0.47094\nval_wR2    = -1.61827\n------------------------------\nEpoch 4/5\ntrain_loss = 0.45410\nval_loss   = 0.44217\nval_wR2    = -1.59446\n------------------------------\nEpoch 5/5\ntrain_loss = 0.42935\nval_loss   = 0.40797\nval_wR2    = -1.56032\n------------------------------\n","output_type":"stream"}],"execution_count":186},{"cell_type":"code","source":"\nhistory_df = pd.DataFrame(history)\nhistory_df.to_csv('resnet18_baseline_history.csv', index=False)\nprint(history_df)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:56:22.005558Z","iopub.execute_input":"2026-04-24T12:56:22.005862Z","iopub.status.idle":"2026-04-24T12:56:22.01424Z","shell.execute_reply.started":"2026-04-24T12:56:22.005828Z","shell.execute_reply":"2026-04-24T12:56:22.013479Z"}},"outputs":[{"name":"stdout","text":"   epoch  train_loss  val_loss  val_weighted_r2\n0      1    0.519988  0.515537        -1.648904\n1      2    0.498565  0.494286        -1.634895\n2      3    0.477281  0.470937        -1.618271\n3      4    0.454104  0.442166        -1.594463\n4      5    0.429346  0.407972        -1.560322\n","output_type":"stream"}],"execution_count":187},{"cell_type":"code","source":"\nprint(df_wide[TARGET_COLS].describe())\n\nprint(df_wide[TARGET_COLS].min())\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:56:22.017087Z","iopub.execute_input":"2026-04-24T12:56:22.017319Z","iopub.status.idle":"2026-04-24T12:56:22.043255Z","shell.execute_reply.started":"2026-04-24T12:56:22.017289Z","shell.execute_reply":"2026-04-24T12:56:22.042229Z"}},"outputs":[{"name":"stdout","text":"       Dry_Green_g  Dry_Dead_g  Dry_Clover_g       GDM_g  Dry_Total_g\ncount   357.000000  357.000000    357.000000  357.000000   357.000000\nmean     26.624722   12.044548      6.649692   33.274414    45.318097\nstd      25.401232   12.402007     12.117761   24.935822    27.984015\nmin       0.000000    0.000000      0.000000    1.040000     1.040000\n25%       8.800000    3.200000      0.000000   16.026100    25.271500\n50%      20.800000    7.980900      1.423500   27.108200    40.300000\n75%      35.083400   17.637800      7.242900   43.675700    57.880000\nmax     157.983600   83.840700     71.786500  157.983600   185.700000\nDry_Green_g     0.00\nDry_Dead_g      0.00\nDry_Clover_g    0.00\nGDM_g           1.04\nDry_Total_g     1.04\ndtype: float64\n","output_type":"stream"}],"execution_count":188},{"cell_type":"code","source":"mean_targets = train_df[TARGET_COLS].mean().values\nval_true = val_df[TARGET_COLS].values\nval_pred_mean = np.tile(mean_targets, (len(val_df), 1))\n\nbaseline_r2 = weighted_r2_score(val_true, val_pred_mean, TARGET_WEIGHTS)\nprint(\"Mean baseline weighted R2:\", baseline_r2)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:56:22.044114Z","iopub.execute_input":"2026-04-24T12:56:22.044357Z","iopub.status.idle":"2026-04-24T12:56:22.051256Z","shell.execute_reply.started":"2026-04-24T12:56:22.044335Z","shell.execute_reply":"2026-04-24T12:56:22.050482Z"}},"outputs":[{"name":"stdout","text":"Mean baseline weighted R2: 0.2591984593284523\n","output_type":"stream"}],"execution_count":189},{"cell_type":"code","source":"\nprint(\"unique image_path:\", df_wide['image_path'].nunique())\nprint(\"rows in df_wide:\", len(df_wide))\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-04-24T12:56:22.052565Z","iopub.execute_input":"2026-04-24T12:56:22.052778Z","iopub.status.idle":"2026-04-24T12:56:22.070473Z","shell.execute_reply.started":"2026-04-24T12:56:22.052759Z","shell.execute_reply":"2026-04-24T12:56:22.069784Z"}},"outputs":[{"name":"stdout","text":"unique image_path: 357\nrows in df_wide: 357\n","output_type":"stream"}],"execution_count":190}]}