{"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":"none","dataSources":[{"sourceId":112509,"databundleVersionId":14254895,"sourceType":"competition"}],"dockerImageVersionId":31192,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# Import Packages","metadata":{}},{"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport joblib\nimport shutil\nimport cv2\nimport random","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-13T00:13:54.698508Z","iopub.execute_input":"2025-12-13T00:13:54.698991Z","iopub.status.idle":"2025-12-13T00:13:57.066908Z","shell.execute_reply.started":"2025-12-13T00:13:54.698967Z","shell.execute_reply":"2025-12-13T00:13:57.066129Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Import Data","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv('/kaggle/input/csiro-biomass/train.csv')\ntargets = train['target_name'].unique()\nprint(f'Targets: {targets}')\ntrain.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-13T00:13:57.068361Z","iopub.execute_input":"2025-12-13T00:13:57.068773Z","iopub.status.idle":"2025-12-13T00:13:57.130285Z","shell.execute_reply.started":"2025-12-13T00:13:57.068750Z","shell.execute_reply":"2025-12-13T00:13:57.129455Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Data Augmentation","metadata":{}},{"cell_type":"code","source":"train_dir = '/kaggle/input/csiro-biomass/train'\nprint(f'Starting with {len(os.listdir(train_dir))} training images')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-13T00:13:57.131374Z","iopub.execute_input":"2025-12-13T00:13:57.131695Z","iopub.status.idle":"2025-12-13T00:13:57.143254Z","shell.execute_reply.started":"2025-12-13T00:13:57.131673Z","shell.execute_reply":"2025-12-13T00:13:57.142420Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"aug_folder_name = 'augmented_images'\naug_folder = '/kaggle/working/augmented_images/'\n\n# Create the destination folder for augmented images if it doesn't exist\nif not os.path.exists(aug_folder):\n    os.makedirs(aug_folder)\n\n# copy all images from train data\nfor filename in os.listdir(train_dir):\n    path = os.path.join(train_dir,filename)\n    shutil.copy(path, aug_folder)\n\nprint(f'Copied {len(os.listdir(aug_folder))} images to new folder')","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-13T00:13:57.144292Z","iopub.execute_input":"2025-12-13T00:13:57.144605Z","iopub.status.idle":"2025-12-13T00:14:09.094218Z","shell.execute_reply.started":"2025-12-13T00:13:57.144584Z","shell.execute_reply":"2025-12-13T00:14:09.093365Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for og_filename in os.listdir(train_dir):\n\n    # 0. Load Image\n    og_path = os.path.join(train_dir, og_filename)\n    img = cv2.imread(og_path) \n    base_name = os.path.splitext(og_filename)[0]\n    ext = os.path.splitext(og_filename)[1]\n    \n    # 1. Horizontal Flip (OpenCV flip code 1)\n    h_flip_img = cv2.flip(img, 1)\n    h_flip_path = os.path.join(aug_folder, f\"{base_name}_aug_h_flip{ext}\")\n    cv2.imwrite(h_flip_path, h_flip_img)\n\n    # 2. Vertical Flip (OpenCV flip code 0)\n    v_flip_img = cv2.flip(img, 0)\n    v_flip_path = os.path.join(aug_folder, f\"{base_name}_aug_v_flip{ext}\")\n    cv2.imwrite(v_flip_path, v_flip_img)\n\n    # 3. Random Brightness Change (20% darker to 20% brighter)\n    brightness_factor = random.uniform(0.8, 1.2)\n    brightness_img = np.clip(img * brightness_factor, 0, 255).astype(np.uint8)\n    brightness_path = os.path.join(aug_folder, f\"{base_name}_aug_brightness{ext}\")\n    cv2.imwrite(brightness_path, brightness_img)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-13T00:14:56.486266Z","iopub.execute_input":"2025-12-13T00:14:56.487147Z","iopub.status.idle":"2025-12-13T00:15:44.281457Z","shell.execute_reply.started":"2025-12-13T00:14:56.487108Z","shell.execute_reply":"2025-12-13T00:15:44.280628Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"new_sample_id_list = []\nnew_image_path_list = []\nimg_type_list = []\naug_func_list = []\n\nfor filename in os.listdir(aug_folder):\n    image_path = os.path.join(aug_folder_name, filename)\n    \n    if '_' in filename:\n        index = filename.find('_')\n        img_id = filename[:index]\n        img_type = 'Aug'\n        aug_func = os.path.splitext(filename)[0][index+5:]\n    else:\n        img_id = os.path.splitext(filename)[0]\n        img_type = 'OG'\n        aug_func = 'No_Aug'\n\n    for t in targets:\n        sample_id = img_id + \"__\" + t\n    \n        new_sample_id_list.append(sample_id)\n        new_image_path_list.append(image_path)\n        img_type_list.append(img_type)\n        aug_func_list.append(aug_func)\n\ntrain_df_aug = pd.DataFrame(data={'sample_id':new_sample_id_list,\n                                  'img_type':img_type_list,\n                                  'aug_func':aug_func_list, \n                                  'image_path':new_image_path_list})","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-13T00:15:44.289984Z","iopub.execute_input":"2025-12-13T00:15:44.290917Z","iopub.status.idle":"2025-12-13T00:15:44.321649Z","shell.execute_reply.started":"2025-12-13T00:15:44.290893Z","shell.execute_reply":"2025-12-13T00:15:44.320669Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# add info from train df\ntrain_aug = pd.merge(train_df_aug, train, on='sample_id', how='left')\ntrain_aug.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-13T00:15:44.323840Z","iopub.execute_input":"2025-12-13T00:15:44.324150Z","iopub.status.idle":"2025-12-13T00:15:44.353986Z","shell.execute_reply.started":"2025-12-13T00:15:44.324125Z","shell.execute_reply":"2025-12-13T00:15:44.353217Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_aug = train_aug.rename(columns={'image_path_x': 'image_path', 'image_path_y': 'image_path_og'})\ntrain_aug.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-13T00:15:44.354793Z","iopub.execute_input":"2025-12-13T00:15:44.355025Z","iopub.status.idle":"2025-12-13T00:15:44.361922Z","shell.execute_reply.started":"2025-12-13T00:15:44.355006Z","shell.execute_reply":"2025-12-13T00:15:44.360980Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# Export Augmented Dataset","metadata":{}},{"cell_type":"code","source":"train_aug.to_csv('train_aug.csv', index=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-12-13T00:15:44.362965Z","iopub.execute_input":"2025-12-13T00:15:44.363614Z","iopub.status.idle":"2025-12-13T00:15:44.430570Z","shell.execute_reply.started":"2025-12-13T00:15:44.363585Z","shell.execute_reply":"2025-12-13T00:15:44.429534Z"}},"outputs":[],"execution_count":null}]}