{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.12.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[],"dockerImageVersionId":28755,"isGpuEnabled":false,"isInternetEnabled":false,"language":"python","sourceType":"notebook"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import torch\n\nprint(\"PyTorch:\", torch.__version__)\nprint(\"GPU available:\", torch.cuda.is_available())\n\nif torch.cuda.is_available():\n    print(\"GPU:\", torch.cuda.get_device_name(0))\n    ","metadata":{"_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","execution":{"iopub.status.busy":"2026-09-07T13:58:05.849134Z","iopub.execute_input":"2026-09-07T13:58:05.849418Z","iopub.status.idle":"2026-09-07T13:58:10.722354Z","shell.execute_reply.started":"2026-09-07T13:58:05.849393Z","shell.execute_reply":"2026-09-07T13:58:10.721661Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q transformers pillow","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:10.723551Z","iopub.execute_input":"2026-09-07T13:58:10.723851Z","iopub.status.idle":"2026-09-07T13:58:15.213061Z","shell.execute_reply.started":"2026-09-07T13:58:10.72383Z","shell.execute_reply":"2026-09-07T13:58:15.212225Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import Image\nimport matplotlib.pyplot as plt\n\n# Check the current Kaggle input directory\nimport os\n\nprint(os.listdir(\"/kaggle/input\")[:20])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:15.21429Z","iopub.execute_input":"2026-09-07T13:58:15.214657Z","iopub.status.idle":"2026-09-07T13:58:15.220169Z","shell.execute_reply.started":"2026-09-07T13:58:15.214628Z","shell.execute_reply":"2026-09-07T13:58:15.219395Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torchvision\n\nprint(\"PyTorch:\", torch.__version__)\nprint(\"Torchvision:\", torchvision.__version__)\nprint(\"CUDA:\", torch.cuda.is_available())\nprint(\"GPU:\", torch.cuda.get_device_name(0))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:15.221337Z","iopub.execute_input":"2026-09-07T13:58:15.22167Z","iopub.status.idle":"2026-09-07T13:58:20.897054Z","shell.execute_reply.started":"2026-09-07T13:58:15.221636Z","shell.execute_reply":"2026-09-07T13:58:20.896255Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import BlipProcessor, BlipForQuestionAnswering\n\nprint(\"BLIP import successful\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:20.899158Z","iopub.execute_input":"2026-09-07T13:58:20.899578Z","iopub.status.idle":"2026-09-07T13:58:37.432391Z","shell.execute_reply.started":"2026-09-07T13:58:20.899552Z","shell.execute_reply":"2026-09-07T13:58:37.431691Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import Image\n\nimage_path = \"/kaggle/input/competitions/understanding_cloud_organization/train_images/397c2fd.jpg\"\n\nimage = Image.open(image_path).convert(\"RGB\")\n\nprint(\"Image loaded:\", image.size)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.433257Z","iopub.execute_input":"2026-09-07T13:58:37.433762Z","iopub.status.idle":"2026-09-07T13:58:37.465921Z","shell.execute_reply.started":"2026-09-07T13:58:37.433736Z","shell.execute_reply":"2026-09-07T13:58:37.443382Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom transformers import BlipProcessor, BlipForQuestionAnswering\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\nprint(\"Using:\", device)\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n).to(device)\n\nprint(\"BLIP-VQA ready!\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.466624Z","iopub.status.idle":"2026-09-07T13:58:37.466916Z","shell.execute_reply.started":"2026-09-07T13:58:37.466793Z","shell.execute_reply":"2026-09-07T13:58:37.466809Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"question = \"What is visible in this image?\"\n\ninputs = processor(\n    image,\n    question,\n    return_tensors=\"pt\"\n).to(device)\n\nwith torch.no_grad():\n    output = model.generate(\n        **inputs,\n        max_new_tokens=20\n    )\n\nanswer = processor.decode(\n    output[0],\n    skip_special_tokens=True\n)\n\nprint(\"Question:\", question)\nprint(\"Answer:\", answer)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.468415Z","iopub.status.idle":"2026-09-07T13:58:37.468725Z","shell.execute_reply.started":"2026-09-07T13:58:37.468588Z","shell.execute_reply":"2026-09-07T13:58:37.468612Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nfor root, dirs, files in os.walk(\"/kaggle/input\"):\n    print(root)\n    if files:\n        print(\"Files:\", files[:10])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.469596Z","iopub.status.idle":"2026-09-07T13:58:37.469947Z","shell.execute_reply.started":"2026-09-07T13:58:37.469767Z","shell.execute_reply":"2026-09-07T13:58:37.46979Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nfor root, dirs, files in os.walk(\"/kaggle/input\"):\n    image_files = [\n        f for f in files\n        if f.lower().endswith((\".jpg\", \".jpeg\", \".png\", \".tif\", \".tiff\"))\n    ]\n    \n    if image_files:\n        print(\"IMAGE FOLDER:\", root)\n        print(\"Number of images found:\", len(image_files))\n        print(\"Examples:\", image_files[:5])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.471289Z","iopub.status.idle":"2026-09-07T13:58:37.471637Z","shell.execute_reply.started":"2026-09-07T13:58:37.471501Z","shell.execute_reply":"2026-09-07T13:58:37.471525Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import Image\nimport os\n\nimage_dir = \"/kaggle/input/notebooks/alienxc137/earthvqa-demo/__results___files\"\n\nfor filename in os.listdir(image_dir):\n    path = os.path.join(image_dir, filename)\n    img = Image.open(path)\n    \n    print(\"File:\", filename)\n    print(\"Size:\", img.size)\n    display(img)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.47281Z","iopub.status.idle":"2026-09-07T13:58:37.473085Z","shell.execute_reply.started":"2026-09-07T13:58:37.472966Z","shell.execute_reply":"2026-09-07T13:58:37.472982Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(\"Everything under /kaggle/input:\\n\")\n\nfor root, dirs, files in os.walk(\"/kaggle/input\"):\n    print(root)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.474108Z","iopub.status.idle":"2026-09-07T13:58:37.474469Z","shell.execute_reply.started":"2026-09-07T13:58:37.474278Z","shell.execute_reply":"2026-09-07T13:58:37.474293Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\ndataset_dir = \"/kaggle/input/datasets/vishnu537261/earthvqa\"\n\nfor root, dirs, files in os.walk(dataset_dir):\n    print(\"\\nFOLDER:\", root)\n    if files:\n        print(\"FILES:\", files[:20])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.475689Z","iopub.status.idle":"2026-09-07T13:58:37.476053Z","shell.execute_reply.started":"2026-09-07T13:58:37.475849Z","shell.execute_reply":"2026-09-07T13:58:37.475875Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from pathlib import Path\n\nimage_extensions = {\".jpg\", \".jpeg\", \".png\", \".tif\", \".tiff\"}\n\nimages = [\n    p for p in Path(dataset_dir).rglob(\"*\")\n    if p.is_file() and p.suffix.lower() in image_extensions\n]\n\nprint(\"Total images:\", len(images))\nprint(\"First 10 images:\")\n\nfor p in images[:10]:\n    print(p)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.477347Z","iopub.status.idle":"2026-09-07T13:58:37.477605Z","shell.execute_reply.started":"2026-09-07T13:58:37.477498Z","shell.execute_reply":"2026-09-07T13:58:37.477513Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\ndataset_dir = \"/kaggle/input/datasets/vishnu537261/earthvqa\"\n\nfor root, dirs, files in os.walk(dataset_dir):\n    print(\"\\nFOLDER:\", root)\n    print(\"Number of files:\", len(files))\n    print(\"Files:\", files[:30])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.478428Z","iopub.status.idle":"2026-09-07T13:58:37.478646Z","shell.execute_reply.started":"2026-09-07T13:58:37.478539Z","shell.execute_reply":"2026-09-07T13:58:37.478552Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(\"Top-level EarthVQA files/folders:\")\n\nfor item in os.listdir(dataset_dir):\n    path = os.path.join(dataset_dir, item)\n    print(\n        item,\n        \"->\",\n        \"folder\" if os.path.isdir(path) else \"file\"\n    )","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.479331Z","iopub.status.idle":"2026-09-07T13:58:37.479554Z","shell.execute_reply.started":"2026-09-07T13:58:37.47945Z","shell.execute_reply":"2026-09-07T13:58:37.479464Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\ndataset_file = \"/kaggle/input/datasets/vishnu537261/earthvqa/earthvqa-semantic-segmentation-visual-question-ans\"\n\nprint(\"File size:\", os.path.getsize(dataset_file) / (1024**3), \"GB\")\nprint(\"File name:\", os.path.basename(dataset_file))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.480539Z","iopub.status.idle":"2026-09-07T13:58:37.480872Z","shell.execute_reply.started":"2026-09-07T13:58:37.480701Z","shell.execute_reply":"2026-09-07T13:58:37.480723Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\ndataset_file = \"/kaggle/input/datasets/vishnu537261/earthvqa/earthvqa-semantic-segmentation-visual-question-ans\"\n\nprint(\"File size:\", os.path.getsize(dataset_file) / (1024**3), \"GB\")\nprint(\"File name:\", os.path.basename(dataset_file))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.483885Z","iopub.status.idle":"2026-09-07T13:58:37.484251Z","shell.execute_reply.started":"2026-09-07T13:58:37.484061Z","shell.execute_reply":"2026-09-07T13:58:37.484087Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dataset_file = \"/kaggle/input/datasets/vishnu537261/earthvqa/earthvqa-semantic-segmentation-visual-question-ans\"\n\nwith open(dataset_file, \"rb\") as f:\n    data = f.read(500)\n\nprint(data)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.484826Z","iopub.status.idle":"2026-09-07T13:58:37.485202Z","shell.execute_reply.started":"2026-09-07T13:58:37.485009Z","shell.execute_reply":"2026-09-07T13:58:37.485055Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!git clone https://github.com/Junjue-Wang/EarthVQA.git /kaggle/working/EarthVQA","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.486346Z","iopub.status.idle":"2026-09-07T13:58:37.486693Z","shell.execute_reply.started":"2026-09-07T13:58:37.486523Z","shell.execute_reply":"2026-09-07T13:58:37.486549Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(os.listdir(\"/kaggle/working/EarthVQA\"))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.487768Z","iopub.status.idle":"2026-09-07T13:58:37.488071Z","shell.execute_reply.started":"2026-09-07T13:58:37.487947Z","shell.execute_reply":"2026-09-07T13:58:37.487972Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"os.listdir(\"/kaggle/working/EarthVQA\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.489543Z","iopub.status.idle":"2026-09-07T13:58:37.489774Z","shell.execute_reply.started":"2026-09-07T13:58:37.489661Z","shell.execute_reply":"2026-09-07T13:58:37.489676Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nrepo = \"/kaggle/working/EarthVQA\"\n\nprint(\"Repository exists:\", os.path.exists(repo))\nprint(\"\\nContents:\")\n\nfor item in os.listdir(repo):\n    print(item)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.491897Z","iopub.status.idle":"2026-09-07T13:58:37.492246Z","shell.execute_reply.started":"2026-09-07T13:58:37.492075Z","shell.execute_reply":"2026-09-07T13:58:37.492098Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!git clone https://github.com/Junjue-Wang/EarthVQA.git /kaggle/working/EarthVQA","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.493469Z","iopub.status.idle":"2026-09-07T13:58:37.494407Z","shell.execute_reply.started":"2026-09-07T13:58:37.494183Z","shell.execute_reply":"2026-09-07T13:58:37.49421Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"with open(\"/kaggle/working/EarthVQA/README.md\", \"r\") as f:\n    readme = f.read()\n\nprint(readme[:15000])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.495554Z","iopub.status.idle":"2026-09-07T13:58:37.495909Z","shell.execute_reply.started":"2026-09-07T13:58:37.495775Z","shell.execute_reply":"2026-09-07T13:58:37.495799Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q datasets huggingface_hub","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.49697Z","iopub.status.idle":"2026-09-07T13:58:37.497225Z","shell.execute_reply.started":"2026-09-07T13:58:37.49711Z","shell.execute_reply":"2026-09-07T13:58:37.497125Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from huggingface_hub import list_repo_files\n\nfiles = list_repo_files(\n    repo_id=\"Kingdrone-Junjue/EarthVLSet\",\n    repo_type=\"dataset\"\n)\n\nprint(\"Number of files:\", len(files))\n\nfor f in files[:30]:\n    print(f)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.498223Z","iopub.status.idle":"2026-09-07T13:58:37.498807Z","shell.execute_reply.started":"2026-09-07T13:58:37.498674Z","shell.execute_reply":"2026-09-07T13:58:37.498697Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Find important EarthVL/EarthVQA files\n\nfor f in files:\n    if (\n        \"Train\" in f\n        or \"Val\" in f\n        or \"QA\" in f\n        or \"json\" in f.lower()\n    ):\n        print(f)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.499994Z","iopub.status.idle":"2026-09-07T13:58:37.500386Z","shell.execute_reply.started":"2026-09-07T13:58:37.500156Z","shell.execute_reply":"2026-09-07T13:58:37.500181Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nfor root, dirs, files in os.walk(\"/kaggle/input\"):\n    if files:\n        print(\"\\nFOLDER:\", root)\n        print(\"FILES:\", files[:10])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.501194Z","iopub.status.idle":"2026-09-07T13:58:37.501487Z","shell.execute_reply.started":"2026-09-07T13:58:37.501365Z","shell.execute_reply":"2026-09-07T13:58:37.501382Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(\"Kaggle input folders:\")\n\nfor root, dirs, files in os.walk(\"/kaggle/input\"):\n    if \"EarthVQA\" in root or \"earthvqa\" in root.lower():\n        print(\"\\nFOLDER:\", root)\n        print(\"Number of files:\", len(files))\n        print(\"Examples:\", files[:10])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.502454Z","iopub.status.idle":"2026-09-07T13:58:37.502882Z","shell.execute_reply.started":"2026-09-07T13:58:37.502696Z","shell.execute_reply":"2026-09-07T13:58:37.502721Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nmatches = []\n\nfor root, dirs, files in os.walk(\"/kaggle\"):\n    for f in files:\n        if f in [\"Val_QA.json\", \"Train_QA.json\", \"Test_QA.json\"]:\n            matches.append(os.path.join(root, f))\n\nprint(\"Found QA files:\")\nfor x in matches:\n    print(x)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.50436Z","iopub.status.idle":"2026-09-07T13:58:37.504709Z","shell.execute_reply.started":"2026-09-07T13:58:37.504535Z","shell.execute_reply":"2026-09-07T13:58:37.504557Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from kaggle_secrets import UserSecretsClient\n\nuser_secrets = UserSecretsClient()\n\nHF_TOKEN = user_secrets.get_secret(\"HF_TOKEN\")\n\nprint(\"Token loaded:\", HF_TOKEN[:5] + \"...\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.505792Z","iopub.status.idle":"2026-09-07T13:58:37.506096Z","shell.execute_reply.started":"2026-09-07T13:58:37.505977Z","shell.execute_reply":"2026-09-07T13:58:37.505994Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from huggingface_hub import hf_hub_download\n\nimage_file = hf_hub_download(\n    repo_id=\"Kingdrone-Junjue/EarthVLSet\",\n    repo_type=\"dataset\",\n    filename=\"EarthVL-GLOBAL/Test/images_png/6001.png\",\n    token=HF_TOKEN\n)\n\nprint(\"Downloaded:\", image_file)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.50779Z","iopub.status.idle":"2026-09-07T13:58:37.508048Z","shell.execute_reply.started":"2026-09-07T13:58:37.507934Z","shell.execute_reply":"2026-09-07T13:58:37.50795Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import Image\nimport matplotlib.pyplot as plt\n\nimg = Image.open(image_file)\n\nprint(\"Image size:\", img.size)\n\nplt.figure(figsize=(8, 8))\nplt.imshow(img)\nplt.axis(\"off\");","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.509525Z","iopub.status.idle":"2026-09-07T13:58:37.509919Z","shell.execute_reply.started":"2026-09-07T13:58:37.509716Z","shell.execute_reply":"2026-09-07T13:58:37.509743Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import Image\nimport matplotlib.pyplot as plt\n\nimg = Image.open(image_file).convert(\"RGB\")\n\nprint(\"Image size:\", img.size)\n\nplt.figure(figsize=(8, 8))\nplt.imshow(img)\nplt.axis(\"off\");","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.510872Z","iopub.status.idle":"2026-09-07T13:58:37.511187Z","shell.execute_reply.started":"2026-09-07T13:58:37.51106Z","shell.execute_reply":"2026-09-07T13:58:37.511078Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from huggingface_hub import hf_hub_download\nfrom PIL import Image\nimport matplotlib.pyplot as plt\n\n# Download the EarthVL image again\nimage_file = hf_hub_download(\n    repo_id=\"Kingdrone-Junjue/EarthVLSet\",\n    repo_type=\"dataset\",\n    filename=\"EarthVL-GLOBAL/Test/images_png/6001.png\",\n    token=HF_TOKEN\n)\n\nprint(\"Downloaded:\", image_file)\n\n# Open image\nimg = Image.open(image_file).convert(\"RGB\")\n\nprint(\"Image size:\", img.size)\n\n# Display\nplt.figure(figsize=(8, 8))\nplt.imshow(img)\nplt.axis(\"off\");","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.513638Z","iopub.status.idle":"2026-09-07T13:58:37.513951Z","shell.execute_reply.started":"2026-09-07T13:58:37.513804Z","shell.execute_reply":"2026-09-07T13:58:37.51383Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from kaggle_secrets import UserSecretsClient\n\nuser_secrets = UserSecretsClient()\n\nHF_TOKEN = user_secrets.get_secret(\"HF_TOKEN\")\n\nprint(\"HF token loaded successfully\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.514956Z","iopub.status.idle":"2026-09-07T13:58:37.515216Z","shell.execute_reply.started":"2026-09-07T13:58:37.515101Z","shell.execute_reply":"2026-09-07T13:58:37.515116Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from huggingface_hub import hf_hub_download\nfrom PIL import Image\n\nimage_file = hf_hub_download(\n    repo_id=\"Kingdrone-Junjue/EarthVLSet\",\n    repo_type=\"dataset\",\n    filename=\"EarthVL-GLOBAL/Test/images_png/6001.png\",\n    token=HF_TOKEN\n)\n\nimg = Image.open(image_file).convert(\"RGB\")\n\nprint(\"Downloaded:\", image_file)\nprint(\"Image size:\", img.size)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.516925Z","iopub.status.idle":"2026-09-07T13:58:37.517254Z","shell.execute_reply.started":"2026-09-07T13:58:37.517061Z","shell.execute_reply":"2026-09-07T13:58:37.517075Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from kaggle_secrets import UserSecretsClient\n\nuser_secrets = UserSecretsClient()\nHF_TOKEN = user_secrets.get_secret(\"HF_TOKEN\")\n\nprint(\"HF token loaded\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.518833Z","iopub.status.idle":"2026-09-07T13:58:37.519118Z","shell.execute_reply.started":"2026-09-07T13:58:37.518992Z","shell.execute_reply":"2026-09-07T13:58:37.519016Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from huggingface_hub import hf_hub_download\nfrom PIL import Image\n\nimage_file = hf_hub_download(\n    repo_id=\"Kingdrone-Junjue/EarthVLSet\",\n    repo_type=\"dataset\",\n    filename=\"EarthVL-GLOBAL/Test/images_png/6001.png\",\n    token=HF_TOKEN\n)\n\nimg = Image.open(image_file).convert(\"RGB\")\n\nprint(\"Image loaded:\", img.size)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.520443Z","iopub.status.idle":"2026-09-07T13:58:37.521406Z","shell.execute_reply.started":"2026-09-07T13:58:37.521157Z","shell.execute_reply":"2026-09-07T13:58:37.521184Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom transformers import BlipProcessor, BlipForQuestionAnswering\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\",\n    use_fast=False\n)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n).to(device)\n\nmodel.eval()\n\nprint(\"BLIP ready\")\nprint(\"Device:\", device)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.52288Z","iopub.status.idle":"2026-09-07T13:58:37.523341Z","shell.execute_reply.started":"2026-09-07T13:58:37.523185Z","shell.execute_reply":"2026-09-07T13:58:37.523202Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import matplotlib.pyplot as plt\n\nplt.figure(figsize=(8, 8))\nplt.imshow(img)\nplt.axis(\"off\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.5242Z","iopub.status.idle":"2026-09-07T13:58:37.524545Z","shell.execute_reply.started":"2026-09-07T13:58:37.524359Z","shell.execute_reply":"2026-09-07T13:58:37.524395Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"question = \"What is visible in this image?\"\n\ninputs = processor(\n    images=img,\n    text=question,\n    return_tensors=\"pt\"\n).to(device)\n\nwith torch.no_grad():\n    output = model.generate(\n        **inputs,\n        max_new_tokens=30\n    )\n\nanswer = processor.decode(\n    output[0],\n    skip_special_tokens=True\n)\n\nprint(\"Question:\", question)\nprint(\"Answer:\", answer)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.525623Z","iopub.status.idle":"2026-09-07T13:58:37.525937Z","shell.execute_reply.started":"2026-09-07T13:58:37.525822Z","shell.execute_reply":"2026-09-07T13:58:37.525837Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"processor exists:\", \"processor\" in globals())\nprint(\"model exists:\", \"model\" in globals())\nprint(\"image exists:\", \"img\" in globals())\nprint(\"device:\", device if \"device\" in globals() else \"not defined\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.527178Z","iopub.status.idle":"2026-09-07T13:58:37.527533Z","shell.execute_reply.started":"2026-09-07T13:58:37.52735Z","shell.execute_reply":"2026-09-07T13:58:37.527374Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import Image\nimport matplotlib.pyplot as plt\n\nimage_file = \"/root/.cache/huggingface/hub/datasets--Kingdrone-Junjue--EarthVLSet/snapshots/bd8559d29d6e4e47890e888f8059b53695a59d33/EarthVL-GLOBAL/Test/images_png/6001.png\"\n\nimg = Image.open(image_file).convert(\"RGB\")\n\nprint(\"Image size:\", img.size)\n\nplt.figure(figsize=(8, 8))\nplt.imshow(img)\nplt.axis(\"off\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.528866Z","iopub.status.idle":"2026-09-07T13:58:37.529258Z","shell.execute_reply.started":"2026-09-07T13:58:37.529029Z","shell.execute_reply":"2026-09-07T13:58:37.529046Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"question = \"What is visible in this image?\"\n\ninputs = processor(\n    images=img,\n    text=question,\n    return_tensors=\"pt\"\n).to(device)\n\nwith torch.no_grad():\n    output = model.generate(\n        **inputs,\n        max_new_tokens=20\n    )\n\nanswer = processor.decode(\n    output[0],\n    skip_special_tokens=True\n)\n\nprint(\"Question:\", question)\nprint(\"Answer:\", answer)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.530638Z","iopub.status.idle":"2026-09-07T13:58:37.530944Z","shell.execute_reply.started":"2026-09-07T13:58:37.530785Z","shell.execute_reply":"2026-09-07T13:58:37.530809Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"questions = [\n    \"What is visible in this image?\",\n    \"Are there any buildings?\",\n    \"Is there water in the image?\",\n    \"Are there roads?\",\n    \"Is the area urban or rural?\",\n    \"What type of land cover is visible?\"\n]\n\nfor question in questions:\n    inputs = processor(\n        images=img,\n        text=question,\n        return_tensors=\"pt\"\n    ).to(device)\n\n    with torch.no_grad():\n        output = model.generate(\n            **inputs,\n            max_new_tokens=20\n        )\n\n    answer = processor.decode(\n        output[0],\n        skip_special_tokens=True\n    )\n\n    print(\"Q:\", question)\n    print(\"A:\", answer)\n    print(\"-\" * 50)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.532115Z","iopub.status.idle":"2026-09-07T13:58:37.532457Z","shell.execute_reply.started":"2026-09-07T13:58:37.532278Z","shell.execute_reply":"2026-09-07T13:58:37.532302Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import json\nimport os\n\n# Find Val_QA.json anywhere under Kaggle input\nqa_files = []\n\nfor root, dirs, files in os.walk(\"/kaggle/input\"):\n    for file in files:\n        if file == \"Val_QA.json\":\n            qa_files.append(os.path.join(root, file))\n\nprint(\"Found QA files:\")\nfor f in qa_files:\n    print(f)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.533631Z","iopub.status.idle":"2026-09-07T13:58:37.534065Z","shell.execute_reply.started":"2026-09-07T13:58:37.533845Z","shell.execute_reply":"2026-09-07T13:58:37.53387Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"qa_path = qa_files[0]\n\nwith open(qa_path, \"r\") as f:\n    qa_data = json.load(f)\n\nprint(\"Type:\", type(qa_data))\nprint(\"Number of records:\", len(qa_data))\n\nprint(\"\\nFirst record:\")\nprint(qa_data[0])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.535303Z","iopub.status.idle":"2026-09-07T13:58:37.535707Z","shell.execute_reply.started":"2026-09-07T13:58:37.535568Z","shell.execute_reply":"2026-09-07T13:58:37.535585Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\njson_files = []\n\nfor root, dirs, files in os.walk(\"/kaggle/input\"):\n    for file in files:\n        if file.lower().endswith(\".json\"):\n            json_files.append(os.path.join(root, file))\n\nprint(\"JSON files found:\", len(json_files))\n\nfor f in json_files[:50]:\n    print(f)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.536925Z","iopub.status.idle":"2026-09-07T13:58:37.537305Z","shell.execute_reply.started":"2026-09-07T13:58:37.53717Z","shell.execute_reply":"2026-09-07T13:58:37.537189Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(\"Kaggle input folders:\")\n\nfor item in os.listdir(\"/kaggle/input\"):\n    print(item)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.539364Z","iopub.status.idle":"2026-09-07T13:58:37.539725Z","shell.execute_reply.started":"2026-09-07T13:58:37.539525Z","shell.execute_reply":"2026-09-07T13:58:37.539547Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for root, dirs, files in os.walk(\"/kaggle/input\"):\n    print(root)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.541551Z","iopub.status.idle":"2026-09-07T13:58:37.541931Z","shell.execute_reply.started":"2026-09-07T13:58:37.541727Z","shell.execute_reply":"2026-09-07T13:58:37.54175Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(\"Kaggle inputs:\")\n\nfor item in os.listdir(\"/kaggle/input\"):\n    print(\" -\", item)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.543122Z","iopub.status.idle":"2026-09-07T13:58:37.543417Z","shell.execute_reply.started":"2026-09-07T13:58:37.543254Z","shell.execute_reply":"2026-09-07T13:58:37.543269Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Top-level keys:\")\nprint(test_qa.keys())\n\nprint(\"\\nFirst few items:\")\nfor i, (key, value) in enumerate(test_qa.items()):\n    print(\"\\nKEY:\", key)\n    print(\"VALUE:\", value)\n    \n    if i >= 2:\n        break","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.544279Z","iopub.status.idle":"2026-09-07T13:58:37.544568Z","shell.execute_reply.started":"2026-09-07T13:58:37.54445Z","shell.execute_reply":"2026-09-07T13:58:37.544466Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Type:\", type(test_qa))\nprint(\"Number of entries:\", len(test_qa))\n\nfor key in list(test_qa.keys())[:10]:\n    print(key)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.545184Z","iopub.status.idle":"2026-09-07T13:58:37.545545Z","shell.execute_reply.started":"2026-09-07T13:58:37.545428Z","shell.execute_reply":"2026-09-07T13:58:37.545444Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"first_image = next(iter(test_qa))\n\nprint(\"Image:\", first_image)\nprint(\"\\nQA data:\")\nprint(test_qa[first_image])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.546391Z","iopub.status.idle":"2026-09-07T13:58:37.54666Z","shell.execute_reply.started":"2026-09-07T13:58:37.546535Z","shell.execute_reply":"2026-09-07T13:58:37.54655Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nfrom PIL import Image\n\nTEST_IMAGE_DIR = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/Test-001/images_png\"\n\nimage_name = next(iter(test_qa))\nimage_path = os.path.join(TEST_IMAGE_DIR, image_name)\n\nprint(\"Image name:\", image_name)\nprint(\"Image path:\", image_path)\nprint(\"Exists:\", os.path.exists(image_path))\n\nif os.path.exists(image_path):\n    img = Image.open(image_path).convert(\"RGB\")\n    print(\"Image size:\", img.size)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.547665Z","iopub.status.idle":"2026-09-07T13:58:37.548515Z","shell.execute_reply.started":"2026-09-07T13:58:37.548283Z","shell.execute_reply":"2026-09-07T13:58:37.548308Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nREPO = \"/kaggle/working/EarthVQA\"\n\nprint(\"Repository exists:\", os.path.exists(REPO))\n\nif os.path.exists(REPO):\n    print(\"\\nRepository files:\")\n    for item in os.listdir(REPO):\n        print(item)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.549632Z","iopub.status.idle":"2026-09-07T13:58:37.549868Z","shell.execute_reply.started":"2026-09-07T13:58:37.549763Z","shell.execute_reply":"2026-09-07T13:58:37.549777Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!git clone https://github.com/Junjue-Wang/EarthVQA.git /kaggle/working/EarthVQA","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.551302Z","iopub.status.idle":"2026-09-07T13:58:37.551694Z","shell.execute_reply.started":"2026-09-07T13:58:37.551502Z","shell.execute_reply":"2026-09-07T13:58:37.55153Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nREPO = \"/kaggle/working/EarthVQA\"\n\nprint(\"Repository exists:\", os.path.exists(REPO))\nprint(os.listdir(REPO))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.553095Z","iopub.status.idle":"2026-09-07T13:58:37.55347Z","shell.execute_reply.started":"2026-09-07T13:58:37.553263Z","shell.execute_reply":"2026-09-07T13:58:37.553285Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!find /kaggle/working/EarthVQA -type f \\( -name \"*.pth\" -o -name \"*.pt\" -o -name \"*.ckpt\" \\)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.554115Z","iopub.status.idle":"2026-09-07T13:58:37.554483Z","shell.execute_reply.started":"2026-09-07T13:58:37.554299Z","shell.execute_reply":"2026-09-07T13:58:37.55436Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"DATASET_ROOT = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans\"\n\n!find \"$DATASET_ROOT\" -type f \\( -name \"*.pth\" -o -name \"*.pt\" -o -name \"*.ckpt\" \\)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.555224Z","iopub.status.idle":"2026-09-07T13:58:37.555506Z","shell.execute_reply.started":"2026-09-07T13:58:37.555393Z","shell.execute_reply":"2026-09-07T13:58:37.555409Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"generate_segfeats.sh:\")\nprint(open(\"/kaggle/working/EarthVQA/scripts/generate_segfeats.sh\").read())\n\nprint(\"\\npredict_soba.sh:\")\nprint(open(\"/kaggle/working/EarthVQA/scripts/predict_soba.sh\").read())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.556553Z","iopub.status.idle":"2026-09-07T13:58:37.556881Z","shell.execute_reply.started":"2026-09-07T13:58:37.556707Z","shell.execute_reply":"2026-09-07T13:58:37.556729Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working\n\n!git clone https://github.com/Junjue-Wang/EarthVQA.git\n\nprint(\"Repository cloned!\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.559072Z","iopub.status.idle":"2026-09-07T13:58:37.559388Z","shell.execute_reply.started":"2026-09-07T13:58:37.55922Z","shell.execute_reply":"2026-09-07T13:58:37.559236Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nrepo = \"/kaggle/working/EarthVQA\"\n\nprint(\"Repository exists:\", os.path.exists(repo))\nprint(os.listdir(repo))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.561233Z","iopub.status.idle":"2026-09-07T13:58:37.561589Z","shell.execute_reply.started":"2026-09-07T13:58:37.561417Z","shell.execute_reply":"2026-09-07T13:58:37.561439Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(open(\"/kaggle/working/EarthVQA/scripts/generate_segfeats.sh\").read())\nprint(\"\\n--- predict_soba.sh ---\\n\")\nprint(open(\"/kaggle/working/EarthVQA/scripts/predict_soba.sh\").read())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.562563Z","iopub.status.idle":"2026-09-07T13:58:37.562921Z","shell.execute_reply.started":"2026-09-07T13:58:37.562746Z","shell.execute_reply":"2026-09-07T13:58:37.562769Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nrepo = \"/kaggle/working/EarthVQA\"\n\nprint(\"Repository exists:\", os.path.exists(repo))\n\nif os.path.exists(repo):\n    for item in os.listdir(repo):\n        print(item)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.564285Z","iopub.status.idle":"2026-09-07T13:58:37.564709Z","shell.execute_reply.started":"2026-09-07T13:58:37.564498Z","shell.execute_reply":"2026-09-07T13:58:37.564526Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nrequired = [\n    \"predict_seg.py\",\n    \"predict_soba.py\",\n    \"train_earthvqa.py\",\n    \"configs\",\n    \"module\",\n    \"data\",\n    \"scripts\"\n]\n\nfor item in required:\n    path = os.path.join(repo, item)\n    print(f\"{item}: {'OK' if os.path.exists(path) else 'MISSING'}\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.566286Z","iopub.status.idle":"2026-09-07T13:58:37.566581Z","shell.execute_reply.started":"2026-09-07T13:58:37.566471Z","shell.execute_reply":"2026-09-07T13:58:37.566487Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nlog_dir = \"/kaggle/working/EarthVQA/log\"\n\nprint(\"Log directory exists:\", os.path.exists(log_dir))\n\nif os.path.exists(log_dir):\n    print(os.listdir(log_dir))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.567448Z","iopub.status.idle":"2026-09-07T13:58:37.567665Z","shell.execute_reply.started":"2026-09-07T13:58:37.567559Z","shell.execute_reply":"2026-09-07T13:58:37.567573Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(open(\"/kaggle/working/EarthVQA/README.md\").read())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.568783Z","iopub.status.idle":"2026-09-07T13:58:37.569515Z","shell.execute_reply.started":"2026-09-07T13:58:37.569292Z","shell.execute_reply":"2026-09-07T13:58:37.569334Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q ever-beta\n!pip install -q git+https://github.com/qubvel/segmentation_models.pytorch\n!pip install -q albumentations==1.4.3","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.570866Z","iopub.status.idle":"2026-09-07T13:58:37.571201Z","shell.execute_reply.started":"2026-09-07T13:58:37.571031Z","shell.execute_reply":"2026-09-07T13:58:37.571053Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!git clone https://huggingface.co/Kingdrone-Junjue/EarthVQA-pretrained /kaggle/working/EarthVQA-pretrained","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.572251Z","iopub.status.idle":"2026-09-07T13:58:37.572679Z","shell.execute_reply.started":"2026-09-07T13:58:37.572468Z","shell.execute_reply":"2026-09-07T13:58:37.572492Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nweights_dir = \"/kaggle/working/EarthVQA-pretrained\"\n\nfor root, dirs, files in os.walk(weights_dir):\n    print(root)\n    if files:\n        print(files)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.578299Z","iopub.status.idle":"2026-09-07T13:58:37.578769Z","shell.execute_reply.started":"2026-09-07T13:58:37.578519Z","shell.execute_reply":"2026-09-07T13:58:37.578543Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q huggingface_hub","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.580563Z","iopub.status.idle":"2026-09-07T13:58:37.581401Z","shell.execute_reply.started":"2026-09-07T13:58:37.581217Z","shell.execute_reply":"2026-09-07T13:58:37.581235Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for root, dirs, files in os.walk(\"/kaggle/working/EarthVQA-pretrained\"):\n    print(root, files)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.582365Z","iopub.status.idle":"2026-09-07T13:58:37.582908Z","shell.execute_reply.started":"2026-09-07T13:58:37.582755Z","shell.execute_reply":"2026-09-07T13:58:37.582781Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nweights_dir = \"/kaggle/working/EarthVQA-pretrained\"\n\nprint(\"Exists:\", os.path.exists(weights_dir))\n\nif os.path.exists(weights_dir):\n    for root, dirs, files in os.walk(weights_dir):\n        print(root)\n        if files:\n            print(\"Files:\", files)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.583753Z","iopub.status.idle":"2026-09-07T13:58:37.583979Z","shell.execute_reply.started":"2026-09-07T13:58:37.583868Z","shell.execute_reply":"2026-09-07T13:58:37.583882Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!git clone https://huggingface.co/Kingdrone-Junjue/EarthVQA-pretrained /kaggle/working/EarthVQA-pretrained","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.585039Z","iopub.status.idle":"2026-09-07T13:58:37.585427Z","shell.execute_reply.started":"2026-09-07T13:58:37.585238Z","shell.execute_reply":"2026-09-07T13:58:37.585261Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nweights_dir = \"/kaggle/working/EarthVQA-pretrained\"\n\nprint(\"Weights folder exists:\", os.path.exists(weights_dir))\n\nif os.path.exists(weights_dir):\n    for root, dirs, files in os.walk(weights_dir):\n        print(\"\\n\", root)\n        for f in files:\n            print(\"  \", f)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.58663Z","iopub.status.idle":"2026-09-07T13:58:37.586985Z","shell.execute_reply.started":"2026-09-07T13:58:37.58681Z","shell.execute_reply":"2026-09-07T13:58:37.586833Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nweights_dir = \"/kaggle/working/EarthVQA-pretrained\"\n\nprint(\"Weights folder exists:\", os.path.exists(weights_dir))\n\nif os.path.exists(weights_dir):\n    for root, dirs, files in os.walk(weights_dir):\n        print(\"\\n\", root)\n        for f in files:\n            print(\"  \", f)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.588138Z","iopub.status.idle":"2026-09-07T13:58:37.588406Z","shell.execute_reply.started":"2026-09-07T13:58:37.588247Z","shell.execute_reply":"2026-09-07T13:58:37.588261Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!git clone https://huggingface.co/Kingdrone-Junjue/EarthVQA-pretrained /kaggle/working/EarthVQA-pretrained","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.589761Z","iopub.status.idle":"2026-09-07T13:58:37.590045Z","shell.execute_reply.started":"2026-09-07T13:58:37.589892Z","shell.execute_reply":"2026-09-07T13:58:37.589906Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nweights_dir = \"/kaggle/working/EarthVQA-pretrained\"\n\nprint(\"Folder exists:\", os.path.exists(weights_dir))\n\nfor root, dirs, files in os.walk(weights_dir):\n    print(\"\\nFolder:\", root)\n    for f in files:\n        print(\"  \", f)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.591355Z","iopub.status.idle":"2026-09-07T13:58:37.591732Z","shell.execute_reply.started":"2026-09-07T13:58:37.591549Z","shell.execute_reply":"2026-09-07T13:58:37.591588Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport shutil\n\nrepo = \"/kaggle/working/EarthVQA\"\nweights = \"/kaggle/working/EarthVQA-pretrained\"\n\nos.makedirs(f\"{repo}/log\", exist_ok=True)\n\nshutil.copy(\n    f\"{weights}/sfpnr50.pth\",\n    f\"{repo}/log/sfpnr50.pth\"\n)\n\nshutil.copy(\n    f\"{weights}/soba.pth\",\n    f\"{repo}/log/soba.pth\"\n)\n\nprint(\"Weights copied successfully!\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.592936Z","iopub.status.idle":"2026-09-07T13:58:37.593198Z","shell.execute_reply.started":"2026-09-07T13:58:37.593088Z","shell.execute_reply":"2026-09-07T13:58:37.593103Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nfor f in [\n    \"/kaggle/working/EarthVQA/log/sfpnr50.pth\",\n    \"/kaggle/working/EarthVQA/log/soba.pth\"\n]:\n    print(f)\n    print(\"Exists:\", os.path.exists(f))\n    print(\"Size:\", os.path.getsize(f) / (1024**2), \"MB\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.594502Z","iopub.status.idle":"2026-09-07T13:58:37.595011Z","shell.execute_reply.started":"2026-09-07T13:58:37.594816Z","shell.execute_reply":"2026-09-07T13:58:37.594833Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from huggingface_hub import list_repo_files\n\nfiles = list_repo_files(\n    repo_id=\"Kingdrone-Junjue/EarthVLSet\",\n    repo_type=\"dataset\"\n)\n\nprint(\"Total files:\", len(files))\n\nfor f in files[:100]:\n    print(f)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.596129Z","iopub.status.idle":"2026-09-07T13:58:37.596397Z","shell.execute_reply.started":"2026-09-07T13:58:37.596242Z","shell.execute_reply":"2026-09-07T13:58:37.596257Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from huggingface_hub import list_repo_files\n\nrepo_id = \"Kingdrone-Junjue/EarthVLSet\"\n\nfiles = list_repo_files(\n    repo_id=repo_id,\n    repo_type=\"dataset\"\n)\n\nprint(\"Total files:\", len(files))\n\nprint(\"\\n--- QA / annotation related files ---\")\n\nfor f in files:\n    name = f.lower()\n    if any(x in name for x in [\n        \"qa\",\n        \"question\",\n        \"answer\",\n        \"annotation\",\n        \"caption\"\n    ]):\n        print(f)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.597785Z","iopub.status.idle":"2026-09-07T13:58:37.598163Z","shell.execute_reply.started":"2026-09-07T13:58:37.59797Z","shell.execute_reply":"2026-09-07T13:58:37.598Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"\\n--- JSON / CSV / TXT files ---\")\n\nannotation_files = [\n    f for f in files\n    if f.lower().endswith((\".json\", \".csv\", \".txt\"))\n]\n\nprint(\"Count:\", len(annotation_files))\n\nfor f in annotation_files:\n    print(f)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.599338Z","iopub.status.idle":"2026-09-07T13:58:37.599697Z","shell.execute_reply.started":"2026-09-07T13:58:37.599506Z","shell.execute_reply":"2026-09-07T13:58:37.59953Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from kaggle_secrets import UserSecretsClient\n\nuser_secrets = UserSecretsClient()\n\nhf_token = user_secrets.get_secret(\"HF_TOKEN\")\n\nprint(\"HF token loaded:\", hf_token is not None)\nprint(\"Token prefix:\", hf_token[:5] + \"...\" if hf_token else \"None\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.600841Z","iopub.status.idle":"2026-09-07T13:58:37.60117Z","shell.execute_reply.started":"2026-09-07T13:58:37.601017Z","shell.execute_reply":"2026-09-07T13:58:37.601042Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from kaggle_secrets import UserSecretsClient\n\nuser_secrets = UserSecretsClient()\nhf_token = user_secrets.get_secret(\"HF_TOKEN\")\n\nprint(\"HF token loaded:\", hf_token is not None)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.602372Z","iopub.status.idle":"2026-09-07T13:58:37.60272Z","shell.execute_reply.started":"2026-09-07T13:58:37.602548Z","shell.execute_reply":"2026-09-07T13:58:37.602587Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from huggingface_hub import login\n\nlogin(\n    token=hf_token,\n    add_to_git_credential=False\n)\n\nprint(\"Hugging Face login successful\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.603906Z","iopub.status.idle":"2026-09-07T13:58:37.60422Z","shell.execute_reply.started":"2026-09-07T13:58:37.60409Z","shell.execute_reply":"2026-09-07T13:58:37.604108Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from huggingface_hub import whoami\n\ninfo = whoami()\nprint(\"Logged in as:\", info[\"name\"])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.605616Z","iopub.status.idle":"2026-09-07T13:58:37.605965Z","shell.execute_reply.started":"2026-09-07T13:58:37.605763Z","shell.execute_reply":"2026-09-07T13:58:37.605796Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from huggingface_hub import hf_hub_download\n\nqa_file = hf_hub_download(\n    repo_id=\"Kingdrone-Junjue/EarthVLSet\",\n    filename=\"EarthVQA/Train_QA.json\",\n    repo_type=\"dataset\",\n    token=hf_token\n)\n\nprint(\"Train_QA downloaded successfully:\")\nprint(qa_file)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.607116Z","iopub.status.idle":"2026-09-07T13:58:37.607461Z","shell.execute_reply.started":"2026-09-07T13:58:37.60726Z","shell.execute_reply":"2026-09-07T13:58:37.607285Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import json\n\nwith open(qa_file, \"r\") as f:\n    train_qa = json.load(f)\n\nprint(\"Data type:\", type(train_qa))\n\nif isinstance(train_qa, list):\n    print(\"Number of QA samples:\", len(train_qa))\n    print(\"\\nFirst sample:\")\n    print(json.dumps(train_qa[0], indent=2))\nelse:\n    print(\"Keys:\", train_qa.keys())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.608692Z","iopub.status.idle":"2026-09-07T13:58:37.609069Z","shell.execute_reply.started":"2026-09-07T13:58:37.608857Z","shell.execute_reply":"2026-09-07T13:58:37.608879Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Top-level keys:\")\nprint(list(train_qa.keys())[:30])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.610659Z","iopub.status.idle":"2026-09-07T13:58:37.610879Z","shell.execute_reply.started":"2026-09-07T13:58:37.610774Z","shell.execute_reply":"2026-09-07T13:58:37.610787Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"\\nFirst key:\")\nfirst_key = next(iter(train_qa))\nprint(first_key)\n\nprint(\"\\nValue type:\")\nprint(type(train_qa[first_key]))\n\nprint(\"\\nFirst value:\")\nprint(train_qa[first_key])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.61217Z","iopub.status.idle":"2026-09-07T13:58:37.612563Z","shell.execute_reply.started":"2026-09-07T13:58:37.61237Z","shell.execute_reply":"2026-09-07T13:58:37.612395Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"if isinstance(train_qa[first_key], dict):\n    print(\"\\nKeys inside first item:\")\n    print(train_qa[first_key].keys())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.613176Z","iopub.status.idle":"2026-09-07T13:58:37.613561Z","shell.execute_reply.started":"2026-09-07T13:58:37.613372Z","shell.execute_reply":"2026-09-07T13:58:37.613396Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from huggingface_hub import list_repo_files\n\nrepo_id = \"Kingdrone-Junjue/EarthVLSet\"\n\nall_files = list_repo_files(\n    repo_id=repo_id,\n    repo_type=\"dataset\"\n)\n\nmatches = [f for f in all_files if f.endswith(\"/275.png\")]\n\nprint(\"Matches:\")\nfor f in matches:\n    print(f)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.614479Z","iopub.status.idle":"2026-09-07T13:58:37.614899Z","shell.execute_reply.started":"2026-09-07T13:58:37.614692Z","shell.execute_reply":"2026-09-07T13:58:37.614719Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from kaggle_secrets import UserSecretsClient\n\nuser_secrets = UserSecretsClient()\nhf_token = user_secrets.get_secret(\"HF_TOKEN\")\n\nprint(\"Token loaded:\", hf_token is not None)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.616226Z","iopub.status.idle":"2026-09-07T13:58:37.616569Z","shell.execute_reply.started":"2026-09-07T13:58:37.61641Z","shell.execute_reply":"2026-09-07T13:58:37.616445Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from huggingface_hub import hf_hub_download\n\nimage_file = hf_hub_download(\n    repo_id=\"Kingdrone-Junjue/EarthVLSet\",\n    filename=\"EarthVQA/Train/images_png/275.png\",\n    repo_type=\"dataset\",\n    token=hf_token\n)\n\nprint(\"Image downloaded:\")\nprint(image_file)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.618843Z","iopub.status.idle":"2026-09-07T13:58:37.619224Z","shell.execute_reply.started":"2026-09-07T13:58:37.619017Z","shell.execute_reply":"2026-09-07T13:58:37.619044Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import Image\nimport matplotlib.pyplot as plt\n\nearthvqa_image = Image.open(image_file).convert(\"RGB\")\n\nprint(\"Image size:\", earthvqa_image.size)\n\nplt.figure(figsize=(8, 8))\nplt.imshow(earthvqa_image)\nplt.axis(\"off\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.620717Z","iopub.status.idle":"2026-09-07T13:58:37.620999Z","shell.execute_reply.started":"2026-09-07T13:58:37.620859Z","shell.execute_reply":"2026-09-07T13:58:37.620876Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import Image\nimport matplotlib.pyplot as plt\n\nearthvqa_image = Image.open(image_file).convert(\"RGB\")\n\nprint(\"Image size:\", earthvqa_image.size)\n\nplt.figure(figsize=(8, 8))\nplt.imshow(earthvqa_image)\nplt.axis(\"off\")\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.622184Z","iopub.status.idle":"2026-09-07T13:58:37.622563Z","shell.execute_reply.started":"2026-09-07T13:58:37.622351Z","shell.execute_reply":"2026-09-07T13:58:37.622381Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom transformers import BlipProcessor, BlipForQuestionAnswering\n\n# Device\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\nprint(\"Using:\", device)\n\n# Load BLIP VQA\nprocessor = BlipProcessor.from_pretrained(\"Salesforce/blip-vqa-base\")\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n).to(device)\n\n# Make sure the image exists\nfrom PIL import Image\n\nearthvqa_image = Image.open(image_file).convert(\"RGB\")\n\n# Question\nquestion = \"Are there any buildings in this scene?\"\n\n# Prepare input\ninputs = processor(\n    images=earthvqa_image,\n    text=question,\n    return_tensors=\"pt\"\n).to(device)\n\n# Generate answer\nwith torch.no_grad():\n    output = model.generate(\n        **inputs,\n        max_new_tokens=20\n    )\n\nanswer = processor.decode(\n    output[0],\n    skip_special_tokens=True\n)\n\nprint(\"Question:\", question)\nprint(\"Model answer:\", answer)\nprint(\"Expected answer: Yes\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.623872Z","iopub.status.idle":"2026-09-07T13:58:37.624175Z","shell.execute_reply.started":"2026-09-07T13:58:37.624052Z","shell.execute_reply":"2026-09-07T13:58:37.624074Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nrepo_url = \"https://github.com/Junjue-Wang/EarthVQA.git\"\nrepo_path = \"/kaggle/working/EarthVQA\"\n\nif not os.path.exists(repo_path):\n    !git clone {repo_url} {repo_path}\nelse:\n    print(\"EarthVQA repository already exists.\")\n\nprint(\"\\nRepository exists:\", os.path.exists(repo_path))\nprint(\"Contents:\")\nprint(os.listdir(repo_path))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.625297Z","iopub.status.idle":"2026-09-07T13:58:37.625558Z","shell.execute_reply.started":"2026-09-07T13:58:37.625444Z","shell.execute_reply":"2026-09-07T13:58:37.62546Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nmatches = []\n\nfor root, dirs, files in os.walk(\"/kaggle\"):\n    for f in files:\n        if f in [\"sfpnr50.pth\", \"soba.pth\"]:\n            matches.append(os.path.join(root, f))\n\nprint(\"Found weights:\")\nfor path in matches:\n    print(path)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.627526Z","iopub.status.idle":"2026-09-07T13:58:37.628066Z","shell.execute_reply.started":"2026-09-07T13:58:37.627847Z","shell.execute_reply":"2026-09-07T13:58:37.627873Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nfor f in [\"sfpnr50.pth\", \"soba.pth\"]:\n    path = f\"/kaggle/working/EarthVQA/log/{f}\"\n    if os.path.exists(path):\n        print(f, \"exists:\", os.path.getsize(path)/(1024**2), \"MB\")\n    else:\n        print(f, \"not present\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.629159Z","iopub.status.idle":"2026-09-07T13:58:37.629545Z","shell.execute_reply.started":"2026-09-07T13:58:37.629349Z","shell.execute_reply":"2026-09-07T13:58:37.629374Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!mkdir -p /kaggle/working/EarthVQA/log\n\n!cp \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/2024EarthVQA/2024EarthVQA/Weights/sfpnr50.pth\" \\\n    \"/kaggle/working/EarthVQA/log/sfpnr50.pth\"\n\n!cp \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/2024EarthVQA/2024EarthVQA/Weights/soba.pth\" \\\n    \"/kaggle/working/EarthVQA/log/soba.pth\"\n\nprint(\"Copy completed.\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.631115Z","iopub.status.idle":"2026-09-07T13:58:37.631507Z","shell.execute_reply.started":"2026-09-07T13:58:37.63129Z","shell.execute_reply":"2026-09-07T13:58:37.631333Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nfor f in [\"sfpnr50.pth\", \"soba.pth\"]:\n    path = f\"/kaggle/working/EarthVQA/log/{f}\"\n    print(\n        f,\n        \"Exists:\", os.path.exists(path),\n        \"Size:\", f\"{os.path.getsize(path)/(1024**2):.2f} MB\"\n        if os.path.exists(path) else \"N/A\"\n    )","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.63297Z","iopub.status.idle":"2026-09-07T13:58:37.633347Z","shell.execute_reply.started":"2026-09-07T13:58:37.633132Z","shell.execute_reply":"2026-09-07T13:58:37.633155Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nrepo = \"/kaggle/working/EarthVQA\"\n\nprint(\"=== SFPN-R50 CONFIG ===\")\nfor root, dirs, files in os.walk(os.path.join(repo, \"configs\", \"sfpnr50\")):\n    print(root)\n    for f in files:\n        print(\"  \", f)\n\nprint(\"\\n=== SOBA CONFIG ===\")\nfor root, dirs, files in os.walk(os.path.join(repo, \"configs\", \"soba\")):\n    print(root)\n    for f in files:\n        print(\"  \", f)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.634639Z","iopub.status.idle":"2026-09-07T13:58:37.634977Z","shell.execute_reply.started":"2026-09-07T13:58:37.634821Z","shell.execute_reply":"2026-09-07T13:58:37.63486Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nrepo = \"/kaggle/working/EarthVQA\"\n\nprint(\"=== configs ===\")\n\nfor root, dirs, files in os.walk(os.path.join(repo, \"configs\")):\n    level = root.replace(os.path.join(repo, \"configs\"), \"\").count(os.sep)\n    indent = \"  \" * level\n    print(indent + os.path.basename(root) + \"/\")\n    \n    for f in files:\n        print(indent + \"  \" + f)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.635882Z","iopub.status.idle":"2026-09-07T13:58:37.636097Z","shell.execute_reply.started":"2026-09-07T13:58:37.63599Z","shell.execute_reply":"2026-09-07T13:58:37.636004Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"\\n=== scripts ===\")\n\nfor f in os.listdir(\"/kaggle/working/EarthVQA/scripts\"):\n    print(f)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.636914Z","iopub.status.idle":"2026-09-07T13:58:37.63724Z","shell.execute_reply.started":"2026-09-07T13:58:37.637112Z","shell.execute_reply":"2026-09-07T13:58:37.637133Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"config_path='sfpnr50'\nconfig_path='soba'","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.638253Z","iopub.status.idle":"2026-09-07T13:58:37.639204Z","shell.execute_reply.started":"2026-09-07T13:58:37.639004Z","shell.execute_reply":"2026-09-07T13:58:37.639023Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"repo = \"/kaggle/working/EarthVQA\"\n\nprint(\"===== predict_seg.py =====\")\nprint(open(f\"{repo}/predict_seg.py\").read())\n\nprint(\"\\n===== predict_soba.py =====\")\nprint(open(f\"{repo}/predict_soba.py\").read())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.640572Z","iopub.status.idle":"2026-09-07T13:58:37.640907Z","shell.execute_reply.started":"2026-09-07T13:58:37.640718Z","shell.execute_reply":"2026-09-07T13:58:37.640756Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"repo = \"/kaggle/working/EarthVQA\"\n\nprint(\"===== configs/sfpnr50.py =====\")\nprint(open(f\"{repo}/configs/sfpnr50.py\").read())\n\nprint(\"\\n===== configs/soba.py =====\")\nprint(open(f\"{repo}/configs/soba.py\").read())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.641986Z","iopub.status.idle":"2026-09-07T13:58:37.642368Z","shell.execute_reply.started":"2026-09-07T13:58:37.642146Z","shell.execute_reply":"2026-09-07T13:58:37.642168Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"repo = \"/kaggle/working/EarthVQA\"\n\nprint(\"===== sfpnr50.py =====\")\nprint(open(f\"{repo}/configs/sfpnr50.py\").read())\n\nprint(\"\\n===== soba.py =====\")\nprint(open(f\"{repo}/configs/soba.py\").read())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.643895Z","iopub.status.idle":"2026-09-07T13:58:37.644256Z","shell.execute_reply.started":"2026-09-07T13:58:37.644069Z","shell.execute_reply":"2026-09-07T13:58:37.644095Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"repo = \"/kaggle/working/EarthVQA\"\n\nprint(\"===== configs/lovedav2.py =====\")\nprint(open(f\"{repo}/configs/lovedav2.py\").read())\n\nprint(\"\\n===== configs/earthvqa.py =====\")\nprint(open(f\"{repo}/configs/earthvqa.py\").read())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.645605Z","iopub.status.idle":"2026-09-07T13:58:37.645983Z","shell.execute_reply.started":"2026-09-07T13:58:37.645761Z","shell.execute_reply":"2026-09-07T13:58:37.645812Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nbase = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans\"\n\nfor root, dirs, files in os.walk(base):\n    level = root.replace(base, \"\").count(os.sep)\n    \n    if level <= 5:\n        print(\"\\n\" + root)\n        if files:\n            print(\"  Files:\", files[:20])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.647413Z","iopub.status.idle":"2026-09-07T13:58:37.64777Z","shell.execute_reply.started":"2026-09-07T13:58:37.647567Z","shell.execute_reply":"2026-09-07T13:58:37.647593Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nsrc = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans\"\nrepo = \"/kaggle/working/EarthVQA\"\n\n# Create required directories\nos.makedirs(f\"{repo}/EarthVQA/Train\", exist_ok=True)\nos.makedirs(f\"{repo}/EarthVQA/Test\", exist_ok=True)\n\n# Helper for symlinks\ndef make_link(source, destination):\n    if os.path.lexists(destination):\n        os.remove(destination)\n    os.symlink(source, destination)\n    print(\"Linked:\")\n    print(\" \", destination)\n    print(\" ->\", source)\n\n# Train data\nmake_link(\n    f\"{src}/Train-003/Train/images_png\",\n    f\"{repo}/EarthVQA/Train/images_png\"\n)\n\nmake_link(\n    f\"{src}/Train-003/Train/masks_png\",\n    f\"{repo}/EarthVQA/Train/masks_png\"\n)\n\n# Test images\nmake_link(\n    f\"{src}/Test-001/images_png\",\n    f\"{repo}/EarthVQA/Test/images_png\"\n)\n\n# QA files\nqa_src = f\"{src}/2024EarthVQA/2024EarthVQA\"\n\nfor name in [\"Train_QA.json\", \"Val_QA.json\", \"Test_QA.json\"]:\n    make_link(\n        f\"{qa_src}/{name}\",\n        f\"{repo}/EarthVQA/{name}\"\n    )\n\nprint(\"\\nDataset structure created.\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.648983Z","iopub.status.idle":"2026-09-07T13:58:37.649477Z","shell.execute_reply.started":"2026-09-07T13:58:37.649305Z","shell.execute_reply":"2026-09-07T13:58:37.649346Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\npaths = [\n    f\"{repo}/EarthVQA/Train/images_png\",\n    f\"{repo}/EarthVQA/Train/masks_png\",\n    f\"{repo}/EarthVQA/Test/images_png\",\n    f\"{repo}/EarthVQA/Train_QA.json\",\n    f\"{repo}/EarthVQA/Test_QA.json\",\n]\n\nprint(\"===== VERIFICATION =====\")\n\nfor p in paths:\n    print(\"\\n\", p)\n    print(\"Exists:\", os.path.exists(p))\n\n    if os.path.isdir(p):\n        print(\"Number of files:\", len(os.listdir(p)))\n        print(\"Examples:\", os.listdir(p)[:5])\n    elif os.path.isfile(p):\n        print(\"Size:\", os.path.getsize(p) / (1024 * 1024), \"MB\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.650512Z","iopub.status.idle":"2026-09-07T13:58:37.650735Z","shell.execute_reply.started":"2026-09-07T13:58:37.650628Z","shell.execute_reply":"2026-09-07T13:58:37.650642Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nweights_dir = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/2024EarthVQA/2024EarthVQA/Weights\"\n\nsfpn = os.path.join(weights_dir, \"sfpnr50.pth\")\n\nprint(\"SFPN-R50:\", sfpn)\nprint(\"Exists:\", os.path.exists(sfpn))\nprint(\"Size:\", os.path.getsize(sfpn) / (1024**2), \"MB\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.651607Z","iopub.status.idle":"2026-09-07T13:58:37.651896Z","shell.execute_reply.started":"2026-09-07T13:58:37.65175Z","shell.execute_reply":"2026-09-07T13:58:37.651766Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport os\nprint(\"Current directory:\", os.getcwd())\nprint(\"predict_seg.py:\", os.path.exists(\"predict_seg.py\"))\nprint(\"config:\", os.path.exists(\"configs/sfpnr50.py\"))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.653344Z","iopub.status.idle":"2026-09-07T13:58:37.653625Z","shell.execute_reply.started":"2026-09-07T13:58:37.653496Z","shell.execute_reply":"2026-09-07T13:58:37.653513Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q ever-beta","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.655075Z","iopub.status.idle":"2026-09-07T13:58:37.655471Z","shell.execute_reply.started":"2026-09-07T13:58:37.655262Z","shell.execute_reply":"2026-09-07T13:58:37.65529Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import ever as er\nprint(\"EVER imported successfully\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.656859Z","iopub.status.idle":"2026-09-07T13:58:37.657209Z","shell.execute_reply.started":"2026-09-07T13:58:37.657013Z","shell.execute_reply":"2026-09-07T13:58:37.657042Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import ever\nimport albumentations\nimport segmentation_models_pytorch as smp\n\nprint(\"ever: OK\")\nprint(\"albumentations:\", albumentations.__version__)\nprint(\"segmentation_models_pytorch:\", smp.__version__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.659189Z","iopub.status.idle":"2026-09-07T13:58:37.6596Z","shell.execute_reply.started":"2026-09-07T13:58:37.659366Z","shell.execute_reply":"2026-09-07T13:58:37.659394Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\n!mkdir -p log/sfpnr50/test_features\n\n!python predict_seg.py \\\n    --config_path=sfpnr50 \\\n    --ckpt_path=\"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/2024EarthVQA/2024EarthVQA/Weights/sfpnr50.pth\" \\\n    --save_dir=\"/kaggle/working/EarthVQA/log/sfpnr50/test_features\"","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.667748Z","iopub.status.idle":"2026-09-07T13:58:37.66809Z","shell.execute_reply.started":"2026-09-07T13:58:37.667959Z","shell.execute_reply":"2026-09-07T13:58:37.667977Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport os\n\nprint(\"DATA DIRECTORY:\")\nfor f in os.listdir(\"data\"):\n    print(f)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.668998Z","iopub.status.idle":"2026-09-07T13:58:37.669229Z","shell.execute_reply.started":"2026-09-07T13:58:37.669117Z","shell.execute_reply":"2026-09-07T13:58:37.669132Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"\\n===== data/lovedav2.py =====\")\nprint(open(\"data/lovedav2.py\").read()[:5000])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.670416Z","iopub.status.idle":"2026-09-07T13:58:37.67088Z","shell.execute_reply.started":"2026-09-07T13:58:37.670682Z","shell.execute_reply":"2026-09-07T13:58:37.670709Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from data import distributed","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.672417Z","iopub.status.idle":"2026-09-07T13:58:37.672762Z","shell.execute_reply.started":"2026-09-07T13:58:37.67257Z","shell.execute_reply":"2026-09-07T13:58:37.672588Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport os\nimport glob\n\nprint(\"Current directory:\", os.getcwd())\n\nprint(\"\\n=== data directory ===\")\nprint(glob.glob(\"data/*\"))\n\nprint(\"\\n=== distributed files ===\")\nprint(glob.glob(\"data/**/distributed*\", recursive=True))\n\nprint(\"\\n=== data/__init__.py ===\")\nif os.path.exists(\"data/__init__.py\"):\n    print(open(\"data/__init__.py\").read())\nelse:\n    print(\"MISSING\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.674009Z","iopub.status.idle":"2026-09-07T13:58:37.674282Z","shell.execute_reply.started":"2026-09-07T13:58:37.674165Z","shell.execute_reply":"2026-09-07T13:58:37.674181Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport os\n\npath = \"data/distributed\"\n\nprint(\"Exists:\", os.path.exists(path))\nprint(\"Is file:\", os.path.isfile(path))\nprint(\"Is directory:\", os.path.isdir(path))\n\nif os.path.isfile(path):\n    print(\"\\nFile size:\", os.path.getsize(path))\n    print(\"\\nFirst 3000 characters:\")\n    with open(path, \"r\", errors=\"ignore\") as f:\n        print(f.read(3000))\nelif os.path.isdir(path):\n    print(\"\\nDirectory contents:\")\n    print(os.listdir(path))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.675637Z","iopub.status.idle":"2026-09-07T13:58:37.675872Z","shell.execute_reply.started":"2026-09-07T13:58:37.675759Z","shell.execute_reply":"2026-09-07T13:58:37.675774Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from data import distributed","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.676704Z","iopub.status.idle":"2026-09-07T13:58:37.677069Z","shell.execute_reply.started":"2026-09-07T13:58:37.676889Z","shell.execute_reply":"2026-09-07T13:58:37.676913Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport os\nimport shutil\n\n# Rename distributed -> distributed.py\nold = \"data/distributed\"\nnew = \"data/distributed.py\"\n\nif os.path.exists(old) and not os.path.exists(new):\n    os.rename(old, new)\n    print(\"Renamed distributed -> distributed.py\")\nelif os.path.exists(new):\n    print(\"distributed.py already exists\")\nelse:\n    print(\"distributed file not found\")\n\n# Create __init__.py\ninit_file = \"data/__init__.py\"\n\nif not os.path.exists(init_file):\n    open(init_file, \"w\").close()\n    print(\"Created data/__init__.py\")\nelse:\n    print(\"data/__init__.py already exists\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.678235Z","iopub.status.idle":"2026-09-07T13:58:37.678667Z","shell.execute_reply.started":"2026-09-07T13:58:37.678537Z","shell.execute_reply":"2026-09-07T13:58:37.678555Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import sys\n\nsys.path.insert(0, \"/kaggle/working/EarthVQA\")\n\nfrom data import distributed\n\nprint(\"SUCCESS: data.distributed imported\")\nprint(distributed.__file__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.679913Z","iopub.status.idle":"2026-09-07T13:58:37.680291Z","shell.execute_reply.started":"2026-09-07T13:58:37.680093Z","shell.execute_reply":"2026-09-07T13:58:37.680119Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import ever as er\n\ner.registry.register_all()\n\nprint(\"SUCCESS: EVER registry initialized\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.68197Z","iopub.status.idle":"2026-09-07T13:58:37.68219Z","shell.execute_reply.started":"2026-09-07T13:58:37.682084Z","shell.execute_reply":"2026-09-07T13:58:37.682098Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\n\nprint(torch.cuda.is_available())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.683523Z","iopub.status.idle":"2026-09-07T13:58:37.683928Z","shell.execute_reply.started":"2026-09-07T13:58:37.683726Z","shell.execute_reply":"2026-09-07T13:58:37.683751Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip uninstall -y albumentations albucore\n!pip install -q \"albumentations==1.4.24\"","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.68513Z","iopub.status.idle":"2026-09-07T13:58:37.685415Z","shell.execute_reply.started":"2026-09-07T13:58:37.685249Z","shell.execute_reply":"2026-09-07T13:58:37.685263Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q ever","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.686628Z","iopub.status.idle":"2026-09-07T13:58:37.686854Z","shell.execute_reply.started":"2026-09-07T13:58:37.686748Z","shell.execute_reply":"2026-09-07T13:58:37.686762Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport sys\nimport os\n\nsys.path.insert(0, \"/kaggle/working/EarthVQA\")\n\nprint(\"Python:\", sys.executable)\nprint(\"Repository:\", os.getcwd())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.687942Z","iopub.status.idle":"2026-09-07T13:58:37.688252Z","shell.execute_reply.started":"2026-09-07T13:58:37.688116Z","shell.execute_reply":"2026-09-07T13:58:37.688145Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q ever-beta\n!pip install -q \"albumentations==1.4.24\"\n!pip install -q \"segmentation-models-pytorch\"","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.689492Z","iopub.status.idle":"2026-09-07T13:58:37.689825Z","shell.execute_reply.started":"2026-09-07T13:58:37.689684Z","shell.execute_reply":"2026-09-07T13:58:37.689709Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport sys\nsys.path.insert(0, \"/kaggle/working/EarthVQA\")\n\nimport ever as er\n\nprint(\"EVER:\", er)\nprint(\"EVER imported successfully\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.690629Z","iopub.status.idle":"2026-09-07T13:58:37.690861Z","shell.execute_reply.started":"2026-09-07T13:58:37.690748Z","shell.execute_reply":"2026-09-07T13:58:37.690762Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport os\n\nprint(\"data/distributed.py:\", os.path.exists(\"data/distributed.py\"))\nprint(\"data/__init__.py:\", os.path.exists(\"data/__init__.py\"))\nprint(\"module/__init__.py:\", os.path.exists(\"module/__init__.py\"))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.692357Z","iopub.status.idle":"2026-09-07T13:58:37.692671Z","shell.execute_reply.started":"2026-09-07T13:58:37.692499Z","shell.execute_reply":"2026-09-07T13:58:37.692515Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working\n\n!git clone https://github.com/Junjue-Wang/EarthVQA.git\n\nprint(\"Clone completed\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.693862Z","iopub.status.idle":"2026-09-07T13:58:37.694117Z","shell.execute_reply.started":"2026-09-07T13:58:37.694003Z","shell.execute_reply":"2026-09-07T13:58:37.694019Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nREPO = \"/kaggle/working/EarthVQA\"\n\nprint(\"Repository exists:\", os.path.exists(REPO))\nprint(\"Repository contents:\")\nprint(os.listdir(REPO))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.695182Z","iopub.status.idle":"2026-09-07T13:58:37.695515Z","shell.execute_reply.started":"2026-09-07T13:58:37.695367Z","shell.execute_reply":"2026-09-07T13:58:37.695406Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport os\n\nif os.path.exists(\"data/distributed\") and not os.path.exists(\"data/distributed.py\"):\n    os.rename(\"data/distributed\", \"data/distributed.py\")\n    print(\"Renamed distributed -> distributed.py\")\n\nif not os.path.exists(\"data/__init__.py\"):\n    open(\"data/__init__.py\", \"w\").close()\n    print(\"Created data/__init__.py\")\n\nprint(\"distributed.py:\", os.path.exists(\"data/distributed.py\"))\nprint(\"__init__.py:\", os.path.exists(\"data/__init__.py\"))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.696857Z","iopub.status.idle":"2026-09-07T13:58:37.697117Z","shell.execute_reply.started":"2026-09-07T13:58:37.697003Z","shell.execute_reply":"2026-09-07T13:58:37.697018Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nsrc = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans\"\nrepo = \"/kaggle/working/EarthVQA\"\n\nos.makedirs(f\"{repo}/EarthVQA/Train\", exist_ok=True)\nos.makedirs(f\"{repo}/EarthVQA/Test\", exist_ok=True)\n\ndef make_link(source, destination):\n    if os.path.lexists(destination):\n        os.remove(destination)\n    os.symlink(source, destination)\n    print(\"Linked:\", destination)\n\nmake_link(\n    f\"{src}/Train-003/Train/images_png\",\n    f\"{repo}/EarthVQA/Train/images_png\"\n)\n\nmake_link(\n    f\"{src}/Train-003/Train/masks_png\",\n    f\"{repo}/EarthVQA/Train/masks_png\"\n)\n\nmake_link(\n    f\"{src}/Test-001/images_png\",\n    f\"{repo}/EarthVQA/Test/images_png\"\n)\n\nqa_src = f\"{src}/2024EarthVQA/2024EarthVQA\"\n\nfor name in [\"Train_QA.json\", \"Val_QA.json\", \"Test_QA.json\"]:\n    make_link(\n        f\"{qa_src}/{name}\",\n        f\"{repo}/EarthVQA/{name}\"\n    )\n\nprint(\"Dataset links recreated.\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.698533Z","iopub.status.idle":"2026-09-07T13:58:37.698851Z","shell.execute_reply.started":"2026-09-07T13:58:37.698718Z","shell.execute_reply":"2026-09-07T13:58:37.698747Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nrepo = \"/kaggle/working/EarthVQA\"\n\npaths = [\n    \"EarthVQA/Train/images_png\",\n    \"EarthVQA/Train/masks_png\",\n    \"EarthVQA/Test/images_png\",\n    \"EarthVQA/Train_QA.json\",\n    \"EarthVQA/Val_QA.json\",\n    \"EarthVQA/Test_QA.json\",\n]\n\nfor p in paths:\n    path = os.path.join(repo, p)\n    print(\n        p,\n        \"->\",\n        \"OK\" if os.path.exists(path) else \"MISSING\"\n    )","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.70002Z","iopub.status.idle":"2026-09-07T13:58:37.700376Z","shell.execute_reply.started":"2026-09-07T13:58:37.700189Z","shell.execute_reply":"2026-09-07T13:58:37.700205Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport shutil\n\nsrc_weights = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/2024EarthVQA/2024EarthVQA/Weights\"\n\nrepo = \"/kaggle/working/EarthVQA\"\n\nos.makedirs(f\"{repo}/log\", exist_ok=True)\n\nfor name in [\"sfpnr50.pth\", \"soba.pth\"]:\n    source = os.path.join(src_weights, name)\n    destination = os.path.join(repo, \"log\", name)\n\n    shutil.copy2(source, destination)\n\n    print(\n        name,\n        \"->\",\n        os.path.getsize(destination) / (1024**2),\n        \"MB\"\n    )","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.702042Z","iopub.status.idle":"2026-09-07T13:58:37.702312Z","shell.execute_reply.started":"2026-09-07T13:58:37.702165Z","shell.execute_reply":"2026-09-07T13:58:37.702179Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport sys\n\nREPO = \"/kaggle/working/EarthVQA\"\n\nprint(\"Repository exists:\", os.path.exists(REPO))\nprint(\"Repository path:\", REPO)\n\nprint(\"\\nRepository contents:\")\nprint(os.listdir(REPO))\n\nprint(\"\\nData directory:\")\ndata_dir = os.path.join(REPO, \"data\")\nprint(\"Exists:\", os.path.exists(data_dir))\nprint(\"Is directory:\", os.path.isdir(data_dir))\n\nif os.path.isdir(data_dir):\n    print(os.listdir(data_dir))\n\nprint(\"\\nPython sys.path BEFORE:\")\nprint(\"\\n\".join(sys.path[:10]))\n\n# Force repository to the FIRST position\nif REPO in sys.path:\n    sys.path.remove(REPO)\nsys.path.insert(0, REPO)\n\nprint(\"\\nPython sys.path AFTER:\")\nprint(\"\\n\".join(sys.path[:10]))\n\n# Check import\ntry:\n    import data\n    print(\"\\nSUCCESS: data package imported\")\n    print(\"data location:\", data.__file__)\nexcept Exception as e:\n    print(\"\\nDATA IMPORT ERROR:\")\n    print(repr(e))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.703445Z","iopub.status.idle":"2026-09-07T13:58:37.703793Z","shell.execute_reply.started":"2026-09-07T13:58:37.703612Z","shell.execute_reply":"2026-09-07T13:58:37.703639Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport sys\nimport importlib.util\n\nREPO = \"/kaggle/working/EarthVQA\"\n\nprint(\"REPO:\", REPO)\nprint(\"Exists:\", os.path.exists(REPO))\nprint(\"data exists:\", os.path.exists(os.path.join(REPO, \"data\")))\nprint(\"data __init__:\", os.path.exists(os.path.join(REPO, \"data\", \"__init__.py\")))\n\nprint(\"\\nfind_spec('data'):\")\nprint(importlib.util.find_spec(\"data\"))\n\nprint(\"\\nsys.modules['data']:\")\nprint(sys.modules.get(\"data\"))\n\nprint(\"\\nCurrent directory:\")\nprint(os.getcwd())\n\nprint(\"\\nREPO in sys.path:\")\nprint(REPO in sys.path)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.705274Z","iopub.status.idle":"2026-09-07T13:58:37.705606Z","shell.execute_reply.started":"2026-09-07T13:58:37.70548Z","shell.execute_reply":"2026-09-07T13:58:37.705496Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import sys\nimport os\n\nREPO = \"/kaggle/working/EarthVQA\"\n\n# Remove stale 'data' module if one exists\nfor name in list(sys.modules):\n    if name == \"data\" or name.startswith(\"data.\"):\n        del sys.modules[name]\n\n# Remove duplicate repository paths\nsys.path = [p for p in sys.path if p != REPO]\n\n# Put repository FIRST\nsys.path.insert(0, REPO)\n\nos.chdir(REPO)\n\nprint(\"cwd:\", os.getcwd())\nprint(\"sys.path[0]:\", sys.path[0])\n\nimport data\n\nprint(\"SUCCESS\")\nprint(\"data:\", data)\nprint(\"data location:\", data.__file__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.70696Z","iopub.status.idle":"2026-09-07T13:58:37.707343Z","shell.execute_reply.started":"2026-09-07T13:58:37.707137Z","shell.execute_reply":"2026-09-07T13:58:37.707161Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import sys\nimport importlib.machinery\n\nREPO = \"/kaggle/working/EarthVQA\"\n\nprint(\n    importlib.machinery.PathFinder.find_spec(\n        \"data\",\n        [REPO]\n    )\n)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.709033Z","iopub.status.idle":"2026-09-07T13:58:37.709445Z","shell.execute_reply.started":"2026-09-07T13:58:37.709224Z","shell.execute_reply":"2026-09-07T13:58:37.709247Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport pathlib\n\nREPO = \"/kaggle/working/EarthVQA\"\nDATA = f\"{REPO}/data\"\n\nprint(\"data exists:\", os.path.exists(DATA))\nprint(\"data is dir:\", os.path.isdir(DATA))\nprint(\"data is symlink:\", os.path.islink(DATA))\nprint(\"real path:\", os.path.realpath(DATA))\n\nprint(\"\\nStat:\")\nprint(os.stat(DATA))\n\nprint(\"\\nDirectory contents:\")\nfor x in pathlib.Path(DATA).iterdir():\n    print(x, \" | file:\", x.is_file())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.71185Z","iopub.status.idle":"2026-09-07T13:58:37.712187Z","shell.execute_reply.started":"2026-09-07T13:58:37.712006Z","shell.execute_reply":"2026-09-07T13:58:37.712021Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import importlib.util\n\ninit_file = \"/kaggle/working/EarthVQA/data/__init__.py\"\n\nspec = importlib.util.spec_from_file_location(\n    \"data\",\n    init_file,\n    submodule_search_locations=[\n        \"/kaggle/working/EarthVQA/data\"\n    ]\n)\n\nprint(\"Spec:\", spec)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.713755Z","iopub.status.idle":"2026-09-07T13:58:37.714094Z","shell.execute_reply.started":"2026-09-07T13:58:37.713922Z","shell.execute_reply":"2026-09-07T13:58:37.713944Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"module = importlib.util.module_from_spec(spec)\nspec.loader.exec_module(module)\n\nprint(\"data loaded manually:\", module)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.715594Z","iopub.status.idle":"2026-09-07T13:58:37.71593Z","shell.execute_reply.started":"2026-09-07T13:58:37.715759Z","shell.execute_reply":"2026-09-07T13:58:37.715781Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport sys\n\nprint(\"Possible data directories:\")\n\nfor p in sys.path:\n    if not p:\n        p = os.getcwd()\n\n    candidate = os.path.join(p, \"data\")\n\n    if os.path.exists(candidate):\n        print(\"FOUND:\", candidate)\n        print(\"  directory:\", os.path.isdir(candidate))\n        print(\"  realpath:\", os.path.realpath(candidate))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.717342Z","iopub.status.idle":"2026-09-07T13:58:37.717679Z","shell.execute_reply.started":"2026-09-07T13:58:37.717508Z","shell.execute_reply":"2026-09-07T13:58:37.717535Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import sys\nimport importlib.util\n\nREPO = \"/kaggle/working/EarthVQA\"\nDATA_DIR = f\"{REPO}/data\"\n\n# Remove any stale data modules\nfor name in list(sys.modules):\n    if name == \"data\" or name.startswith(\"data.\"):\n        del sys.modules[name]\n\n# Explicitly load data as a package\nspec = importlib.util.spec_from_file_location(\n    \"data\",\n    f\"{DATA_DIR}/__init__.py\",\n    submodule_search_locations=[DATA_DIR]\n)\n\ndata_module = importlib.util.module_from_spec(spec)\n\n# Register BEFORE executing package\nsys.modules[\"data\"] = data_module\n\nspec.loader.exec_module(data_module)\n\nprint(\"data package loaded:\")\nprint(data_module)\nprint(data_module.__path__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.718566Z","iopub.status.idle":"2026-09-07T13:58:37.718875Z","shell.execute_reply.started":"2026-09-07T13:58:37.71873Z","shell.execute_reply":"2026-09-07T13:58:37.718755Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from data import distributed\n\nprint(\"SUCCESS: distributed imported\")\nprint(\"Location:\", distributed.__file__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.719791Z","iopub.status.idle":"2026-09-07T13:58:37.720007Z","shell.execute_reply.started":"2026-09-07T13:58:37.719903Z","shell.execute_reply":"2026-09-07T13:58:37.719916Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from data.earthvqa import EarthVQALoader\n\nprint(\"SUCCESS: EarthVQALoader imported\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.721081Z","iopub.status.idle":"2026-09-07T13:58:37.721283Z","shell.execute_reply.started":"2026-09-07T13:58:37.72118Z","shell.execute_reply":"2026-09-07T13:58:37.721194Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from data.lovedav2 import LoveDALoaderV2\n\nprint(\"SUCCESS: LoveDALoaderV2 imported\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.722249Z","iopub.status.idle":"2026-09-07T13:58:37.722598Z","shell.execute_reply.started":"2026-09-07T13:58:37.722429Z","shell.execute_reply":"2026-09-07T13:58:37.722452Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import albumentations\n\nprint(\"Albumentations:\", albumentations.__version__)\n\nfrom albumentations.core.transforms_interface import (\n    ImageOnlyTransform,\n    NoOp,\n    to_tuple\n)\n\nprint(\"SUCCESS: Albumentations compatibility confirmed\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.723977Z","iopub.status.idle":"2026-09-07T13:58:37.72425Z","shell.execute_reply.started":"2026-09-07T13:58:37.72412Z","shell.execute_reply":"2026-09-07T13:58:37.724135Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nprint(open(\"module/utils.py\").read())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.725399Z","iopub.status.idle":"2026-09-07T13:58:37.725706Z","shell.execute_reply.started":"2026-09-07T13:58:37.725574Z","shell.execute_reply":"2026-09-07T13:58:37.725598Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nprint(\"===== module/utils.py =====\")\nwith open(\"module/utils.py\", \"r\") as f:\n    for i, line in enumerate(f, 1):\n        print(f\"{i:3}: {line.rstrip()}\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.726959Z","iopub.status.idle":"2026-09-07T13:58:37.727292Z","shell.execute_reply.started":"2026-09-07T13:58:37.727131Z","shell.execute_reply":"2026-09-07T13:58:37.727155Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nprint(open(\"module/utils.py\").read())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.728256Z","iopub.status.idle":"2026-09-07T13:58:37.728626Z","shell.execute_reply.started":"2026-09-07T13:58:37.72845Z","shell.execute_reply":"2026-09-07T13:58:37.728475Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.729881Z","iopub.status.idle":"2026-09-07T13:58:37.730207Z","shell.execute_reply.started":"2026-09-07T13:58:37.730041Z","shell.execute_reply":"2026-09-07T13:58:37.730064Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport os\nimport sys\nimport importlib\n\nREPO = \"/kaggle/working/EarthVQA\"\n\n# Verify repository structure\nprint(\"Repository:\", os.path.exists(REPO))\nprint(\"module/:\", os.path.isdir(os.path.join(REPO, \"module\")))\nprint(\"module/__init__.py:\", os.path.isfile(os.path.join(REPO, \"module\", \"__init__.py\")))\nprint(\"data/:\", os.path.isdir(os.path.join(REPO, \"data\")))\nprint(\"data/__init__.py:\", os.path.isfile(os.path.join(REPO, \"data\", \"__init__.py\")))\n\n# Put repository FIRST in Python's search path\nif REPO in sys.path:\n    sys.path.remove(REPO)\nsys.path.insert(0, REPO)\n\n# Clear possibly broken cached imports\nfor name in list(sys.modules):\n    if name == \"module\" or name.startswith(\"module.\"):\n        del sys.modules[name]\n    if name == \"data\" or name.startswith(\"data.\"):\n        del sys.modules[name]\n\nimportlib.invalidate_caches()\n\nprint(\"\\nRepository added to sys.path:\")\nprint(sys.path[:3])\n\n# Test module\nimport module\nprint(\"\\nSUCCESS: module loaded\")\nprint(\"module location:\", module.__file__)\n\n# Test data\nimport data\nprint(\"SUCCESS: data loaded\")\nprint(\"data location:\", data.__file__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.731685Z","iopub.status.idle":"2026-09-07T13:58:37.732012Z","shell.execute_reply.started":"2026-09-07T13:58:37.731878Z","shell.execute_reply":"2026-09-07T13:58:37.731903Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from module import utils\n\nprint(\"SUCCESS: module.utils imported\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.736092Z","iopub.status.idle":"2026-09-07T13:58:37.736603Z","shell.execute_reply.started":"2026-09-07T13:58:37.73648Z","shell.execute_reply":"2026-09-07T13:58:37.736497Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import ever as er\n\nprint(\"EVER:\", er.__file__)\n\ner.registry.register_all()\n\nprint(\"SUCCESS: EVER registry initialized\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.7379Z","iopub.status.idle":"2026-09-07T13:58:37.738667Z","shell.execute_reply.started":"2026-09-07T13:58:37.738445Z","shell.execute_reply":"2026-09-07T13:58:37.738471Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport os\n\nos.makedirs(\"log/sfpnr50/test_features\", exist_ok=True)\n\nprint(\"Working directory:\", os.getcwd())\nprint(\"Checkpoint exists:\", os.path.exists(\"log/sfpnr50.pth\"))\nprint(\"Test images:\", len(os.listdir(\"EarthVQA/Test/images_png\")))\n\n!python predict_seg.py \\\n    --config_path=sfpnr50 \\\n    --ckpt_path=\"log/sfpnr50.pth\" \\\n    --save_dir=\"log/sfpnr50/test_features\"","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.739666Z","iopub.status.idle":"2026-09-07T13:58:37.739894Z","shell.execute_reply.started":"2026-09-07T13:58:37.739788Z","shell.execute_reply":"2026-09-07T13:58:37.739801Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nfeature_dir = \"/kaggle/working/EarthVQA/log/sfpnr50/test_features\"\n\nprint(\"Feature directory:\", feature_dir)\nprint(\"Exists:\", os.path.exists(feature_dir))\n\nif os.path.exists(feature_dir):\n    files = os.listdir(feature_dir)\n    print(\"Number of generated files:\", len(files))\n    print(\"First 20 files:\")\n    print(files[:20])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.740727Z","iopub.status.idle":"2026-09-07T13:58:37.741033Z","shell.execute_reply.started":"2026-09-07T13:58:37.740886Z","shell.execute_reply":"2026-09-07T13:58:37.74091Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"image_feat_dir='./log/sfpnr50/test_features'","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.743083Z","iopub.status.idle":"2026-09-07T13:58:37.743448Z","shell.execute_reply.started":"2026-09-07T13:58:37.743252Z","shell.execute_reply":"2026-09-07T13:58:37.743282Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model = make_model(cfg['model'])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.744512Z","iopub.status.idle":"2026-09-07T13:58:37.744797Z","shell.execute_reply.started":"2026-09-07T13:58:37.744683Z","shell.execute_reply":"2026-09-07T13:58:37.744699Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nprint(open(\"configs/sfpnr50.py\").read())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.746383Z","iopub.status.idle":"2026-09-07T13:58:37.746706Z","shell.execute_reply.started":"2026-09-07T13:58:37.74656Z","shell.execute_reply":"2026-09-07T13:58:37.746586Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(open(\"predict_seg.py\").read())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.747907Z","iopub.status.idle":"2026-09-07T13:58:37.748198Z","shell.execute_reply.started":"2026-09-07T13:58:37.748082Z","shell.execute_reply":"2026-09-07T13:58:37.748098Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(open(\"module/semantic-fpn.py\").read()[:12000])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.75013Z","iopub.status.idle":"2026-09-07T13:58:37.750505Z","shell.execute_reply.started":"2026-09-07T13:58:37.750385Z","shell.execute_reply":"2026-09-07T13:58:37.750402Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nprint(open(\"configs/sfpnr50.py\").read())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.752166Z","iopub.status.idle":"2026-09-07T13:58:37.752522Z","shell.execute_reply.started":"2026-09-07T13:58:37.752403Z","shell.execute_reply":"2026-09-07T13:58:37.752419Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import inspect\nfrom ever.core.builder import make_model\n\nprint(inspect.getsource(make_model))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.753414Z","iopub.status.idle":"2026-09-07T13:58:37.754529Z","shell.execute_reply.started":"2026-09-07T13:58:37.754401Z","shell.execute_reply":"2026-09-07T13:58:37.754419Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nprint(\"===== configs/sfpnr50.py =====\")\nwith open(\"configs/sfpnr50.py\", \"r\") as f:\n    print(f.read())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.755619Z","iopub.status.idle":"2026-09-07T13:58:37.755972Z","shell.execute_reply.started":"2026-09-07T13:58:37.755797Z","shell.execute_reply":"2026-09-07T13:58:37.75582Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import inspect\nfrom ever.core.builder import make_model\n\nprint(\"===== EVER make_model =====\")\nprint(inspect.getsource(make_model))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.757141Z","iopub.status.idle":"2026-09-07T13:58:37.757536Z","shell.execute_reply.started":"2026-09-07T13:58:37.757359Z","shell.execute_reply":"2026-09-07T13:58:37.757384Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nwith open(\"configs/sfpnr50.py\", \"r\") as f:\n    config_text = f.read()\n\nprint(config_text)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.758738Z","iopub.status.idle":"2026-09-07T13:58:37.759032Z","shell.execute_reply.started":"2026-09-07T13:58:37.758894Z","shell.execute_reply":"2026-09-07T13:58:37.758934Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import inspect\nfrom ever.core.builder import make_model\n\nprint(inspect.getsource(make_model))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.760683Z","iopub.status.idle":"2026-09-07T13:58:37.761038Z","shell.execute_reply.started":"2026-09-07T13:58:37.760864Z","shell.execute_reply":"2026-09-07T13:58:37.760887Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport sys\nimport os\nimport torch\nimport ever as er\n\n# Make repository importable\nif \"/kaggle/working/EarthVQA\" not in sys.path:\n    sys.path.insert(0, \"/kaggle/working/EarthVQA\")\n\nprint(\"CWD:\", os.getcwd())\nprint(\"EVER:\", er.__file__)\n\n# Register EarthVQA components\ner.registry.register_all()\n\nprint(\"\\nRegistered models:\")\nprint(list(er.registry.MODEL.keys()))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.762804Z","iopub.status.idle":"2026-09-07T13:58:37.763304Z","shell.execute_reply.started":"2026-09-07T13:58:37.763177Z","shell.execute_reply":"2026-09-07T13:58:37.763194Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from ever.core.builder import make_model\nfrom ever.core.config import import_config\n\ncfg = import_config(\"sfpnr50\")\n\nprint(\"Config loaded\")\nprint(\"Model type:\", cfg[\"model\"][\"type\"])\nprint(\"Model params:\", cfg[\"model\"][\"params\"].keys())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.763991Z","iopub.status.idle":"2026-09-07T13:58:37.764596Z","shell.execute_reply.started":"2026-09-07T13:58:37.764465Z","shell.execute_reply":"2026-09-07T13:58:37.764483Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport sys\nsys.path.insert(0, \"/kaggle/working/EarthVQA\")\n\nimport ever as er\nfrom ever.core.config import import_config\n\ner.registry.register_all()\n\ncfg = import_config(\"sfpnr50\")\n\nprint(\"Model:\", cfg[\"model\"][\"type\"])\nprint(\"SemanticFPN class:\", er.registry.MODEL[\"SemanticFPN\"])\n\ncls = er.registry.MODEL[\"SemanticFPN\"]\n\nprint(\"_is_auto_config_class:\", cls._is_auto_config_class)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.766611Z","iopub.status.idle":"2026-09-07T13:58:37.766948Z","shell.execute_reply.started":"2026-09-07T13:58:37.766777Z","shell.execute_reply":"2026-09-07T13:58:37.766794Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working\n\n!rm -rf EarthVQA\n\n!git clone https://github.com/Junjue-Wang/EarthVQA.git EarthVQA","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.768221Z","iopub.status.idle":"2026-09-07T13:58:37.768512Z","shell.execute_reply.started":"2026-09-07T13:58:37.768386Z","shell.execute_reply":"2026-09-07T13:58:37.76841Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nREPO = \"/kaggle/working/EarthVQA\"\n\nprint(\"Repository:\", os.path.exists(REPO))\nprint(\"Contents:\")\nprint(os.listdir(REPO))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.770047Z","iopub.status.idle":"2026-09-07T13:58:37.770525Z","shell.execute_reply.started":"2026-09-07T13:58:37.770355Z","shell.execute_reply":"2026-09-07T13:58:37.770386Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nos.chdir(REPO)\n\nold = \"data/distributed\"\nnew = \"data/distributed.py\"\n\nif os.path.isfile(old):\n    os.rename(old, new)\n    print(\"Renamed distributed -> distributed.py\")\n\nif not os.path.exists(\"data/__init__.py\"):\n    open(\"data/__init__.py\", \"w\").close()\n    print(\"Created data/__init__.py\")\n\nprint(os.listdir(\"data\"))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.771618Z","iopub.status.idle":"2026-09-07T13:58:37.77191Z","shell.execute_reply.started":"2026-09-07T13:58:37.771786Z","shell.execute_reply":"2026-09-07T13:58:37.771811Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import ever as er\n\nprint(\"EVER:\", er.__file__)\nprint(\"EVER imported successfully\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.77351Z","iopub.status.idle":"2026-09-07T13:58:37.773858Z","shell.execute_reply.started":"2026-09-07T13:58:37.773726Z","shell.execute_reply":"2026-09-07T13:58:37.773745Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport sys\nimport os\nimport importlib.util\n\nREPO = \"/kaggle/working/EarthVQA\"\n\n# Put repository FIRST in Python's import path\nsys.path.insert(0, REPO)\n\n# Verify the actual files\nprint(\"REPO:\", REPO)\nprint(\"data exists:\", os.path.isdir(os.path.join(REPO, \"data\")))\nprint(\"data/__init__.py:\", os.path.isfile(os.path.join(REPO, \"data\", \"__init__.py\")))\nprint(\"data files:\", os.listdir(os.path.join(REPO, \"data\")))\n\n# Test Python's ability to locate data\nspec = importlib.util.find_spec(\"data\")\n\nprint(\"\\nPython data spec:\", spec)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.775702Z","iopub.status.idle":"2026-09-07T13:58:37.776088Z","shell.execute_reply.started":"2026-09-07T13:58:37.775909Z","shell.execute_reply":"2026-09-07T13:58:37.775943Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport sys\nimport os\nimport importlib.util\n\nREPO = \"/kaggle/working/EarthVQA\"\nDATA_DIR = os.path.join(REPO, \"data\")\nINIT = os.path.join(DATA_DIR, \"__init__.py\")\n\nspec = importlib.util.spec_from_file_location(\n    \"data\",\n    INIT,\n    submodule_search_locations=[DATA_DIR]\n)\n\ndata_module = importlib.util.module_from_spec(spec)\n\nsys.modules[\"data\"] = data_module\n\nspec.loader.exec_module(data_module)\n\nprint(\"data loaded manually:\", data_module)\nprint(\"data file:\", data_module.__file__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.777034Z","iopub.status.idle":"2026-09-07T13:58:37.777464Z","shell.execute_reply.started":"2026-09-07T13:58:37.777234Z","shell.execute_reply":"2026-09-07T13:58:37.77726Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import data\n\nprint(\"SUCCESS: data imported\")\nprint(\"data location:\", data.__file__)\nprint(\"data path:\", list(data.__path__))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.778941Z","iopub.status.idle":"2026-09-07T13:58:37.779195Z","shell.execute_reply.started":"2026-09-07T13:58:37.779082Z","shell.execute_reply":"2026-09-07T13:58:37.779098Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from data import distributed\n\nprint(\"SUCCESS: data.distributed imported\")\nprint(distributed.__file__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.780302Z","iopub.status.idle":"2026-09-07T13:58:37.780698Z","shell.execute_reply.started":"2026-09-07T13:58:37.780526Z","shell.execute_reply":"2026-09-07T13:58:37.78055Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport sys\nimport os\nimport importlib.util\n\nREPO = \"/kaggle/working/EarthVQA\"\nMODULE_DIR = os.path.join(REPO, \"module\")\n\nprint(\"module directory:\", MODULE_DIR)\nprint(\"Exists:\", os.path.isdir(MODULE_DIR))\nprint(\"Contents:\", os.listdir(MODULE_DIR))\n\n# Make repository the first import location\nif REPO in sys.path:\n    sys.path.remove(REPO)\nsys.path.insert(0, REPO)\n\n# Create module/__init__.py if missing\ninit_file = os.path.join(MODULE_DIR, \"__init__.py\")\n\nif not os.path.exists(init_file):\n    open(init_file, \"w\").close()\n    print(\"Created module/__init__.py\")\nelse:\n    print(\"module/__init__.py already exists\")\n\n# Test module discovery\nspec = importlib.util.find_spec(\"module\")\n\nprint(\"\\nModule spec:\", spec)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.781787Z","iopub.status.idle":"2026-09-07T13:58:37.782141Z","shell.execute_reply.started":"2026-09-07T13:58:37.781934Z","shell.execute_reply":"2026-09-07T13:58:37.78195Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import sys\nimport os\nimport importlib.util\n\nREPO = \"/kaggle/working/EarthVQA\"\nMODULE_DIR = os.path.join(REPO, \"module\")\nINIT = os.path.join(MODULE_DIR, \"__init__.py\")\n\nprint(\"REPO exists:\", os.path.exists(REPO))\nprint(\"MODULE exists:\", os.path.isdir(MODULE_DIR))\nprint(\"INIT exists:\", os.path.isfile(INIT))\n\n# Remove any broken/stale module entry\nsys.modules.pop(\"module\", None)\n\n# Force-load EarthVQA/module as the top-level package \"module\"\nspec = importlib.util.spec_from_file_location(\n    \"module\",\n    INIT,\n    submodule_search_locations=[MODULE_DIR]\n)\n\nmodule_pkg = importlib.util.module_from_spec(spec)\n\nsys.modules[\"module\"] = module_pkg\n\nspec.loader.exec_module(module_pkg)\n\nprint(\"\\nSUCCESS: module manually loaded\")\nprint(\"module:\", module_pkg)\nprint(\"module file:\", module_pkg.__file__)\nprint(\"module path:\", list(module_pkg.__path__))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.783294Z","iopub.status.idle":"2026-09-07T13:58:37.783609Z","shell.execute_reply.started":"2026-09-07T13:58:37.783487Z","shell.execute_reply":"2026-09-07T13:58:37.783511Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from module import seg_base\n\nprint(\"SUCCESS: module.seg_base imported\")\nprint(seg_base.__file__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.784701Z","iopub.status.idle":"2026-09-07T13:58:37.785042Z","shell.execute_reply.started":"2026-09-07T13:58:37.784894Z","shell.execute_reply":"2026-09-07T13:58:37.78491Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\npath = \"module/utils.py\"\n\nwith open(path, \"r\") as f:\n    text = f.read()\n\nold = \"from albumentations.core.transforms_interface import ImageOnlyTransform, NoOp, to_tuple\"\n\nnew = \"\"\"from albumentations.core.transforms_interface import ImageOnlyTransform, NoOp\n\ndef to_tuple(param, low=None, bias=None):\n    if param is None:\n        return (low, low) if low is not None else (None, None)\n\n    if isinstance(param, (list, tuple)):\n        if len(param) == 2:\n            return tuple(param)\n        if len(param) == 1:\n            param = param[0]\n\n    if bias is not None:\n        return (param - bias, param + bias)\n\n    if low is not None:\n        return (low, param)\n\n    return (param, param)\n\"\"\"\n\nif old in text:\n    text = text.replace(old, new)\n    with open(path, \"w\") as f:\n        f.write(text)\n    print(\"PATCH SUCCESS\")\nelse:\n    print(\"Original import not found.\")\n    print(\"First lines:\")\n    print(\"\\n\".join(text.splitlines()[:15]))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.786489Z","iopub.status.idle":"2026-09-07T13:58:37.786822Z","shell.execute_reply.started":"2026-09-07T13:58:37.786653Z","shell.execute_reply":"2026-09-07T13:58:37.786675Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import sys\n\nfor name in list(sys.modules):\n    if name == \"module.utils\" or name.startswith(\"module.utils.\"):\n        del sys.modules[name]\n\nprint(\"module.utils cache cleared\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.787624Z","iopub.status.idle":"2026-09-07T13:58:37.787839Z","shell.execute_reply.started":"2026-09-07T13:58:37.787735Z","shell.execute_reply":"2026-09-07T13:58:37.787748Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from module import utils\n\nprint(\"SUCCESS: module.utils imported\")\nprint(\"Location:\", utils.__file__)\nprint(\"to_tuple:\", utils.to_tuple)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.788821Z","iopub.status.idle":"2026-09-07T13:58:37.78916Z","shell.execute_reply.started":"2026-09-07T13:58:37.788987Z","shell.execute_reply":"2026-09-07T13:58:37.789008Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport sys\n\nif \"/kaggle/working/EarthVQA\" not in sys.path:\n    sys.path.insert(0, \"/kaggle/working/EarthVQA\")\n\nfrom module import seg_base\n\nprint(\"SUCCESS: module.seg_base imported\")\nprint(\"Location:\", seg_base.__file__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.7903Z","iopub.status.idle":"2026-09-07T13:58:37.790722Z","shell.execute_reply.started":"2026-09-07T13:58:37.790508Z","shell.execute_reply":"2026-09-07T13:58:37.790532Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from module import soba\n\nprint(\"SUCCESS: module.soba imported\")\nprint(\"Location:\", soba.__file__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.791732Z","iopub.status.idle":"2026-09-07T13:58:37.791947Z","shell.execute_reply.started":"2026-09-07T13:58:37.791841Z","shell.execute_reply":"2026-09-07T13:58:37.791854Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q segmentation-models-pytorch","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.792661Z","iopub.status.idle":"2026-09-07T13:58:37.792984Z","shell.execute_reply.started":"2026-09-07T13:58:37.792814Z","shell.execute_reply":"2026-09-07T13:58:37.792836Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import segmentation_models_pytorch as smp\n\nprint(\"SMP version:\", smp.__version__)\nprint(\"SMP imported successfully\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.79453Z","iopub.status.idle":"2026-09-07T13:58:37.79503Z","shell.execute_reply.started":"2026-09-07T13:58:37.794903Z","shell.execute_reply":"2026-09-07T13:58:37.79492Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(os.getcwd())\nprint(os.listdir(\"/kaggle/working\"))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.795966Z","iopub.status.idle":"2026-09-07T13:58:37.796194Z","shell.execute_reply.started":"2026-09-07T13:58:37.796086Z","shell.execute_reply":"2026-09-07T13:58:37.7961Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(\"=== /kaggle/working ===\")\nprint(os.listdir(\"/kaggle/working\"))\n\nprint(\"\\n=== /kaggle/input ===\")\nfor root, dirs, files in os.walk(\"/kaggle/input\"):\n    print(root)\n    if root.count(os.sep) >= 4:\n        dirs[:] = []","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.797641Z","iopub.status.idle":"2026-09-07T13:58:37.797977Z","shell.execute_reply.started":"2026-09-07T13:58:37.797802Z","shell.execute_reply":"2026-09-07T13:58:37.797827Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nROOT = \"/kaggle/input/datasets/alienxc137\"\n\nprint(\"Exists:\", os.path.exists(ROOT))\nprint(\"Contents:\")\n\nfor root, dirs, files in os.walk(ROOT):\n    level = root.replace(ROOT, \"\").count(os.sep)\n    indent = \"  \" * level\n    print(f\"{indent}{os.path.basename(root)}/\")\n\n    for f in files[:20]:\n        print(f\"{indent}  {f}\")\n\n    # Don't recursively print thousands of files\n    if level >= 3:\n        dirs[:] = []","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.799126Z","iopub.status.idle":"2026-09-07T13:58:37.799484Z","shell.execute_reply.started":"2026-09-07T13:58:37.799285Z","shell.execute_reply":"2026-09-07T13:58:37.799329Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nROOT = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans\"\n\nprint(\"Searching for checkpoints and Python code...\\n\")\n\nfor root, dirs, files in os.walk(ROOT):\n    for f in files:\n        if (\n            f.endswith((\".pth\", \".pt\", \".ckpt\"))\n            or f in [\"predict_seg.py\", \"predict_soba.py\", \"train_earthvqa.py\"]\n        ):\n            full = os.path.join(root, f)\n            size_mb = os.path.getsize(full) / (1024 * 1024)\n            print(f\"{full}  [{size_mb:.1f} MB]\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.800705Z","iopub.status.idle":"2026-09-07T13:58:37.800922Z","shell.execute_reply.started":"2026-09-07T13:58:37.800816Z","shell.execute_reply":"2026-09-07T13:58:37.80083Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nROOT = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans\"\n\nprint(\"Searching for EarthVQA source directories...\\n\")\n\ntargets = {\n    \"module\",\n    \"data\",\n    \"configs\",\n    \"scripts\",\n}\n\nfor root, dirs, files in os.walk(ROOT):\n    for d in dirs:\n        if d in targets:\n            print(\"FOUND:\", os.path.join(root, d))\n\n    for f in files:\n        if f in [\"semantic-fpn.py\", \"seg_base.py\", \"soba.py\", \"predict_seg.py\"]:\n            print(\"FOUND FILE:\", os.path.join(root, f))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.801865Z","iopub.status.idle":"2026-09-07T13:58:37.802091Z","shell.execute_reply.started":"2026-09-07T13:58:37.801979Z","shell.execute_reply":"2026-09-07T13:58:37.801992Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working\n\n!rm -rf EarthVQA\n\n!git clone https://github.com/Junjue-Wang/EarthVQA.git\n\n%cd /kaggle/working/EarthVQA\n\nprint(\"Repository restored:\", __import__(\"os\").path.exists(\"/kaggle/working/EarthVQA\"))\n!find . -maxdepth 2 -type f | sort | head -50","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.803428Z","iopub.status.idle":"2026-09-07T13:58:37.803697Z","shell.execute_reply.started":"2026-09-07T13:58:37.803544Z","shell.execute_reply":"2026-09-07T13:58:37.803558Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q ever-beta\n!pip install -q \"git+https://github.com/qubvel/segmentation_models.pytorch\"\n!pip install -q \"albumentations==1.4.3\"","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.804805Z","iopub.status.idle":"2026-09-07T13:58:37.805091Z","shell.execute_reply.started":"2026-09-07T13:58:37.804966Z","shell.execute_reply":"2026-09-07T13:58:37.804992Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport sys\nimport os\n\nsys.path.insert(0, os.getcwd())\n\nprint(\"cwd:\", os.getcwd())\nprint(\"Python path:\", sys.path[0])\n\nimport ever as er\nimport albumentations\nimport segmentation_models_pytorch\n\nprint(\"EVER: OK\")\nprint(\"Albumentations:\", albumentations.__version__)\nprint(\"SMP: OK\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.806347Z","iopub.status.idle":"2026-09-07T13:58:37.806705Z","shell.execute_reply.started":"2026-09-07T13:58:37.806517Z","shell.execute_reply":"2026-09-07T13:58:37.806555Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport shutil\n\nDATA_ROOT = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/2024EarthVQA/2024EarthVQA\"\n\nos.makedirs(\"/kaggle/working/EarthVQA/log\", exist_ok=True)\n\nshutil.copy(\n    os.path.join(DATA_ROOT, \"Weights\", \"sfpnr50.pth\"),\n    \"/kaggle/working/EarthVQA/log/sfpnr50.pth\"\n)\n\nshutil.copy(\n    os.path.join(DATA_ROOT, \"Weights\", \"soba.pth\"),\n    \"/kaggle/working/EarthVQA/log/soba.pth\"\n)\n\nprint(\"SFPN:\", os.path.getsize(\"/kaggle/working/EarthVQA/log/sfpnr50.pth\") / 1024**2, \"MB\")\nprint(\"SOBA:\", os.path.getsize(\"/kaggle/working/EarthVQA/log/soba.pth\") / 1024**2, \"MB\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.808163Z","iopub.status.idle":"2026-09-07T13:58:37.808712Z","shell.execute_reply.started":"2026-09-07T13:58:37.808554Z","shell.execute_reply":"2026-09-07T13:58:37.808581Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport os\n\nprint(\"CWD:\", os.getcwd())\nprint(\"predict_seg.py:\", os.path.exists(\"predict_seg.py\"))\nprint(\"semantic-fpn.py:\", os.path.exists(\"module/semantic-fpn.py\"))\nprint(\"config:\", os.path.exists(\"configs/sfpnr50.py\"))\nprint(\"SFPN checkpoint:\", os.path.exists(\"log/sfpnr50.pth\"))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.80989Z","iopub.status.idle":"2026-09-07T13:58:37.810228Z","shell.execute_reply.started":"2026-09-07T13:58:37.810057Z","shell.execute_reply":"2026-09-07T13:58:37.81008Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import sys\nsys.path.insert(0, \"/kaggle/working/EarthVQA\")\n\nimport ever as er\nimport albumentations\nimport segmentation_models_pytorch\n\nprint(\"EVER: OK\")\nprint(\"Albumentations:\", albumentations.__version__)\nprint(\"SMP: OK\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.811904Z","iopub.status.idle":"2026-09-07T13:58:37.812244Z","shell.execute_reply.started":"2026-09-07T13:58:37.812071Z","shell.execute_reply":"2026-09-07T13:58:37.812095Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from ever.core.config import import_config\n\ncfg = import_config(\"sfpnr50\")\n\nprint(\"Config loaded\")\nprint(\"Model:\")\nprint(cfg[\"model\"])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.813566Z","iopub.status.idle":"2026-09-07T13:58:37.814016Z","shell.execute_reply.started":"2026-09-07T13:58:37.813867Z","shell.execute_reply":"2026-09-07T13:58:37.813897Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"","metadata":{}},{"cell_type":"code","source":"!git clone https://github.com/Junjue-Wang/EarthVQA.git EarthVQA","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.814817Z","iopub.status.idle":"2026-09-07T13:58:37.815133Z","shell.execute_reply.started":"2026-09-07T13:58:37.815011Z","shell.execute_reply":"2026-09-07T13:58:37.815028Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"%cd /kaggle/working/EarthVQA\n\nimport os\n\nprint(\"Repository:\", os.getcwd())\nprint(\"\\nData files:\")\n\nfor f in os.listdir(\"data\"):\n    print(\" \", f)\n\nprint(\"\\nModule files:\")\n\nfor f in os.listdir(\"module\"):\n    print(\" \", f)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.816302Z","iopub.status.idle":"2026-09-07T13:58:37.816669Z","shell.execute_reply.started":"2026-09-07T13:58:37.816495Z","shell.execute_reply":"2026-09-07T13:58:37.816518Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!git remote -v\n!git status\n!git log -1 --oneline","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.818448Z","iopub.status.idle":"2026-09-07T13:58:37.818969Z","shell.execute_reply.started":"2026-09-07T13:58:37.818817Z","shell.execute_reply":"2026-09-07T13:58:37.818846Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport shutil\n\nDATA_ROOT = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/2024EarthVQA/2024EarthVQA\"\n\nos.makedirs(\"log\", exist_ok=True)\n\nshutil.copy(\n    f\"{DATA_ROOT}/Weights/sfpnr50.pth\",\n    \"log/sfpnr50.pth\"\n)\n\nshutil.copy(\n    f\"{DATA_ROOT}/Weights/soba.pth\",\n    \"log/soba.pth\"\n)\n\nprint(\"SFPN:\", os.path.getsize(\"log/sfpnr50.pth\") / 1024**2, \"MB\")\nprint(\"SOBA:\", os.path.getsize(\"log/soba.pth\") / 1024**2, \"MB\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.819693Z","iopub.status.idle":"2026-09-07T13:58:37.8201Z","shell.execute_reply.started":"2026-09-07T13:58:37.819907Z","shell.execute_reply":"2026-09-07T13:58:37.819961Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport sys\nimport subprocess\nimport shutil\n\nREPO = \"/kaggle/working/EarthVQA\"\n\n# Make sure we are in the real repository\nos.chdir(REPO)\n\nprint(\"CWD:\", os.getcwd())\nprint(\"Git:\", subprocess.check_output(\n    [\"git\", \"rev-parse\", \"--short\", \"HEAD\"]\n).decode().strip())\n\n# Re-create required package marker\nos.makedirs(\"data\", exist_ok=True)\nos.makedirs(\"module\", exist_ok=True)\n\nopen(\"data/__init__.py\", \"w\").write(\"\")\nopen(\"module/__init__.py\", \"w\").write(\"\")\n\nprint(\"\\nRequired files:\")\nfor f in [\n    \"data/__init__.py\",\n    \"data/distributed.py\",\n    \"data/earthvqa.py\",\n    \"data/lovedav2.py\",\n    \"module/__init__.py\",\n    \"module/semantic-fpn.py\",\n    \"module/soba.py\",\n]:\n    print(f, \"=>\", os.path.exists(f))\n\n# Python must see the repository FIRST\nif REPO in sys.path:\n    sys.path.remove(REPO)\nsys.path.insert(0, REPO)\n\n# Remove stale/broken modules from previous notebook cells\nfor name in list(sys.modules):\n    if name == \"data\" or name.startswith(\"data.\"):\n        del sys.modules[name]\n    if name == \"module\" or name.startswith(\"module.\"):\n        del sys.modules[name]\n\nprint(\"\\nsys.path[0]:\", sys.path[0])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.821126Z","iopub.status.idle":"2026-09-07T13:58:37.821446Z","shell.execute_reply.started":"2026-09-07T13:58:37.821267Z","shell.execute_reply":"2026-09-07T13:58:37.82129Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport subprocess\nimport shutil\n\nREPO = \"/kaggle/working/EarthVQA\"\nos.chdir(REPO)\n\n# Remove only the broken local data package\nif os.path.exists(\"data\"):\n    shutil.rmtree(\"data\")\n\n# Restore data from the repository's HEAD\nsubprocess.run(\n    [\"git\", \"checkout\", \"HEAD\", \"--\", \"data\"],\n    check=True\n)\n\nprint(\"DATA DIRECTORY RESTORED\")\nprint(os.listdir(\"data\"))\n\nfor f in [\n    \"data/__init__.py\",\n    \"data/distributed.py\",\n    \"data/earthvqa.py\",\n    \"data/lovedav2.py\",\n]:\n    print(f, \"=>\", os.path.exists(f))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.822659Z","iopub.status.idle":"2026-09-07T13:58:37.823007Z","shell.execute_reply.started":"2026-09-07T13:58:37.82284Z","shell.execute_reply":"2026-09-07T13:58:37.822863Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport subprocess\n\nREPO = \"/kaggle/working/EarthVQA\"\nos.chdir(REPO)\n\nprint(\"CWD:\", os.getcwd())\n\nprint(\"\\nDATA DIRECTORY:\")\nprint(os.listdir(\"data\") if os.path.exists(\"data\") else \"DATA DOES NOT EXIST\")\n\nprint(\"\\nGIT TRACKING:\")\nresult = subprocess.run(\n    [\"git\", \"ls-tree\", \"-r\", \"--name-only\", \"HEAD\", \"data\"],\n    capture_output=True,\n    text=True\n)\nprint(result.stdout)\n\nprint(\"\\nFILESYSTEM CHECK:\")\nfor f in [\n    \"data/__init__.py\",\n    \"data/distributed.py\",\n    \"data/earthvqa.py\",\n    \"data/lovedav2.py\",\n]:\n    print(f\"{f}: {os.path.isfile(f)}\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.827068Z","iopub.status.idle":"2026-09-07T13:58:37.827521Z","shell.execute_reply.started":"2026-09-07T13:58:37.827335Z","shell.execute_reply":"2026-09-07T13:58:37.827359Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport shutil\n\nREPO = \"/kaggle/working/EarthVQA\"\nos.chdir(REPO)\n\n# Rename the repository's distributed file\nsrc = \"data/distributed\"\ndst = \"data/distributed.py\"\n\nif os.path.exists(src):\n    shutil.move(src, dst)\n    print(\"Renamed:\", src, \"->\", dst)\nelif os.path.exists(dst):\n    print(\"distributed.py already exists\")\nelse:\n    raise FileNotFoundError(\"Neither distributed nor distributed.py exists\")\n\n# Create package initializer\ninit_file = \"data/__init__.py\"\n\nif not os.path.exists(init_file):\n    open(init_file, \"w\").write(\"\")\n    print(\"Created:\", init_file)\n\nprint(\"\\nDATA DIRECTORY:\")\nprint(os.listdir(\"data\"))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.829045Z","iopub.status.idle":"2026-09-07T13:58:37.829368Z","shell.execute_reply.started":"2026-09-07T13:58:37.82921Z","shell.execute_reply":"2026-09-07T13:58:37.829225Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import sys\nimport os\n\nREPO = \"/kaggle/working/EarthVQA\"\nos.chdir(REPO)\n\nif REPO in sys.path:\n    sys.path.remove(REPO)\n\nsys.path.insert(0, REPO)\n\n# Remove stale data/module imports\nfor name in list(sys.modules):\n    if name == \"data\" or name.startswith(\"data.\"):\n        del sys.modules[name]\n\nprint(\"sys.path[0]:\", sys.path[0])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.830444Z","iopub.status.idle":"2026-09-07T13:58:37.830729Z","shell.execute_reply.started":"2026-09-07T13:58:37.830558Z","shell.execute_reply":"2026-09-07T13:58:37.830572Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import data\n\nprint(\"data:\", data)\nprint(\"data.__file__:\", data.__file__)\n\nfrom data import distributed\n\nprint(\"distributed:\", distributed)\nprint(\"distributed.__file__:\", distributed.__file__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.831723Z","iopub.status.idle":"2026-09-07T13:58:37.832009Z","shell.execute_reply.started":"2026-09-07T13:58:37.831892Z","shell.execute_reply":"2026-09-07T13:58:37.831907Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(\"EarthVQA directory:\")\nprint(os.listdir(\"/kaggle/working/EarthVQA\"))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.833052Z","iopub.status.idle":"2026-09-07T13:58:37.833273Z","shell.execute_reply.started":"2026-09-07T13:58:37.833168Z","shell.execute_reply":"2026-09-07T13:58:37.833182Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(\"Current directory:\")\nprint(os.getcwd())\n\nprint(\"\\nFiles in /kaggle/working:\")\nprint(os.listdir(\"/kaggle/working\"))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.834471Z","iopub.status.idle":"2026-09-07T13:58:37.834845Z","shell.execute_reply.started":"2026-09-07T13:58:37.834641Z","shell.execute_reply":"2026-09-07T13:58:37.834666Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(\"Datasets available in Kaggle:\")\nprint(os.listdir(\"/kaggle/input\"))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.836206Z","iopub.status.idle":"2026-09-07T13:58:37.836555Z","shell.execute_reply.started":"2026-09-07T13:58:37.836379Z","shell.execute_reply":"2026-09-07T13:58:37.836402Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nfor name in os.listdir(\"/kaggle/input\"):\n    if \"earth\" in name.lower() or \"vqa\" in name.lower():\n        print(\"EarthVQA dataset:\", name)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.83808Z","iopub.status.idle":"2026-09-07T13:58:37.838489Z","shell.execute_reply.started":"2026-09-07T13:58:37.838266Z","shell.execute_reply":"2026-09-07T13:58:37.838292Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"SatQuery AI is running\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.839589Z","iopub.status.idle":"2026-09-07T13:58:37.839906Z","shell.execute_reply.started":"2026-09-07T13:58:37.839787Z","shell.execute_reply":"2026-09-07T13:58:37.839804Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\npath = \"/kaggle/input/datasets/alienxc137\"\n\nprint(\"Contents:\")\nprint(os.listdir(path))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.840887Z","iopub.status.idle":"2026-09-07T13:58:37.841098Z","shell.execute_reply.started":"2026-09-07T13:58:37.840993Z","shell.execute_reply":"2026-09-07T13:58:37.841007Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\npath = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans\"\n\nprint(\"EarthVQA contents:\")\nprint(os.listdir(path))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.842401Z","iopub.status.idle":"2026-09-07T13:58:37.842747Z","shell.execute_reply.started":"2026-09-07T13:58:37.842602Z","shell.execute_reply":"2026-09-07T13:58:37.842621Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for root, dirs, files in os.walk(path):\n    print(\"\\n📁\", root)\n    if files:\n        print(\"Files:\", files[:10])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.843823Z","iopub.status.idle":"2026-09-07T13:58:37.844046Z","shell.execute_reply.started":"2026-09-07T13:58:37.843939Z","shell.execute_reply":"2026-09-07T13:58:37.843953Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import json\n\nqa_path = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/2024EarthVQA/2024EarthVQA/Train_QA.json\"\n\nwith open(qa_path, \"r\") as f:\n    train_data = json.load(f)\n\nprint(\"Type:\", type(train_data))\nprint(\"Keys:\", train_data.keys())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.845922Z","iopub.status.idle":"2026-09-07T13:58:37.846224Z","shell.execute_reply.started":"2026-09-07T13:58:37.846106Z","shell.execute_reply":"2026-09-07T13:58:37.846122Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for key, value in train_data.items():\n    print(\"\\nKEY:\", key)\n    print(\"TYPE:\", type(value))\n    \n    if isinstance(value, list):\n        print(\"Number of items:\", len(value))\n        print(\"First item:\", value[0])\n    elif isinstance(value, dict):\n        print(\"Nested keys:\", value.keys())\n    else:\n        print(\"Value:\", value)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.847433Z","iopub.status.idle":"2026-09-07T13:58:37.84775Z","shell.execute_reply.started":"2026-09-07T13:58:37.847607Z","shell.execute_reply":"2026-09-07T13:58:37.84763Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import json\nimport os\n\nqa_path = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/2024EarthVQA/2024EarthVQA/Train_QA.json\"\n\nwith open(qa_path, \"r\") as f:\n    train_data = json.load(f)\n\n# Select one image\nimage_name = \"275.png\"\n\n# Get its questions\nquestions = train_data[image_name]\n\n# Select the first question\nsample = questions[0]\n\nprint(\"Image:\", image_name)\nprint(\"Question:\", sample[\"Question\"])\nprint(\"Expected answer:\", sample[\"Answer\"])\nprint(\"Question type:\", sample[\"Type\"])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.848767Z","iopub.status.idle":"2026-09-07T13:58:37.848996Z","shell.execute_reply.started":"2026-09-07T13:58:37.848883Z","shell.execute_reply":"2026-09-07T13:58:37.848898Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import Image\nimport os\n\nimage_path = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/Train-003/Train/images_png/275.png\"\n\nprint(\"Exists:\", os.path.exists(image_path))\n\nif os.path.exists(image_path):\n    image = Image.open(image_path)\n    print(\"Image size:\", image.size)\n    display(image)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.849753Z","iopub.status.idle":"2026-09-07T13:58:37.850093Z","shell.execute_reply.started":"2026-09-07T13:58:37.849907Z","shell.execute_reply":"2026-09-07T13:58:37.849937Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import BlipProcessor, BlipForQuestionAnswering\nimport torch\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\nprocessor = BlipProcessor.from_pretrained(\"Salesforce/blip-vqa-base\")\nmodel = BlipForQuestionAnswering.from_pretrained(\"Salesforce/blip-vqa-base\")\n\nmodel = model.to(device)\nmodel.eval()\n\nprint(\"Device:\", device)\nprint(\"BLIP-VQA loaded successfully\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.851216Z","iopub.status.idle":"2026-09-07T13:58:37.851578Z","shell.execute_reply.started":"2026-09-07T13:58:37.851379Z","shell.execute_reply":"2026-09-07T13:58:37.851417Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"question = sample[\"Question\"]\nexpected_answer = sample[\"Answer\"]\n\ninputs = processor(\n    images=image,\n    text=question,\n    return_tensors=\"pt\"\n)\n\ninputs = {k: v.to(device) for k, v in inputs.items()}\n\nwith torch.no_grad():\n    output = model.generate(\n        **inputs,\n        max_new_tokens=20\n    )\n\npredicted_answer = processor.decode(\n    output[0],\n    skip_special_tokens=True\n)\n\nprint(\"Question:\", question)\nprint(\"Expected answer:\", expected_answer)\nprint(\"BLIP answer:\", predicted_answer)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.852809Z","iopub.status.idle":"2026-09-07T13:58:37.853059Z","shell.execute_reply.started":"2026-09-07T13:58:37.852922Z","shell.execute_reply":"2026-09-07T13:58:37.852936Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for i in range(5):\n\n    sample = questions[i]\n\n    question = sample[\"Question\"]\n    expected_answer = sample[\"Answer\"]\n\n    inputs = processor(\n        images=image,\n        text=question,\n        return_tensors=\"pt\"\n    )\n\n    inputs = {k: v.to(device) for k, v in inputs.items()}\n\n    with torch.no_grad():\n        output = model.generate(\n            **inputs,\n            max_new_tokens=20\n        )\n\n    predicted_answer = processor.decode(\n        output[0],\n        skip_special_tokens=True\n    )\n\n    print(\"=\" * 60)\n    print(\"Question :\", question)\n    print(\"Expected :\", expected_answer)\n    print(\"BLIP     :\", predicted_answer)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.854857Z","iopub.status.idle":"2026-09-07T13:58:37.855143Z","shell.execute_reply.started":"2026-09-07T13:58:37.855018Z","shell.execute_reply":"2026-09-07T13:58:37.855043Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from collections import Counter\n\nall_questions = []\nall_answers = []\n\nfor image_name, qa_list in train_data.items():\n    for item in qa_list:\n        all_questions.append(item[\"Question\"])\n        all_answers.append(item[\"Answer\"])\n\nprint(\"Total images:\", len(train_data))\nprint(\"Total QA pairs:\", len(all_questions))\n\nprint(\"\\nMost common answers:\")\nfor answer, count in Counter(all_answers).most_common(30):\n    print(answer, \":\", count)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.856475Z","iopub.status.idle":"2026-09-07T13:58:37.856862Z","shell.execute_reply.started":"2026-09-07T13:58:37.85662Z","shell.execute_reply":"2026-09-07T13:58:37.85664Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import json\nimport os\n\nqa_path = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/2024EarthVQA/2024EarthVQA/Train_QA.json\"\n\nwith open(qa_path, \"r\") as f:\n    train_data = json.load(f)\n\nrecords = []\n\nfor image_name, qa_list in train_data.items():\n    for item in qa_list:\n        records.append({\n            \"image\": image_name,\n            \"question\": item[\"Question\"],\n            \"answer\": item[\"Answer\"],\n            \"type\": item[\"Type\"]\n        })\n\nprint(\"Total training records:\", len(records))\nprint(\"\\nFirst 5 records:\")\n\nfor record in records[:5]:\n    print(record)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.858655Z","iopub.status.idle":"2026-09-07T13:58:37.858948Z","shell.execute_reply.started":"2026-09-07T13:58:37.858834Z","shell.execute_reply":"2026-09-07T13:58:37.858849Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"image_dir = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/Train-003/Train/images_png\"\n\nmissing = []\n\nfor record in records:\n    image_path = os.path.join(image_dir, record[\"image\"])\n    \n    if not os.path.exists(image_path):\n        missing.append(record[\"image\"])\n\nprint(\"Missing images:\", len(missing))\n\nif missing:\n    print(\"First missing images:\", missing[:20])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.860406Z","iopub.status.idle":"2026-09-07T13:58:37.86072Z","shell.execute_reply.started":"2026-09-07T13:58:37.86058Z","shell.execute_reply":"2026-09-07T13:58:37.860595Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import random\n\nrandom.seed(42)\n\n# Use 5,000 samples for the first fine-tuning experiment\ntrain_subset = random.sample(records, 5000)\n\nprint(\"Training subset:\", len(train_subset))\n\nprint(\"\\nFirst 5 samples:\")\nfor r in train_subset[:5]:\n    print(r)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.861996Z","iopub.status.idle":"2026-09-07T13:58:37.862306Z","shell.execute_reply.started":"2026-09-07T13:58:37.862177Z","shell.execute_reply":"2026-09-07T13:58:37.862195Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Model:\", type(model).__name__)\nprint(\"Processor:\", type(processor).__name__)\nprint(\"Device:\", device)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.863569Z","iopub.status.idle":"2026-09-07T13:58:37.863978Z","shell.execute_reply.started":"2026-09-07T13:58:37.863842Z","shell.execute_reply":"2026-09-07T13:58:37.86386Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torch.utils.data import Dataset, DataLoader\nfrom PIL import Image\nimport os\nimport torch\n\nimage_dir = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/Train-003/Train/images_png\"\n\n\nclass EarthVQADataset(Dataset):\n    def __init__(self, records, processor, image_dir):\n        self.records = records\n        self.processor = processor\n        self.image_dir = image_dir\n\n    def __len__(self):\n        return len(self.records)\n\n    def __getitem__(self, idx):\n        record = self.records[idx]\n\n        image_path = os.path.join(\n            self.image_dir,\n            record[\"image\"]\n        )\n\n        image = Image.open(image_path).convert(\"RGB\")\n\n        question = record[\"question\"]\n        answer = record[\"answer\"]\n\n        encoding = self.processor(\n            images=image,\n            text=question,\n            return_tensors=\"pt\",\n            padding=\"max_length\",\n            truncation=True,\n            max_length=32\n        )\n\n        labels = self.processor.tokenizer(\n            answer,\n            return_tensors=\"pt\",\n            padding=\"max_length\",\n            truncation=True,\n            max_length=16\n        ).input_ids\n\n        # Ignore padding tokens when calculating loss\n        labels[labels == self.processor.tokenizer.pad_token_id] = -100\n\n        encoding = {k: v.squeeze(0) for k, v in encoding.items()}\n        encoding[\"labels\"] = labels.squeeze(0)\n\n        return encoding","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.865158Z","iopub.status.idle":"2026-09-07T13:58:37.865498Z","shell.execute_reply.started":"2026-09-07T13:58:37.865267Z","shell.execute_reply":"2026-09-07T13:58:37.865299Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import json\nimport os\nimport random\n\n# --------------------------------------------------\n# 1. Paths\n# --------------------------------------------------\n\nbase_path = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans\"\n\nqa_path = os.path.join(\n    base_path,\n    \"2024EarthVQA\",\n    \"2024EarthVQA\",\n    \"Train_QA.json\"\n)\n\nimage_dir = os.path.join(\n    base_path,\n    \"Train-003\",\n    \"Train\",\n    \"images_png\"\n)\n\n# --------------------------------------------------\n# 2. Load EarthVQA questions and answers\n# --------------------------------------------------\n\nwith open(qa_path, \"r\") as f:\n    train_data = json.load(f)\n\n# --------------------------------------------------\n# 3. Convert JSON → records\n# --------------------------------------------------\n\nrecords = []\n\nfor image_name, qa_list in train_data.items():\n    for item in qa_list:\n        records.append({\n            \"image\": image_name,\n            \"question\": item[\"Question\"],\n            \"answer\": item[\"Answer\"],\n            \"type\": item[\"Type\"]\n        })\n\nprint(\"Total QA records:\", len(records))\n\n# --------------------------------------------------\n# 4. Create 5,000-sample training subset\n# --------------------------------------------------\n\nrandom.seed(42)\n\ntrain_subset = random.sample(records, 5000)\n\nprint(\"Training subset:\", len(train_subset))\n\n# --------------------------------------------------\n# 5. Verify images\n# --------------------------------------------------\n\nmissing = []\n\nfor record in train_subset:\n    image_path = os.path.join(image_dir, record[\"image\"])\n\n    if not os.path.exists(image_path):\n        missing.append(record[\"image\"])\n\nprint(\"Missing images:\", len(missing))\n\n# --------------------------------------------------\n# 6. Show first sample\n# --------------------------------------------------\n\nprint(\"\\nFirst training sample:\")\nprint(train_subset[0])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.868591Z","iopub.status.idle":"2026-09-07T13:58:37.868886Z","shell.execute_reply.started":"2026-09-07T13:58:37.868771Z","shell.execute_reply":"2026-09-07T13:58:37.868788Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import BlipProcessor, BlipForQuestionAnswering\n\nprint(\"BLIP imports successfully\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.869887Z","iopub.status.idle":"2026-09-07T13:58:37.870102Z","shell.execute_reply.started":"2026-09-07T13:58:37.869996Z","shell.execute_reply":"2026-09-07T13:58:37.87001Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\n\nprint(\"PyTorch:\", torch.__version__)\nprint(\"CUDA:\", torch.cuda.is_available())\n\nimport torchvision\n\nprint(\"TorchVision:\", torchvision.__version__)\nprint(\"TorchVision imported successfully\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.871588Z","iopub.status.idle":"2026-09-07T13:58:37.871851Z","shell.execute_reply.started":"2026-09-07T13:58:37.871739Z","shell.execute_reply":"2026-09-07T13:58:37.871754Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"processor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\nmodel = model.to(device)\nmodel.eval()\n\nprint(\"BLIP-VQA ready\")\nprint(\"Device:\", device)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.872806Z","iopub.status.idle":"2026-09-07T13:58:37.873117Z","shell.execute_reply.started":"2026-09-07T13:58:37.87296Z","shell.execute_reply":"2026-09-07T13:58:37.872995Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import json\nimport os\nfrom PIL import Image\nimport torch\n\nbase_path = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans\"\n\nqa_path = os.path.join(\n    base_path,\n    \"2024EarthVQA\",\n    \"2024EarthVQA\",\n    \"Train_QA.json\"\n)\n\nimage_dir = os.path.join(\n    base_path,\n    \"Train-003\",\n    \"Train\",\n    \"images_png\"\n)\n\nwith open(qa_path, \"r\") as f:\n    train_data = json.load(f)\n\nimage_name = \"275.png\"\nsample = train_data[image_name][0]\n\nimage_path = os.path.join(image_dir, image_name)\nimage = Image.open(image_path).convert(\"RGB\")\n\nquestion = sample[\"Question\"]\nexpected = sample[\"Answer\"]\n\ninputs = processor(\n    images=image,\n    text=question,\n    return_tensors=\"pt\"\n)\n\ninputs = {\n    k: v.to(device)\n    for k, v in inputs.items()\n}\n\nwith torch.no_grad():\n    output = model.generate(\n        **inputs,\n        max_new_tokens=20\n    )\n\npredicted = processor.decode(\n    output[0],\n    skip_special_tokens=True\n)\n\nprint(\"Image:\", image_name)\nprint(\"Question:\", question)\nprint(\"Expected:\", expected)\nprint(\"BLIP:\", predicted)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.875526Z","iopub.status.idle":"2026-09-07T13:58:37.876038Z","shell.execute_reply.started":"2026-09-07T13:58:37.875839Z","shell.execute_reply":"2026-09-07T13:58:37.875867Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torch.utils.data import Dataset, DataLoader\nfrom PIL import Image\nimport os\nimport torch\n\nclass EarthVQADataset(Dataset):\n    def __init__(self, records, processor, image_dir):\n        self.records = records\n        self.processor = processor\n        self.image_dir = image_dir\n\n    def __len__(self):\n        return len(self.records)\n\n    def __getitem__(self, idx):\n        record = self.records[idx]\n\n        image_path = os.path.join(\n            self.image_dir,\n            record[\"image\"]\n        )\n\n        image = Image.open(image_path).convert(\"RGB\")\n\n        # Process image and question\n        inputs = self.processor(\n            images=image,\n            text=record[\"question\"],\n            return_tensors=\"pt\",\n            padding=\"max_length\",\n            truncation=True,\n            max_length=32\n        )\n\n        # Process answer\n        labels = self.processor.tokenizer(\n            record[\"answer\"],\n            return_tensors=\"pt\",\n            padding=\"max_length\",\n            truncation=True,\n            max_length=16\n        ).input_ids\n\n        # Ignore padding tokens in loss\n        labels[labels == self.processor.tokenizer.pad_token_id] = -100\n\n        inputs = {\n            key: value.squeeze(0)\n            for key, value in inputs.items()\n        }\n\n        inputs[\"labels\"] = labels.squeeze(0)\n\n        return inputs\n\n\ndataset = EarthVQADataset(\n    train_subset,\n    processor,\n    image_dir\n)\n\nprint(\"Dataset size:\", len(dataset))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.877181Z","iopub.status.idle":"2026-09-07T13:58:37.87751Z","shell.execute_reply.started":"2026-09-07T13:58:37.877382Z","shell.execute_reply":"2026-09-07T13:58:37.877399Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample = dataset[0]\n\nprint(\"Sample created successfully!\")\n\nfor key, value in sample.items():\n    print(key, value.shape)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.878487Z","iopub.status.idle":"2026-09-07T13:58:37.878815Z","shell.execute_reply.started":"2026-09-07T13:58:37.878641Z","shell.execute_reply":"2026-09-07T13:58:37.878663Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torch.utils.data import DataLoader\n\ntrain_loader = DataLoader(\n    dataset,\n    batch_size=4,\n    shuffle=True,\n    num_workers=0\n)\n\nprint(\"Number of batches:\", len(train_loader))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.880051Z","iopub.status.idle":"2026-09-07T13:58:37.880364Z","shell.execute_reply.started":"2026-09-07T13:58:37.880199Z","shell.execute_reply":"2026-09-07T13:58:37.880216Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"batch = next(iter(train_loader))\n\nprint(\"Batch created successfully!\")\n\nfor key, value in batch.items():\n    print(key, value.shape)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.881702Z","iopub.status.idle":"2026-09-07T13:58:37.882003Z","shell.execute_reply.started":"2026-09-07T13:58:37.881862Z","shell.execute_reply":"2026-09-07T13:58:37.881879Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch.nn as nn\n\nprint(\"Linear layers in BLIP-VQA:\")\n\nfor name, module in model.named_modules():\n    if isinstance(module, nn.Linear):\n        print(name)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.883803Z","iopub.status.idle":"2026-09-07T13:58:37.884041Z","shell.execute_reply.started":"2026-09-07T13:58:37.883927Z","shell.execute_reply":"2026-09-07T13:58:37.883942Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import peft\n\nprint(\"PEFT version:\", peft.__version__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.885889Z","iopub.status.idle":"2026-09-07T13:58:37.886583Z","shell.execute_reply.started":"2026-09-07T13:58:37.886332Z","shell.execute_reply":"2026-09-07T13:58:37.886358Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -U \"torchao>=0.16.0\"","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.887815Z","iopub.status.idle":"2026-09-07T13:58:37.888205Z","shell.execute_reply.started":"2026-09-07T13:58:37.888035Z","shell.execute_reply":"2026-09-07T13:58:37.888053Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torchao\n\nprint(\"torchao:\", torchao.__version__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.889259Z","iopub.status.idle":"2026-09-07T13:58:37.889607Z","shell.execute_reply.started":"2026-09-07T13:58:37.889448Z","shell.execute_reply":"2026-09-07T13:58:37.889464Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"model\" in globals())\nprint(\"processor\" in globals())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.891209Z","iopub.status.idle":"2026-09-07T13:58:37.891691Z","shell.execute_reply.started":"2026-09-07T13:58:37.891528Z","shell.execute_reply":"2026-09-07T13:58:37.891556Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(type(model).__name__)\nprint(type(processor).__name__)\nprint(\"Device:\", next(model.parameters()).device)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.892721Z","iopub.status.idle":"2026-09-07T13:58:37.893112Z","shell.execute_reply.started":"2026-09-07T13:58:37.892899Z","shell.execute_reply":"2026-09-07T13:58:37.892925Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from peft import LoraConfig, get_peft_model\n\nlora_config = LoraConfig(\n    r=8,\n    lora_alpha=16,\n    lora_dropout=0.05,\n    target_modules=[\"query\", \"value\"],\n    bias=\"none\",\n    task_type=\"SEQ_2_SEQ_LM\"\n)\n\nmodel = get_peft_model(model, lora_config)\n\nmodel.print_trainable_parameters()","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.894937Z","iopub.status.idle":"2026-09-07T13:58:37.895237Z","shell.execute_reply.started":"2026-09-07T13:58:37.89512Z","shell.execute_reply":"2026-09-07T13:58:37.895136Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import BlipProcessor, BlipForQuestionAnswering\nimport torch\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\nprint(\"Loading clean BLIP-VQA model...\")\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nbase_model = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nbase_model = base_model.to(device)\n\nprint(\"Clean BLIP loaded\")\nprint(\"Device:\", device)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.896715Z","iopub.status.idle":"2026-09-07T13:58:37.897038Z","shell.execute_reply.started":"2026-09-07T13:58:37.896874Z","shell.execute_reply":"2026-09-07T13:58:37.89689Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Model:\", type(base_model).__name__)\nprint(\"Device:\", next(base_model.parameters()).device)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.89852Z","iopub.status.idle":"2026-09-07T13:58:37.89886Z","shell.execute_reply.started":"2026-09-07T13:58:37.898737Z","shell.execute_reply":"2026-09-07T13:58:37.898754Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nfrom PIL import Image\nimport torch\n\nimage_name = \"275.png\"\n\nimage_path = os.path.join(\n    image_dir,\n    image_name\n)\n\nimage = Image.open(image_path).convert(\"RGB\")\n\nquestion = \"Are there any buildings in this scene?\"\n\ninputs = processor(\n    images=image,\n    text=question,\n    return_tensors=\"pt\"\n)\n\ninputs = {\n    k: v.to(device)\n    for k, v in inputs.items()\n}\n\nwith torch.no_grad():\n    output = base_model.generate(\n        **inputs,\n        max_new_tokens=20\n    )\n\nanswer = processor.decode(\n    output[0],\n    skip_special_tokens=True\n)\n\nprint(\"Question:\", question)\nprint(\"BLIP answer:\", answer)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.900245Z","iopub.status.idle":"2026-09-07T13:58:37.900682Z","shell.execute_reply.started":"2026-09-07T13:58:37.900533Z","shell.execute_reply":"2026-09-07T13:58:37.90055Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom transformers import BlipProcessor, BlipForQuestionAnswering\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel = model.to(device)\n\nprint(\"BLIP loaded\")\nprint(\"Device:\", device)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.901629Z","iopub.status.idle":"2026-09-07T13:58:37.901866Z","shell.execute_reply.started":"2026-09-07T13:58:37.901752Z","shell.execute_reply":"2026-09-07T13:58:37.901766Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Tokenizer vocab size:\", processor.tokenizer.vocab_size)\nprint(\"PAD:\", processor.tokenizer.pad_token_id)\nprint(\"BOS:\", processor.tokenizer.bos_token_id)\nprint(\"EOS:\", processor.tokenizer.eos_token_id)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.902907Z","iopub.status.idle":"2026-09-07T13:58:37.90335Z","shell.execute_reply.started":"2026-09-07T13:58:37.9031Z","shell.execute_reply":"2026-09-07T13:58:37.903126Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"answer = \"Yes\"\n\ntokens = processor.tokenizer(\n    answer,\n    return_tensors=\"pt\"\n)\n\nprint(\"Token IDs:\", tokens.input_ids)\nprint(\"Maximum token ID:\", tokens.input_ids.max().item())\nprint(\"Vocabulary size:\", processor.tokenizer.vocab_size)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.904767Z","iopub.status.idle":"2026-09-07T13:58:37.905137Z","shell.execute_reply.started":"2026-09-07T13:58:37.904952Z","shell.execute_reply":"2026-09-07T13:58:37.904975Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import json\nimport os\nimport random\n\nbase_path = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans\"\n\nqa_path = os.path.join(\n    base_path,\n    \"2024EarthVQA\",\n    \"2024EarthVQA\",\n    \"Train_QA.json\"\n)\n\nimage_dir = os.path.join(\n    base_path,\n    \"Train-003\",\n    \"Train\",\n    \"images_png\"\n)\n\nwith open(qa_path, \"r\") as f:\n    train_data = json.load(f)\n\nrecords = []\n\nfor image_name, qa_list in train_data.items():\n    for item in qa_list:\n        records.append({\n            \"image\": image_name,\n            \"question\": item[\"Question\"],\n            \"answer\": item[\"Answer\"],\n            \"type\": item[\"Type\"]\n        })\n\nrandom.seed(42)\ntrain_subset = random.sample(records, 5000)\n\nprint(\"Total:\", len(records))\nprint(\"Subset:\", len(train_subset))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.906305Z","iopub.status.idle":"2026-09-07T13:58:37.906689Z","shell.execute_reply.started":"2026-09-07T13:58:37.906499Z","shell.execute_reply":"2026-09-07T13:58:37.906522Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torch.utils.data import Dataset\nfrom PIL import Image\nimport torch\n\nclass EarthVQADataset(Dataset):\n    def __init__(self, records, processor, image_dir):\n        self.records = records\n        self.processor = processor\n        self.image_dir = image_dir\n\n    def __len__(self):\n        return len(self.records)\n\n    def __getitem__(self, idx):\n        record = self.records[idx]\n\n        image_path = os.path.join(\n            self.image_dir,\n            record[\"image\"]\n        )\n\n        image = Image.open(image_path).convert(\"RGB\")\n\n        # Image + QUESTION\n        inputs = self.processor(\n            images=image,\n            text=record[\"question\"],\n            return_tensors=\"pt\",\n            padding=\"max_length\",\n            truncation=True,\n            max_length=32\n        )\n\n        # ANSWER → labels\n        labels = self.processor.tokenizer(\n            record[\"answer\"],\n            return_tensors=\"pt\",\n            padding=\"max_length\",\n            truncation=True,\n            max_length=16\n        )[\"input_ids\"]\n\n        # Ignore padding in loss\n        labels[labels == self.processor.tokenizer.pad_token_id] = -100\n\n        return {\n            \"pixel_values\": inputs[\"pixel_values\"].squeeze(0),\n            \"input_ids\": inputs[\"input_ids\"].squeeze(0),\n            \"attention_mask\": inputs[\"attention_mask\"].squeeze(0),\n            \"labels\": labels.squeeze(0)\n        }","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.908226Z","iopub.status.idle":"2026-09-07T13:58:37.90869Z","shell.execute_reply.started":"2026-09-07T13:58:37.908421Z","shell.execute_reply":"2026-09-07T13:58:37.90844Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dataset = EarthVQADataset(\n    train_subset,\n    processor,\n    image_dir\n)\n\nprint(\"Dataset size:\", len(dataset))\n\nsample = dataset[0]\n\nfor key, value in sample.items():\n    print(key, value.shape)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.909938Z","iopub.status.idle":"2026-09-07T13:58:37.910226Z","shell.execute_reply.started":"2026-09-07T13:58:37.910099Z","shell.execute_reply":"2026-09-07T13:58:37.910116Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(model.config)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.91179Z","iopub.status.idle":"2026-09-07T13:58:37.91209Z","shell.execute_reply.started":"2026-09-07T13:58:37.911951Z","shell.execute_reply":"2026-09-07T13:58:37.911968Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"BLIP config type:\", type(model.config))\n\nprint(\"\\nConfig keys containing 'decoder':\")\nfor key in model.config.to_dict():\n    if \"decoder\" in key.lower():\n        print(key, \"=\", model.config.to_dict()[key])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.913639Z","iopub.status.idle":"2026-09-07T13:58:37.913983Z","shell.execute_reply.started":"2026-09-07T13:58:37.913818Z","shell.execute_reply":"2026-09-07T13:58:37.913845Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"\\nText config type:\", type(model.config.text_config))\n\ntext_config = model.config.text_config.to_dict()\n\nprint(\"\\nText config keys containing 'decoder':\")\nfor key in text_config:\n    if \"decoder\" in key.lower():\n        print(key, \"=\", text_config[key])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.915431Z","iopub.status.idle":"2026-09-07T13:58:37.915719Z","shell.execute_reply.started":"2026-09-07T13:58:37.915587Z","shell.execute_reply":"2026-09-07T13:58:37.915613Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torch.utils.data import DataLoader\n\ntrain_loader = DataLoader(\n    dataset,\n    batch_size=4,\n    shuffle=True,\n    num_workers=0\n)\n\nprint(\"DataLoader created\")\nprint(\"Number of batches:\", len(train_loader))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.916691Z","iopub.status.idle":"2026-09-07T13:58:37.916965Z","shell.execute_reply.started":"2026-09-07T13:58:37.916852Z","shell.execute_reply":"2026-09-07T13:58:37.916867Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"batch = next(iter(train_loader))\n\nprint(\"Batch:\")\nfor k, v in batch.items():\n    print(k, v.shape)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.917827Z","iopub.status.idle":"2026-09-07T13:58:37.918113Z","shell.execute_reply.started":"2026-09-07T13:58:37.917992Z","shell.execute_reply":"2026-09-07T13:58:37.918008Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"batch = next(iter(train_loader))\n\nlabels = batch[\"labels\"]\n\nprint(\"Labels min:\", labels.min().item())\nprint(\"Labels max:\", labels.max().item())\nprint(\"Vocabulary size:\", processor.tokenizer.vocab_size)\n\ndecoder_input_ids = labels.clone()\ndecoder_input_ids[decoder_input_ids == -100] = processor.tokenizer.pad_token_id\n\nprint(\"Decoder IDs min:\", decoder_input_ids.min().item())\nprint(\"Decoder IDs max:\", decoder_input_ids.max().item())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.919065Z","iopub.status.idle":"2026-09-07T13:58:37.91945Z","shell.execute_reply.started":"2026-09-07T13:58:37.919281Z","shell.execute_reply":"2026-09-07T13:58:37.919298Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Get one batch\nbatch = next(iter(train_loader))\n\npixel_values = batch[\"pixel_values\"].to(device)\ninput_ids = batch[\"input_ids\"].to(device)\nattention_mask = batch[\"attention_mask\"].to(device)\nlabels = batch[\"labels\"].to(device)\n\n# Prepare decoder inputs\ndecoder_input_ids = labels.clone()\ndecoder_input_ids[decoder_input_ids == -100] = processor.tokenizer.pad_token_id\n\nprint(\"Running BLIP forward pass...\")\n\nwith torch.no_grad():\n    outputs = model(\n        pixel_values=pixel_values,\n        input_ids=input_ids,\n        attention_mask=attention_mask,\n        decoder_input_ids=decoder_input_ids,\n        labels=labels\n    )\n\nprint(\"✅ Forward pass successful!\")\nprint(\"Loss:\", outputs.loss.item())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.920827Z","iopub.status.idle":"2026-09-07T13:58:37.921199Z","shell.execute_reply.started":"2026-09-07T13:58:37.92101Z","shell.execute_reply":"2026-09-07T13:58:37.921036Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Check whether LoRA parameters are present\nlora_params = []\n\nfor name, param in model.named_parameters():\n    if \"lora_\" in name and param.requires_grad:\n        lora_params.append((name, param))\n\nprint(\"Trainable LoRA parameters:\", len(lora_params))\n\nfor name, param in lora_params[:10]:\n    print(name, param.shape)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.922552Z","iopub.status.idle":"2026-09-07T13:58:37.922915Z","shell.execute_reply.started":"2026-09-07T13:58:37.922717Z","shell.execute_reply":"2026-09-07T13:58:37.922733Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.train()\n\noutputs = model(\n    pixel_values=pixel_values,\n    input_ids=input_ids,\n    attention_mask=attention_mask,\n    decoder_input_ids=decoder_input_ids,\n    labels=labels\n)\n\nloss = outputs.loss\n\nloss.backward()\n\nprint(\"Loss:\", loss.item())\nprint(\"Backward pass successful!\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.924251Z","iopub.status.idle":"2026-09-07T13:58:37.924607Z","shell.execute_reply.started":"2026-09-07T13:58:37.92447Z","shell.execute_reply":"2026-09-07T13:58:37.924496Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom transformers import BlipProcessor, BlipForQuestionAnswering\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n).to(device)\n\nprint(\"BLIP ready\")\nprint(\"Device:\", device)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.925766Z","iopub.status.idle":"2026-09-07T13:58:37.92606Z","shell.execute_reply.started":"2026-09-07T13:58:37.925908Z","shell.execute_reply":"2026-09-07T13:58:37.925924Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for name, module in model.text_decoder.named_modules():\n    if hasattr(module, \"weight\") and module.__class__.__name__ == \"Linear\":\n        print(name)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.927441Z","iopub.status.idle":"2026-09-07T13:58:37.927725Z","shell.execute_reply.started":"2026-09-07T13:58:37.927589Z","shell.execute_reply":"2026-09-07T13:58:37.927619Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom transformers import BlipProcessor, BlipForQuestionAnswering\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\nprocessor = BlipProcessor.from_pretrained(\"Salesforce/blip-vqa-base\")\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel = model.to(device)\n\nprint(\"Model loaded successfully\")\nprint(\"Device:\", device)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.92891Z","iopub.status.idle":"2026-09-07T13:58:37.929211Z","shell.execute_reply.started":"2026-09-07T13:58:37.929087Z","shell.execute_reply":"2026-09-07T13:58:37.929105Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport peft\n\nprint(\"PyTorch:\", torch.__version__)\nprint(\"PEFT:\", peft.__version__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.929978Z","iopub.status.idle":"2026-09-07T13:58:37.93034Z","shell.execute_reply.started":"2026-09-07T13:58:37.930144Z","shell.execute_reply":"2026-09-07T13:58:37.930167Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom transformers import BlipProcessor, BlipForQuestionAnswering\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n).to(device)\n\nprint(\"Model loaded successfully\")\nprint(\"Device:\", device)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.931674Z","iopub.status.idle":"2026-09-07T13:58:37.932065Z","shell.execute_reply.started":"2026-09-07T13:58:37.931877Z","shell.execute_reply":"2026-09-07T13:58:37.931903Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -U \"torchao>=0.17.0\"","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.933091Z","iopub.status.idle":"2026-09-07T13:58:37.933442Z","shell.execute_reply.started":"2026-09-07T13:58:37.933246Z","shell.execute_reply":"2026-09-07T13:58:37.933269Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torchao\nimport peft\n\nprint(\"PyTorch :\", torch.__version__)\nprint(\"torchao :\", torchao.__version__)\nprint(\"PEFT    :\", peft.__version__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.936783Z","iopub.status.idle":"2026-09-07T13:58:37.93722Z","shell.execute_reply.started":"2026-09-07T13:58:37.937026Z","shell.execute_reply":"2026-09-07T13:58:37.937051Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torchao\nimport peft\n\nprint(\"PyTorch :\", torch.__version__)\nprint(\"torchao :\", torchao.__version__)\nprint(\"PEFT    :\", peft.__version__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.938377Z","iopub.status.idle":"2026-09-07T13:58:37.93882Z","shell.execute_reply.started":"2026-09-07T13:58:37.938555Z","shell.execute_reply":"2026-09-07T13:58:37.93858Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import BlipProcessor, BlipForQuestionAnswering\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n).to(device)\n\nprint(\"BLIP loaded\")\nprint(\"Device:\", device)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.940187Z","iopub.status.idle":"2026-09-07T13:58:37.940547Z","shell.execute_reply.started":"2026-09-07T13:58:37.940421Z","shell.execute_reply":"2026-09-07T13:58:37.940439Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from peft import LoraConfig, get_peft_model\n\nlora_config = LoraConfig(\n    r=8,\n    lora_alpha=16,\n    lora_dropout=0.05,\n    target_modules=[\n        \"attention.self.query\",\n        \"attention.self.value\",\n        \"crossattention.self.query\",\n        \"crossattention.self.value\"\n    ],\n    bias=\"none\",\n    task_type=\"SEQ_2_SEQ_LM\"\n)\n\nmodel = get_peft_model(model, lora_config)\n\nmodel.print_trainable_parameters()","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.941884Z","iopub.status.idle":"2026-09-07T13:58:37.94217Z","shell.execute_reply.started":"2026-09-07T13:58:37.942048Z","shell.execute_reply":"2026-09-07T13:58:37.942071Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Checking LoRA modules...\\n\")\n\ncount = 0\n\nfor name, module in model.named_modules():\n    if \"lora_\" in name:\n        print(name)\n        count += 1\n\nprint(\"\\nTotal LoRA module entries:\", count)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.943731Z","iopub.status.idle":"2026-09-07T13:58:37.943988Z","shell.execute_reply.started":"2026-09-07T13:58:37.943864Z","shell.execute_reply":"2026-09-07T13:58:37.94388Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom transformers import BlipProcessor, BlipForQuestionAnswering\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n).to(device)\n\nprint(\"BLIP loaded\")\nprint(\"Device:\", device)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.948257Z","iopub.status.idle":"2026-09-07T13:58:37.948627Z","shell.execute_reply.started":"2026-09-07T13:58:37.948489Z","shell.execute_reply":"2026-09-07T13:58:37.948508Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from peft import LoraConfig, get_peft_model\n\ntarget_modules = []\n\nfor i in range(12):\n    target_modules.extend([\n        f\"text_decoder.bert.encoder.layer.{i}.attention.self.query\",\n        f\"text_decoder.bert.encoder.layer.{i}.attention.self.value\",\n        f\"text_decoder.bert.encoder.layer.{i}.crossattention.self.query\",\n        f\"text_decoder.bert.encoder.layer.{i}.crossattention.self.value\",\n    ])\n\nprint(\"Target modules:\", len(target_modules))\nprint(target_modules[:4])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.94974Z","iopub.status.idle":"2026-09-07T13:58:37.949975Z","shell.execute_reply.started":"2026-09-07T13:58:37.949859Z","shell.execute_reply":"2026-09-07T13:58:37.949874Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"lora_config = LoraConfig(\n    r=8,\n    lora_alpha=16,\n    lora_dropout=0.05,\n    target_modules=target_modules,\n    bias=\"none\",\n    task_type=\"SEQ_2_SEQ_LM\"\n)\n\nmodel = get_peft_model(model, lora_config)\n\nmodel.print_trainable_parameters()","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.951265Z","iopub.status.idle":"2026-09-07T13:58:37.95166Z","shell.execute_reply.started":"2026-09-07T13:58:37.951469Z","shell.execute_reply":"2026-09-07T13:58:37.951493Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"decoder_lora = 0\nencoder_lora = 0\n\nfor name, module in model.named_modules():\n    if \"lora_A\" in name:\n        if \"text_decoder\" in name:\n            decoder_lora += 1\n        elif \"text_encoder\" in name:\n            encoder_lora += 1\n\nprint(\"Decoder LoRA modules:\", decoder_lora)\nprint(\"Encoder LoRA modules:\", encoder_lora)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.952624Z","iopub.status.idle":"2026-09-07T13:58:37.95288Z","shell.execute_reply.started":"2026-09-07T13:58:37.952744Z","shell.execute_reply":"2026-09-07T13:58:37.952759Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"train_dataset\" in globals())\nprint(\"train_loader\" in globals())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.954132Z","iopub.status.idle":"2026-09-07T13:58:37.954491Z","shell.execute_reply.started":"2026-09-07T13:58:37.954291Z","shell.execute_reply":"2026-09-07T13:58:37.954357Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(type(qa_data))\nprint(qa_data.keys() if isinstance(qa_data, dict) else \"Not a dictionary\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.956004Z","iopub.status.idle":"2026-09-07T13:58:37.956234Z","shell.execute_reply.started":"2026-09-07T13:58:37.95613Z","shell.execute_reply":"2026-09-07T13:58:37.956143Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"TYPE:\", type(qa_data))\n\nif isinstance(qa_data, dict):\n    print(\"DICT KEYS:\")\n    print(list(qa_data.keys()))\n\nelif isinstance(qa_data, list):\n    print(\"LIST LENGTH:\", len(qa_data))\n    print(\"FIRST ITEM:\")\n    print(qa_data[0])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.956922Z","iopub.status.idle":"2026-09-07T13:58:37.957194Z","shell.execute_reply.started":"2026-09-07T13:58:37.957061Z","shell.execute_reply":"2026-09-07T13:58:37.957076Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"TYPE:\", type(qa_data))\n\nif isinstance(qa_data, dict):\n    print(\"NUMBER OF KEYS:\", len(qa_data))\n    print(\"FIRST 10 KEYS:\")\n    print(list(qa_data.keys())[:10])\n\nelif isinstance(qa_data, list):\n    print(\"LIST LENGTH:\", len(qa_data))\n    print(\"FIRST ITEM:\")\n    print(qa_data[0])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.958581Z","iopub.status.idle":"2026-09-07T13:58:37.958931Z","shell.execute_reply.started":"2026-09-07T13:58:37.958747Z","shell.execute_reply":"2026-09-07T13:58:37.958764Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"first_image = list(qa_data.keys())[0]\n\nprint(\"Image:\", first_image)\nprint(\"Value type:\", type(qa_data[first_image]))\nprint(\"Value:\")\nprint(qa_data[first_image])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.960257Z","iopub.status.idle":"2026-09-07T13:58:37.96092Z","shell.execute_reply.started":"2026-09-07T13:58:37.960728Z","shell.execute_reply":"2026-09-07T13:58:37.960758Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"flat_qa = []\n\nfor image_name, qa_list in qa_data.items():\n    for item in qa_list:\n        flat_qa.append({\n            \"image\": image_name,\n            \"question\": item[\"Question\"],\n            \"answer\": str(item[\"Answer\"]),\n            \"type\": item[\"Type\"]\n        })\n\nprint(\"Total QA records:\", len(flat_qa))\nprint(\"\\nFirst record:\")\nprint(flat_qa[0])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.962289Z","iopub.status.idle":"2026-09-07T13:58:37.962687Z","shell.execute_reply.started":"2026-09-07T13:58:37.96251Z","shell.execute_reply":"2026-09-07T13:58:37.962536Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import random\n\nrandom.seed(42)\n\nsample_size = min(5000, len(flat_qa))\nsample_data = random.sample(flat_qa, sample_size)\n\nprint(\"Sample size:\", len(sample_data))\nprint(\"\\nSample record:\")\nprint(sample_data[0])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.965424Z","iopub.status.idle":"2026-09-07T13:58:37.965761Z","shell.execute_reply.started":"2026-09-07T13:58:37.965624Z","shell.execute_reply":"2026-09-07T13:58:37.965648Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"{\n    'image': '2253.png',\n    'question': 'What are the types of residential buildings?',\n    'answer': 'There are private buildings',\n    'type': 'Object Situation Analysis'\n}","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.967267Z","iopub.status.idle":"2026-09-07T13:58:37.967725Z","shell.execute_reply.started":"2026-09-07T13:58:37.967542Z","shell.execute_reply":"2026-09-07T13:58:37.96757Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torch.utils.data import Dataset, DataLoader\nfrom PIL import Image\nimport os\nimport torch\n\nIMAGE_DIR = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/2024EarthVQA/Train-003/Train/images_png\"\n\nclass EarthVQADataset(Dataset):\n\n    def __init__(self, data, image_dir, processor):\n        self.data = data\n        self.image_dir = image_dir\n        self.processor = processor\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, idx):\n\n        item = self.data[idx]\n\n        image_path = os.path.join(\n            self.image_dir,\n            item[\"image\"]\n        )\n\n        image = Image.open(image_path).convert(\"RGB\")\n\n        question = item[\"question\"]\n        answer = item[\"answer\"]\n\n        # Process image + question\n        inputs = self.processor(\n            images=image,\n            text=question,\n            padding=\"max_length\",\n            truncation=True,\n            max_length=32,\n            return_tensors=\"pt\"\n        )\n\n        # Tokenize answer separately\n        answer_tokens = self.processor.tokenizer(\n            answer,\n            padding=\"max_length\",\n            truncation=True,\n            max_length=16,\n            return_tensors=\"pt\"\n        )\n\n        labels = answer_tokens.input_ids.squeeze(0)\n\n        # Ignore padding during loss calculation\n        labels[\n            labels == self.processor.tokenizer.pad_token_id\n        ] = -100\n\n        return {\n            \"pixel_values\": inputs[\"pixel_values\"].squeeze(0),\n            \"input_ids\": inputs[\"input_ids\"].squeeze(0),\n            \"attention_mask\": inputs[\"attention_mask\"].squeeze(0),\n            \"labels\": labels\n        }","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.968742Z","iopub.status.idle":"2026-09-07T13:58:37.968958Z","shell.execute_reply.started":"2026-09-07T13:58:37.968851Z","shell.execute_reply":"2026-09-07T13:58:37.968864Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"IMAGE_DIR = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/Train-003/Train/images_png\"\n\nprint(\"Directory exists:\", os.path.exists(IMAGE_DIR))\n\nprint(\"311.png exists:\",\n      os.path.exists(os.path.join(IMAGE_DIR, \"311.png\")))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.969566Z","iopub.status.idle":"2026-09-07T13:58:37.96988Z","shell.execute_reply.started":"2026-09-07T13:58:37.969741Z","shell.execute_reply":"2026-09-07T13:58:37.969765Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dataset = EarthVQADataset(\n    sample_data,\n    IMAGE_DIR,\n    processor\n)\n\ntrain_loader = DataLoader(\n    train_dataset,\n    batch_size=4,\n    shuffle=True,\n    num_workers=2\n)\n\nprint(\"Dataset size:\", len(train_dataset))\n\nbatch = next(iter(train_loader))\n\nprint(\"\\nBatch shapes:\")\nfor key, value in batch.items():\n    print(key, value.shape)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.970928Z","iopub.status.idle":"2026-09-07T13:58:37.971267Z","shell.execute_reply.started":"2026-09-07T13:58:37.971105Z","shell.execute_reply":"2026-09-07T13:58:37.971131Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(type(model))\nprint(type(model.base_model) if hasattr(model, \"base_model\") else \"No base_model\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.973034Z","iopub.status.idle":"2026-09-07T13:58:37.974217Z","shell.execute_reply.started":"2026-09-07T13:58:37.974008Z","shell.execute_reply":"2026-09-07T13:58:37.974026Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"del model\ntorch.cuda.empty_cache()\n\nfrom transformers import BlipForQuestionAnswering\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel = model.to(\"cuda\")\n\nprint(\"Clean BLIP loaded.\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.97524Z","iopub.status.idle":"2026-09-07T13:58:37.975652Z","shell.execute_reply.started":"2026-09-07T13:58:37.975479Z","shell.execute_reply":"2026-09-07T13:58:37.975503Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.eval()\n\nwith torch.no_grad():\n    test_outputs = model(\n        pixel_values=batch[\"pixel_values\"].to(\"cuda\"),\n        input_ids=batch[\"input_ids\"].to(\"cuda\"),\n        attention_mask=batch[\"attention_mask\"].to(\"cuda\"),\n        decoder_input_ids=batch[\"labels\"].to(\"cuda\")[:, :-1].masked_fill(\n            batch[\"labels\"].to(\"cuda\")[:, :-1] == -100,\n            processor.tokenizer.pad_token_id\n        ),\n        labels=batch[\"labels\"].to(\"cuda\")[:, 1:]\n    )\n\nprint(\"Clean BLIP forward successful!\")\nprint(\"Loss:\", test_outputs.loss.item())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.976938Z","iopub.status.idle":"2026-09-07T13:58:37.977265Z","shell.execute_reply.started":"2026-09-07T13:58:37.97714Z","shell.execute_reply":"2026-09-07T13:58:37.977158Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from peft import LoraConfig, get_peft_model\n\n# Save the clean BLIP model\nclean_blip = model\n\n# LoRA targets ONLY the text decoder\ndecoder_targets = []\n\nfor i in range(12):\n    decoder_targets.extend([\n        f\"bert.encoder.layer.{i}.attention.self.query\",\n        f\"bert.encoder.layer.{i}.attention.self.value\",\n        f\"bert.encoder.layer.{i}.crossattention.self.query\",\n        f\"bert.encoder.layer.{i}.crossattention.self.value\",\n    ])\n\nprint(\"Number of decoder targets:\", len(decoder_targets))\n\n# IMPORTANT:\n# Apply PEFT to the text decoder, NOT to the complete BLIP model.\ndecoder_lora_config = LoraConfig(\n    r=8,\n    lora_alpha=16,\n    lora_dropout=0.05,\n    target_modules=decoder_targets,\n    bias=\"none\",\n    task_type=\"SEQ_2_SEQ_LM\"\n)\n\nmodel.text_decoder = get_peft_model(\n    model.text_decoder,\n    decoder_lora_config\n)\n\nmodel = model.to(\"cuda\")\n\nprint(\"LoRA attached to text decoder.\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.978791Z","iopub.status.idle":"2026-09-07T13:58:37.979147Z","shell.execute_reply.started":"2026-09-07T13:58:37.978954Z","shell.execute_reply":"2026-09-07T13:58:37.97898Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Model type:\", type(model))\nprint(\"Text decoder type:\", type(model.text_decoder))\n\ndecoder_lora = [\n    name for name, param in model.named_parameters()\n    if \"text_decoder\" in name and \"lora_\" in name\n]\n\nencoder_lora = [\n    name for name, param in model.named_parameters()\n    if \"text_encoder\" in name and \"lora_\" in name\n]\n\nprint(\"Decoder LoRA parameters:\", len(decoder_lora))\nprint(\"Encoder LoRA parameters:\", len(encoder_lora))\n\ntrainable = sum(\n    p.numel() for p in model.parameters() if p.requires_grad\n)\n\ntotal = sum(\n    p.numel() for p in model.parameters()\n)\n\nprint(f\"Trainable: {trainable:,}\")\nprint(f\"Total: {total:,}\")\nprint(f\"Trainable %: {100 * trainable / total:.4f}%\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.980455Z","iopub.status.idle":"2026-09-07T13:58:37.98074Z","shell.execute_reply.started":"2026-09-07T13:58:37.980624Z","shell.execute_reply":"2026-09-07T13:58:37.980641Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Freeze the entire model\nfor param in model.parameters():\n    param.requires_grad = False\n\n# Unfreeze only LoRA parameters\nfor name, param in model.named_parameters():\n    if \"lora_\" in name:\n        param.requires_grad = True\n\n# Check trainable parameters\ntrainable = sum(\n    p.numel() for p in model.parameters()\n    if p.requires_grad\n)\n\ntotal = sum(\n    p.numel() for p in model.parameters()\n)\n\nprint(f\"Trainable: {trainable:,}\")\nprint(f\"Total: {total:,}\")\nprint(f\"Trainable %: {100 * trainable / total:.4f}%\")\n\n# Show a few trainable parameters\nprint(\"\\nTrainable parameter examples:\")\ncount = 0\n\nfor name, param in model.named_parameters():\n    if param.requires_grad:\n        print(name, param.shape)\n        count += 1\n        if count >= 10:\n            break","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.981586Z","iopub.status.idle":"2026-09-07T13:58:37.981823Z","shell.execute_reply.started":"2026-09-07T13:58:37.981705Z","shell.execute_reply":"2026-09-07T13:58:37.98172Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\n\nmodel.train()\n\n# Get one batch\nbatch = next(iter(train_loader))\n\npixel_values = batch[\"pixel_values\"].to(\"cuda\")\ninput_ids = batch[\"input_ids\"].to(\"cuda\")\nattention_mask = batch[\"attention_mask\"].to(\"cuda\")\nlabels = batch[\"labels\"].to(\"cuda\")\n\n# Create decoder input IDs\ndecoder_input_ids = labels.clone()\n\n# Replace ignored padding tokens\ndecoder_input_ids[decoder_input_ids == -100] = (\n    processor.tokenizer.pad_token_id\n)\n\n# Shift decoder inputs and labels\ndecoder_input_ids = decoder_input_ids[:, :-1]\ndecoder_labels = labels[:, 1:]\n\nprint(\"Running LoRA forward pass...\")\n\noutputs = model(\n    pixel_values=pixel_values,\n    input_ids=input_ids,\n    attention_mask=attention_mask,\n    decoder_input_ids=decoder_input_ids,\n    labels=decoder_labels\n)\n\nloss = outputs.loss\n\nprint(\"Forward pass successful!\")\nprint(\"Loss:\", loss.item())\n\nprint(\"\\nRunning backward pass...\")\n\nloss.backward()\n\nprint(\"Backward pass successful!\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.98279Z","iopub.status.idle":"2026-09-07T13:58:37.983656Z","shell.execute_reply.started":"2026-09-07T13:58:37.983442Z","shell.execute_reply":"2026-09-07T13:58:37.983471Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"\\nChecking LoRA gradients...\")\n\ngradient_count = 0\n\nfor name, param in model.named_parameters():\n    if param.requires_grad and param.grad is not None:\n        gradient_count += 1\n\nprint(\"LoRA parameters with gradients:\", gradient_count)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.984417Z","iopub.status.idle":"2026-09-07T13:58:37.98486Z","shell.execute_reply.started":"2026-09-07T13:58:37.984712Z","shell.execute_reply":"2026-09-07T13:58:37.984733Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torch.optim import AdamW\n\n# Clear gradients from our test\nmodel.zero_grad(set_to_none=True)\n\n# Optimizer sees only trainable LoRA parameters\noptimizer = AdamW(\n    [p for p in model.parameters() if p.requires_grad],\n    lr=1e-4,\n    weight_decay=0.01\n)\n\nprint(\"Optimizer created.\")\nprint(\"Trainable parameters:\",\n      sum(p.numel() for p in model.parameters() if p.requires_grad))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.986541Z","iopub.status.idle":"2026-09-07T13:58:37.986902Z","shell.execute_reply.started":"2026-09-07T13:58:37.986714Z","shell.execute_reply":"2026-09-07T13:58:37.986737Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tqdm.auto import tqdm\nimport torch\n\nnum_epochs = 1\n\nmodel.train()\n\nfor epoch in range(num_epochs):\n\n    total_loss = 0.0\n\n    progress_bar = tqdm(\n        train_loader,\n        desc=f\"Epoch {epoch + 1}/{num_epochs}\"\n    )\n\n    for step, batch in enumerate(progress_bar):\n\n        pixel_values = batch[\"pixel_values\"].to(\"cuda\")\n        input_ids = batch[\"input_ids\"].to(\"cuda\")\n        attention_mask = batch[\"attention_mask\"].to(\"cuda\")\n        labels = batch[\"labels\"].to(\"cuda\")\n\n        # Create decoder inputs\n        decoder_input_ids = labels.clone()\n\n        decoder_input_ids[\n            decoder_input_ids == -100\n        ] = processor.tokenizer.pad_token_id\n\n        # Shift input and target\n        decoder_input_ids = decoder_input_ids[:, :-1]\n        decoder_labels = labels[:, 1:]\n\n        # Clear previous gradients\n        optimizer.zero_grad(set_to_none=True)\n\n        # Forward\n        outputs = model(\n            pixel_values=pixel_values,\n            input_ids=input_ids,\n            attention_mask=attention_mask,\n            decoder_input_ids=decoder_input_ids,\n            labels=decoder_labels\n        )\n\n        loss = outputs.loss\n\n        # Backward\n        loss.backward()\n\n        # Update LoRA parameters\n        optimizer.step()\n\n        total_loss += loss.item()\n\n        progress_bar.set_postfix(\n            loss=f\"{loss.item():.4f}\"\n        )\n\n    average_loss = total_loss / len(train_loader)\n\n    print(\n        f\"\\nEpoch {epoch + 1} completed \"\n        f\"| Average Loss: {average_loss:.4f}\"\n    )","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.98847Z","iopub.status.idle":"2026-09-07T13:58:37.988735Z","shell.execute_reply.started":"2026-09-07T13:58:37.988602Z","shell.execute_reply":"2026-09-07T13:58:37.988619Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nADAPTER_DIR = \"/kaggle/working/blip-earthvqa-lora\"\n\nos.makedirs(ADAPTER_DIR, exist_ok=True)\n\nmodel.text_decoder.save_pretrained(ADAPTER_DIR)\nprocessor.save_pretrained(ADAPTER_DIR)\n\nprint(\"LoRA adapter saved to:\")\nprint(ADAPTER_DIR)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.9901Z","iopub.status.idle":"2026-09-07T13:58:37.990469Z","shell.execute_reply.started":"2026-09-07T13:58:37.990283Z","shell.execute_reply":"2026-09-07T13:58:37.990336Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_item = sample_data[0]\n\nprint(\"Image:\", test_item[\"image\"])\nprint(\"Question:\", test_item[\"question\"])\nprint(\"Expected answer:\", test_item[\"answer\"])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.991703Z","iopub.status.idle":"2026-09-07T13:58:37.991985Z","shell.execute_reply.started":"2026-09-07T13:58:37.991864Z","shell.execute_reply":"2026-09-07T13:58:37.991881Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport os\n\nfrom transformers import BlipProcessor, BlipForQuestionAnswering\nfrom peft import PeftModel\n\nMODEL_NAME = \"Salesforce/blip-vqa-base\"\nADAPTER_DIR = \"/kaggle/working/blip-earthvqa-lora\"\n\n# Load processor\nprocessor = BlipProcessor.from_pretrained(MODEL_NAME)\n\n# Load clean BLIP\nbase_model = BlipForQuestionAnswering.from_pretrained(\n    MODEL_NAME\n)\n\nbase_model = base_model.to(\"cuda\")\n\n# Load trained LoRA into the text decoder\nbase_model.text_decoder = PeftModel.from_pretrained(\n    base_model.text_decoder,\n    ADAPTER_DIR\n)\n\nmodel = base_model.to(\"cuda\")\n\nmodel.eval()\n\nprint(\"Trained BLIP + LoRA loaded successfully!\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.994491Z","iopub.status.idle":"2026-09-07T13:58:37.994832Z","shell.execute_reply.started":"2026-09-07T13:58:37.994706Z","shell.execute_reply":"2026-09-07T13:58:37.994724Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nADAPTER_DIR = \"/kaggle/working/blip-earthvqa-lora\"\n\nprint(\"Directory exists:\", os.path.exists(ADAPTER_DIR))\n\nif os.path.exists(ADAPTER_DIR):\n    print(\"\\nFiles saved:\")\n    for f in os.listdir(ADAPTER_DIR):\n        print(f)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.995987Z","iopub.status.idle":"2026-09-07T13:58:37.996305Z","shell.execute_reply.started":"2026-09-07T13:58:37.996162Z","shell.execute_reply":"2026-09-07T13:58:37.996179Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -U \"torchao>=0.16.0\"","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.997872Z","iopub.status.idle":"2026-09-07T13:58:37.998178Z","shell.execute_reply.started":"2026-09-07T13:58:37.998046Z","shell.execute_reply":"2026-09-07T13:58:37.998068Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torchao\nimport peft\n\nprint(\"PyTorch:\", torch.__version__)\nprint(\"torchao:\", torchao.__version__)\nprint(\"PEFT:\", peft.__version__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:37.999494Z","iopub.status.idle":"2026-09-07T13:58:37.999853Z","shell.execute_reply.started":"2026-09-07T13:58:37.999647Z","shell.execute_reply":"2026-09-07T13:58:37.999672Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom transformers import BlipForQuestionAnswering\nfrom peft import LoraConfig, get_peft_model\n\nMODEL_NAME = \"Salesforce/blip-vqa-base\"\n\n# Load BLIP\nmodel = BlipForQuestionAnswering.from_pretrained(MODEL_NAME)\nmodel = model.to(\"cuda\")\n\n# LoRA targets only the BLIP text decoder\ndecoder_targets = []\n\nfor i in range(12):\n    decoder_targets.extend([\n        f\"bert.encoder.layer.{i}.attention.self.query\",\n        f\"bert.encoder.layer.{i}.attention.self.value\",\n        f\"bert.encoder.layer.{i}.crossattention.self.query\",\n        f\"bert.encoder.layer.{i}.crossattention.self.value\",\n    ])\n\nlora_config = LoraConfig(\n    r=8,\n    lora_alpha=16,\n    lora_dropout=0.05,\n    target_modules=decoder_targets,\n    bias=\"none\",\n    task_type=\"SEQ_2_SEQ_LM\"\n)\n\n# Apply LoRA only to text decoder\nmodel.text_decoder = get_peft_model(\n    model.text_decoder,\n    lora_config\n)\n\n# Freeze everything\nfor param in model.parameters():\n    param.requires_grad = False\n\n# Train only LoRA\nfor name, param in model.named_parameters():\n    if \"lora_\" in name:\n        param.requires_grad = True\n\nmodel = model.to(\"cuda\")\n\ntrainable = sum(\n    p.numel() for p in model.parameters()\n    if p.requires_grad\n)\n\nprint(\"Model ready\")\nprint(\"Trainable parameters:\", trainable)\nprint(\"Trainable %:\", 100 * trainable / sum(p.numel() for p in model.parameters()))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.001392Z","iopub.status.idle":"2026-09-07T13:58:38.002469Z","shell.execute_reply.started":"2026-09-07T13:58:38.002249Z","shell.execute_reply":"2026-09-07T13:58:38.002267Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import json\nimport random\nimport os\nimport torch\n\nfrom PIL import Image\nfrom torch.utils.data import Dataset, DataLoader\nfrom transformers import BlipProcessor\n\n# Paths\nBASE_DIR = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans\"\n\nQA_PATH = os.path.join(\n    BASE_DIR,\n    \"2024EarthVQA\",\n    \"2024EarthVQA\",\n    \"Train_QA.json\"\n)\n\nIMAGE_DIR = os.path.join(\n    BASE_DIR,\n    \"Train-003\",\n    \"Train\",\n    \"images_png\"\n)\n\n# Processor\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\n# Load QA JSON\nwith open(QA_PATH, \"r\") as f:\n    qa_data = json.load(f)\n\n# Flatten image -> QA list\nflat_qa = []\n\nfor image_name, qa_list in qa_data.items():\n    for item in qa_list:\n        flat_qa.append({\n            \"image\": image_name,\n            \"question\": item[\"Question\"],\n            \"answer\": str(item[\"Answer\"]),\n            \"type\": item[\"Type\"]\n        })\n\nprint(\"Total QA records:\", len(flat_qa))\n\n# Same 5,000-sample selection\nrandom.seed(42)\nsample_data = random.sample(\n    flat_qa,\n    min(5000, len(flat_qa))\n)\n\nprint(\"Sample size:\", len(sample_data))\n\n\nclass EarthVQADataset(Dataset):\n\n    def __init__(self, data, image_dir, processor):\n        self.data = data\n        self.image_dir = image_dir\n        self.processor = processor\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, idx):\n\n        item = self.data[idx]\n\n        image_path = os.path.join(\n            self.image_dir,\n            item[\"image\"]\n        )\n\n        image = Image.open(image_path).convert(\"RGB\")\n\n        # Question\n        inputs = self.processor(\n            images=image,\n            text=item[\"question\"],\n            padding=\"max_length\",\n            truncation=True,\n            max_length=32,\n            return_tensors=\"pt\"\n        )\n\n        # Answer\n        answer_tokens = self.processor.tokenizer(\n            item[\"answer\"],\n            padding=\"max_length\",\n            truncation=True,\n            max_length=16,\n            return_tensors=\"pt\"\n        )\n\n        labels = answer_tokens.input_ids.squeeze(0)\n\n        # Ignore padding\n        labels[\n            labels == self.processor.tokenizer.pad_token_id\n        ] = -100\n\n        return {\n            \"pixel_values\": inputs[\"pixel_values\"].squeeze(0),\n            \"input_ids\": inputs[\"input_ids\"].squeeze(0),\n            \"attention_mask\": inputs[\"attention_mask\"].squeeze(0),\n            \"labels\": labels\n        }\n\n\ntrain_dataset = EarthVQADataset(\n    sample_data,\n    IMAGE_DIR,\n    processor\n)\n\ntrain_loader = DataLoader(\n    train_dataset,\n    batch_size=4,\n    shuffle=True,\n    num_workers=2\n)\n\nprint(\"Dataset size:\", len(train_dataset))\n\nbatch = next(iter(train_loader))\n\nprint(\"Batch shapes:\")\nfor key, value in batch.items():\n    print(key, value.shape)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.003511Z","iopub.status.idle":"2026-09-07T13:58:38.004217Z","shell.execute_reply.started":"2026-09-07T13:58:38.004072Z","shell.execute_reply":"2026-09-07T13:58:38.004092Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torch.optim import AdamW\n\noptimizer = AdamW(\n    [p for p in model.parameters() if p.requires_grad],\n    lr=1e-4,\n    weight_decay=0.01\n)\n\nprint(\"Optimizer ready.\")\nprint(\"Trainable parameters:\",\n      sum(p.numel() for p in model.parameters() if p.requires_grad))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.005276Z","iopub.status.idle":"2026-09-07T13:58:38.005785Z","shell.execute_reply.started":"2026-09-07T13:58:38.005653Z","shell.execute_reply":"2026-09-07T13:58:38.005671Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_loader = DataLoader(\n    train_dataset,\n    batch_size=4,\n    shuffle=True,\n    num_workers=0\n)\n\nprint(\"DataLoader ready.\")\nprint(\"Batches per epoch:\", len(train_loader))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.007176Z","iopub.status.idle":"2026-09-07T13:58:38.007555Z","shell.execute_reply.started":"2026-09-07T13:58:38.007352Z","shell.execute_reply":"2026-09-07T13:58:38.007378Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tqdm.auto import tqdm\nimport torch\n\nmodel.train()\n\ntotal_loss = 0.0\n\nprogress_bar = tqdm(\n    train_loader,\n    desc=\"EarthVQA LoRA Training\"\n)\n\nfor step, batch in enumerate(progress_bar):\n\n    pixel_values = batch[\"pixel_values\"].to(\"cuda\")\n    input_ids = batch[\"input_ids\"].to(\"cuda\")\n    attention_mask = batch[\"attention_mask\"].to(\"cuda\")\n    labels = batch[\"labels\"].to(\"cuda\")\n\n    # Create decoder inputs\n    decoder_input_ids = labels.clone()\n\n    decoder_input_ids[\n        decoder_input_ids == -100\n    ] = processor.tokenizer.pad_token_id\n\n    decoder_input_ids = decoder_input_ids[:, :-1]\n    decoder_labels = labels[:, 1:]\n\n    optimizer.zero_grad(set_to_none=True)\n\n    outputs = model(\n        pixel_values=pixel_values,\n        input_ids=input_ids,\n        attention_mask=attention_mask,\n        decoder_input_ids=decoder_input_ids,\n        labels=decoder_labels\n    )\n\n    loss = outputs.loss\n\n    loss.backward()\n    optimizer.step()\n\n    loss_value = loss.item()\n    total_loss += loss_value\n\n    progress_bar.set_postfix(\n        loss=f\"{loss_value:.4f}\"\n    )\n\naverage_loss = total_loss / len(train_loader)\n\nprint(f\"\\nTraining complete!\")\nprint(f\"Average Loss: {average_loss:.4f}\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.008504Z","iopub.status.idle":"2026-09-07T13:58:38.008855Z","shell.execute_reply.started":"2026-09-07T13:58:38.008714Z","shell.execute_reply":"2026-09-07T13:58:38.008739Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nSAVE_DIR = \"/kaggle/working/blip-earthvqa-lora\"\n\n# Save the PEFT adapter from the text decoder\nmodel.text_decoder.save_pretrained(SAVE_DIR)\n\nprint(\"Saved files:\")\nfor root, dirs, files in os.walk(SAVE_DIR):\n    for file in files:\n        print(os.path.join(root, file))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.01006Z","iopub.status.idle":"2026-09-07T13:58:38.010445Z","shell.execute_reply.started":"2026-09-07T13:58:38.010228Z","shell.execute_reply":"2026-09-07T13:58:38.010251Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nconfig_file = os.path.join(\n    SAVE_DIR,\n    \"adapter_config.json\"\n)\n\nweights_file = os.path.join(\n    SAVE_DIR,\n    \"adapter_model.safetensors\"\n)\n\nprint(\"adapter_config.json:\", os.path.exists(config_file))\nprint(\"adapter_model.safetensors:\", os.path.exists(weights_file))\n\nif os.path.exists(config_file) and os.path.exists(weights_file):\n    print(\"\\nSUCCESS: LoRA adapter saved correctly.\")\nelse:\n    print(\"\\nERROR: Adapter files are missing.\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.011513Z","iopub.status.idle":"2026-09-07T13:58:38.011751Z","shell.execute_reply.started":"2026-09-07T13:58:38.011634Z","shell.execute_reply":"2026-09-07T13:58:38.011651Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport torch\nfrom PIL import Image\n\nIMAGE_DIR = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/Train-003/Train/images_png\"\n\ntest_image = \"2253.png\"\ntest_question = \"What are the types of residential buildings?\"\nexpected_answer = \"There are private buildings\"\n\nimage_path = os.path.join(IMAGE_DIR, test_image)\n\nimage = Image.open(image_path).convert(\"RGB\")\n\nmodel.eval()\n\ninputs = processor(\n    images=image,\n    text=test_question,\n    return_tensors=\"pt\"\n)\n\ninputs = {\n    k: v.to(\"cuda\")\n    for k, v in inputs.items()\n}\n\nwith torch.no_grad():\n    generated_ids = model.generate(\n        pixel_values=inputs[\"pixel_values\"],\n        input_ids=inputs[\"input_ids\"],\n        attention_mask=inputs[\"attention_mask\"],\n        max_new_tokens=20\n    )\n\npredicted_answer = processor.tokenizer.decode(\n    generated_ids[0],\n    skip_special_tokens=True\n)\n\nprint(\"Image:\", test_image)\nprint(\"Question:\", test_question)\nprint(\"Expected:\", expected_answer)\nprint(\"Predicted:\", predicted_answer)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.012836Z","iopub.status.idle":"2026-09-07T13:58:38.013179Z","shell.execute_reply.started":"2026-09-07T13:58:38.012991Z","shell.execute_reply":"2026-09-07T13:58:38.013016Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import random\nimport os\nimport torch\nfrom PIL import Image\n\nmodel.eval()\n\nrandom.seed(42)\n\n# Pick 10 different examples\ntest_samples = random.sample(sample_data, 10)\n\nresults = []\n\nfor item in test_samples:\n\n    image_path = os.path.join(\n        IMAGE_DIR,\n        item[\"image\"]\n    )\n\n    image = Image.open(image_path).convert(\"RGB\")\n\n    inputs = processor(\n        images=image,\n        text=item[\"question\"],\n        return_tensors=\"pt\"\n    )\n\n    inputs = {\n        k: v.to(\"cuda\")\n        for k, v in inputs.items()\n    }\n\n    with torch.no_grad():\n\n        generated_ids = model.generate(\n            pixel_values=inputs[\"pixel_values\"],\n            input_ids=inputs[\"input_ids\"],\n            attention_mask=inputs[\"attention_mask\"],\n            max_new_tokens=20\n        )\n\n    prediction = processor.tokenizer.decode(\n        generated_ids[0],\n        skip_special_tokens=True\n    ).strip()\n\n    results.append({\n        \"image\": item[\"image\"],\n        \"type\": item[\"type\"],\n        \"question\": item[\"question\"],\n        \"expected\": item[\"answer\"],\n        \"predicted\": prediction\n    })\n\nfor i, result in enumerate(results, 1):\n\n    print(f\"\\n--- Example {i} ---\")\n    print(\"Image:    \", result[\"image\"])\n    print(\"Type:     \", result[\"type\"])\n    print(\"Question: \", result[\"question\"])\n    print(\"Expected: \", result[\"expected\"])\n    print(\"Predicted:\", result[\"predicted\"])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.014638Z","iopub.status.idle":"2026-09-07T13:58:38.015007Z","shell.execute_reply.started":"2026-09-07T13:58:38.014813Z","shell.execute_reply":"2026-09-07T13:58:38.014837Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import BlipForQuestionAnswering\nimport torch\n\nBASE_MODEL_NAME = \"Salesforce/blip-vqa-base\"\n\nbase_model = BlipForQuestionAnswering.from_pretrained(\n    BASE_MODEL_NAME\n).to(\"cuda\")\n\nbase_model.eval()\n\nprint(\"Base BLIP loaded.\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.016398Z","iopub.status.idle":"2026-09-07T13:58:38.016769Z","shell.execute_reply.started":"2026-09-07T13:58:38.016575Z","shell.execute_reply":"2026-09-07T13:58:38.016599Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"base_results = []\n\nfor item in test_samples:\n\n    image_path = os.path.join(\n        IMAGE_DIR,\n        item[\"image\"]\n    )\n\n    image = Image.open(image_path).convert(\"RGB\")\n\n    inputs = processor(\n        images=image,\n        text=item[\"question\"],\n        return_tensors=\"pt\"\n    )\n\n    inputs = {\n        k: v.to(\"cuda\")\n        for k, v in inputs.items()\n    }\n\n    with torch.no_grad():\n\n        generated_ids = base_model.generate(\n            pixel_values=inputs[\"pixel_values\"],\n            input_ids=inputs[\"input_ids\"],\n            attention_mask=inputs[\"attention_mask\"],\n            max_new_tokens=20\n        )\n\n    prediction = processor.tokenizer.decode(\n        generated_ids[0],\n        skip_special_tokens=True\n    ).strip()\n\n    base_results.append(prediction)\n\nfor i, (item, prediction) in enumerate(\n    zip(test_samples, base_results), 1\n):\n\n    print(f\"\\n--- Example {i} ---\")\n    print(\"Question: \", item[\"question\"])\n    print(\"Expected: \", item[\"answer\"])\n    print(\"Base BLIP:\", prediction)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.017468Z","iopub.status.idle":"2026-09-07T13:58:38.017702Z","shell.execute_reply.started":"2026-09-07T13:58:38.017583Z","shell.execute_reply":"2026-09-07T13:58:38.017597Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nDATASET_DIR = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans\"\n\nprint(\"Searching for image folders...\\n\")\n\nfor root, dirs, files in os.walk(DATASET_DIR):\n    image_files = [\n        f for f in files\n        if f.lower().endswith((\".png\", \".jpg\", \".jpeg\", \".tif\", \".tiff\"))\n    ]\n\n    if image_files:\n        print(\"IMAGE FOLDER:\")\n        print(root)\n        print(\"Number of images:\", len(image_files))\n        print(\"Examples:\", image_files[:5])\n        print()","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.018817Z","iopub.status.idle":"2026-09-07T13:58:38.019055Z","shell.execute_reply.started":"2026-09-07T13:58:38.018935Z","shell.execute_reply":"2026-09-07T13:58:38.01895Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(\"JSON exists:\", os.path.exists(TRAIN_JSON))\nprint(\"Image directory exists:\", os.path.exists(IMAGE_DIR))\n\nprint(\"Number of training images:\", len(os.listdir(IMAGE_DIR)))\nprint(\"Example images:\", os.listdir(IMAGE_DIR)[:5])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.020233Z","iopub.status.idle":"2026-09-07T13:58:38.020534Z","shell.execute_reply.started":"2026-09-07T13:58:38.020401Z","shell.execute_reply":"2026-09-07T13:58:38.020417Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Inspect the actual structure of Train_QA.json\n\nprint(\"Number of image entries:\", len(raw_data))\n\nfirst_image = next(iter(raw_data))\nprint(\"\\nFirst image:\", first_image)\n\nprint(\"\\nValue type:\", type(raw_data[first_image]))\n\nprint(\"\\nFirst entry:\")\nprint(raw_data[first_image][0])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.022471Z","iopub.status.idle":"2026-09-07T13:58:38.02271Z","shell.execute_reply.started":"2026-09-07T13:58:38.022593Z","shell.execute_reply":"2026-09-07T13:58:38.022608Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Show the keys/structure safely\n\nfirst_value = raw_data[first_image]\n\nif isinstance(first_value, list):\n    for i, item in enumerate(first_value[:3]):\n        print(f\"\\nEntry {i}:\")\n        print(item)\n        if isinstance(item, dict):\n            print(\"Keys:\", item.keys())\nelse:\n    print(first_value)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.024003Z","iopub.status.idle":"2026-09-07T13:58:38.024409Z","shell.execute_reply.started":"2026-09-07T13:58:38.024169Z","shell.execute_reply":"2026-09-07T13:58:38.024187Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"records = []\n\nfor image_name, qa_list in raw_data.items():\n    for qa in qa_list:\n        records.append({\n            \"image\": image_name,\n            \"question\": qa[\"Question\"],\n            \"answer\": qa[\"Answer\"],\n            \"type\": qa[\"Type\"]\n        })\n\nprint(\"Total QA records:\", len(records))\nprint(\"\\nFirst 5 records:\")\n\nfor r in records[:5]:\n    print(r)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.025291Z","iopub.status.idle":"2026-09-07T13:58:38.025697Z","shell.execute_reply.started":"2026-09-07T13:58:38.025518Z","shell.execute_reply":"2026-09-07T13:58:38.025541Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import random\n\nrandom.seed(42)\n\nrandom.shuffle(records)\n\ntrain_records = records[:10000]\nval_records = records[10000:11000]\n\nprint(\"Training samples:\", len(train_records))\nprint(\"Validation samples:\", len(val_records))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.027008Z","iopub.status.idle":"2026-09-07T13:58:38.027379Z","shell.execute_reply.started":"2026-09-07T13:58:38.027169Z","shell.execute_reply":"2026-09-07T13:58:38.027191Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"IMAGE_DIR = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/Train-003/Train/images_png\"\n\nprint(\"Image directory exists:\", os.path.exists(IMAGE_DIR))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.02824Z","iopub.status.idle":"2026-09-07T13:58:38.028548Z","shell.execute_reply.started":"2026-09-07T13:58:38.028405Z","shell.execute_reply":"2026-09-07T13:58:38.028421Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import Image\nimport torch\nfrom torch.utils.data import Dataset, DataLoader\n\nclass EarthVQADataset(Dataset):\n\n    def __init__(self, records, image_dir, processor):\n        self.records = records\n        self.image_dir = image_dir\n        self.processor = processor\n\n    def __len__(self):\n        return len(self.records)\n\n    def __getitem__(self, idx):\n\n        item = self.records[idx]\n\n        image_path = os.path.join(\n            self.image_dir,\n            item[\"image\"]\n        )\n\n        image = Image.open(image_path).convert(\"RGB\")\n\n        # Question\n        inputs = self.processor(\n            images=image,\n            text=item[\"question\"],\n            padding=\"max_length\",\n            truncation=True,\n            max_length=32,\n            return_tensors=\"pt\"\n        )\n\n        # Answer\n        labels = self.processor.tokenizer(\n            item[\"answer\"],\n            padding=\"max_length\",\n            truncation=True,\n            max_length=16,\n            return_tensors=\"pt\"\n        ).input_ids\n\n        # Ignore padding when calculating loss\n        labels[labels == processor.tokenizer.pad_token_id] = -100\n\n        return {\n            \"pixel_values\": inputs[\"pixel_values\"].squeeze(0),\n            \"input_ids\": inputs[\"input_ids\"].squeeze(0),\n            \"attention_mask\": inputs[\"attention_mask\"].squeeze(0),\n            \"labels\": labels.squeeze(0)\n        }","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.029979Z","iopub.status.idle":"2026-09-07T13:58:38.030258Z","shell.execute_reply.started":"2026-09-07T13:58:38.030145Z","shell.execute_reply":"2026-09-07T13:58:38.030161Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom transformers import BlipProcessor, BlipForQuestionAnswering\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n).to(device)\n\nprint(\"Device:\", device)\nprint(\"BLIP-VQA loaded successfully\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.030826Z","iopub.status.idle":"2026-09-07T13:58:38.031177Z","shell.execute_reply.started":"2026-09-07T13:58:38.030985Z","shell.execute_reply":"2026-09-07T13:58:38.031002Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport json\nimport random\nimport torch\n\nfrom PIL import Image\nfrom torch.utils.data import Dataset, DataLoader\nfrom transformers import BlipProcessor, BlipForQuestionAnswering\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n).to(device)\n\nprint(\"Device:\", device)\nprint(\"BLIP loaded\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.032595Z","iopub.status.idle":"2026-09-07T13:58:38.032915Z","shell.execute_reply.started":"2026-09-07T13:58:38.032754Z","shell.execute_reply":"2026-09-07T13:58:38.03277Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"DATASET_DIR = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans\"\n\nTRAIN_JSON = os.path.join(\n    DATASET_DIR,\n    \"2024EarthVQA/2024EarthVQA/Train_QA.json\"\n)\n\nIMAGE_DIR = os.path.join(\n    DATASET_DIR,\n    \"Train-003/Train/images_png\"\n)\n\nprint(\"JSON:\", os.path.exists(TRAIN_JSON))\nprint(\"Images:\", os.path.exists(IMAGE_DIR))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.034492Z","iopub.status.idle":"2026-09-07T13:58:38.035094Z","shell.execute_reply.started":"2026-09-07T13:58:38.034875Z","shell.execute_reply":"2026-09-07T13:58:38.034906Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"with open(TRAIN_JSON, \"r\") as f:\n    raw_data = json.load(f)\n\nrecords = []\n\nfor image_name, qa_list in raw_data.items():\n    for qa in qa_list:\n        records.append({\n            \"image\": image_name,\n            \"question\": qa[\"Question\"],\n            \"answer\": qa[\"Answer\"],\n            \"type\": qa[\"Type\"]\n        })\n\nprint(\"Total QA records:\", len(records))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.036507Z","iopub.status.idle":"2026-09-07T13:58:38.036809Z","shell.execute_reply.started":"2026-09-07T13:58:38.036659Z","shell.execute_reply":"2026-09-07T13:58:38.036675Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"random.seed(42)\nrandom.shuffle(records)\n\ntrain_records = records[:10000]\nval_records = records[10000:11000]\n\nprint(\"Training:\", len(train_records))\nprint(\"Validation:\", len(val_records))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.037566Z","iopub.status.idle":"2026-09-07T13:58:38.037884Z","shell.execute_reply.started":"2026-09-07T13:58:38.037761Z","shell.execute_reply":"2026-09-07T13:58:38.037778Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class EarthVQADataset(Dataset):\n\n    def __init__(self, records, image_dir, processor):\n        self.records = records\n        self.image_dir = image_dir\n        self.processor = processor\n\n    def __len__(self):\n        return len(self.records)\n\n    def __getitem__(self, idx):\n\n        item = self.records[idx]\n\n        image_path = os.path.join(\n            self.image_dir,\n            item[\"image\"]\n        )\n\n        image = Image.open(image_path).convert(\"RGB\")\n\n        # Image + question\n        inputs = self.processor(\n            images=image,\n            text=item[\"question\"],\n            padding=\"max_length\",\n            truncation=True,\n            max_length=32,\n            return_tensors=\"pt\"\n        )\n\n        # Answer\n        labels = self.processor.tokenizer(\n            item[\"answer\"],\n            padding=\"max_length\",\n            truncation=True,\n            max_length=16,\n            return_tensors=\"pt\"\n        ).input_ids\n\n        # Ignore padding when calculating loss\n        labels[labels == self.processor.tokenizer.pad_token_id] = -100\n\n        return {\n            \"pixel_values\": inputs[\"pixel_values\"].squeeze(0),\n            \"input_ids\": inputs[\"input_ids\"].squeeze(0),\n            \"attention_mask\": inputs[\"attention_mask\"].squeeze(0),\n            \"labels\": labels.squeeze(0)\n        }\n\nprint(\"EarthVQADataset defined\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.039106Z","iopub.status.idle":"2026-09-07T13:58:38.039405Z","shell.execute_reply.started":"2026-09-07T13:58:38.039238Z","shell.execute_reply":"2026-09-07T13:58:38.039253Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dataset = EarthVQADataset(\n    train_records,\n    IMAGE_DIR,\n    processor\n)\n\nval_dataset = EarthVQADataset(\n    val_records,\n    IMAGE_DIR,\n    processor\n)\n\ntrain_loader = DataLoader(\n    train_dataset,\n    batch_size=4,\n    shuffle=True,\n    num_workers=0\n)\n\nval_loader = DataLoader(\n    val_dataset,\n    batch_size=4,\n    shuffle=False,\n    num_workers=0\n)\n\nprint(\"Train dataset:\", len(train_dataset))\nprint(\"Validation dataset:\", len(val_dataset))\nprint(\"Train batches:\", len(train_loader))\nprint(\"Validation batches:\", len(val_loader))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.04012Z","iopub.status.idle":"2026-09-07T13:58:38.040502Z","shell.execute_reply.started":"2026-09-07T13:58:38.040289Z","shell.execute_reply":"2026-09-07T13:58:38.040344Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"batch = next(iter(train_loader))\n\npixel_values = batch[\"pixel_values\"].to(device)\ninput_ids = batch[\"input_ids\"].to(device)\nattention_mask = batch[\"attention_mask\"].to(device)\nlabels = batch[\"labels\"].to(device)\n\nprint(\"pixel_values:\", pixel_values.shape)\nprint(\"input_ids:\", input_ids.shape)\nprint(\"attention_mask:\", attention_mask.shape)\nprint(\"labels:\", labels.shape)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.041691Z","iopub.status.idle":"2026-09-07T13:58:38.042026Z","shell.execute_reply.started":"2026-09-07T13:58:38.041851Z","shell.execute_reply":"2026-09-07T13:58:38.041875Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q --upgrade \"torchao>=0.18.0\"","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.043452Z","iopub.status.idle":"2026-09-07T13:58:38.043811Z","shell.execute_reply.started":"2026-09-07T13:58:38.043597Z","shell.execute_reply":"2026-09-07T13:58:38.043623Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torchao\nimport peft\nimport transformers\n\nprint(\"PyTorch:\", torch.__version__)\nprint(\"TorchAO:\", torchao.__version__)\nprint(\"PEFT:\", peft.__version__)\nprint(\"Transformers:\", transformers.__version__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.045716Z","iopub.status.idle":"2026-09-07T13:58:38.046089Z","shell.execute_reply.started":"2026-09-07T13:58:38.045878Z","shell.execute_reply":"2026-09-07T13:58:38.045904Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom transformers import BlipProcessor, BlipForQuestionAnswering\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n).to(device)\n\nprint(\"BLIP loaded on:\", device)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.046845Z","iopub.status.idle":"2026-09-07T13:58:38.047067Z","shell.execute_reply.started":"2026-09-07T13:58:38.046959Z","shell.execute_reply":"2026-09-07T13:58:38.046973Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torchao\nimport peft\nimport transformers\n\nprint(\"PyTorch:\", torch.__version__)\nprint(\"TorchAO:\", torchao.__version__)\nprint(\"PEFT:\", peft.__version__)\nprint(\"Transformers:\", transformers.__version__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.048414Z","iopub.status.idle":"2026-09-07T13:58:38.048713Z","shell.execute_reply.started":"2026-09-07T13:58:38.04859Z","shell.execute_reply":"2026-09-07T13:58:38.048606Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from peft import LoraConfig, get_peft_model\n\ntarget_modules = []\n\nfor i in range(12):\n    target_modules.extend([\n        f\"text_decoder.bert.encoder.layer.{i}.attention.self.query\",\n        f\"text_decoder.bert.encoder.layer.{i}.attention.self.value\",\n        f\"text_decoder.bert.encoder.layer.{i}.crossattention.self.query\",\n        f\"text_decoder.bert.encoder.layer.{i}.crossattention.self.value\",\n    ])\n\nlora_config = LoraConfig(\n    r=8,\n    lora_alpha=16,\n    lora_dropout=0.05,\n    target_modules=target_modules,\n    bias=\"none\",\n    task_type=\"SEQ_2_SEQ_LM\"\n)\n\nmodel = get_peft_model(model, lora_config)\n\nmodel.print_trainable_parameters()","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.049701Z","iopub.status.idle":"2026-09-07T13:58:38.049981Z","shell.execute_reply.started":"2026-09-07T13:58:38.049856Z","shell.execute_reply":"2026-09-07T13:58:38.049881Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"decoder_lora = 0\nencoder_lora = 0\n\nfor name, module in model.named_modules():\n    if \"lora_\" in name:\n        if \"text_decoder\" in name:\n            decoder_lora += 1\n        elif \"vision_model\" in name:\n            encoder_lora += 1\n\nprint(\"Decoder LoRA modules:\", decoder_lora)\nprint(\"Encoder LoRA modules:\", encoder_lora)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.050998Z","iopub.status.idle":"2026-09-07T13:58:38.051306Z","shell.execute_reply.started":"2026-09-07T13:58:38.051146Z","shell.execute_reply":"2026-09-07T13:58:38.051162Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip uninstall -y transformers\n!pip install --no-cache-dir --force-reinstall \"transformers==4.49.0\"","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.052692Z","iopub.status.idle":"2026-09-07T13:58:38.052967Z","shell.execute_reply.started":"2026-09-07T13:58:38.052846Z","shell.execute_reply":"2026-09-07T13:58:38.052862Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport transformers\nimport peft\nimport torchao\n\nprint(\"PyTorch:\", torch.__version__)\nprint(\"Transformers:\", transformers.__version__)\nprint(\"PEFT:\", peft.__version__)\nprint(\"TorchAO:\", torchao.__version__)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.054143Z","iopub.status.idle":"2026-09-07T13:58:38.054526Z","shell.execute_reply.started":"2026-09-07T13:58:38.054305Z","shell.execute_reply":"2026-09-07T13:58:38.054356Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import BlipProcessor, BlipForQuestionAnswering\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n).to(device)\n\nprint(\"BLIP loaded:\", device)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.055688Z","iopub.status.idle":"2026-09-07T13:58:38.056038Z","shell.execute_reply.started":"2026-09-07T13:58:38.055854Z","shell.execute_reply":"2026-09-07T13:58:38.055875Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import BlipProcessor, BlipForQuestionAnswering\n\nprint(\"BLIP import OK\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.056861Z","iopub.status.idle":"2026-09-07T13:58:38.05713Z","shell.execute_reply.started":"2026-09-07T13:58:38.05702Z","shell.execute_reply":"2026-09-07T13:58:38.057035Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom transformers import BlipProcessor, BlipForQuestionAnswering\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\nprint(\"Device:\", device)\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n).to(device)\n\nprint(\"BLIP model loaded successfully\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.058003Z","iopub.status.idle":"2026-09-07T13:58:38.058295Z","shell.execute_reply.started":"2026-09-07T13:58:38.058182Z","shell.execute_reply":"2026-09-07T13:58:38.058197Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nfrom PIL import Image\n\nIMAGE_DIR = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/Train-003/Train/images_png\"\n\nimage_name = os.listdir(IMAGE_DIR)[0]\nimage_path = os.path.join(IMAGE_DIR, image_name)\n\nimage = Image.open(image_path).convert(\"RGB\")\n\nquestion = \"Are there any buildings in this scene?\"\n\ninputs = processor(\n    images=image,\n    text=question,\n    return_tensors=\"pt\"\n).to(device)\n\nwith torch.no_grad():\n    generated_ids = model.generate(\n        **inputs,\n        max_new_tokens=10\n    )\n\nanswer = processor.decode(\n    generated_ids[0],\n    skip_special_tokens=True\n)\n\nprint(\"Image:\", image_name)\nprint(\"Question:\", question)\nprint(\"Answer:\", answer)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.060424Z","iopub.status.idle":"2026-09-07T13:58:38.060773Z","shell.execute_reply.started":"2026-09-07T13:58:38.060588Z","shell.execute_reply":"2026-09-07T13:58:38.060611Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Freeze the complete model\nfor param in model.parameters():\n    param.requires_grad = False\n\n# Enable training for the text decoder\nfor param in model.text_decoder.parameters():\n    param.requires_grad = True\n\ntrainable = sum(\n    p.numel()\n    for p in model.parameters()\n    if p.requires_grad\n)\n\ntotal = sum(\n    p.numel()\n    for p in model.parameters()\n)\n\nprint(\"Trainable parameters:\", trainable)\nprint(\"Total parameters:\", total)\nprint(\"Trainable percentage:\", 100 * trainable / total)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.062025Z","iopub.status.idle":"2026-09-07T13:58:38.062457Z","shell.execute_reply.started":"2026-09-07T13:58:38.062195Z","shell.execute_reply":"2026-09-07T13:58:38.062225Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import json\nimport random\n\nQA_PATH = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/2024EarthVQA/2024EarthVQA/Train_QA.json\"\n\nwith open(QA_PATH, \"r\") as f:\n    raw_data = json.load(f)\n\nrecords = []\n\nfor image_name, qa_list in raw_data.items():\n    for qa in qa_list:\n        records.append({\n            \"image\": image_name,\n            \"question\": qa[\"Question\"],\n            \"answer\": qa[\"Answer\"],\n            \"type\": qa[\"Type\"]\n        })\n\nprint(\"Total QA records:\", len(records))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.064357Z","iopub.status.idle":"2026-09-07T13:58:38.064737Z","shell.execute_reply.started":"2026-09-07T13:58:38.06454Z","shell.execute_reply":"2026-09-07T13:58:38.064565Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Freeze everything\nfor param in model.parameters():\n    param.requires_grad = False\n\n# Train only the final layers of the text decoder\nfor layer in model.text_decoder.bert.encoder.layer[-2:]:\n    for param in layer.parameters():\n        param.requires_grad = True\n\n# Also train the language-model prediction head\nfor param in model.text_decoder.cls.parameters():\n    param.requires_grad = True\n\ntrainable = sum(\n    p.numel()\n    for p in model.parameters()\n    if p.requires_grad\n)\n\ntotal = sum(\n    p.numel()\n    for p in model.parameters()\n)\n\nprint(\"Trainable parameters:\", trainable)\nprint(\"Total parameters:\", total)\nprint(\"Trainable percentage:\", 100 * trainable / total)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.065718Z","iopub.status.idle":"2026-09-07T13:58:38.066458Z","shell.execute_reply.started":"2026-09-07T13:58:38.066264Z","shell.execute_reply":"2026-09-07T13:58:38.066292Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"random.seed(42)\nrandom.shuffle(records)\n\ntrain_records = records[:10000]\nval_records = records[10000:11000]\n\nprint(\"Train:\", len(train_records))\nprint(\"Validation:\", len(val_records))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.068288Z","iopub.status.idle":"2026-09-07T13:58:38.068736Z","shell.execute_reply.started":"2026-09-07T13:58:38.068558Z","shell.execute_reply":"2026-09-07T13:58:38.068595Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torch.utils.data import Dataset, DataLoader\nfrom PIL import Image\nimport os\n\nclass EarthVQADataset(Dataset):\n\n    def __init__(self, records, image_dir, processor):\n        self.records = records\n        self.image_dir = image_dir\n        self.processor = processor\n\n    def __len__(self):\n        return len(self.records)\n\n    def __getitem__(self, idx):\n\n        item = self.records[idx]\n\n        image_path = os.path.join(\n            self.image_dir,\n            item[\"image\"]\n        )\n\n        image = Image.open(image_path).convert(\"RGB\")\n\n        inputs = self.processor(\n            images=image,\n            text=item[\"question\"],\n            padding=\"max_length\",\n            truncation=True,\n            max_length=32,\n            return_tensors=\"pt\"\n        )\n\n        labels = self.processor.tokenizer(\n            item[\"answer\"],\n            padding=\"max_length\",\n            truncation=True,\n            max_length=16,\n            return_tensors=\"pt\"\n        ).input_ids\n\n        # Ignore padding tokens when calculating loss\n        labels[\n            labels == self.processor.tokenizer.pad_token_id\n        ] = -100\n\n        return {\n            \"pixel_values\": inputs[\"pixel_values\"].squeeze(0),\n            \"input_ids\": inputs[\"input_ids\"].squeeze(0),\n            \"attention_mask\": inputs[\"attention_mask\"].squeeze(0),\n            \"labels\": labels.squeeze(0)\n        }\n\nprint(\"EarthVQADataset defined\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.069846Z","iopub.status.idle":"2026-09-07T13:58:38.070185Z","shell.execute_reply.started":"2026-09-07T13:58:38.070065Z","shell.execute_reply":"2026-09-07T13:58:38.070081Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import random\n\nrandom.seed(42)\nrandom.shuffle(records)\n\ntrain_records = records[:10000]\nval_records = records[10000:11000]\n\nprint(\"Train:\", len(train_records))\nprint(\"Validation:\", len(val_records))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.071704Z","iopub.status.idle":"2026-09-07T13:58:38.072067Z","shell.execute_reply.started":"2026-09-07T13:58:38.07188Z","shell.execute_reply":"2026-09-07T13:58:38.071917Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dataset = EarthVQADataset(\n    train_records,\n    IMAGE_DIR,\n    processor\n)\n\nval_dataset = EarthVQADataset(\n    val_records,\n    IMAGE_DIR,\n    processor\n)\n\nprint(\"Train dataset:\", len(train_dataset))\nprint(\"Validation dataset:\", len(val_dataset))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.073563Z","iopub.status.idle":"2026-09-07T13:58:38.073881Z","shell.execute_reply.started":"2026-09-07T13:58:38.073761Z","shell.execute_reply":"2026-09-07T13:58:38.073778Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_loader = DataLoader(\n    train_dataset,\n    batch_size=4,\n    shuffle=True,\n    num_workers=0\n)\n\nval_loader = DataLoader(\n    val_dataset,\n    batch_size=4,\n    shuffle=False,\n    num_workers=0\n)\n\nprint(\"DataLoaders ready\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.074944Z","iopub.status.idle":"2026-09-07T13:58:38.075228Z","shell.execute_reply.started":"2026-09-07T13:58:38.075084Z","shell.execute_reply":"2026-09-07T13:58:38.075099Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"batch = next(iter(train_loader))\n\nfor key, value in batch.items():\n    print(key, value.shape)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.076613Z","iopub.status.idle":"2026-09-07T13:58:38.07696Z","shell.execute_reply.started":"2026-09-07T13:58:38.076772Z","shell.execute_reply":"2026-09-07T13:58:38.076795Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Get one batch\nbatch = next(iter(train_loader))\n\npixel_values = batch[\"pixel_values\"].to(device)\ninput_ids = batch[\"input_ids\"].to(device)\nattention_mask = batch[\"attention_mask\"].to(device)\nlabels = batch[\"labels\"].to(device)\n\n# Prepare decoder inputs\ndecoder_input_ids = labels.clone()\n\ndecoder_input_ids[\n    decoder_input_ids == -100\n] = processor.tokenizer.pad_token_id\n\ndecoder_input_ids = decoder_input_ids[:, :-1]\n\ndecoder_labels = labels[:, 1:]\n\n# Forward pass\noutputs = model(\n    pixel_values=pixel_values,\n    input_ids=input_ids,\n    attention_mask=attention_mask,\n    decoder_input_ids=decoder_input_ids,\n    labels=decoder_labels\n)\n\nloss = outputs.loss\n\nprint(\"Forward pass successful!\")\nprint(\"Loss:\", loss.item())\n\n# Backward pass\nloss.backward()\n\nprint(\"Backward pass successful!\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.078025Z","iopub.status.idle":"2026-09-07T13:58:38.078258Z","shell.execute_reply.started":"2026-09-07T13:58:38.078145Z","shell.execute_reply":"2026-09-07T13:58:38.07816Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torch.optim import AdamW\n\ntrainable_params = [\n    p for p in model.parameters()\n    if p.requires_grad\n]\n\noptimizer = AdamW(\n    trainable_params,\n    lr=5e-5,\n    weight_decay=0.01\n)\n\nprint(\"Trainable tensors:\", len(trainable_params))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.079486Z","iopub.status.idle":"2026-09-07T13:58:38.079709Z","shell.execute_reply.started":"2026-09-07T13:58:38.079601Z","shell.execute_reply":"2026-09-07T13:58:38.079615Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class EarthVQADataset(Dataset):\n\n    def __init__(self, records, image_dir, processor):\n        self.records = records\n        self.image_dir = image_dir\n        self.processor = processor\n\n    def __len__(self):\n        return len(self.records)\n\n    def __getitem__(self, idx):\n\n        item = self.records[idx]\n\n        image_path = os.path.join(\n            self.image_dir,\n            item[\"image\"]\n        )\n\n        image = Image.open(image_path).convert(\"RGB\")\n\n        # Make sure question and answer are strings\n        question = str(item[\"question\"])\n        answer = str(item[\"answer\"])\n\n        inputs = self.processor(\n            images=image,\n            text=question,\n            padding=\"max_length\",\n            truncation=True,\n            max_length=32,\n            return_tensors=\"pt\"\n        )\n\n        labels = self.processor.tokenizer(\n            answer,\n            padding=\"max_length\",\n            truncation=True,\n            max_length=16,\n            return_tensors=\"pt\"\n        ).input_ids\n\n        labels[\n            labels == self.processor.tokenizer.pad_token_id\n        ] = -100\n\n        return {\n            \"pixel_values\": inputs[\"pixel_values\"].squeeze(0),\n            \"input_ids\": inputs[\"input_ids\"].squeeze(0),\n            \"attention_mask\": inputs[\"attention_mask\"].squeeze(0),\n            \"labels\": labels.squeeze(0)\n        }\n\nprint(\"Dataset class updated\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.08111Z","iopub.status.idle":"2026-09-07T13:58:38.081427Z","shell.execute_reply.started":"2026-09-07T13:58:38.081256Z","shell.execute_reply":"2026-09-07T13:58:38.081271Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dataset = EarthVQADataset(\n    train_records,\n    IMAGE_DIR,\n    processor\n)\n\nval_dataset = EarthVQADataset(\n    val_records,\n    IMAGE_DIR,\n    processor\n)\n\ntrain_loader = DataLoader(\n    train_dataset,\n    batch_size=4,\n    shuffle=True,\n    num_workers=0\n)\n\nval_loader = DataLoader(\n    val_dataset,\n    batch_size=4,\n    shuffle=False,\n    num_workers=0\n)\n\nprint(\"Datasets and DataLoaders recreated\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.082513Z","iopub.status.idle":"2026-09-07T13:58:38.082774Z","shell.execute_reply.started":"2026-09-07T13:58:38.082646Z","shell.execute_reply":"2026-09-07T13:58:38.082661Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from collections import Counter\n\nanswer_types = Counter(\n    type(r[\"answer\"]).__name__\n    for r in train_records\n)\n\nprint(answer_types)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.083833Z","iopub.status.idle":"2026-09-07T13:58:38.084183Z","shell.execute_reply.started":"2026-09-07T13:58:38.083995Z","shell.execute_reply":"2026-09-07T13:58:38.084021Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"batch = next(iter(train_loader))\n\nfor key, value in batch.items():\n    print(key, value.shape)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.085798Z","iopub.status.idle":"2026-09-07T13:58:38.086115Z","shell.execute_reply.started":"2026-09-07T13:58:38.08595Z","shell.execute_reply":"2026-09-07T13:58:38.085967Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tqdm.auto import tqdm\n\nmodel.train()\n\nnum_steps = 500\nrunning_loss = 0.0\n\nprogress = tqdm(\n    enumerate(train_loader),\n    total=num_steps,\n    desc=\"EarthVQA pilot training\"\n)\n\nfor step, batch in progress:\n\n    if step >= num_steps:\n        break\n\n    pixel_values = batch[\"pixel_values\"].to(device)\n    input_ids = batch[\"input_ids\"].to(device)\n    attention_mask = batch[\"attention_mask\"].to(device)\n    labels = batch[\"labels\"].to(device)\n\n    decoder_input_ids = labels.clone()\n\n    decoder_input_ids[\n        decoder_input_ids == -100\n    ] = processor.tokenizer.pad_token_id\n\n    decoder_input_ids = decoder_input_ids[:, :-1]\n    decoder_labels = labels[:, 1:]\n\n    optimizer.zero_grad(set_to_none=True)\n\n    outputs = model(\n        pixel_values=pixel_values,\n        input_ids=input_ids,\n        attention_mask=attention_mask,\n        decoder_input_ids=decoder_input_ids,\n        labels=decoder_labels\n    )\n\n    loss = outputs.loss\n\n    loss.backward()\n\n    torch.nn.utils.clip_grad_norm_(\n        trainable_params,\n        max_norm=1.0\n    )\n\n    optimizer.step()\n\n    running_loss += loss.item()\n\n    progress.set_postfix(\n        loss=f\"{loss.item():.4f}\",\n        avg=f\"{running_loss / (step + 1):.4f}\"\n    )\n\nprint(\"Pilot training finished.\")\nprint(\"Average loss:\", running_loss / num_steps)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.08706Z","iopub.status.idle":"2026-09-07T13:58:38.087361Z","shell.execute_reply.started":"2026-09-07T13:58:38.087228Z","shell.execute_reply":"2026-09-07T13:58:38.087244Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.eval()\n\nval_loss = 0.0\nval_steps = 0\n\nwith torch.no_grad():\n\n    for batch in tqdm(val_loader, desc=\"Validation\"):\n\n        pixel_values = batch[\"pixel_values\"].to(device)\n        input_ids = batch[\"input_ids\"].to(device)\n        attention_mask = batch[\"attention_mask\"].to(device)\n        labels = batch[\"labels\"].to(device)\n\n        decoder_input_ids = labels.clone()\n\n        decoder_input_ids[\n            decoder_input_ids == -100\n        ] = processor.tokenizer.pad_token_id\n\n        decoder_input_ids = decoder_input_ids[:, :-1]\n        decoder_labels = labels[:, 1:]\n\n        outputs = model(\n            pixel_values=pixel_values,\n            input_ids=input_ids,\n            attention_mask=attention_mask,\n            decoder_input_ids=decoder_input_ids,\n            labels=decoder_labels\n        )\n\n        val_loss += outputs.loss.item()\n        val_steps += 1\n\navg_val_loss = val_loss / val_steps\n\nprint(\"Validation loss:\", avg_val_loss)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.088323Z","iopub.status.idle":"2026-09-07T13:58:38.088563Z","shell.execute_reply.started":"2026-09-07T13:58:38.088447Z","shell.execute_reply":"2026-09-07T13:58:38.088462Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"model.eval()\n\nfor i in range(10):\n\n    item = val_records[i]\n\n    image_path = os.path.join(\n        IMAGE_DIR,\n        item[\"image\"]\n    )\n\n    image = Image.open(image_path).convert(\"RGB\")\n\n    inputs = processor(\n        images=image,\n        text=str(item[\"question\"]),\n        return_tensors=\"pt\"\n    ).to(device)\n\n    with torch.no_grad():\n        generated_ids = model.generate(\n            **inputs,\n            max_new_tokens=16\n        )\n\n    prediction = processor.decode(\n        generated_ids[0],\n        skip_special_tokens=True\n    )\n\n    print(\"\\n\", i + 1)\n    print(\"Question :\", item[\"question\"])\n    print(\"Expected :\", item[\"answer\"])\n    print(\"Predicted:\", prediction)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.08942Z","iopub.status.idle":"2026-09-07T13:58:38.08975Z","shell.execute_reply.started":"2026-09-07T13:58:38.089537Z","shell.execute_reply":"2026-09-07T13:58:38.089637Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pilot_dir = \"/kaggle/working/blip-earthvqa-pilot\"\n\nmodel.save_pretrained(pilot_dir)\nprocessor.save_pretrained(pilot_dir)\n\nprint(\"Pilot saved:\", pilot_dir)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.090469Z","iopub.status.idle":"2026-09-07T13:58:38.090694Z","shell.execute_reply.started":"2026-09-07T13:58:38.090584Z","shell.execute_reply":"2026-09-07T13:58:38.090598Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import BlipProcessor, BlipForQuestionAnswering\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n).to(device)\n\nprint(\"Fresh BLIP loaded\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.091837Z","iopub.status.idle":"2026-09-07T13:58:38.092168Z","shell.execute_reply.started":"2026-09-07T13:58:38.091992Z","shell.execute_reply":"2026-09-07T13:58:38.092016Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"base_processor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nbase_model = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n).to(device)\n\nbase_model.eval()\n\nprint(\"Base BLIP loaded\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.094237Z","iopub.status.idle":"2026-09-07T13:58:38.094569Z","shell.execute_reply.started":"2026-09-07T13:58:38.094414Z","shell.execute_reply":"2026-09-07T13:58:38.094442Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from tqdm.auto import tqdm\n\ndef evaluate_vqa(model, processor, records, image_dir, max_samples=None):\n\n    model.eval()\n\n    if max_samples is not None:\n        records = records[:max_samples]\n\n    correct = 0\n    results = []\n\n    for item in tqdm(records, desc=\"Evaluating\"):\n\n        image_path = os.path.join(\n            image_dir,\n            item[\"image\"]\n        )\n\n        image = Image.open(image_path).convert(\"RGB\")\n\n        question = str(item[\"question\"])\n        expected = str(item[\"answer\"]).strip().lower()\n\n        inputs = processor(\n            images=image,\n            text=question,\n            return_tensors=\"pt\"\n        ).to(device)\n\n        with torch.no_grad():\n            generated_ids = model.generate(\n                **inputs,\n                max_new_tokens=16,\n                num_beams=3,\n                repetition_penalty=1.2\n            )\n\n        prediction = processor.decode(\n            generated_ids[0],\n            skip_special_tokens=True\n        ).strip().lower()\n\n        is_correct = prediction == expected\n\n        if is_correct:\n            correct += 1\n\n        results.append({\n            \"question\": question,\n            \"expected\": expected,\n            \"predicted\": prediction,\n            \"correct\": is_correct\n        })\n\n    accuracy = correct / len(records) * 100\n\n    return accuracy, results","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.095551Z","iopub.status.idle":"2026-09-07T13:58:38.095876Z","shell.execute_reply.started":"2026-09-07T13:58:38.095743Z","shell.execute_reply":"2026-09-07T13:58:38.09577Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"base_accuracy, base_results = evaluate_vqa(\n    base_model,\n    base_processor,\n    val_records,\n    IMAGE_DIR,\n    max_samples=100\n)\n\nprint(f\"Base BLIP accuracy: {base_accuracy:.2f}%\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.096992Z","iopub.status.idle":"2026-09-07T13:58:38.097391Z","shell.execute_reply.started":"2026-09-07T13:58:38.097144Z","shell.execute_reply":"2026-09-07T13:58:38.097171Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"pilot_accuracy, pilot_results = evaluate_vqa(\n    model,\n    processor,\n    val_records,\n    IMAGE_DIR,\n    max_samples=100\n)\n\nprint(f\"Pilot BLIP accuracy: {pilot_accuracy:.2f}%\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.098716Z","iopub.status.idle":"2026-09-07T13:58:38.099051Z","shell.execute_reply.started":"2026-09-07T13:58:38.098876Z","shell.execute_reply":"2026-09-07T13:58:38.098897Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from collections import Counter\n\nprint(\"===== BASE BLIP =====\")\n\nbase_correct = sum(r[\"correct\"] for r in base_results)\n\nprint(\"Correct:\", base_correct)\nprint(\"Total:\", len(base_results))\n\nprint(\"\\n===== PILOT BLIP =====\")\n\npilot_correct = sum(r[\"correct\"] for r in pilot_results)\n\nprint(\"Correct:\", pilot_correct)\nprint(\"Total:\", len(pilot_results))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.100075Z","iopub.status.idle":"2026-09-07T13:58:38.100299Z","shell.execute_reply.started":"2026-09-07T13:58:38.100189Z","shell.execute_reply":"2026-09-07T13:58:38.100203Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"===== MODEL DISAGREEMENTS =====\\n\")\n\nfor i, (b, p) in enumerate(zip(base_results, pilot_results)):\n\n    if b[\"predicted\"] != p[\"predicted\"]:\n\n        print(f\"{i+1}.\")\n        print(\"Question :\", b[\"question\"])\n        print(\"Expected :\", b[\"expected\"])\n        print(\"Base     :\", b[\"predicted\"])\n        print(\"Pilot    :\", p[\"predicted\"])\n        print()","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.10171Z","iopub.status.idle":"2026-09-07T13:58:38.101928Z","shell.execute_reply.started":"2026-09-07T13:58:38.101823Z","shell.execute_reply":"2026-09-07T13:58:38.101837Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for i in range(10):\n\n    item = val_records[i]\n\n    image_path = os.path.join(\n        IMAGE_DIR,\n        item[\"image\"]\n    )\n\n    image = Image.open(image_path).convert(\"RGB\")\n\n    inputs = processor(\n        images=image,\n        text=str(item[\"question\"]),\n        return_tensors=\"pt\"\n    ).to(device)\n\n    with torch.no_grad():\n        generated_ids = model.generate(\n            **inputs,\n            max_new_tokens=16,\n            num_beams=3,\n            repetition_penalty=1.2\n        )\n\n    prediction = processor.decode(\n        generated_ids[0],\n        skip_special_tokens=True\n    ).strip()\n\n    print(f\"\\n{i+1}\")\n    print(\"Q:\", item[\"question\"])\n    print(\"Expected:\", item[\"answer\"])\n    print(\"Pilot:\", prediction)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.102784Z","iopub.status.idle":"2026-09-07T13:58:38.10309Z","shell.execute_reply.started":"2026-09-07T13:58:38.102899Z","shell.execute_reply":"2026-09-07T13:58:38.102914Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"base_model.eval()\n\nfor i in range(10):\n\n    item = val_records[i]\n\n    image_path = os.path.join(\n        IMAGE_DIR,\n        item[\"image\"]\n    )\n\n    image = Image.open(image_path).convert(\"RGB\")\n\n    inputs = base_processor(\n        images=image,\n        text=str(item[\"question\"]),\n        return_tensors=\"pt\"\n    ).to(device)\n\n    with torch.no_grad():\n        generated_ids = base_model.generate(\n            **inputs,\n            max_new_tokens=16,\n            num_beams=3,\n            repetition_penalty=1.2\n        )\n\n    prediction = base_processor.decode(\n        generated_ids[0],\n        skip_special_tokens=True\n    ).strip()\n\n    print(f\"\\n{i+1}\")\n    print(\"Q:\", item[\"question\"])\n    print(\"Expected:\", item[\"answer\"])\n    print(\"Base:\", prediction)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.104088Z","iopub.status.idle":"2026-09-07T13:58:38.104518Z","shell.execute_reply.started":"2026-09-07T13:58:38.104262Z","shell.execute_reply":"2026-09-07T13:58:38.104294Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport re\nimport string\nimport torch\nfrom PIL import Image\nfrom collections import defaultdict\n\n\ndef normalize_text(s):\n    s = str(s).lower().strip()\n    s = re.sub(f\"[{re.escape(string.punctuation)}]\", \"\", s)\n    s = re.sub(r\"\\s+\", \" \", s)\n    return s.strip()\n\n\ndef classify_question_type(qa_type, question, answer):\n    a = str(answer).lower().strip()\n    t = str(qa_type).lower()\n\n    if a in {\"yes\", \"no\"}:\n        return \"yes_no\"\n    if \"rural\" in a or \"urban\" in a:\n        return \"rural_urban\"\n    if \"%\" in a or re.fullmatch(r\"[\\d.]+\", a):\n        return \"numeric_percentage\"\n    if len(a.split()) > 4 or \"reasoning\" in t or \"situation\" in t:\n        return \"descriptive_reasoning\"\n    return \"land_use_category\"\n\n\ndef generate_answer(model, processor, image, question, device,\n                     max_new_tokens=20, num_beams=5,\n                     repetition_penalty=1.5, no_repeat_ngram_size=3):\n    inputs = processor(images=image, text=str(question), return_tensors=\"pt\").to(device)\n    with torch.no_grad():\n        out = model.generate(\n            **inputs,\n            max_new_tokens=max_new_tokens,\n            num_beams=num_beams,\n            repetition_penalty=repetition_penalty,\n            no_repeat_ngram_size=no_repeat_ngram_size,\n            early_stopping=True,\n        )\n    return processor.decode(out[0], skip_special_tokens=True).strip()\n\n\ndef evaluate_model(model, processor, records_subset, image_dir, device,\n                    label=\"model\", max_samples=None, verbose_examples=5):\n    model.eval()\n    records_to_use = records_subset if max_samples is None else records_subset[:max_samples]\n\n    exact_correct = 0\n    normalized_correct = 0\n    total = 0\n\n    per_type_exact = defaultdict(int)\n    per_type_normalized = defaultdict(int)\n    per_type_total = defaultdict(int)\n\n    correct_examples = []\n    incorrect_examples = []\n\n    for item in records_to_use:\n        image_path = os.path.join(image_dir, item[\"image\"])\n        try:\n            image = Image.open(image_path).convert(\"RGB\")\n        except Exception:\n            continue\n\n        question = str(item[\"question\"])\n        expected = str(item[\"answer\"])\n        qtype = classify_question_type(item.get(\"type\", \"\"), question, expected)\n\n        predicted = generate_answer(model, processor, image, question, device)\n\n        exact = predicted.strip().lower() == expected.strip().lower()\n        norm_match = normalize_text(predicted) == normalize_text(expected)\n\n        total += 1\n        per_type_total[qtype] += 1\n        if exact:\n            exact_correct += 1\n            per_type_exact[qtype] += 1\n        if norm_match:\n            normalized_correct += 1\n            per_type_normalized[qtype] += 1\n\n        record = {\n            \"image\": item[\"image\"], \"question\": question,\n            \"expected\": expected, \"predicted\": predicted, \"type\": qtype\n        }\n        (correct_examples if norm_match else incorrect_examples).append(record)\n\n    results = {\n        \"label\": label,\n        \"total\": total,\n        \"exact_match_acc\": exact_correct / total if total else 0,\n        \"normalized_acc\": normalized_correct / total if total else 0,\n        \"per_type\": {\n            qt: {\n                \"count\": per_type_total[qt],\n                \"exact_match_acc\": per_type_exact[qt] / per_type_total[qt],\n                \"normalized_acc\": per_type_normalized[qt] / per_type_total[qt],\n            }\n            for qt in per_type_total\n        },\n        \"correct_examples\": correct_examples[:verbose_examples],\n        \"incorrect_examples\": incorrect_examples[:verbose_examples],\n    }\n\n    print(f\"\\n=== Evaluation: {label} ===\")\n    print(f\"Total questions: {total}\")\n    print(f\"Exact-match accuracy:  {results['exact_match_acc']*100:.2f}%\")\n    print(f\"Normalized accuracy:   {results['normalized_acc']*100:.2f}%\")\n    print(\"\\nPer-question-type breakdown:\")\n    for qt, stats in results[\"per_type\"].items():\n        print(f\"  {qt:22s} n={stats['count']:4d}  exact={stats['exact_match_acc']*100:5.1f}%  \"\n              f\"normalized={stats['normalized_acc']*100:5.1f}%\")\n\n    return results\n\n\nprint(\"Evaluation utilities ready: normalize_text, classify_question_type, generate_answer, evaluate_model\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.106225Z","iopub.status.idle":"2026-09-07T13:58:38.10662Z","shell.execute_reply.started":"2026-09-07T13:58:38.106409Z","shell.execute_reply":"2026-09-07T13:58:38.106432Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Diagnostic: check which required variables actually exist in THIS kernel session\n\nrequired_vars = [\n    \"device\", \"processor\", \"model\",\n    \"records\", \"train_records\", \"val_records\",\n    \"IMAGE_DIR\", \"train_loader\", \"val_loader\",\n]\n\nprint(\"Variable status:\")\nfor name in required_vars:\n    exists = name in globals()\n    print(f\"  {name:15s} -> {'OK' if exists else 'MISSING'}\")\n\nimport torch\nprint(\"\\nCUDA available:\", torch.cuda.is_available())\nif torch.cuda.is_available():\n    print(\"GPU:\", torch.cuda.get_device_name(0))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.107717Z","iopub.status.idle":"2026-09-07T13:58:38.108055Z","shell.execute_reply.started":"2026-09-07T13:58:38.107879Z","shell.execute_reply":"2026-09-07T13:58:38.107896Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom transformers import BlipProcessor, BlipForQuestionAnswering\n\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\nprint(\"Using device:\", device)\n\nprocessor = BlipProcessor.from_pretrained(\"Salesforce/blip-vqa-base\")\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n).to(device)\n\nmodel.eval()\n\nprint(\"BLIP-VQA base model loaded.\")\nprint(\"Model dtype:\", next(model.parameters()).dtype)\nprint(\"Model device:\", next(model.parameters()).device)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.10933Z","iopub.status.idle":"2026-09-07T13:58:38.109676Z","shell.execute_reply.started":"2026-09-07T13:58:38.109545Z","shell.execute_reply":"2026-09-07T13:58:38.109568Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import json\nimport random\n\nQA_PATH = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/2024EarthVQA/2024EarthVQA/Train_QA.json\"\n\nwith open(QA_PATH, \"r\") as f:\n    raw_data = json.load(f)\n\nprint(\"Number of image keys:\", len(raw_data))\n\nrecords = []\n\nfor image_name, qa_list in raw_data.items():\n    for qa in qa_list:\n        records.append({\n            \"image\": image_name,\n            \"question\": qa[\"Question\"],\n            \"answer\": qa[\"Answer\"],\n            \"type\": qa[\"Type\"]\n        })\n\nprint(\"Total QA records:\", len(records))\n\nrandom.seed(42)\nrandom.shuffle(records)\n\ntrain_records = records[:10000]\nval_records = records[10000:11000]\n\nprint(\"train_records:\", len(train_records))\nprint(\"val_records:  \", len(val_records))\nprint(\"\\nSample train record:\")\nprint(train_records[0])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.11076Z","iopub.status.idle":"2026-09-07T13:58:38.11113Z","shell.execute_reply.started":"2026-09-07T13:58:38.110945Z","shell.execute_reply":"2026-09-07T13:58:38.110972Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport torch\nfrom PIL import Image\nfrom torch.utils.data import Dataset, DataLoader\n\nIMAGE_DIR = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/Train-003/Train/images_png\"\nVAL_IMAGE_DIR = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans/Val-002/Val/images_png\"\n\nprint(\"Train image dir exists:\", os.path.exists(IMAGE_DIR))\nprint(\"Val image dir exists:  \", os.path.exists(VAL_IMAGE_DIR))\n\n# Sanity check: does the first train record's image actually exist on disk?\nsample_img_path = os.path.join(IMAGE_DIR, train_records[0][\"image\"])\nprint(\"Sample image exists:\", os.path.exists(sample_img_path), \"->\", sample_img_path)\n\n\nclass EarthVQADataset(Dataset):\n    def __init__(self, data, image_dir, processor, max_q_len=32, max_a_len=16):\n        self.data = data\n        self.image_dir = image_dir\n        self.processor = processor\n        self.max_q_len = max_q_len\n        self.max_a_len = max_a_len\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, idx):\n        item = self.data[idx]\n\n        image_path = os.path.join(self.image_dir, item[\"image\"])\n        image = Image.open(image_path).convert(\"RGB\")\n\n        question = str(item[\"question\"])\n        answer = str(item[\"answer\"])\n\n        inputs = self.processor(\n            images=image,\n            text=question,\n            padding=\"max_length\",\n            truncation=True,\n            max_length=self.max_q_len,\n            return_tensors=\"pt\"\n        )\n\n        answer_tokens = self.processor.tokenizer(\n            answer,\n            padding=\"max_length\",\n            truncation=True,\n            max_length=self.max_a_len,\n            return_tensors=\"pt\"\n        )\n\n        labels = answer_tokens.input_ids.squeeze(0)\n        labels[labels == self.processor.tokenizer.pad_token_id] = -100\n\n        return {\n            \"pixel_values\": inputs[\"pixel_values\"].squeeze(0),\n            \"input_ids\": inputs[\"input_ids\"].squeeze(0),\n            \"attention_mask\": inputs[\"attention_mask\"].squeeze(0),\n            \"labels\": labels\n        }\n\n\ntrain_dataset = EarthVQADataset(train_records, IMAGE_DIR, processor)\nval_dataset = EarthVQADataset(val_records, IMAGE_DIR, processor)\n\ntrain_loader = DataLoader(train_dataset, batch_size=4, shuffle=True, num_workers=2)\nval_loader = DataLoader(val_dataset, batch_size=4, shuffle=False, num_workers=2)\n\nprint(\"\\ntrain_dataset size:\", len(train_dataset))\nprint(\"val_dataset size:  \", len(val_dataset))\nprint(\"train_loader batches:\", len(train_loader))\nprint(\"val_loader batches:  \", len(val_loader))\n\nbatch = next(iter(train_loader))\nprint(\"\\nBatch shapes:\")\nfor key, value in batch.items():\n    print(f\"  {key}: {value.shape}\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.112362Z","iopub.status.idle":"2026-09-07T13:58:38.112887Z","shell.execute_reply.started":"2026-09-07T13:58:38.112758Z","shell.execute_reply":"2026-09-07T13:58:38.112776Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport re\nimport string\nimport torch\nfrom PIL import Image\nfrom collections import defaultdict\n\n\ndef normalize_text(s):\n    s = str(s).lower().strip()\n    s = re.sub(f\"[{re.escape(string.punctuation)}]\", \"\", s)\n    s = re.sub(r\"\\s+\", \" \", s)\n    return s.strip()\n\n\ndef classify_question_type(qa_type, question, answer):\n    a = str(answer).lower().strip()\n    t = str(qa_type).lower()\n\n    if a in {\"yes\", \"no\"}:\n        return \"yes_no\"\n    if \"rural\" in a or \"urban\" in a:\n        return \"rural_urban\"\n    if \"%\" in a or re.fullmatch(r\"[\\d.]+\", a):\n        return \"numeric_percentage\"\n    if len(a.split()) > 4 or \"reasoning\" in t or \"situation\" in t:\n        return \"descriptive_reasoning\"\n    return \"land_use_category\"\n\n\ndef generate_answer(model, processor, image, question, device,\n                     max_new_tokens=20, num_beams=5,\n                     repetition_penalty=1.5, no_repeat_ngram_size=3):\n    inputs = processor(images=image, text=str(question), return_tensors=\"pt\").to(device)\n    with torch.no_grad():\n        out = model.generate(\n            **inputs,\n            max_new_tokens=max_new_tokens,\n            num_beams=num_beams,\n            repetition_penalty=repetition_penalty,\n            no_repeat_ngram_size=no_repeat_ngram_size,\n            early_stopping=True,\n        )\n    return processor.decode(out[0], skip_special_tokens=True).strip()\n\n\ndef evaluate_model(model, processor, records_subset, image_dir, device,\n                    label=\"model\", max_samples=None, verbose_examples=5):\n    model.eval()\n    records_to_use = records_subset if max_samples is None else records_subset[:max_samples]\n\n    exact_correct = 0\n    normalized_correct = 0\n    total = 0\n\n    per_type_exact = defaultdict(int)\n    per_type_normalized = defaultdict(int)\n    per_type_total = defaultdict(int)\n\n    correct_examples = []\n    incorrect_examples = []\n\n    for item in records_to_use:\n        image_path = os.path.join(image_dir, item[\"image\"])\n        try:\n            image = Image.open(image_path).convert(\"RGB\")\n        except Exception:\n            continue\n\n        question = str(item[\"question\"])\n        expected = str(item[\"answer\"])\n        qtype = classify_question_type(item.get(\"type\", \"\"), question, expected)\n\n        predicted = generate_answer(model, processor, image, question, device)\n\n        exact = predicted.strip().lower() == expected.strip().lower()\n        norm_match = normalize_text(predicted) == normalize_text(expected)\n\n        total += 1\n        per_type_total[qtype] += 1\n        if exact:\n            exact_correct += 1\n            per_type_exact[qtype] += 1\n        if norm_match:\n            normalized_correct += 1\n            per_type_normalized[qtype] += 1\n\n        record = {\n            \"image\": item[\"image\"], \"question\": question,\n            \"expected\": expected, \"predicted\": predicted, \"type\": qtype\n        }\n        (correct_examples if norm_match else incorrect_examples).append(record)\n\n    results = {\n        \"label\": label,\n        \"total\": total,\n        \"exact_match_acc\": exact_correct / total if total else 0,\n        \"normalized_acc\": normalized_correct / total if total else 0,\n        \"per_type\": {\n            qt: {\n                \"count\": per_type_total[qt],\n                \"exact_match_acc\": per_type_exact[qt] / per_type_total[qt],\n                \"normalized_acc\": per_type_normalized[qt] / per_type_total[qt],\n            }\n            for qt in per_type_total\n        },\n        \"correct_examples\": correct_examples[:verbose_examples],\n        \"incorrect_examples\": incorrect_examples[:verbose_examples],\n    }\n\n    print(f\"\\n=== Evaluation: {label} ===\")\n    print(f\"Total questions: {total}\")\n    print(f\"Exact-match accuracy:  {results['exact_match_acc']*100:.2f}%\")\n    print(f\"Normalized accuracy:   {results['normalized_acc']*100:.2f}%\")\n    print(\"\\nPer-question-type breakdown:\")\n    for qt, stats in results[\"per_type\"].items():\n        print(f\"  {qt:22s} n={stats['count']:4d}  exact={stats['exact_match_acc']*100:5.1f}%  \"\n              f\"normalized={stats['normalized_acc']*100:5.1f}%\")\n\n    return results\n\n\nprint(\"Evaluation utilities re-defined.\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.114147Z","iopub.status.idle":"2026-09-07T13:58:38.114587Z","shell.execute_reply.started":"2026-09-07T13:58:38.11437Z","shell.execute_reply":"2026-09-07T13:58:38.114398Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nfrom glob import glob\n\nBASE_DIR = (\n    \"/kaggle/input/datasets/alienxc137/\"\n    \"earthvqa-semantic-segmentation-visual-question-ans\"\n)\n\nprint(\"Dataset contents:\")\nfor root, dirs, files in os.walk(BASE_DIR):\n    level = root.replace(BASE_DIR, \"\").count(os.sep)\n    indent = \" \" * (4 * level)\n    print(f\"{indent}{os.path.basename(root)}/\")\n\n    subindent = \" \" * (4 * (level + 1))\n    for file in files[:10]:\n        print(f\"{subindent}{file}\")\n\n    if level > 3:\n        dirs[:] = []","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.116155Z","iopub.status.idle":"2026-09-07T13:58:38.116584Z","shell.execute_reply.started":"2026-09-07T13:58:38.116361Z","shell.execute_reply":"2026-09-07T13:58:38.116395Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nfrom glob import glob\n\nBASE_DIR = (\n    \"/kaggle/input/datasets/alienxc137/\"\n    \"earthvqa-semantic-segmentation-visual-question-ans\"\n)\n\nall_png_files = glob(\n    os.path.join(BASE_DIR, \"**\", \"*.png\"),\n    recursive=True\n)\n\nprint(\"Total PNG files found:\", len(all_png_files))\n\nprint(\"\\nFirst 20 image paths:\")\nfor path in all_png_files[:20]:\n    print(path)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.117415Z","iopub.status.idle":"2026-09-07T13:58:38.117773Z","shell.execute_reply.started":"2026-09-07T13:58:38.117588Z","shell.execute_reply":"2026-09-07T13:58:38.117612Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nfrom glob import glob\nfrom collections import Counter\n\nBASE_DIR = (\n    \"/kaggle/input/datasets/alienxc137/\"\n    \"earthvqa-semantic-segmentation-visual-question-ans\"\n)\n\ndef find_image_directory(records, base_dir, required_matches=10):\n    \"\"\"\n    Searches recursively for the directory containing the largest\n    number of image names from the supplied records.\n    \"\"\"\n\n    requested_image_names = {\n        str(item[\"image\"])\n        for item in records\n    }\n\n    candidate_files = glob(\n        os.path.join(base_dir, \"**\", \"*.png\"),\n        recursive=True\n    )\n\n    directory_matches = Counter()\n\n    for file_path in candidate_files:\n        file_name = os.path.basename(file_path)\n\n        if file_name in requested_image_names:\n            directory = os.path.dirname(file_path)\n            directory_matches[directory] += 1\n\n    if not directory_matches:\n        raise FileNotFoundError(\n            \"No matching image directory was found. \"\n            \"Check the image names in val_records and the dataset path.\"\n        )\n\n    best_directory, match_count = directory_matches.most_common(1)[0]\n\n    print(\"Selected image directory:\")\n    print(best_directory)\n\n    print(\"\\nMatching images:\")\n    print(match_count)\n\n    if match_count < required_matches:\n        print(\n            \"\\nWarning: very few images matched. \"\n            \"The records may refer to a different dataset split.\"\n        )\n\n    return best_directory\n\n\nVAL_IMAGE_DIR = find_image_directory(\n    records=val_records,\n    base_dir=BASE_DIR\n)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.118653Z","iopub.status.idle":"2026-09-07T13:58:38.118948Z","shell.execute_reply.started":"2026-09-07T13:58:38.118823Z","shell.execute_reply":"2026-09-07T13:58:38.118846Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"First five validation records:\")\n\nfor item in val_records[:5]:\n    print(item)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.119886Z","iopub.status.idle":"2026-09-07T13:58:38.120267Z","shell.execute_reply.started":"2026-09-07T13:58:38.120148Z","shell.execute_reply":"2026-09-07T13:58:38.120164Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fine_tuned_results = evaluate_model(\n    model=model,\n    processor=processor,\n    records=val_records,\n    image_dir=VAL_IMAGE_DIR,\n    device=DEVICE,\n    label=\"blip_finetuned\",\n    max_samples=100,\n    verbose_examples=10\n)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.121684Z","iopub.status.idle":"2026-09-07T13:58:38.122045Z","shell.execute_reply.started":"2026-09-07T13:58:38.121858Z","shell.execute_reply":"2026-09-07T13:58:38.121881Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nfrom glob import glob\nfrom collections import Counter\n\nBASE_DIR = (\n    \"/kaggle/input/datasets/alienxc137/\"\n    \"earthvqa-semantic-segmentation-visual-question-ans\"\n)\n\nrequested_names = {\n    str(item[\"image\"])\n    for item in val_records\n}\n\nall_files = glob(\n    os.path.join(BASE_DIR, \"**\", \"*.png\"),\n    recursive=True\n)\n\ndirectory_stats = Counter()\n\nfor file_path in all_files:\n    file_name = os.path.basename(file_path)\n\n    if file_name in requested_names:\n        directory_stats[os.path.dirname(file_path)] += 1\n\nprint(\"Candidate directories:\")\nfor directory, count in directory_stats.most_common():\n    print(f\"{count:5d} matches  |  {directory}\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.123036Z","iopub.status.idle":"2026-09-07T13:58:38.123415Z","shell.execute_reply.started":"2026-09-07T13:58:38.123197Z","shell.execute_reply":"2026-09-07T13:58:38.123221Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"for root, dirs, files in os.walk(BASE_DIR):\n    png_count = sum(\n        1 for file_name in files\n        if file_name.lower().endswith(\".png\")\n    )\n\n    if png_count > 0:\n        print(f\"{png_count:6d} PNG files: {root}\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.125202Z","iopub.status.idle":"2026-09-07T13:58:38.125679Z","shell.execute_reply.started":"2026-09-07T13:58:38.125434Z","shell.execute_reply":"2026-09-07T13:58:38.125459Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"VAL_IMAGE_DIR = (\n    \"/kaggle/input/datasets/alienxc137/\"\n    \"earthvqa-semantic-segmentation-visual-question-ans/\"\n    \"Train-003/Train/images_png\"\n)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.126979Z","iopub.status.idle":"2026-09-07T13:58:38.12736Z","shell.execute_reply.started":"2026-09-07T13:58:38.127151Z","shell.execute_reply":"2026-09-07T13:58:38.127174Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from PIL import Image\nimport matplotlib.pyplot as plt\nimport os\n\ntest_image_name = val_records[0][\"image\"]\ntest_image_path = os.path.join(\n    VAL_IMAGE_DIR,\n    test_image_name\n)\n\nprint(\"Image path:\", test_image_path)\nprint(\"Exists:\", os.path.exists(test_image_path))\n\nif os.path.exists(test_image_path):\n    image = Image.open(test_image_path).convert(\"RGB\")\n\n    print(\"Image size:\", image.size)\n    print(\"Image mode:\", image.mode)\n\n    plt.figure(figsize=(6, 6))\n    plt.imshow(image)\n    plt.axis(\"off\")\n    plt.title(test_image_name)\n    plt.show()","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.129771Z","iopub.status.idle":"2026-09-07T13:58:38.130102Z","shell.execute_reply.started":"2026-09-07T13:58:38.129975Z","shell.execute_reply":"2026-09-07T13:58:38.129993Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def find_rgb_image_directory(records, base_dir):\n    \"\"\"\n    Finds an RGB image directory and excludes mask directories.\n    \"\"\"\n\n    requested_image_names = {\n        str(item[\"image\"])\n        for item in records\n    }\n\n    candidate_files = glob(\n        os.path.join(base_dir, \"**\", \"*.png\"),\n        recursive=True\n    )\n\n    directory_matches = Counter()\n\n    for file_path in candidate_files:\n        directory = os.path.dirname(file_path)\n        directory_lower = directory.lower()\n\n        # Exclude segmentation masks\n        if \"mask\" in directory_lower:\n            continue\n\n        file_name = os.path.basename(file_path)\n\n        if file_name in requested_image_names:\n            directory_matches[directory] += 1\n\n    if not directory_matches:\n        raise FileNotFoundError(\n            \"No RGB image directory matched the validation records.\"\n        )\n\n    best_directory, match_count = directory_matches.most_common(1)[0]\n\n    print(\"Selected RGB image directory:\")\n    print(best_directory)\n\n    print(\"Matching RGB images:\", match_count)\n\n    return best_directory","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.13095Z","iopub.status.idle":"2026-09-07T13:58:38.131236Z","shell.execute_reply.started":"2026-09-07T13:58:38.131108Z","shell.execute_reply":"2026-09-07T13:58:38.131123Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport json\nimport random\n\nBASE_DIR = (\n    \"/kaggle/input/datasets/alienxc137/\"\n    \"earthvqa-semantic-segmentation-visual-question-ans\"\n)\n\nVAL_JSON_PATH = os.path.join(\n    BASE_DIR,\n    \"2024EarthVQA\",\n    \"2024EarthVQA\",\n    \"Val_QA.json\"\n)\n\nVAL_IMAGE_DIR = os.path.join(\n    BASE_DIR,\n    \"Val-002\",\n    \"Val\",\n    \"images_png\"\n)\n\nprint(\"Validation JSON:\", VAL_JSON_PATH)\nprint(\"Validation image directory:\", VAL_IMAGE_DIR)\n\nwith open(VAL_JSON_PATH, \"r\", encoding=\"utf-8\") as file:\n    val_raw_data = json.load(file)\n\nval_records = []\n\nfor image_name, qa_list in val_raw_data.items():\n    for qa in qa_list:\n        val_records.append({\n            \"image\": image_name,\n            \"question\": qa[\"Question\"],\n            \"answer\": qa[\"Answer\"],\n            \"type\": qa[\"Type\"]\n        })\n\nprint(\"Total validation records:\", len(val_records))\nprint(\"First five validation records:\")\n\nfor item in val_records[:5]:\n    print(item)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.132716Z","iopub.status.idle":"2026-09-07T13:58:38.133032Z","shell.execute_reply.started":"2026-09-07T13:58:38.132863Z","shell.execute_reply":"2026-09-07T13:58:38.132885Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"missing_images = []\n\nfor item in val_records:\n    image_path = os.path.join(\n        VAL_IMAGE_DIR,\n        item[\"image\"]\n    )\n\n    if not os.path.exists(image_path):\n        missing_images.append(item[\"image\"])\n\nprint(\"Total validation records:\", len(val_records))\nprint(\"Missing image files:\", len(missing_images))\n\nif missing_images:\n    print(\"First missing images:\")\n    print(missing_images[:20])\nelse:\n    print(\"All validation images are available.\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.133885Z","iopub.status.idle":"2026-09-07T13:58:38.134192Z","shell.execute_reply.started":"2026-09-07T13:58:38.134035Z","shell.execute_reply":"2026-09-07T13:58:38.134051Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"fine_tuned_results = evaluate_model(\n    model=model,\n    processor=processor,\n    records=val_records,\n    image_dir=VAL_IMAGE_DIR,\n    device=DEVICE,\n    label=\"blip_finetuned_validation\",\n    max_samples=100,\n    verbose_examples=10\n)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.135837Z","iopub.status.idle":"2026-09-07T13:58:38.136179Z","shell.execute_reply.started":"2026-09-07T13:58:38.136004Z","shell.execute_reply":"2026-09-07T13:58:38.136027Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def classify_question_type(qa_type, question, answer):\n    \"\"\"\n    Classifies EarthVQA questions using the question, answer,\n    and original dataset type.\n    \"\"\"\n\n    answer_text = str(answer).lower().strip()\n    question_text = str(question).lower().strip()\n    type_text = str(qa_type).lower().strip()\n\n    # Yes/no answers\n    if answer_text in {\"yes\", \"no\"}:\n        return \"yes_no\"\n\n    # Explicit rural/urban classification questions\n    if (\n        (\"rural\" in question_text and \"urban\" in question_text)\n        or question_text.startswith(\"is it a rural\")\n        or answer_text in {\"rural\", \"urban\"}\n    ):\n        return \"rural_urban\"\n\n    # Percentage or numerical questions\n    if (\n        \"%\" in answer_text\n        or re.fullmatch(r\"\\d+(\\.\\d+)?\", answer_text)\n        or \"area\" in question_text\n        or \"percentage\" in question_text\n        or \"percent\" in question_text\n        or \"how many\" in question_text\n        or \"number of\" in question_text\n        or \"count\" in question_text\n    ):\n        return \"numeric_percentage\"\n\n    # Descriptive and reasoning questions\n    if (\n        len(answer_text.split()) > 4\n        or \"reasoning\" in type_text\n        or \"situation\" in type_text\n        or \"what are the needs\" in question_text\n        or \"what are the land use types\" in question_text\n        or \"what are the road materials\" in question_text\n        or \"what are the water situations\" in question_text\n        or \"describe\" in question_text\n        or \"explain\" in question_text\n        or \"why\" in question_text\n    ):\n        return \"descriptive_reasoning\"\n\n    return \"land_use_category\"","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.137262Z","iopub.status.idle":"2026-09-07T13:58:38.137614Z","shell.execute_reply.started":"2026-09-07T13:58:38.137439Z","shell.execute_reply":"2026-09-07T13:58:38.137464Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"balanced_results = evaluate_model(\n    model=model,\n    processor=processor,\n    records=balanced_val_records,\n    image_dir=VAL_IMAGE_DIR,\n    device=DEVICE,\n    label=\"blip_finetuned_balanced_validation\",\n    max_samples=None,\n    verbose_examples=10\n)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.138905Z","iopub.status.idle":"2026-09-07T13:58:38.139242Z","shell.execute_reply.started":"2026-09-07T13:58:38.139048Z","shell.execute_reply":"2026-09-07T13:58:38.139071Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"balanced_val_records = create_balanced_subset(\n    records=val_records,\n    samples_per_type=100,\n    seed=42\n)\n\nprint(\"Total balanced evaluation records:\", len(balanced_val_records))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.140448Z","iopub.status.idle":"2026-09-07T13:58:38.14079Z","shell.execute_reply.started":"2026-09-07T13:58:38.140595Z","shell.execute_reply":"2026-09-07T13:58:38.140625Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import BlipProcessor, BlipForQuestionAnswering\n\nBASE_MODEL_NAME = \"Salesforce/blip-vqa-base\"\n\nbase_processor = BlipProcessor.from_pretrained(\n    BASE_MODEL_NAME\n)\n\nbase_model = BlipForQuestionAnswering.from_pretrained(\n    BASE_MODEL_NAME\n).to(DEVICE)\n\nbase_model.eval()","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.141507Z","iopub.status.idle":"2026-09-07T13:58:38.142305Z","shell.execute_reply.started":"2026-09-07T13:58:38.142098Z","shell.execute_reply":"2026-09-07T13:58:38.142124Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"base_balanced_results = evaluate_model(\n    model=base_model,\n    processor=base_processor,\n    records=balanced_val_records,\n    image_dir=VAL_IMAGE_DIR,\n    device=DEVICE,\n    label=\"blip_base_balanced_validation\",\n    max_samples=None,\n    verbose_examples=10\n)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.143386Z","iopub.status.idle":"2026-09-07T13:58:38.143772Z","shell.execute_reply.started":"2026-09-07T13:58:38.143628Z","shell.execute_reply":"2026-09-07T13:58:38.143652Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"\\n\" + \"=\" * 70)\nprint(\"BASE MODEL VS FINE-TUNED MODEL\")\nprint(\"=\" * 70)\n\nbase_exact = (\n    base_balanced_results[\"exact_match_accuracy\"] * 100\n)\n\ntuned_exact = (\n    balanced_results[\"exact_match_accuracy\"] * 100\n)\n\nbase_normalized = (\n    base_balanced_results[\"normalized_accuracy\"] * 100\n)\n\ntuned_normalized = (\n    balanced_results[\"normalized_accuracy\"] * 100\n)\n\nprint(f\"Base exact-match accuracy      : {base_exact:.2f}%\")\nprint(f\"Fine-tuned exact-match accuracy: {tuned_exact:.2f}%\")\nprint(f\"Exact-match change             : {tuned_exact - base_exact:+.2f} points\")\n\nprint()\n\nprint(f\"Base normalized accuracy       : {base_normalized:.2f}%\")\nprint(f\"Fine-tuned normalized accuracy : {tuned_normalized:.2f}%\")\nprint(\n    f\"Normalized accuracy change     : \"\n    f\"{tuned_normalized - base_normalized:+.2f} points\"\n)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.145403Z","iopub.status.idle":"2026-09-07T13:58:38.145734Z","shell.execute_reply.started":"2026-09-07T13:58:38.145548Z","shell.execute_reply":"2026-09-07T13:58:38.145573Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport json\nimport random\nimport torch\n\nDEVICE = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\nBASE_DIR = (\n    \"/kaggle/input/datasets/alienxc137/\"\n    \"earthvqa-semantic-segmentation-visual-question-ans\"\n)\n\nTRAIN_JSON_PATH = os.path.join(\n    BASE_DIR,\n    \"2024EarthVQA\",\n    \"2024EarthVQA\",\n    \"Train_QA.json\"\n)\n\nTRAIN_IMAGE_DIR = os.path.join(\n    BASE_DIR,\n    \"Train-003\",\n    \"Train\",\n    \"images_png\"\n)\n\nwith open(TRAIN_JSON_PATH, \"r\", encoding=\"utf-8\") as f:\n    train_raw_data = json.load(f)\n\ntrain_records = []\n\nfor image_name, qa_list in train_raw_data.items():\n    for qa in qa_list:\n        image_path = os.path.join(TRAIN_IMAGE_DIR, image_name)\n\n        if os.path.exists(image_path):\n            train_records.append({\n                \"image\": image_name,\n                \"question\": qa[\"Question\"],\n                \"answer\": qa[\"Answer\"],\n                \"type\": qa[\"Type\"]\n            })\n\nprint(\"Training records:\", len(train_records))\nprint(\"Training images:\", len(set(x[\"image\"] for x in train_records)))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.147145Z","iopub.status.idle":"2026-09-07T13:58:38.147512Z","shell.execute_reply.started":"2026-09-07T13:58:38.14733Z","shell.execute_reply":"2026-09-07T13:58:38.147355Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"random.seed(42)\nrandom.shuffle(train_records)\n\nprint(train_records[0])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.148919Z","iopub.status.idle":"2026-09-07T13:58:38.149253Z","shell.execute_reply.started":"2026-09-07T13:58:38.14908Z","shell.execute_reply":"2026-09-07T13:58:38.149102Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"TRAIN_LIMIT = 10000\n\ntraining_subset = train_records[:TRAIN_LIMIT]\n\nprint(\"Records used for training:\", len(training_subset))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.150645Z","iopub.status.idle":"2026-09-07T13:58:38.150987Z","shell.execute_reply.started":"2026-09-07T13:58:38.150812Z","shell.execute_reply":"2026-09-07T13:58:38.150834Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import BlipProcessor, BlipForQuestionAnswering\n\nMODEL_NAME = \"Salesforce/blip-vqa-base\"\n\nprocessor = BlipProcessor.from_pretrained(MODEL_NAME)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    MODEL_NAME\n).to(DEVICE)\n\nprint(\"Model loaded on:\", DEVICE)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.151909Z","iopub.status.idle":"2026-09-07T13:58:38.152538Z","shell.execute_reply.started":"2026-09-07T13:58:38.152386Z","shell.execute_reply":"2026-09-07T13:58:38.152411Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n\n\nfrom PIL import Image\nfrom torch.utils.data import Dataset, DataLoader\n\nclass EarthVQADataset(Dataset):\n    def __init__(self, records, image_dir, processor):\n        self.records = records\n        self.image_dir = image_dir\n        self.processor = processor\n\n    def __len__(self):\n        return len(self.records)\n\n    def __getitem__(self, index):\n        item = self.records[index]\n\n        image_path = os.path.join(\n            self.image_dir,\n            item[\"image\"]\n        )\n\n        image = Image.open(image_path).convert(\"RGB\")\n\n        encoding = self.processor(\n            images=image,\n            text=item[\"question\"],\n            return_tensors=\"pt\",\n            padding=\"max_length\",\n            truncation=True,\n            max_length=32\n        )\n\n        labels = self.processor.tokenizer(\n            item[\"answer\"],\n            return_tensors=\"pt\",\n            padding=\"max_length\",\n            truncation=True,\n            max_length=32\n        ).input_ids\n\n        labels[labels == self.processor.tokenizer.pad_token_id] = -100\n\n        return {\n            \"pixel_values\": encoding[\"pixel_values\"].squeeze(0),\n            \"input_ids\": encoding[\"input_ids\"].squeeze(0),\n            \"attention_mask\": encoding[\"attention_mask\"].squeeze(0),\n            \"labels\": labels.squeeze(0)\n        }\n\ntrain_dataset = EarthVQADataset(\n    training_subset,\n    TRAIN_IMAGE_DIR,\n    processor\n)\n\ntrain_loader = DataLoader(\n    train_dataset,\n    batch_size=8,\n    shuffle=True,\n    num_workers=2,\n    pin_memory=True\n)\n\nprint(\"Training batches:\", len(train_loader))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.153903Z","iopub.status.idle":"2026-09-07T13:58:38.154274Z","shell.execute_reply.started":"2026-09-07T13:58:38.154073Z","shell.execute_reply":"2026-09-07T13:58:38.154098Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Freeze the complete model first\nfor param in model.parameters():\n    param.requires_grad = False\n\n# Unfreeze the text decoder\nfor param in model.text_decoder.parameters():\n    param.requires_grad = True\n\n# Unfreeze the output classification layer\nfor param in model.text_decoder.cls.parameters():\n    param.requires_grad = True\n\n# Collect trainable parameters\ntrainable_parameters = [\n    param\n    for param in model.parameters()\n    if param.requires_grad\n]\n\nprint(\n    \"Trainable parameters:\",\n    sum(param.numel() for param in trainable_parameters)\n)\n\nprint(\n    \"Total parameters:\",\n    sum(param.numel() for param in model.parameters())\n)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.155743Z","iopub.status.idle":"2026-09-07T13:58:38.15601Z","shell.execute_reply.started":"2026-09-07T13:58:38.155894Z","shell.execute_reply":"2026-09-07T13:58:38.15591Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport torch\nfrom PIL import Image\nfrom torch.utils.data import Dataset, DataLoader","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.162213Z","iopub.status.idle":"2026-09-07T13:58:38.162702Z","shell.execute_reply.started":"2026-09-07T13:58:38.162566Z","shell.execute_reply":"2026-09-07T13:58:38.162583Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torch.utils.data import Dataset, DataLoader","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.163639Z","iopub.status.idle":"2026-09-07T13:58:38.163975Z","shell.execute_reply.started":"2026-09-07T13:58:38.163852Z","shell.execute_reply":"2026-09-07T13:58:38.163869Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(Dataset)\nprint(DataLoader)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.165047Z","iopub.status.idle":"2026-09-07T13:58:38.165394Z","shell.execute_reply.started":"2026-09-07T13:58:38.165218Z","shell.execute_reply":"2026-09-07T13:58:38.165241Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import json\nimport random\n\nwith open(TRAIN_QA_JSON, \"r\", encoding=\"utf-8\") as f:\n    train_data = json.load(f)\n\nprint(\"Loaded type:\", type(train_data))\n\n# Convert the dictionary to a list of QA records\nif isinstance(train_data, dict):\n    if \"data\" in train_data:\n        train_records = train_data[\"data\"]\n    elif \"questions\" in train_data:\n        train_records = train_data[\"questions\"]\n    elif \"annotations\" in train_data:\n        train_records = train_data[\"annotations\"]\n    else:\n        # If each dictionary value is a record or list of records\n        train_records = list(train_data.values())\nelse:\n    train_records = train_data\n\n# Flatten nested lists, if necessary\nif len(train_records) > 0 and isinstance(train_records[0], list):\n    train_records = [\n        record\n        for group in train_records\n        for record in group\n    ]\n\nprint(\"Total training records:\", len(train_records))\n\nrandom.seed(42)\n\ntrain_records_used = random.sample(\n    train_records,\n    min(10000, len(train_records))\n)\n\nprint(\"Records used for training:\", len(train_records_used))\nprint(\"Example record:\", train_records_used[0])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.166827Z","iopub.status.idle":"2026-09-07T13:58:38.167048Z","shell.execute_reply.started":"2026-09-07T13:58:38.166942Z","shell.execute_reply":"2026-09-07T13:58:38.166955Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(type(train_data))\n\nif isinstance(train_data, dict):\n    print(\"Keys:\", train_data.keys())\n\nprint(\"First item:\")\nprint(train_records[0])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.167695Z","iopub.status.idle":"2026-09-07T13:58:38.168004Z","shell.execute_reply.started":"2026-09-07T13:58:38.167887Z","shell.execute_reply":"2026-09-07T13:58:38.167903Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"flattened_records = []\n\nfor image_item in train_records:\n    if \"questions\" in image_item:\n        for qa in image_item[\"questions\"]:\n            flattened_records.append({\n                \"image\": image_item[\"image\"],\n                \"question\": qa[\"question\"],\n                \"answer\": qa[\"answer\"],\n                \"type\": qa.get(\"type\", \"\")\n            })\n    else:\n        flattened_records.append(image_item)\n\ntrain_records = flattened_records\n\nprint(\"Total QA records:\", len(train_records))\n\nrandom.seed(42)\n\ntrain_records_used = random.sample(\n    train_records,\n    min(10000, len(train_records))\n)\n\nprint(\"Records used:\", len(train_records_used))\nprint(train_records_used[0])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.169529Z","iopub.status.idle":"2026-09-07T13:58:38.170017Z","shell.execute_reply.started":"2026-09-07T13:58:38.169882Z","shell.execute_reply":"2026-09-07T13:58:38.169901Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Convert the dictionary into flat records\nflat_records = []\n\nfor image_name, qa_list in train_data.items():\n    for qa in qa_list:\n        flat_records.append({\n            \"image\": image_name,\n            \"question\": qa[\"Question\"],\n            \"answer\": qa[\"Answer\"],\n            \"type\": qa.get(\"Type\", \"\")\n        })\n\ntrain_records = flat_records\n\nprint(\"Total QA records:\", len(train_records))\nprint(\"Example:\", train_records[0])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.170858Z","iopub.status.idle":"2026-09-07T13:58:38.171075Z","shell.execute_reply.started":"2026-09-07T13:58:38.170969Z","shell.execute_reply":"2026-09-07T13:58:38.170983Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import random\n\nrandom.seed(42)\n\ntrain_records_used = random.sample(\n    train_records,\n    min(10000, len(train_records))\n)\n\nprint(\"Records used for training:\", len(train_records_used))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.17204Z","iopub.status.idle":"2026-09-07T13:58:38.172258Z","shell.execute_reply.started":"2026-09-07T13:58:38.172153Z","shell.execute_reply":"2026-09-07T13:58:38.172167Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport torch\n\nfrom PIL import Image\nfrom torch.utils.data import Dataset, DataLoader","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.17353Z","iopub.status.idle":"2026-09-07T13:58:38.173877Z","shell.execute_reply.started":"2026-09-07T13:58:38.173704Z","shell.execute_reply":"2026-09-07T13:58:38.173727Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class EarthVQADataset(Dataset):\n    def __init__(self, records, image_dir, processor):\n        self.records = records\n        self.image_dir = image_dir\n        self.processor = processor\n\n    def __len__(self):\n        return len(self.records)\n\n    def __getitem__(self, idx):\n        item = self.records[idx]\n\n        image_path = os.path.join(\n            self.image_dir,\n            str(item[\"image\"])\n        )\n\n        if not os.path.exists(image_path):\n            raise FileNotFoundError(\n                f\"Image not found: {image_path}\"\n            )\n\n        image = Image.open(image_path).convert(\"RGB\")\n\n        # Process image and question\n        encoding = self.processor(\n            images=image,\n            text=str(item[\"question\"]),\n            return_tensors=\"pt\",\n            padding=\"max_length\",\n            truncation=True,\n            max_length=16\n        )\n\n        # Process answer as training labels\n        labels = self.processor.tokenizer(\n            str(item[\"answer\"]),\n            return_tensors=\"pt\",\n            padding=\"max_length\",\n            truncation=True,\n            max_length=16\n        ).input_ids\n\n        # Ignore padding tokens in the loss calculation\n        labels[\n            labels == self.processor.tokenizer.pad_token_id\n        ] = -100\n\n        return {\n            \"pixel_values\": encoding[\"pixel_values\"].squeeze(0),\n            \"input_ids\": encoding[\"input_ids\"].squeeze(0),\n            \"attention_mask\": encoding[\"attention_mask\"].squeeze(0),\n            \"labels\": labels.squeeze(0)\n        }","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.175342Z","iopub.status.idle":"2026-09-07T13:58:38.175713Z","shell.execute_reply.started":"2026-09-07T13:58:38.175511Z","shell.execute_reply":"2026-09-07T13:58:38.175534Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import BlipProcessor, BlipForQuestionAnswering\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nprint(\"Processor loaded successfully\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.177204Z","iopub.status.idle":"2026-09-07T13:58:38.177578Z","shell.execute_reply.started":"2026-09-07T13:58:38.177398Z","shell.execute_reply":"2026-09-07T13:58:38.177421Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dataset = EarthVQADataset(\n    records=train_records_used,\n    image_dir=TRAIN_IMAGE_DIR,\n    processor=processor\n)\n\nprint(\"Dataset size:\", len(train_dataset))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.180043Z","iopub.status.idle":"2026-09-07T13:58:38.180268Z","shell.execute_reply.started":"2026-09-07T13:58:38.180157Z","shell.execute_reply":"2026-09-07T13:58:38.180171Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"sample = train_dataset[0]\n\nfor key, value in sample.items():\n    print(key, value.shape, value.dtype)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.181866Z","iopub.status.idle":"2026-09-07T13:58:38.182481Z","shell.execute_reply.started":"2026-09-07T13:58:38.182331Z","shell.execute_reply":"2026-09-07T13:58:38.182357Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_loader = DataLoader(\n    train_dataset,\n    batch_size=1,\n    shuffle=True,\n    num_workers=0,\n    pin_memory=False\n)\n\nbatch = next(iter(train_loader))\n\nfor key, value in batch.items():\n    print(key, value.shape, value.dtype)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.184971Z","iopub.status.idle":"2026-09-07T13:58:38.185327Z","shell.execute_reply.started":"2026-09-07T13:58:38.185135Z","shell.execute_reply":"2026-09-07T13:58:38.185158Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Load the model if it has not already been loaded\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n).to(DEVICE)\n\nmodel.config.use_cache = False\nmodel.train()\n\n# Move the batch to the selected device\nbatch = {\n    key: value.to(DEVICE)\n    for key, value in batch.items()\n}\n\n# Test forward pass\noutputs = model(**batch)\n\nprint(\"Forward pass successful\")\nprint(\"Loss:\", outputs.loss.item())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.186196Z","iopub.status.idle":"2026-09-07T13:58:38.186569Z","shell.execute_reply.started":"2026-09-07T13:58:38.186383Z","shell.execute_reply":"2026-09-07T13:58:38.186414Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\n\nDEVICE = torch.device(\n    \"cuda\" if torch.cuda.is_available() else \"cpu\"\n)\n\nprint(\"Using device:\", DEVICE)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.187865Z","iopub.status.idle":"2026-09-07T13:58:38.188187Z","shell.execute_reply.started":"2026-09-07T13:58:38.188044Z","shell.execute_reply":"2026-09-07T13:58:38.188067Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import BlipForQuestionAnswering\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n).to(DEVICE)\n\nmodel.config.use_cache = False\nmodel.config.tie_word_embeddings = False\n\nprint(\"Model loaded successfully\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.190012Z","iopub.status.idle":"2026-09-07T13:58:38.190282Z","shell.execute_reply.started":"2026-09-07T13:58:38.190141Z","shell.execute_reply":"2026-09-07T13:58:38.190155Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nos.environ[\"CUDA_LAUNCH_BLOCKING\"] = \"1\"\nos.environ[\"PYTORCH_CUDA_ALLOC_CONF\"] = \"expandable_segments:True\"","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.191561Z","iopub.status.idle":"2026-09-07T13:58:38.192348Z","shell.execute_reply.started":"2026-09-07T13:58:38.192129Z","shell.execute_reply":"2026-09-07T13:58:38.192156Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\n\nDEVICE = torch.device(\n    \"cuda\" if torch.cuda.is_available() else \"cpu\"\n)\n\nprint(\"Device:\", DEVICE)\nprint(\"CUDA available:\", torch.cuda.is_available())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.193212Z","iopub.status.idle":"2026-09-07T13:58:38.193843Z","shell.execute_reply.started":"2026-09-07T13:58:38.193709Z","shell.execute_reply":"2026-09-07T13:58:38.193728Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nos.environ[\"CUDA_LAUNCH_BLOCKING\"] = \"1\"\nos.environ[\"PYTORCH_CUDA_ALLOC_CONF\"] = \"expandable_segments:True\"\n\nimport torch\n\nprint(\"PyTorch version:\", torch.__version__)\nprint(\"CUDA available:\", torch.cuda.is_available())\n\nif torch.cuda.is_available():\n    print(\"GPU:\", torch.cuda.get_device_name(0))\n    torch.cuda.empty_cache()\n\nDEVICE = torch.device(\n    \"cuda\" if torch.cuda.is_available() else \"cpu\"\n)\n\nprint(\"Using:\", DEVICE)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.194803Z","iopub.status.idle":"2026-09-07T13:58:38.1951Z","shell.execute_reply.started":"2026-09-07T13:58:38.194916Z","shell.execute_reply":"2026-09-07T13:58:38.19493Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import BlipForQuestionAnswering\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel.config.use_cache = False\nmodel.config.tie_word_embeddings = False\n\nprint(\"Model loaded on CPU\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.196572Z","iopub.status.idle":"2026-09-07T13:58:38.196916Z","shell.execute_reply.started":"2026-09-07T13:58:38.19674Z","shell.execute_reply":"2026-09-07T13:58:38.196764Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\n\nfrom transformers import BlipForQuestionAnswering\n\nDEVICE = torch.device(\"cpu\")\n\nprint(\"Using device:\", DEVICE)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.198479Z","iopub.status.idle":"2026-09-07T13:58:38.198843Z","shell.execute_reply.started":"2026-09-07T13:58:38.198657Z","shell.execute_reply":"2026-09-07T13:58:38.19869Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nfrom huggingface_hub import scan_cache_dir\n\ncache_info = scan_cache_dir()\n\nfor repo in cache_info.repos:\n    if \"Salesforce/blip-vqa-base\" in str(repo.repo_id):\n        print(repo)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.199889Z","iopub.status.idle":"2026-09-07T13:58:38.200239Z","shell.execute_reply.started":"2026-09-07T13:58:38.200058Z","shell.execute_reply":"2026-09-07T13:58:38.200081Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom transformers import BlipForQuestionAnswering\n\nDEVICE = torch.device(\"cpu\")\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\",\n    local_files_only=True\n)\n\nmodel.config.use_cache = False\nmodel.config.tie_word_embeddings = False\n\nprint(\"Cached model loaded successfully\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.201226Z","iopub.status.idle":"2026-09-07T13:58:38.201586Z","shell.execute_reply.started":"2026-09-07T13:58:38.201417Z","shell.execute_reply":"2026-09-07T13:58:38.201441Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom transformers import BlipForQuestionAnswering\n\nDEVICE = torch.device(\"cpu\")\n\nMODEL_PATH = (\n    \"/root/.cache/huggingface/hub/models--Salesforce--blip-vqa-base/\"\n    \"snapshots/787b3d35d57e49572baabd22884b3d5a05acf072\"\n)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    MODEL_PATH,\n    local_files_only=True\n)\n\nmodel.config.use_cache = False\nmodel.config.tie_word_embeddings = False\n\nmodel = model.to(DEVICE)\n\nprint(\"Model loaded locally\")\nprint(\"Device:\", next(model.parameters()).device)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.202672Z","iopub.status.idle":"2026-09-07T13:58:38.203033Z","shell.execute_reply.started":"2026-09-07T13:58:38.202856Z","shell.execute_reply":"2026-09-07T13:58:38.202879Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport torch\n\nfrom PIL import Image\nfrom torch.utils.data import Dataset, DataLoader\n\n\nclass EarthVQADataset(Dataset):\n    def __init__(self, records, image_dir, processor):\n        self.records = records\n        self.image_dir = image_dir\n        self.processor = processor\n\n    def __len__(self):\n        return len(self.records)\n\n    def __getitem__(self, idx):\n        item = self.records[idx]\n\n        image_path = os.path.join(\n            self.image_dir,\n            str(item[\"image\"])\n        )\n\n        if not os.path.isfile(image_path):\n            raise FileNotFoundError(\n                f\"Image not found: {image_path}\"\n            )\n\n        image = Image.open(image_path).convert(\"RGB\")\n\n        encoding = self.processor(\n            images=image,\n            text=str(item[\"question\"]),\n            return_tensors=\"pt\",\n            padding=\"max_length\",\n            truncation=True,\n            max_length=16\n        )\n\n        labels = self.processor.tokenizer(\n            str(item[\"answer\"]),\n            return_tensors=\"pt\",\n            padding=\"max_length\",\n            truncation=True,\n            max_length=16\n        ).input_ids\n\n        labels[\n            labels == self.processor.tokenizer.pad_token_id\n        ] = -100\n\n        return {\n            \"pixel_values\": encoding[\"pixel_values\"].squeeze(0),\n            \"input_ids\": encoding[\"input_ids\"].squeeze(0),\n            \"attention_mask\": encoding[\"attention_mask\"].squeeze(0),\n            \"labels\": labels.squeeze(0)\n        }","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.204603Z","iopub.status.idle":"2026-09-07T13:58:38.204952Z","shell.execute_reply.started":"2026-09-07T13:58:38.204778Z","shell.execute_reply":"2026-09-07T13:58:38.204801Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport json\n\nBASE_DIR = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans\"\n\nTRAIN_QA_JSON = (\n    BASE_DIR +\n    \"/2024EarthVQA/2024EarthVQA/Train_QA.json\"\n)\n\nTRAIN_IMAGE_DIR = (\n    BASE_DIR +\n    \"/Train-003/Train/images_png\"\n)\n\nwith open(TRAIN_QA_JSON, \"r\", encoding=\"utf-8\") as f:\n    train_data = json.load(f)\n\nprint(\"Loaded type:\", type(train_data))\nprint(\"Total images:\", len(train_data))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.205767Z","iopub.status.idle":"2026-09-07T13:58:38.205987Z","shell.execute_reply.started":"2026-09-07T13:58:38.205883Z","shell.execute_reply":"2026-09-07T13:58:38.205897Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import random\n\nflat_records = []\n\nfor image_name, qa_list in train_data.items():\n    for qa in qa_list:\n        flat_records.append({\n            \"image\": image_name,\n            \"question\": qa[\"Question\"],\n            \"answer\": qa[\"Answer\"],\n            \"type\": qa.get(\"Type\", \"\")\n        })\n\ntrain_records = flat_records\n\nrandom.seed(42)\n\ntrain_records_used = random.sample(\n    train_records,\n    min(10000, len(train_records))\n)\n\nprint(\"Total QA records:\", len(train_records))\nprint(\"Records used:\", len(train_records_used))\nprint(\"Example:\", train_records_used[0])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.206568Z","iopub.status.idle":"2026-09-07T13:58:38.206788Z","shell.execute_reply.started":"2026-09-07T13:58:38.206683Z","shell.execute_reply":"2026-09-07T13:58:38.206697Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import BlipProcessor\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\",\n    use_fast=False\n)\n\nprint(\"Processor loaded successfully\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.207865Z","iopub.status.idle":"2026-09-07T13:58:38.208089Z","shell.execute_reply.started":"2026-09-07T13:58:38.207981Z","shell.execute_reply":"2026-09-07T13:58:38.207996Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_dataset = EarthVQADataset(\n    records=train_records_used,\n    image_dir=TRAIN_IMAGE_DIR,\n    processor=processor\n)\n\nprint(\"Dataset size:\", len(train_dataset))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.208975Z","iopub.status.idle":"2026-09-07T13:58:38.209288Z","shell.execute_reply.started":"2026-09-07T13:58:38.209154Z","shell.execute_reply":"2026-09-07T13:58:38.209182Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torch.utils.data import DataLoader\n\ntrain_loader = DataLoader(\n    train_dataset,\n    batch_size=1,\n    shuffle=True,\n    num_workers=0,\n    pin_memory=False\n)\n\nprint(\"DataLoader created\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.210203Z","iopub.status.idle":"2026-09-07T13:58:38.210496Z","shell.execute_reply.started":"2026-09-07T13:58:38.210378Z","shell.execute_reply":"2026-09-07T13:58:38.210394Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"batch = next(iter(train_loader))\n\nfor key, value in batch.items():\n    print(key, value.shape, value.dtype)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.21107Z","iopub.status.idle":"2026-09-07T13:58:38.211376Z","shell.execute_reply.started":"2026-09-07T13:58:38.211215Z","shell.execute_reply":"2026-09-07T13:58:38.211231Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"Processor vocabulary size:\", len(processor.tokenizer))\nprint(\"Model vocabulary size:\", model.config.text_config.vocab_size)\n\nprint(\"Maximum input token ID:\", batch[\"input_ids\"].max().item())\nprint(\"Maximum label token ID:\", batch[\"labels\"][batch[\"labels\"] != -100].max().item())","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.212784Z","iopub.status.idle":"2026-09-07T13:58:38.213142Z","shell.execute_reply.started":"2026-09-07T13:58:38.212937Z","shell.execute_reply":"2026-09-07T13:58:38.212963Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!git clone https://github.com/vishnumanivannan53-max/Vigyaan.git","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.214291Z","iopub.status.idle":"2026-09-07T13:58:38.214667Z","shell.execute_reply.started":"2026-09-07T13:58:38.214519Z","shell.execute_reply":"2026-09-07T13:58:38.214544Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!ls /kaggle/working/Vigyaan","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-07T13:58:38.215636Z","iopub.status.idle":"2026-09-07T13:58:38.215881Z","shell.execute_reply.started":"2026-09-07T13:58:38.215758Z","shell.execute_reply":"2026-09-07T13:58:38.215772Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!git status","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-07T13:58:38.217447Z","iopub.status.idle":"2026-09-07T13:58:38.218053Z","shell.execute_reply.started":"2026-09-07T13:58:38.217876Z","shell.execute_reply":"2026-09-07T13:58:38.217894Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport json\n\n# Dataset paths\nBASE_DIR = \"/kaggle/input/datasets/alienxc137/earthvqa-semantic-segmentation-visual-question-ans\"\n\nTRAIN_QA_JSON = os.path.join(\n    BASE_DIR,\n    \"2024EarthVQA\",\n    \"2024EarthVQA\",\n    \"Train_QA.json\"\n)\n\nTRAIN_IMAGE_DIR = os.path.join(\n    BASE_DIR,\n    \"Train-003\",\n    \"Train\",\n    \"images_png\"\n)\n\nprint(\"JSON exists:\", os.path.isfile(TRAIN_QA_JSON))\nprint(\"Image directory exists:\", os.path.isdir(TRAIN_IMAGE_DIR))\n\nprint(\"JSON path:\", TRAIN_QA_JSON)\nprint(\"Image directory:\", TRAIN_IMAGE_DIR)","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.219233Z","iopub.status.idle":"2026-09-07T13:58:38.219545Z","shell.execute_reply.started":"2026-09-07T13:58:38.219418Z","shell.execute_reply":"2026-09-07T13:58:38.219442Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import json\nimport random\nimport os\n\n# Load the database\nwith open(TRAIN_QA_JSON, \"r\", encoding=\"utf-8\") as f:\n    train_data = json.load(f)\n\nprint(\"JSON loaded successfully.\")\nprint(\"Number of image entries:\", len(train_data))\n\n# Convert JSON into a flat list of records\nrecords = []\n\nfor image_name, qa_list in train_data.items():\n    for qa in qa_list:\n        records.append({\n            \"image\": image_name,\n            \"question\": qa[\"Question\"],\n            \"answer\": qa[\"Answer\"],\n            \"type\": qa.get(\"Type\", \"\")\n        })\n\nprint(\"Total question-answer records:\", len(records))\n\n# Check the first record\nprint(\"\\nFirst record:\")\nprint(records[0])\n\n# Check whether its image exists\nfirst_image_path = os.path.join(\n    TRAIN_IMAGE_DIR,\n    records[0][\"image\"]\n)\n\nprint(\"\\nFirst image path:\", first_image_path)\nprint(\"First image exists:\", os.path.isfile(first_image_path))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.450359Z","iopub.status.idle":"2026-09-07T13:58:38.450656Z","shell.execute_reply.started":"2026-09-07T13:58:38.450526Z","shell.execute_reply":"2026-09-07T13:58:38.450542Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport torch\nfrom PIL import Image\nfrom torch.utils.data import Dataset, DataLoader\n\nclass EarthVQADataset(Dataset):\n\n    def __init__(self, records, image_dir, processor):\n        self.records = records\n        self.image_dir = image_dir\n        self.processor = processor\n\n    def __len__(self):\n        return len(self.records)\n\n    def __getitem__(self, idx):\n\n        item = self.records[idx]\n\n        image_path = os.path.join(\n            self.image_dir,\n            str(item[\"image\"])\n        )\n\n        if not os.path.isfile(image_path):\n            raise FileNotFoundError(\n                f\"Image not found: {image_path}\"\n            )\n\n        image = Image.open(image_path).convert(\"RGB\")\n\n        # Process image and question\n        encoding = self.processor(\n            images=image,\n            text=str(item[\"question\"]),\n            return_tensors=\"pt\",\n            padding=\"max_length\",\n            truncation=True,\n            max_length=16\n        )\n\n        # Process answer as training label\n        labels = self.processor.tokenizer(\n            str(item[\"answer\"]),\n            return_tensors=\"pt\",\n            padding=\"max_length\",\n            truncation=True,\n            max_length=16\n        ).input_ids\n\n        # Ignore padding tokens during loss calculation\n        labels[\n            labels == self.processor.tokenizer.pad_token_id\n        ] = -100\n\n        return {\n            \"pixel_values\": encoding[\"pixel_values\"].squeeze(0),\n            \"input_ids\": encoding[\"input_ids\"].squeeze(0),\n            \"attention_mask\": encoding[\"attention_mask\"].squeeze(0),\n            \"labels\": labels.squeeze(0)\n        }\n\nprint(\"EarthVQADataset class defined successfully.\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.452144Z","iopub.status.idle":"2026-09-07T13:58:38.452412Z","shell.execute_reply.started":"2026-09-07T13:58:38.452283Z","shell.execute_reply":"2026-09-07T13:58:38.452298Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from transformers import BlipProcessor\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\",\n    use_fast=False\n)\n\nprint(\"Processor initialized successfully.\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.454159Z","iopub.status.idle":"2026-09-07T13:58:38.454553Z","shell.execute_reply.started":"2026-09-07T13:58:38.454342Z","shell.execute_reply":"2026-09-07T13:58:38.454376Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_dataset = EarthVQADataset(\n    records=test_records,\n    image_dir=TRAIN_IMAGE_DIR,\n    processor=processor\n)\n\nprint(\"Dataset length:\", len(test_dataset))\n\nsample = test_dataset[0]\n\nfor key, value in sample.items():\n    print(\n        key,\n        \"shape =\", tuple(value.shape),\n        \"dtype =\", value.dtype\n    )","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.455517Z","iopub.status.idle":"2026-09-07T13:58:38.455762Z","shell.execute_reply.started":"2026-09-07T13:58:38.455646Z","shell.execute_reply":"2026-09-07T13:58:38.455661Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom transformers import BlipProcessor, BlipForQuestionAnswering\n\nDEVICE = torch.device(\"cpu\")\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\",\n    use_fast=False\n)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel.config.use_cache = False\nmodel.config.tie_word_embeddings = False\n\nmodel = model.to(DEVICE)\nmodel.eval()\n\nprint(\"BLIP model loaded successfully.\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.456528Z","iopub.status.idle":"2026-09-07T13:58:38.456762Z","shell.execute_reply.started":"2026-09-07T13:58:38.45665Z","shell.execute_reply":"2026-09-07T13:58:38.456664Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\n\nprint(os.path.exists(\n    \"/root/.cache/huggingface/hub/models--Salesforce--blip-vqa-base/\"\n    \"snapshots/787b3d35d57e49572baabd22884b3d5a05acf072/model.safetensors\"\n))","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.457619Z","iopub.status.idle":"2026-09-07T13:58:38.458368Z","shell.execute_reply.started":"2026-09-07T13:58:38.458149Z","shell.execute_reply":"2026-09-07T13:58:38.458186Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom transformers import BlipProcessor, BlipForQuestionAnswering\n\nDEVICE = torch.device(\"cpu\")\n\nprocessor = BlipProcessor.from_pretrained(\n    \"Salesforce/blip-vqa-base\",\n    use_fast=False\n)\n\nmodel = BlipForQuestionAnswering.from_pretrained(\n    \"Salesforce/blip-vqa-base\"\n)\n\nmodel.config.use_cache = False\nmodel.config.tie_word_embeddings = False\n\nmodel = model.to(DEVICE)\nmodel.eval()\n\nprint(\"Processor and model loaded successfully.\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.459961Z","iopub.status.idle":"2026-09-07T13:58:38.460302Z","shell.execute_reply.started":"2026-09-07T13:58:38.460127Z","shell.execute_reply":"2026-09-07T13:58:38.46015Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport torch\nfrom PIL import Image\nfrom IPython.display import display\n\ndef ask_question(image_path, question):\n    image = Image.open(image_path).convert(\"RGB\")\n\n    inputs = processor(\n        images=image,\n        text=question,\n        return_tensors=\"pt\"\n    )\n\n    inputs = {\n        key: value.to(DEVICE)\n        for key, value in inputs.items()\n    }\n\n    with torch.no_grad():\n        output_ids = model.generate(\n            **inputs,\n            max_new_tokens=20\n        )\n\n    predicted_answer = processor.decode(\n        output_ids[0],\n        skip_special_tokens=True\n    )\n\n    display(image)\n    print(\"Question:\", question)\n    print(\"Predicted answer:\", predicted_answer)\n\n    return predicted_answer\n\nprint(\"Question-answering function is ready.\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.464294Z","iopub.status.idle":"2026-09-07T13:58:38.464698Z","shell.execute_reply.started":"2026-09-07T13:58:38.464498Z","shell.execute_reply":"2026-09-07T13:58:38.464521Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"record = records[0]\n\nimage_path = os.path.join(\n    TRAIN_IMAGE_DIR,\n    record[\"image\"]\n)\n\npredicted_answer = ask_question(\n    image_path=image_path,\n    question=record[\"question\"]\n)\n\nprint(\"Database answer:\", record[\"answer\"])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.465683Z","iopub.status.idle":"2026-09-07T13:58:38.466043Z","shell.execute_reply.started":"2026-09-07T13:58:38.465868Z","shell.execute_reply":"2026-09-07T13:58:38.465891Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"record = records[0]\n\nimage_path = os.path.join(\n    TRAIN_IMAGE_DIR,\n    record[\"image\"]\n)\n\nask_question(\n    image_path=image_path,\n    question=\"Are there any buildings in this scene?\"\n)\n\nprint(\"Image used:\", record[\"image\"])\nprint(\"Original database answer:\", record[\"answer\"])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.467138Z","iopub.status.idle":"2026-09-07T13:58:38.467558Z","shell.execute_reply.started":"2026-09-07T13:58:38.46735Z","shell.execute_reply":"2026-09-07T13:58:38.467377Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nfrom PIL import Image\n\ndef ask_question(image_path, question, show_image=False):\n    image = Image.open(image_path).convert(\"RGB\")\n\n    inputs = processor(\n        images=image,\n        text=question,\n        return_tensors=\"pt\"\n    )\n\n    inputs = {\n        key: value.to(DEVICE)\n        for key, value in inputs.items()\n    }\n\n    with torch.no_grad():\n        output_ids = model.generate(\n            **inputs,\n            max_new_tokens=20\n        )\n\n    predicted_answer = processor.decode(\n        output_ids[0],\n        skip_special_tokens=True\n    ).strip()\n\n    if show_image:\n        display(image)\n\n    print(\"Question:\", question)\n    print(\"Predicted answer:\", predicted_answer)\n\n    return predicted_answer","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.468455Z","iopub.status.idle":"2026-09-07T13:58:38.468831Z","shell.execute_reply.started":"2026-09-07T13:58:38.468645Z","shell.execute_reply":"2026-09-07T13:58:38.468672Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"record = records[0]\n\nimage_path = os.path.join(\n    TRAIN_IMAGE_DIR,\n    record[\"image\"]\n)\n\npredicted = ask_question(\n    image_path=image_path,\n    question=record[\"question\"],\n    show_image=True\n)\n\nprint(\"Expected answer:\", record[\"answer\"])","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.470498Z","iopub.status.idle":"2026-09-07T13:58:38.471141Z","shell.execute_reply.started":"2026-09-07T13:58:38.470948Z","shell.execute_reply":"2026-09-07T13:58:38.470972Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import random\n\nevaluation_records = random.sample(\n    records,\n    min(10, len(records))\n)\n\ncorrect = 0\n\nfor index, record in enumerate(evaluation_records):\n\n    print(f\"\\n========== TEST {index + 1} ==========\")\n\n    image_path = os.path.join(\n        TRAIN_IMAGE_DIR,\n        record[\"image\"]\n    )\n\n    predicted = ask_question(\n        image_path=image_path,\n        question=record[\"question\"],\n        show_image=False\n    )\n\n    expected = str(record[\"answer\"]).strip().lower()\n    predicted = predicted.strip().lower()\n\n    is_correct = predicted == expected\n\n    if is_correct:\n        correct += 1\n\n    print(\"Expected:\", expected)\n    print(\"Correct:\", is_correct)\n\naccuracy = correct / len(evaluation_records)\n\nprint(\"\\n========== RESULTS ==========\")\nprint(\"Correct:\", correct)\nprint(\"Total:\", len(evaluation_records))\nprint(\"Accuracy:\", round(accuracy * 100, 2), \"%\")","metadata":{"execution":{"iopub.status.busy":"2026-09-07T13:58:38.472125Z","iopub.status.idle":"2026-09-07T13:58:38.472495Z","shell.execute_reply.started":"2026-09-07T13:58:38.47229Z","shell.execute_reply":"2026-09-07T13:58:38.472329Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install -q gradio","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-07T13:59:12.699898Z","iopub.execute_input":"2026-09-07T13:59:12.700266Z","iopub.status.idle":"2026-09-07T13:59:16.209147Z","shell.execute_reply.started":"2026-09-07T13:59:12.700219Z","shell.execute_reply":"2026-09-07T13:59:16.208298Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import gradio as gr","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-07T13:59:00.266917Z","iopub.execute_input":"2026-09-07T13:59:00.267176Z","iopub.status.idle":"2026-09-07T13:59:09.235272Z","shell.execute_reply.started":"2026-09-07T13:59:00.267155Z","shell.execute_reply":"2026-09-07T13:59:09.234632Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def gradio_predict(\n    image_path,\n    second_image_path,\n    question,\n    sensor_type\n):\n    # Validate the primary image\n    if image_path is None:\n        return (\n            \"Please upload a primary satellite image.\",\n            \"unknown\",\n            \"0.0\",\n            [],\n            {}\n        )\n\n    # Validate the question\n    if question is None or question.strip() == \"\":\n        return (\n            \"Please enter a question.\",\n            \"unknown\",\n            \"0.0\",\n            [],\n            {}\n        )\n\n    # Convert the default dropdown value to None\n    if sensor_type == \"Not specified\":\n        sensor_type = None\n\n    # Run the Vigyaan agent\n    result = satquery_agent(\n        question=question,\n        image_path=image_path,\n        second_image_path=second_image_path,\n        sensor_type=sensor_type\n    )\n\n    return (\n        result[\"answer\"],\n        result[\"task\"],\n        f'{result[\"confidence\"]:.2f}',\n        result[\"evidence\"],\n        result[\"execution_trace\"]\n    )","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-07T13:58:57.2308Z","iopub.execute_input":"2026-09-07T13:58:57.231107Z","iopub.status.idle":"2026-09-07T13:58:57.236957Z","shell.execute_reply.started":"2026-09-07T13:58:57.231082Z","shell.execute_reply":"2026-09-07T13:58:57.236183Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"with gr.Blocks(title=\"Vigyaan\") as demo:\n\n    gr.Markdown(\n        \"\"\"\n        # 🛰️ Vigyaan\n\n        Agentic satellite image analysis system.\n\n        Upload an image, ask a question, and Vigyaan will\n        select the appropriate analysis module.\n        \"\"\"\n    )\n\n    with gr.Row():\n\n        with gr.Column():\n\n            image_input = gr.Image(\n                type=\"filepath\",\n                label=\"Primary Satellite Image\"\n            )\n\n            second_image_input = gr.Image(\n                type=\"filepath\",\n                label=\"Second Image for Change Detection\"\n            )\n\n            question_input = gr.Textbox(\n                label=\"Question\",\n                placeholder=\"Are there any buildings in this scene?\"\n            )\n\n            sensor_input = gr.Dropdown(\n                choices=[\n                    \"Not specified\",\n                    \"Optical\",\n                    \"SAR\"\n                ],\n                value=\"Not specified\",\n                label=\"Sensor Type\"\n            )\n\n            analyze_button = gr.Button(\n                \"Analyze Image\",\n                variant=\"primary\"\n            )\n\n        with gr.Column():\n\n            answer_output = gr.Textbox(\n                label=\"Answer\"\n            )\n\n            task_output = gr.Textbox(\n                label=\"Selected Task\"\n            )\n\n            confidence_output = gr.Textbox(\n                label=\"Confidence\"\n            )\n\n            evidence_output = gr.JSON(\n                label=\"Evidence\"\n            )\n\n            trace_output = gr.JSON(\n                label=\"Execution Trace\"\n            )\n\n    analyze_button.click(\n        fn=gradio_predict,\n        inputs=[\n            image_input,\n            second_image_input,\n            question_input,\n            sensor_input\n        ],\n        outputs=[\n            answer_output,\n            task_output,\n            confidence_output,\n            evidence_output,\n            trace_output\n        ]\n    )\n\ndemo.launch(share=True)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-09-07T13:59:49.198964Z","iopub.execute_input":"2026-09-07T13:59:49.199311Z","execution_failed":"2026-09-07T13:59:56.758Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}