{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceType":"competition","sourceId":132732,"databundleVersionId":16583342}],"dockerImageVersionId":31328,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import os\nimport numpy as np\nimport pandas as pd\nimport torch\nimport torch.nn as nn\nfrom torch.utils.data import Dataset, DataLoader\nfrom PIL import Image\nfrom torchvision import transforms, models\n\nclass CFG:\n    root = \"/kaggle/input/competitions/dlmmdd-workshop-synthetic-source-attribution-challenge/Data/Data\"\n    train_csv = os.path.join(root, \"training.csv\")\n    test_csv = os.path.join(root, \"test.csv\")\n    train_dir = os.path.join(root, \"Training\")\n    test_dir = os.path.join(root, \"Test\")\n    device = \"cpu\"\n    batch_size = 32\n    img_size = 224\n    num_classes = 10\n\ndef resolve_path(p):\n    for c in [\n        os.path.join(CFG.root, p),\n        os.path.join(CFG.train_dir, os.path.basename(p)),\n        os.path.join(CFG.test_dir, os.path.basename(p)),\n        p\n    ]:\n        if os.path.exists(c):\n            return c\n    return None\n\nclass DatasetInfer(Dataset):\n    def __init__(self, df):\n        self.df = df\n        self.tfm = transforms.Compose([\n            transforms.Resize((CFG.img_size, CFG.img_size)),\n            transforms.ToTensor(),\n            transforms.Normalize([0.5]*3,[0.5]*3)\n        ])\n\n    def __len__(self):\n        return len(self.df)\n\n    def __getitem__(self, i):\n        r = self.df.iloc[i]\n        img = Image.open(resolve_path(r[\"path\"])).convert(\"RGB\")\n        x = self.tfm(img)\n        return x, r[\"ID\"]\n\nclass Model(nn.Module):\n    def __init__(self):\n        super().__init__()\n        self.net = models.efficientnet_b0(\n            weights=models.EfficientNet_B0_Weights.DEFAULT\n        )\n        self.net.classifier = nn.Linear(1280, CFG.num_classes)\n\n    def forward(self, x):\n        return self.net(x)\n\ndef predict(model, loader):\n    model.eval()\n    ids, preds = [], []\n    with torch.no_grad():\n        for x, i in loader:\n            x = x.to(CFG.device)\n            logits = model(x)\n            p = logits.argmax(1).cpu().numpy()\n            ids.extend(i.numpy())\n            preds.extend(p)\n    return ids, preds\n\ndef main():\n    test_df = pd.read_csv(CFG.test_csv)\n\n    loader = DataLoader(\n        DatasetInfer(test_df),\n        batch_size=CFG.batch_size,\n        shuffle=False\n    )\n\n    model = Model().to(CFG.device)\n\n    ids, preds = predict(model, loader)\n\n    pd.DataFrame({\n        \"ID\": ids,\n        \"TARGET\": preds\n    }).to_csv(\"submission.csv\", index=False)\n\nif __name__ == \"__main__\":\n    main()","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-04-11T04:45:28.472120Z","iopub.execute_input":"2026-04-11T04:45:28.473182Z"}},"outputs":[],"execution_count":null}]}