{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"gpu","dataSources":[{"sourceId":20270,"databundleVersionId":1222630,"sourceType":"competition"},{"sourceId":9797223,"sourceType":"datasetVersion","datasetId":982170},{"sourceId":266169227,"sourceType":"kernelVersion"}],"dockerImageVersionId":31090,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import sys\nsys.path.append(\"../input/tez-lib/\")","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2025-10-07T19:54:48.954949Z","iopub.execute_input":"2025-10-07T19:54:48.955731Z","iopub.status.idle":"2025-10-07T19:54:48.959148Z","shell.execute_reply.started":"2025-10-07T19:54:48.955701Z","shell.execute_reply":"2025-10-07T19:54:48.958541Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import tez\nfrom tez import Tez, TezConfig\nimport albumentations\nimport pandas as pd\nimport cv2\nimport numpy as np\nimport timm\nimport torch\nimport torch.nn as nn\nfrom tqdm import tqdm","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-07T19:54:48.960383Z","iopub.execute_input":"2025-10-07T19:54:48.960900Z","iopub.status.idle":"2025-10-07T19:54:48.976966Z","shell.execute_reply.started":"2025-10-07T19:54:48.960883Z","shell.execute_reply":"2025-10-07T19:54:48.976319Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class args:\n    batch_size = 64\n    image_size = 384","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-07T19:54:48.977661Z","iopub.execute_input":"2025-10-07T19:54:48.977973Z","iopub.status.idle":"2025-10-07T19:54:48.992476Z","shell.execute_reply.started":"2025-10-07T19:54:48.977919Z","shell.execute_reply":"2025-10-07T19:54:48.991763Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"BEST_MODEL_NAME = \"inception_v3\"\nINFERENCE_FOLD = 0\nBASE_IMAGE_PATH = \"/kaggle/input/siim-isic-melanoma-classification/jpeg/test/\"","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-07T19:54:48.993248Z","iopub.execute_input":"2025-10-07T19:54:48.993493Z","iopub.status.idle":"2025-10-07T19:54:49.009935Z","shell.execute_reply.started":"2025-10-07T19:54:48.993471Z","shell.execute_reply":"2025-10-07T19:54:49.009397Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class targetDataset:\n    def __init__(self, image_paths, dense_features, targets, augmentations):\n        self.image_paths = image_paths\n        self.dense_features = dense_features\n        self.targets = targets \n        self.augmentations = augmentations\n        \n    def __len__(self):\n        return len(self.image_paths)\n    \n    def __getitem__(self, item):\n        image_path = self.image_paths[item]\n        image = cv2.imread(image_path)\n        \n       \n        if image is None:\n            raise FileNotFoundError(f\"Could not read image file: {image_path}. Please check the path.\")\n            \n        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n        \n        if self.augmentations is not None:\n            augmented = self.augmentations(image=image)\n            image = augmented[\"image\"]\n            \n        image = np.transpose(image, (2, 0, 1)).astype(np.float32)\n        features = self.dense_features[item, :]\n        \n        \n        return {\n            \"image\": torch.tensor(image, dtype=torch.float),\n            \"features\": torch.tensor(features, dtype=torch.float),\n        }","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-07T19:54:49.011815Z","iopub.execute_input":"2025-10-07T19:54:49.012089Z","iopub.status.idle":"2025-10-07T19:54:49.026203Z","shell.execute_reply.started":"2025-10-07T19:54:49.012073Z","shell.execute_reply":"2025-10-07T19:54:49.025503Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"class targetModel(nn.Module):\n    def __init__(self, model_name=\"resnet50\", dense_dim=12, pretrained=False):\n        super().__init__()\n        self.model = timm.create_model(model_name, pretrained=pretrained, in_chans=3)\n        n_features = self.model.get_classifier().in_features\n        self.model.reset_classifier(0)\n        self.out = nn.Linear(n_features + dense_dim, 1)\n\n    def forward(self, image, features, targets=None):\n        image_features = self.model(image)\n        x = torch.cat([image_features, features], dim=1)\n        output = self.out(x)\n        return output, 0, {}","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-07T19:54:49.026810Z","iopub.execute_input":"2025-10-07T19:54:49.027028Z","iopub.status.idle":"2025-10-07T19:54:49.041292Z","shell.execute_reply.started":"2025-10-07T19:54:49.027009Z","shell.execute_reply":"2025-10-07T19:54:49.040573Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"test_aug = albumentations.Compose([\n    albumentations.LongestMaxSize(args.image_size, p=1),\n    albumentations.PadIfNeeded(args.image_size, args.image_size, p=1, border_mode=cv2.BORDER_CONSTANT),\n    albumentations.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225], max_pixel_value=255.0, p=1.0),\n])","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-07T19:54:49.041873Z","iopub.execute_input":"2025-10-07T19:54:49.042084Z","iopub.status.idle":"2025-10-07T19:54:49.057828Z","shell.execute_reply.started":"2025-10-07T19:54:49.042069Z","shell.execute_reply":"2025-10-07T19:54:49.057141Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"df_train = pd.read_csv(\"/kaggle/input/siim-isic-melanoma-classification/train.csv\")\ndf_test = pd.read_csv(\"/kaggle/input/siim-isic-melanoma-classification/test.csv\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-07T19:54:49.058371Z","iopub.execute_input":"2025-10-07T19:54:49.058582Z","iopub.status.idle":"2025-10-07T19:54:49.139723Z","shell.execute_reply.started":"2025-10-07T19:54:49.058567Z","shell.execute_reply":"2025-10-07T19:54:49.139190Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"categorical_features = ['sex', 'anatom_site_general_challenge']\ndf_train = pd.get_dummies(df_train, columns=categorical_features, dummy_na=False)\ndf_test = pd.get_dummies(df_test, columns=categorical_features, dummy_na=False)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-07T19:54:49.140342Z","iopub.execute_input":"2025-10-07T19:54:49.140516Z","iopub.status.idle":"2025-10-07T19:54:49.158647Z","shell.execute_reply.started":"2025-10-07T19:54:49.140503Z","shell.execute_reply":"2025-10-07T19:54:49.157849Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"one_hot_cols = [col for col in df_train.columns if any(f\"_{cat}\" in col for cat in categorical_features)]\nnumerical_features = ['age_approx']\ndense_features_list = numerical_features + one_hot_cols","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-07T19:54:49.159267Z","iopub.execute_input":"2025-10-07T19:54:49.159466Z","iopub.status.idle":"2025-10-07T19:54:49.163308Z","shell.execute_reply.started":"2025-10-07T19:54:49.159450Z","shell.execute_reply":"2025-10-07T19:54:49.162712Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_cols = set(df_train.columns)\nfor col in dense_features_list:\n    if col not in df_test.columns:\n        df_test[col] = 0\ndf_test = df_test[df_train.columns.intersection(df_test.columns)]\nprint(f\"Final dense features being used ({len(dense_features_list)}): {dense_features_list}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-07T19:54:49.164038Z","iopub.execute_input":"2025-10-07T19:54:49.164408Z","iopub.status.idle":"2025-10-07T19:54:49.179228Z","shell.execute_reply.started":"2025-10-07T19:54:49.164386Z","shell.execute_reply":"2025-10-07T19:54:49.178620Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(f\"\\n--- Getting predictions for the best model: {BEST_MODEL_NAME.upper()} ---\")\n\nmodel = targetModel(model_name=BEST_MODEL_NAME, dense_dim=len(dense_features_list), pretrained=False)\nmodel = Tez(model)\n\n\nmodel_path = f\"/kaggle/input/ajai-sharan-velmurugan-23bcs10154-training-siim/model_inception_v3_f0.bin\"\nmodel.load(model_path, weights_only=True)\n\n\ntest_img_paths = [f\"{BASE_IMAGE_PATH}{x}.jpg\" for x in df_test[\"image_name\"].values]\ntest_dataset = targetDataset(\n    image_paths=test_img_paths,\n    dense_features=df_test[dense_features_list].values,\n    targets=np.ones(len(test_img_paths)),\n    augmentations=test_aug,\n)\n\n\npredictions_generator = model.predict(test_dataset, batch_size=2*args.batch_size, n_jobs=-1)\n\n\nfinal_predictions_logits = []\nfor preds in tqdm(predictions_generator):\n    final_predictions_logits.extend(preds.ravel().tolist())","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-07T19:54:49.180821Z","iopub.execute_input":"2025-10-07T19:54:49.181275Z","iopub.status.idle":"2025-10-07T20:00:26.108453Z","shell.execute_reply.started":"2025-10-07T19:54:49.181259Z","shell.execute_reply":"2025-10-07T20:00:26.107633Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(\"\\nCreating submission file from best model...\")\n\ndef sigmoid(x):\n    return 1 / (1 + np.exp(-x))\n\nfinal_predictions_logits = np.array(final_predictions_logits)\nfinal_predictions_prob = sigmoid(final_predictions_logits)\n\ndf_test[\"target\"] = final_predictions_prob\nsubmission_df = df_test[[\"image_name\", \"target\"]]\nsubmission_df.to_csv(\"submission.csv\", index=False)\n\nprint(\"Submission file created successfully!\")\nsubmission_df.head()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-10-07T20:04:39.411938Z","iopub.execute_input":"2025-10-07T20:04:39.412567Z","iopub.status.idle":"2025-10-07T20:04:39.467567Z","shell.execute_reply.started":"2025-10-07T20:04:39.412543Z","shell.execute_reply":"2025-10-07T20:04:39.466846Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}