{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":45867,"databundleVersionId":6688004,"sourceType":"competition"}],"dockerImageVersionId":30558,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import cv2\nimport os\nimport numpy as np\nimport pandas as pd\nfrom glob import glob\nfrom PIL import Image\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nfrom skimage.io import imread\nfrom skimage import io\n\n# Pytorch Libraries\nimport torch\nimport torchvision\nimport torch.nn as nn\nimport torch.optim as optim\nimport torch.nn.functional as F\n\nfrom torch.optim import lr_scheduler\nfrom torchvision import models, transforms\nfrom torchvision.datasets import ImageFolder\nfrom torch.utils.data import TensorDataset, DataLoader, Dataset\n\nfrom sklearn.model_selection import train_test_split, GridSearchCV\nfrom sklearn.calibration import CalibratedClassifierCV\nfrom sklearn.ensemble import BaggingClassifier\nfrom sklearn.metrics import confusion_matrix, roc_curve, roc_auc_score\nfrom sklearn.metrics import classification_report, roc_curve, roc_auc_score, confusion_matrix, precision_recall_curve, auc\nfrom sklearn.metrics import precision_score\nfrom sklearn.metrics import recall_score\nfrom sklearn.metrics import f1_score\nfrom sklearn.svm import SVC\n\nsns.set()","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2023-10-16T20:01:36.658709Z","iopub.execute_input":"2023-10-16T20:01:36.658972Z","iopub.status.idle":"2023-10-16T20:01:46.649296Z","shell.execute_reply.started":"2023-10-16T20:01:36.658952Z","shell.execute_reply":"2023-10-16T20:01:46.648381Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"csv_file_path = '/kaggle/input/UBC-OCEAN/train.csv'\nbase_image_dir = '/kaggle/input/UBC-OCEAN/train_images/'\nbase_thumbnail_dir = '/kaggle/input/UBC-OCEAN/train_thumbnails/'\nn_samples = 5\nbatch_size = 32\nnum_classes = 5","metadata":{"execution":{"iopub.status.busy":"2023-10-16T20:01:46.651205Z","iopub.execute_input":"2023-10-16T20:01:46.651725Z","iopub.status.idle":"2023-10-16T20:01:46.657397Z","shell.execute_reply.started":"2023-10-16T20:01:46.651691Z","shell.execute_reply":"2023-10-16T20:01:46.655577Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta_data = pd.read_csv(csv_file_path)\nmeta_data['path'] = base_image_dir + meta_data['image_id'].astype(str) + '.png'\nmeta_data['path_thumb'] = base_thumbnail_dir + meta_data['image_id'].astype(str) + '_thumbnail.png'\nmeta_data.head()","metadata":{"execution":{"iopub.status.busy":"2023-10-16T20:01:46.658558Z","iopub.execute_input":"2023-10-16T20:01:46.661103Z","iopub.status.idle":"2023-10-16T20:01:46.726988Z","shell.execute_reply.started":"2023-10-16T20:01:46.66107Z","shell.execute_reply":"2023-10-16T20:01:46.725992Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = ['HGSC', 'LGSC', 'EC', 'CC', 'MC']\n\nfig, axs = plt.subplots(len(labels), n_samples, figsize=(10, 10))\n\nfor i, lab in enumerate(labels):\n    imgs_with_label = meta_data[(meta_data['label'] == lab) & (meta_data['is_tma'] == True)]\n    img_paths = imgs_with_label['path'] \n    \n    for j, img_path in enumerate(img_paths):\n        ax = axs[i, j]\n        try:\n            img = io.imread(img_path) \n            ax.imshow(img, interpolation='bilinear') \n            \n            img_id = os.path.splitext(os.path.basename(img_path))[0]\n            \n            ax.set_title(f'Image ID: {img_id}\\nLabel: {lab}', fontsize=9)  \n            ax.axis('off')\n        except FileNotFoundError:\n            print(f'Thumbnail at path \"{img_path}\" does not exist.')\n\nfor ax in axs.flatten():\n    ax.set_aspect('auto')\n\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2023-10-16T17:41:52.908648Z","iopub.execute_input":"2023-10-16T17:41:52.909195Z","iopub.status.idle":"2023-10-16T17:42:34.4084Z","shell.execute_reply.started":"2023-10-16T17:41:52.909164Z","shell.execute_reply":"2023-10-16T17:42:34.407077Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = ['HGSC', 'LGSC', 'EC', 'CC', 'MC']\n\n# Assuming n_samples is already defined somewhere in your code\nfig, axs = plt.subplots(len(labels), n_samples, figsize=(10, 10))\n\nfor i, lab in enumerate(labels):\n    img_paths = meta_data.loc[(meta_data['label'] == lab) & (meta_data['is_tma'] == False), 'path_thumb']\n    \n    # Limit the number of image paths to n_samples\n    limited_img_paths = img_paths.iloc[:n_samples]\n    \n    for j, img_path in enumerate(limited_img_paths):\n        ax = axs[i, j]\n        img = io.imread(img_path)\n        ax.imshow(img, interpolation='bilinear')\n\n        img_id = os.path.splitext(os.path.basename(img_path))[0]\n        ax.set_title(f'Image ID: {img_id}\\nLabel: {lab}', fontsize=9)\n        ax.axis('off')\n\nfor ax in axs.ravel():\n    ax.set_aspect('auto')\n\nplt.tight_layout()\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2023-10-16T17:42:34.410791Z","iopub.execute_input":"2023-10-16T17:42:34.411155Z","iopub.status.idle":"2023-10-16T17:42:56.465758Z","shell.execute_reply.started":"2023-10-16T17:42:34.411126Z","shell.execute_reply":"2023-10-16T17:42:56.46491Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta_data = meta_data[meta_data['is_tma'] == False]","metadata":{"execution":{"iopub.status.busy":"2023-10-16T20:01:46.729207Z","iopub.execute_input":"2023-10-16T20:01:46.730644Z","iopub.status.idle":"2023-10-16T20:01:46.741211Z","shell.execute_reply.started":"2023-10-16T20:01:46.730613Z","shell.execute_reply":"2023-10-16T20:01:46.740332Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data = []\n\nfor path in meta_data['path_thumb']:\n    img = cv2.imread(path)\n        \n    avgR = np.mean(img[:,:,2])\n    avgG = np.mean(img[:,:,1])\n    avgB = np.mean(img[:,:,0])\n    RGB = np.mean([avgR, avgG, avgB])\n    \n    data.append([avgR, avgG, avgB, RGB])\n        \nrgb = pd.DataFrame(data, columns=['Red Channel Mean','Green Channel Mean','Blue Channel Mean', 'RGB Mean'])\n\nmeta_data = pd.concat([meta_data.reset_index(drop=True), rgb], axis=1)","metadata":{"execution":{"iopub.status.busy":"2023-10-16T20:01:46.742522Z","iopub.execute_input":"2023-10-16T20:01:46.743183Z","iopub.status.idle":"2023-10-16T20:03:50.48783Z","shell.execute_reply.started":"2023-10-16T20:01:46.743155Z","shell.execute_reply":"2023-10-16T20:03:50.486802Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"dist = sns.pairplot(meta_data[['Red Channel Mean', 'Green Channel Mean', 'Blue Channel Mean', 'RGB Mean', 'label']],\n             hue='label', plot_kws = {'alpha': 0.3})\n\ndist.fig.set_size_inches(12,8)","metadata":{"execution":{"iopub.status.busy":"2023-10-16T20:03:50.489308Z","iopub.execute_input":"2023-10-16T20:03:50.48965Z","iopub.status.idle":"2023-10-16T20:03:57.958267Z","shell.execute_reply.started":"2023-10-16T20:03:50.48962Z","shell.execute_reply":"2023-10-16T20:03:57.956716Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"meta_data.head()","metadata":{"execution":{"iopub.status.busy":"2023-10-16T19:50:26.021224Z","iopub.execute_input":"2023-10-16T19:50:26.02171Z","iopub.status.idle":"2023-10-16T19:50:26.046707Z","shell.execute_reply.started":"2023-10-16T19:50:26.021672Z","shell.execute_reply":"2023-10-16T19:50:26.045761Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class CustomDataset(Dataset):\n    def __init__(self, data_df, transform=None):\n        self.data_df = data_df\n        self.transform = transform\n        self.label_map = {'HGSC': 0, 'CC': 1, 'LGSC': 2, 'EC': 3, 'MC': 4}\n\n    def __len__(self):\n        return len(self.data_df)\n\n    def __getitem__(self, index):\n        # Retrieve the row as a series\n        row = self.data_df.iloc[index]\n        img_path = row['path_thumb']\n        label_str = row['label']\n        \n        # Convert the string label to its corresponding integer\n        label = self.label_map[label_str]\n        \n        # Load image from file\n        img = Image.open(img_path).convert('RGB')\n        \n        if self.transform is not None:\n            img = self.transform(img)\n        \n        return img, label\n\n\n# Split data into train and test sets\ntrain_df, test_df = train_test_split(meta_data, test_size=0.2, random_state=42)","metadata":{"execution":{"iopub.status.busy":"2023-10-16T20:03:57.959928Z","iopub.execute_input":"2023-10-16T20:03:57.960244Z","iopub.status.idle":"2023-10-16T20:03:57.979115Z","shell.execute_reply.started":"2023-10-16T20:03:57.960215Z","shell.execute_reply":"2023-10-16T20:03:57.978061Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Define the data transforms for training and testing datasets\ntrain_transforms = transforms.Compose([\n    transforms.RandomResizedCrop(size=256, scale=(0.8, 1.0)),\n    transforms.RandomRotation(degrees=15),\n    transforms.RandomHorizontalFlip(),\n    transforms.CenterCrop(size=224),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406],\n                         std=[0.229, 0.224, 0.225])\n])\n\ntest_transforms = transforms.Compose([\n    transforms.Resize(size=256),\n    transforms.CenterCrop(size=224),\n    transforms.ToTensor(),\n    transforms.Normalize(mean=[0.485, 0.456, 0.406],\n                         std=[0.229, 0.224, 0.225])\n])\n\n# Load the data\ntrain_dataset = CustomDataset(train_df, transform=train_transforms)\ntrain_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True)\n\ntest_dataset = CustomDataset(test_df, transform=test_transforms)\ntest_loader = DataLoader(test_dataset, batch_size=batch_size)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def evaluate(model, loader, criterion):\n    correct = 0\n    total = 0\n    total_loss = 0\n    \n    model.eval()\n    with torch.no_grad():\n        for data in loader:\n            images, labels = data\n            images = images.to(device)\n            labels = labels.to(device)\n            outputs = model(images)\n            \n            # Compute the loss\n            loss = criterion(outputs, labels)\n            total_loss += loss.item()\n            \n            # Predict the class\n            _, predicted = torch.max(outputs.data, 1)\n            total += labels.size(0)\n            \n            # Compute number of correct predictions\n            correct += (predicted == labels).sum().item()\n\n    acc = correct / total\n    avg_loss = total_loss / len(loader)\n    \n    model.train()\n    return acc, avg_loss\n","metadata":{"execution":{"iopub.status.busy":"2023-10-14T21:21:10.175518Z","iopub.execute_input":"2023-10-14T21:21:10.175866Z","iopub.status.idle":"2023-10-14T21:21:10.182368Z","shell.execute_reply.started":"2023-10-14T21:21:10.175843Z","shell.execute_reply":"2023-10-14T21:21:10.181398Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n\n# define hyperparameters\nlearning_rate = 0.01\nnum_epochs = 10\nroc_aucs = []\n\n# define binary cross entropy loss\ncriterion = nn.CrossEntropyLoss()\n\n# define ResNet50, VGG19, Inception, and DenseNet121 models\nmodels_dict = {'ResNet50': models.resnet50(weights='DEFAULT'),\n               'VGG19': models.vgg19(weights='DEFAULT'),\n              'VGG16': models.vgg16(weights='DEFAULT'),\n              'DenseNet121': models.densenet121(weights='DEFAULT')}\n\naccs = []\nlosses = []\n\nfor model_name, model in models_dict.items():\n    \n    print('Training', model_name, 'model')\n    \n    if (model_name == 'VGG19') | (model_name == 'VGG16'):\n        num_features = model.classifier[-1].in_features\n        model.classifier[-1] = nn.Linear(num_features, 512)\n        model.classifier.add_module('bn1', nn.BatchNorm1d(512))\n        model.classifier.add_module('relu1', nn.ReLU(inplace=True))\n        model.classifier.add_module('dropout1', nn.Dropout())\n        model.classifier.add_module('fc2', nn.Linear(512, 256))\n        model.classifier.add_module('bn2', nn.BatchNorm1d(256))\n        model.classifier.add_module('relu2', nn.ReLU(inplace=True))\n        model.classifier.add_module('dropout2', nn.Dropout())\n        model.classifier.add_module('fc3', nn.Linear(256, num_classes))\n    else:\n        if model_name == 'DenseNet121':\n            num_ftrs = model.classifier.in_features\n            model.classifier = nn.Sequential(\n                nn.Linear(num_ftrs, 512),\n                nn.BatchNorm1d(512),\n                nn.ReLU(inplace=True),\n                nn.Dropout(),\n                nn.Linear(512, 256),\n                nn.BatchNorm1d(256),\n                nn.ReLU(inplace=True),\n                nn.Dropout(),\n                nn.Linear(256, num_classes)\n            )\n        else:\n            num_ftrs = model.fc.in_features\n            model.fc = nn.Sequential(\n                nn.Linear(num_ftrs, 512),\n                nn.BatchNorm1d(512),\n                nn.ReLU(inplace=True),\n                nn.Dropout(),\n                nn.Linear(512, 256),\n                nn.BatchNorm1d(256),\n                nn.ReLU(inplace=True),\n                nn.Dropout(),\n                nn.Linear(256, num_classes)\n            )\n\n    model.to(device)\n    \n    # define optimizer\n    optimizer = optim.Adam(model.parameters(), lr=learning_rate)\n    scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode='min', factor=0.1, patience=3)\n    \n    # define empty lists to store predictions and labels\n    y_preds = []\n    y_trues = []\n    # train the model\n    for epoch in range(num_epochs):\n        \n        running_loss = 0.0\n        total = 0\n        correct = 0\n        \n        for i, data in enumerate(train_loader):\n            inputs, labels = data\n            inputs, labels = inputs.to(device), labels.to(device)\n            \n            # zero the parameter gradients\n            optimizer.zero_grad()\n\n            # forward + backward + optimize\n            outputs = model(inputs)\n            loss = criterion(outputs, labels)\n            loss.backward()\n            nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)\n            optimizer.step()\n\n            # calculate accuracy\n            _, predicted = torch.max(outputs.data, 1)\n            total += labels.size(0)\n            correct += (predicted == labels).sum().item()\n            acc = correct / total\n\n            # append accuracy and loss to the lists\n            accs.append(acc)\n            losses.append(loss.item())\n\n            # append predictions and labels to the lists\n            y_preds += predicted.cpu().detach().numpy().tolist()\n            y_trues += labels.cpu().detach().numpy().tolist()\n\n        print('Epoch [{}/{}], Loss: {:.4f}, Accuracy: {:.2f}%'\n              .format(epoch+1, num_epochs, loss.item(), acc*100))\n        \n        # calculate validation accuracy and loss\n        val_acc, val_loss = evaluate(model, test_loader, criterion)\n        print('Accuracy of the network on the validation set: %d %%' % (100 * val_acc))\n\n        # adjust learning rate based on validation loss\n        scheduler.step(val_loss)\n        \n    torch.save(model.state_dict(), model_name + '.pt')","metadata":{"execution":{"iopub.status.busy":"2023-10-14T21:27:56.557683Z","iopub.execute_input":"2023-10-14T21:27:56.558022Z","iopub.status.idle":"2023-10-14T23:48:03.092162Z","shell.execute_reply.started":"2023-10-14T21:27:56.557997Z","shell.execute_reply":"2023-10-14T23:48:03.091161Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"![](https://www.memecreator.org/static/images/memes/4748722.jpg)","metadata":{}},{"cell_type":"markdown","source":"![](https://assets.leetcode.com/users/images/26c10ed8-4af3-4b8e-9baa-9f486ad1ab0e_1674298298.8688552.webp)","metadata":{}}]}