{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"toc_visible":true,"authorship_tag":"ABX9TyOMs9KjExsBYIvDLyFNvPnK"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["# Importing libaries"],"metadata":{"id":"uWjrvQ8gKv_E"}},{"cell_type":"code","source":["import os\n","import pandas as pd\n","import shutil\n","from tqdm import tqdm\n","from google.colab import drive\n","\n","# Mount Google Drive\n","drive.mount('/content/drive')"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"1KyYcJSjJI1M","executionInfo":{"status":"ok","timestamp":1778102115694,"user_tz":420,"elapsed":19112,"user":{"displayName":"Fernanda Lecaros Saavedra","userId":"12919384150885623581"}},"outputId":"ce47b51c-c4f4-48b0-e5d0-59d85a669c4d"},"execution_count":1,"outputs":[{"output_type":"stream","name":"stdout","text":["Mounted at /content/drive\n"]}]},{"cell_type":"markdown","source":["# Creating folders with the predicitons of the ROIs"],"metadata":{"id":"_uW3xYS-KyiT"}},{"cell_type":"code","execution_count":2,"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"79P47hGwJFeG","executionInfo":{"status":"ok","timestamp":1778102243496,"user_tz":420,"elapsed":75218,"user":{"displayName":"Fernanda Lecaros Saavedra","userId":"12919384150885623581"}},"outputId":"efe886bf-f237-4f79-c44c-c0292113b1b5"},"outputs":[{"output_type":"stream","name":"stderr","text":["Organizing crops: 100%|██████████| 60/60 [01:14<00:00,  1.25s/it]"]},{"output_type":"stream","name":"stdout","text":["\n","Done. Copied: 60 | Skipped: 0\n"]},{"output_type":"stream","name":"stderr","text":["\n"]}],"source":["\n","\n","# ── CONFIG ──────────────────────────────────────────────────────────────────\n","CSV_PATH    = \"/content/drive/Shareddrives/OMI Underwater imaging/MBARI tutorial/STT23-1_particles/auto_generated_model.csv\"  # path to your CSV\n","OUTPUT_DIR  = \"/content/drive/Shareddrives/OMI Underwater imaging/MBARI tutorial/\"           # where to save organized crops\n","# ────────────────────────────────────────────────────────────────────────────\n","\n","df = pd.read_csv(CSV_PATH)\n","\n","# Validate required columns\n","assert \"class\" in df.columns, \"Missing 'class' column\"\n","assert \"crop_path\" in df.columns, \"Missing 'crop_path' column\"\n","\n","os.makedirs(OUTPUT_DIR, exist_ok=True)\n","\n","skipped = 0\n","copied  = 0\n","\n","for _, row in tqdm(df.iterrows(), total=len(df), desc=\"Organizing crops\"):\n","    src = row[\"crop_path\"]\n","    class_name = str(row[\"class\"])\n","\n","    if not os.path.exists(src):\n","        print(f\"Missing: {src}\")\n","        skipped += 1\n","        continue\n","\n","    class_dir = os.path.join(OUTPUT_DIR, class_name)\n","    os.makedirs(class_dir, exist_ok=True)\n","\n","    dst = os.path.join(class_dir, os.path.basename(src))\n","    shutil.copy2(src, dst)\n","    copied += 1\n","\n","print(f\"\\nDone. Copied: {copied} | Skipped: {skipped}\")"]}]}