{"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":7706955,"sourceType":"datasetVersion","datasetId":4499671},{"sourceId":7786938,"sourceType":"datasetVersion","datasetId":4557739}],"dockerImageVersionId":30674,"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-04-03T10:07:50.804384Z","iopub.execute_input":"2024-04-03T10:07:50.804753Z","iopub.status.idle":"2024-04-03T10:07:50.811233Z","shell.execute_reply.started":"2024-04-03T10:07:50.804724Z","shell.execute_reply":"2024-04-03T10:07:50.810167Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"working_folder = os.path.abspath(\"\")\nimage_dir = os.path.join(working_folder, \"/kaggle/input/all-images/data_all\")","metadata":{"execution":{"iopub.status.busy":"2024-04-03T10:07:50.812966Z","iopub.execute_input":"2024-04-03T10:07:50.813273Z","iopub.status.idle":"2024-04-03T10:07:50.826955Z","shell.execute_reply.started":"2024-04-03T10:07:50.813249Z","shell.execute_reply":"2024-04-03T10:07:50.826143Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = '/kaggle/input/train-full/train_full.csv'","metadata":{"execution":{"iopub.status.busy":"2024-04-03T10:07:50.82781Z","iopub.execute_input":"2024-04-03T10:07:50.828037Z","iopub.status.idle":"2024-04-03T10:07:50.836903Z","shell.execute_reply.started":"2024-04-03T10:07:50.828017Z","shell.execute_reply":"2024-04-03T10:07:50.83601Z"},"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, 1]\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, 0][-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-04-03T10:07:50.838038Z","iopub.execute_input":"2024-04-03T10:07:50.83848Z","iopub.status.idle":"2024-04-03T10:07:50.84792Z","shell.execute_reply.started":"2024-04-03T10:07:50.838449Z","shell.execute_reply":"2024-04-03T10:07:50.846995Z"},"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-04-03T10:07:50.850252Z","iopub.execute_input":"2024-04-03T10:07:50.850583Z","iopub.status.idle":"2024-04-03T10:07:50.858435Z","shell.execute_reply.started":"2024-04-03T10:07:50.850555Z","shell.execute_reply":"2024-04-03T10:07:50.857725Z"},"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-04-03T10:07:50.85952Z","iopub.execute_input":"2024-04-03T10:07:50.859816Z","iopub.status.idle":"2024-04-03T10:07:50.868641Z","shell.execute_reply.started":"2024-04-03T10:07:50.859794Z","shell.execute_reply":"2024-04-03T10:07:50.867761Z"},"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 (data_loader):\n            inputs = inputs.to(device)\n            outputs = model(inputs)\n            probabilities = torch.nn.functional.softmax(outputs, dim=1)\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-04-03T10:07:50.869654Z","iopub.execute_input":"2024-04-03T10:07:50.870014Z","iopub.status.idle":"2024-04-03T10:07:50.881749Z","shell.execute_reply.started":"2024-04-03T10:07:50.869991Z","shell.execute_reply":"2024-04-03T10:07:50.880893Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CustomDINONormModel(nn.Module):\n    def __init__(self, dino_model, fc_units, dropout_rate):\n        super(CustomDINONormModel, self).__init__()\n        self.dino_model = dino_model\n        self.classifier = nn.Sequential(\n            nn.Linear(1024, fc_units),\n            nn.ReLU(),\n            nn.Dropout(dropout_rate),\n            nn.Linear(fc_units, 10),\n        )\n\n    def forward(self, x):\n        x = self.dino_model(x)\n        x = self.classifier(x)\n        return x","metadata":{"execution":{"iopub.status.busy":"2024-04-03T10:07:50.882901Z","iopub.execute_input":"2024-04-03T10:07:50.883373Z","iopub.status.idle":"2024-04-03T10:07:50.892183Z","shell.execute_reply.started":"2024-04-03T10:07:50.883341Z","shell.execute_reply":"2024-04-03T10:07:50.891328Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for trail in range(0, 9):\n    train_dataset = CustomImageDataset(train_df, image_dir, transform=transform)\n    train_loader = DataLoader(train_dataset, batch_size=4, shuffle=True, num_workers=4)\n    \n    dino_model = torch.hub.load(\"facebookresearch/dinov2\", \"dinov2_vitl14\")\n    model = CustomDINONormModel(dino_model, 1216, 0.45)\n    \n    criterion = nn.CrossEntropyLoss()\n    optimizer = optim.Adam(model.parameters(), lr=1.0504088130751306e-06)\n    \n    device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n    model.to(device)\n    \n    print(\"model load_compelete\")\n    \n    dataset = SingleFolderDataset(directory='/kaggle/input/state-farm-distracted-driver-detection/imgs/test', transform=transform)\n    test_loader = DataLoader(dataset, batch_size=4, shuffle=False, num_workers=4)\n\n    def train_model(model, criterion, optimizer, num_epochs, trail):\n        for epoch in (range(num_epochs)):\n            model.train()\n            running_loss = 0.0\n            for inputs, labels in (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            file_names, preds = make_predictions_sigmoid(test_loader)\n            submission_df = pd.DataFrame(preds, columns=[f'c{i}' for i in range(10)])\n            submission_df.insert(0, 'img', file_names)\n            submission = \"submission\" + str(trail) + str(epoch) + \".csv\"\n            submission_df.to_csv(submission, index=False)       \n\n        print('Finished Training')\n    \n    train_model(model, criterion, optimizer, 1, trail)\n    ","metadata":{"execution":{"iopub.status.busy":"2024-04-03T10:07:53.510956Z","iopub.execute_input":"2024-04-03T10:07:53.511277Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}