{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.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":5048,"databundleVersionId":868335,"sourceType":"competition"},{"sourceId":7683303,"sourceType":"datasetVersion","datasetId":4482963},{"sourceId":7699703,"sourceType":"datasetVersion","datasetId":4494436}],"dockerImageVersionId":30646,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"from PIL import Image\nimport torch\nimport os\nimport cv2\nfrom tqdm import tqdm\nimport copy\nimport torch.optim as optim\nimport numpy as np\nimport optuna\nfrom sklearn.metrics import f1_score\nfrom optuna.exceptions import TrialPruned\nimport random\nimport torch.nn as nn\nfrom torchvision import datasets, models, transforms\nfrom torch.utils.data import DataLoader, Dataset\nimport pandas as pd\nfrom skimage import io","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-02-25T18:55:24.451399Z","iopub.execute_input":"2024-02-25T18:55:24.451710Z","iopub.status.idle":"2024-02-25T18:55:33.089844Z","shell.execute_reply.started":"2024-02-25T18:55:24.451677Z","shell.execute_reply":"2024-02-25T18:55:33.089069Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"working_folder = os.path.abspath(\"\")\nimage_dir = os.path.join(working_folder, \"/kaggle/input/data-all/data_all\")","metadata":{"execution":{"iopub.status.busy":"2024-02-25T18:55:33.091552Z","iopub.execute_input":"2024-02-25T18:55:33.092023Z","iopub.status.idle":"2024-02-25T18:55:33.096540Z","shell.execute_reply.started":"2024-02-25T18:55:33.091994Z","shell.execute_reply":"2024-02-25T18:55:33.095592Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = '/kaggle/input/labels-6-split/train_split.csv'\nval_df = '/kaggle/input/labels-6-split/valid_split.csv'","metadata":{"execution":{"iopub.status.busy":"2024-02-25T18:55:33.097955Z","iopub.execute_input":"2024-02-25T18:55:33.098421Z","iopub.status.idle":"2024-02-25T18:55:33.108274Z","shell.execute_reply.started":"2024-02-25T18:55:33.098394Z","shell.execute_reply":"2024-02-25T18:55:33.107410Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataframe = pd.read_csv('/kaggle/input/labels-6-split/train_split.csv')\nval_dataframe = pd.read_csv('/kaggle/input/labels-6-split/valid_split.csv')","metadata":{"execution":{"iopub.status.busy":"2024-02-25T18:55:33.110565Z","iopub.execute_input":"2024-02-25T18:55:33.110863Z","iopub.status.idle":"2024-02-25T18:55:33.160712Z","shell.execute_reply.started":"2024-02-25T18:55:33.110839Z","shell.execute_reply":"2024-02-25T18:55:33.159984Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train_dataframe.shape)\nprint(val_dataframe.shape)","metadata":{"execution":{"iopub.status.busy":"2024-02-25T18:55:33.161641Z","iopub.execute_input":"2024-02-25T18:55:33.161882Z","iopub.status.idle":"2024-02-25T18:55:33.166530Z","shell.execute_reply.started":"2024-02-25T18:55:33.161860Z","shell.execute_reply":"2024-02-25T18:55:33.165604Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CustomImageDataset(Dataset):\n    def __init__(self, csv_file, root_dir, transform):\n        self.annotations = pd.read_csv(csv_file)\n        self.root_dir = root_dir\n        self.transform = transform\n\n    def __len__(self):\n        return len(self.annotations)\n\n    def __getitem__(self, index):\n        img_id = self.annotations.iloc[index, 2]\n        img_name = os.path.join(self.root_dir, f\"{img_id}\")\n        image = Image.open(img_name).convert('RGB')\n        label = int(self.annotations.iloc[index, 1][-1])  # Extract class number\n\n        if self.transform:\n            image = self.transform(image)\n\n        return image, label","metadata":{"execution":{"iopub.status.busy":"2024-02-25T18:55:33.167862Z","iopub.execute_input":"2024-02-25T18:55:33.168320Z","iopub.status.idle":"2024-02-25T18:55:33.176344Z","shell.execute_reply.started":"2024-02-25T18:55:33.168289Z","shell.execute_reply":"2024-02-25T18:55:33.175464Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n])","metadata":{"execution":{"iopub.status.busy":"2024-02-25T18:55:33.177231Z","iopub.execute_input":"2024-02-25T18:55:33.177515Z","iopub.status.idle":"2024-02-25T18:55:33.186517Z","shell.execute_reply.started":"2024-02-25T18:55:33.177479Z","shell.execute_reply":"2024-02-25T18:55:33.185771Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dataset = CustomImageDataset(train_df, image_dir, transform=transform)\nval_dataset = CustomImageDataset(val_df, image_dir, transform=transform)\n    \ntrain_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=2)\nval_loader = DataLoader(val_dataset, batch_size=32, num_workers=2)","metadata":{"execution":{"iopub.status.busy":"2024-02-25T18:55:33.187522Z","iopub.execute_input":"2024-02-25T18:55:33.187869Z","iopub.status.idle":"2024-02-25T18:55:33.214685Z","shell.execute_reply.started":"2024-02-25T18:55:33.187838Z","shell.execute_reply":"2024-02-25T18:55:33.213997Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"model = models.regnet_y_16gf(weights = models.RegNet_Y_16GF_Weights.IMAGENET1K_SWAG_E2E_V1)\n\nnum_ftrs = model.fc.in_features\nmodel.fc = nn.Sequential(\n    nn.Linear(num_ftrs, 1024),\n    nn.ReLU(),\n    nn.Dropout(0.5),\n    nn.Linear(1024, 10),\n)","metadata":{"execution":{"iopub.status.busy":"2024-02-25T18:55:33.215749Z","iopub.execute_input":"2024-02-25T18:55:33.216217Z","iopub.status.idle":"2024-02-25T18:55:37.166234Z","shell.execute_reply.started":"2024-02-25T18:55:33.216182Z","shell.execute_reply":"2024-02-25T18:55:37.165116Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nmodel.to(device)","metadata":{"execution":{"iopub.status.busy":"2024-02-25T18:55:37.169915Z","iopub.execute_input":"2024-02-25T18:55:37.170342Z","iopub.status.idle":"2024-02-25T18:55:37.461752Z","shell.execute_reply.started":"2024-02-25T18:55:37.170304Z","shell.execute_reply":"2024-02-25T18:55:37.460848Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"criterion = nn.CrossEntropyLoss()\noptimizer = optim.Adam(model.parameters(), lr=0.0001)","metadata":{"execution":{"iopub.status.busy":"2024-02-25T18:55:37.462942Z","iopub.execute_input":"2024-02-25T18:55:37.463239Z","iopub.status.idle":"2024-02-25T18:55:37.470111Z","shell.execute_reply.started":"2024-02-25T18:55:37.463212Z","shell.execute_reply":"2024-02-25T18:55:37.468625Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train_model(model, criterion, optimizer, num_epochs):\n    for epoch in range(num_epochs):\n        model.train()\n        running_loss = 0.0\n        for inputs, labels in tqdm(train_loader):\n            inputs, labels = inputs.to(device), labels.to(device)\n            optimizer.zero_grad()\n            outputs = model(inputs)\n            loss = criterion(outputs, labels)\n            loss.backward()\n            optimizer.step()\n            running_loss += loss.item()\n        print(f'Epoch {epoch+1}, Loss: {running_loss/len(train_loader)}')\n        \n        model.eval()\n        running_loss = 0.0\n        with torch.no_grad():\n            for inputs, labels in val_loader:\n                inputs, labels = inputs.to(device), labels.to(device)\n                outputs = model(inputs)\n                loss = criterion(outputs, labels)\n                running_loss += loss.item()\n\n        print(f'Multi-class Log Loss on Validation: {running_loss/len(val_loader)}')\n\n    print('Finished Training')","metadata":{"execution":{"iopub.status.busy":"2024-02-25T18:55:37.471126Z","iopub.execute_input":"2024-02-25T18:55:37.471397Z","iopub.status.idle":"2024-02-25T18:55:37.483823Z","shell.execute_reply.started":"2024-02-25T18:55:37.471374Z","shell.execute_reply":"2024-02-25T18:55:37.482914Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_model(model, criterion, optimizer, num_epochs=10)","metadata":{"execution":{"iopub.status.busy":"2024-02-25T18:55:37.485001Z","iopub.execute_input":"2024-02-25T18:55:37.485305Z","iopub.status.idle":"2024-02-25T20:39:24.441226Z","shell.execute_reply.started":"2024-02-25T18:55:37.485282Z","shell.execute_reply":"2024-02-25T20:39:24.440009Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class SingleFolderDataset(Dataset):\n    def __init__(self, directory, transform):\n        self.directory = directory\n        self.transform = transform\n        self.image_filenames = [f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))]\n\n    def __len__(self):\n        return len(self.image_filenames)\n\n    def __getitem__(self, idx):\n        image_name = self.image_filenames[idx]\n        image_path = os.path.join(self.directory, image_name)\n        image = Image.open(image_path).convert('RGB')\n        if self.transform:\n            image = self.transform(image)\n        return image, image_name","metadata":{"execution":{"iopub.status.busy":"2024-02-25T20:39:24.442872Z","iopub.execute_input":"2024-02-25T20:39:24.443272Z","iopub.status.idle":"2024-02-25T20:39:24.451069Z","shell.execute_reply.started":"2024-02-25T20:39:24.443232Z","shell.execute_reply":"2024-02-25T20:39:24.450040Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"transform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),\n])","metadata":{"execution":{"iopub.status.busy":"2024-02-25T20:39:24.452091Z","iopub.execute_input":"2024-02-25T20:39:24.452369Z","iopub.status.idle":"2024-02-25T20:39:24.464023Z","shell.execute_reply.started":"2024-02-25T20:39:24.452344Z","shell.execute_reply":"2024-02-25T20:39:24.463309Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dataset = SingleFolderDataset(directory='/kaggle/input/state-farm-distracted-driver-detection/imgs/test', transform=transform)\ntest_loader = DataLoader(dataset, batch_size=32, shuffle=False, num_workers=4)","metadata":{"execution":{"iopub.status.busy":"2024-02-25T20:39:24.465350Z","iopub.execute_input":"2024-02-25T20:39:24.465666Z","iopub.status.idle":"2024-02-25T20:42:23.484218Z","shell.execute_reply.started":"2024-02-25T20:39:24.465642Z","shell.execute_reply":"2024-02-25T20:42:23.483215Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def make_predictions_sigmoid(data_loader):\n    model.eval()\n    y_pred = []\n    file_names = []\n    with torch.no_grad():\n        for inputs, paths in tqdm(data_loader):\n            inputs = inputs.to(device)\n            outputs = model(inputs)\n            probabilities = torch.sigmoid(outputs)\n            y_pred.extend(probabilities.cpu().numpy())\n            file_names.extend([os.path.basename(path) for path in paths])\n            \n    return file_names, y_pred","metadata":{"execution":{"iopub.status.busy":"2024-02-25T20:42:23.485662Z","iopub.execute_input":"2024-02-25T20:42:23.486024Z","iopub.status.idle":"2024-02-25T20:42:23.493868Z","shell.execute_reply.started":"2024-02-25T20:42:23.485988Z","shell.execute_reply":"2024-02-25T20:42:23.492913Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"file_names, preds = make_predictions_sigmoid(test_loader)\nsubmission_df = pd.DataFrame(preds, columns=[f'c{i}' for i in range(10)])\nsubmission_df.insert(0, 'img', file_names)\nsubmission_df.to_csv('submission.csv', index=False)\nprint(\"Submission file has been saved.\")","metadata":{"execution":{"iopub.status.busy":"2024-02-25T20:42:23.495072Z","iopub.execute_input":"2024-02-25T20:42:23.495421Z","iopub.status.idle":"2024-02-25T20:55:48.373019Z","shell.execute_reply.started":"2024-02-25T20:42:23.495388Z","shell.execute_reply":"2024-02-25T20:55:48.371967Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}