{"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"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# **Cell Instance Segmentation**","metadata":{}},{"cell_type":"markdown","source":"github repo:\nhttps://github.com/mingxuanche99/cell-instance-segmentation","metadata":{}},{"cell_type":"markdown","source":"# Introduction\nCurrent solutions for instance segmentation of cells have limited accuracy for neuronal cells in particular. This could be because neuronal cells have a very unique, irregular and concave morphology, making them challenging to segment with commonly used mask heads. \nIn this project, we are applying segmentation on medical images with resolution of 704x520 of neuronal cells.We got 600 labeled neuronal cell images, using run length encoded masks as training annotations. The method we used including k-means, CNN, U-net and U-net with attention. This notebook shows ourwork","metadata":{}},{"cell_type":"markdown","source":"# **1.Importing the required libraries**","metadata":{}},{"cell_type":"markdown","source":"In this part, we import the required python libraries for this project, including pytorch,cv2, sklearn, pandas,numpy,matplotlib and so on.","metadata":{}},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd\nimport os\nimport torch\nfrom torch import nn\nfrom torch import optim\nfrom torch.utils.tensorboard import SummaryWriter\nfrom torch.utils.data import Dataset, DataLoader\nfrom torchvision import transforms\n# import torchvision.transforms.functional as TF\n\nimport random\nimport os, shutil\nimport numpy as np\nimport pandas as pd\nfrom PIL import Image\nfrom tqdm.auto import tqdm\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport os\nfrom os.path import join\nimport matplotlib.pyplot as plt\nplt.rcParams.update({'font.size': 18})\nimport cv2\n\nimport torch.nn.functional as F\nfrom torch.utils.data import DataLoader, Dataset, sampler\nfrom albumentations import (HorizontalFlip, VerticalFlip, ShiftScaleRotate, Normalize, Resize, Compose, GaussNoise)\n\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import accuracy_score, f1_score,roc_auc_score,recall_score,precision_score\n","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:21.711227Z","iopub.execute_input":"2021-12-15T01:26:21.711535Z","iopub.status.idle":"2021-12-15T01:26:23.167219Z","shell.execute_reply.started":"2021-12-15T01:26:21.711454Z","shell.execute_reply":"2021-12-15T01:26:23.166284Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **2.Data Loading and Preprocessing**","metadata":{}},{"cell_type":"markdown","source":"This part mainly completes the data loading, decoding the mask data and data augmentation. The dataset in our project including 2 parts, a csv file and a folder containing 606 images. In the csv file, each row contain a image id and annotation, the annotation can be decode as a mask, which reveals a true cell instance.","metadata":{}},{"cell_type":"markdown","source":"Data Source: https://www.kaggle.com/mingxuanche/sartorius-cell-instance-segmentation-pyt-19d48f/data","metadata":{}},{"cell_type":"markdown","source":"### Loading Data","metadata":{}},{"cell_type":"code","source":"data_train = pd.read_csv('../input/sartorius-cell-instance-segmentation/train.csv')","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:23.169409Z","iopub.execute_input":"2021-12-15T01:26:23.169740Z","iopub.status.idle":"2021-12-15T01:26:23.464786Z","shell.execute_reply.started":"2021-12-15T01:26:23.169698Z","shell.execute_reply":"2021-12-15T01:26:23.464017Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"data_train.head()","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:23.466302Z","iopub.execute_input":"2021-12-15T01:26:23.466563Z","iopub.status.idle":"2021-12-15T01:26:23.485916Z","shell.execute_reply.started":"2021-12-15T01:26:23.466528Z","shell.execute_reply":"2021-12-15T01:26:23.485273Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"DATA_PATH = '../input/sartorius-cell-instance-segmentation'\nTRAIN_CSV = join(DATA_PATH,'train.csv')\nTRAIN_PATH = join(DATA_PATH,'train')\ndf_train = pd.read_csv(TRAIN_CSV)\nprint(f'Training Set Shape: {df_train.shape} - {df_train[\"id\"].nunique()} \\\nImages - Memory Usage: {df_train.memory_usage().sum() / 1024 ** 2:.2f} MB')","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:23.487157Z","iopub.execute_input":"2021-12-15T01:26:23.487481Z","iopub.status.idle":"2021-12-15T01:26:23.778172Z","shell.execute_reply.started":"2021-12-15T01:26:23.487444Z","shell.execute_reply":"2021-12-15T01:26:23.777357Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Decoding data and build masks for all images","metadata":{}},{"cell_type":"code","source":"def rle_decode(mask_rle, shape, color=1):\n    '''\n    mask_rle: run-length as string formated (start length)\n    shape: (height,width) of array to return \n    Returns numpy array, 1 - mask, 0 - background\n\n    '''\n    s = mask_rle.split()\n    starts, lengths = [np.asarray(x, dtype=int) for x in (s[0:][::2], s[1:][::2])]\n    starts -= 1\n    ends = starts + lengths\n    img = np.zeros(shape[0] * shape[1], dtype=np.float32)\n    for lo, hi in zip(starts, ends):\n        img[lo : hi] = color\n    return img.reshape(shape)\ndef build_masks(df_train, image_id, input_shape):\n    height, width = input_shape\n    labels = df_train[df_train[\"id\"] == image_id][\"annotation\"].tolist()\n    mask = np.zeros((height, width))\n    for label in labels:\n        mask += rle_decode(label, shape=(height, width))\n    mask = mask.clip(0, 1)\n    return np.array(mask)\n","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:23.780228Z","iopub.execute_input":"2021-12-15T01:26:23.780424Z","iopub.status.idle":"2021-12-15T01:26:23.792488Z","shell.execute_reply.started":"2021-12-15T01:26:23.780400Z","shell.execute_reply":"2021-12-15T01:26:23.791611Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Data processing and augmentation","metadata":{}},{"cell_type":"code","source":"class CellDataset(Dataset):\n    def __init__(self, df: pd.core.frame.DataFrame, train:bool):\n        self.IMAGE_RESIZE = (224, 224)\n        self.RESNET_MEAN = (0.485, 0.456, 0.406)\n        self.RESNET_STD = (0.229, 0.224, 0.225)\n        self.df = df\n        self.base_path = TRAIN_PATH\n        self.gb = self.df.groupby('id')\n        self.transforms = Compose([Resize(self.IMAGE_RESIZE[0],  self.IMAGE_RESIZE[1]),\n                                   Normalize(mean=self.RESNET_MEAN, std= self.RESNET_STD, p=1),\n                                   HorizontalFlip(p=0.5),\n                                   VerticalFlip(p=0.5)])\n        \n        # Split train and val set\n        all_image_ids = np.array(df_train.id.unique())\n        np.random.seed(42)\n#         iperm = np.random.permutation(len(all_image_ids))\n        num_train_samples = int(len(all_image_ids) * 0.9)\n\n        if train:\n            self.image_ids = all_image_ids[:num_train_samples]\n        else:\n             self.image_ids = all_image_ids[num_train_samples:]\n\n    def __getitem__(self, idx: int) -> dict:\n\n        image_id = self.image_ids[idx]\n        df = self.gb.get_group(image_id)\n\n        # Read image\n        image_path = os.path.join(self.base_path, image_id + \".png\")\n        image = cv2.imread(image_path)\n\n        # Create the mask\n        mask = build_masks(df_train, image_id, input_shape=(520, 704))\n        mask = (mask >= 1).astype('float32')\n        augmented = self.transforms(image=image, mask=mask)\n        image = augmented['image']\n        mask = augmented['mask']\n        # print(np.moveaxis(image,0,2).shape)\n        return np.moveaxis(np.array(image),2,0), mask.reshape((1, self.IMAGE_RESIZE[0], self.IMAGE_RESIZE[1]))\n\n\n    def __len__(self):\n        return len(self.image_ids)","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:23.794007Z","iopub.execute_input":"2021-12-15T01:26:23.794369Z","iopub.status.idle":"2021-12-15T01:26:23.808499Z","shell.execute_reply.started":"2021-12-15T01:26:23.794324Z","shell.execute_reply":"2021-12-15T01:26:23.807713Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ds_train = CellDataset(df_train, train=True)\ndl_train = DataLoader(ds_train, batch_size=16, num_workers=2, pin_memory=True, shuffle=False)","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:23.809928Z","iopub.execute_input":"2021-12-15T01:26:23.810227Z","iopub.status.idle":"2021-12-15T01:26:23.827491Z","shell.execute_reply.started":"2021-12-15T01:26:23.810189Z","shell.execute_reply":"2021-12-15T01:26:23.826684Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"ds_test = CellDataset(df_train, train=False)\ndl_test = DataLoader(ds_test, batch_size=4, num_workers=2, pin_memory=True, shuffle=False)\n","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:23.830635Z","iopub.execute_input":"2021-12-15T01:26:23.830867Z","iopub.status.idle":"2021-12-15T01:26:23.841988Z","shell.execute_reply.started":"2021-12-15T01:26:23.830837Z","shell.execute_reply":"2021-12-15T01:26:23.841229Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# **3.Data explore and Visualization**","metadata":{}},{"cell_type":"code","source":"df_train=data_train\ndf_train.head()","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:23.843703Z","iopub.execute_input":"2021-12-15T01:26:23.844197Z","iopub.status.idle":"2021-12-15T01:26:23.860666Z","shell.execute_reply.started":"2021-12-15T01:26:23.844157Z","shell.execute_reply":"2021-12-15T01:26:23.859755Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_train.info()","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:23.862456Z","iopub.execute_input":"2021-12-15T01:26:23.863005Z","iopub.status.idle":"2021-12-15T01:26:23.927516Z","shell.execute_reply.started":"2021-12-15T01:26:23.862967Z","shell.execute_reply":"2021-12-15T01:26:23.926716Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Image Information\nFrom the `train.csv`, all the images have the same shape *704 x 520* which contains no variable image resolution problem. However, there is only 606 images in the tarin set. The number of rows in this file is far more than 606 which indicates there are more than 1 instances in 1 image.","metadata":{}},{"cell_type":"code","source":"print(f'Number of images: {df_train.id.nunique()}')","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:23.928947Z","iopub.execute_input":"2021-12-15T01:26:23.929199Z","iopub.status.idle":"2021-12-15T01:26:23.940726Z","shell.execute_reply.started":"2021-12-15T01:26:23.929165Z","shell.execute_reply":"2021-12-15T01:26:23.939717Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"The number of instances in each image is different which varys from 4 to 790.","metadata":{}},{"cell_type":"code","source":"fig, ax = plt.subplots()\n\nninstances_per_image = df_train[['id']].value_counts().sort_values()\nninstances_per_image.index = range(606)\nninstances_per_image.median()\nninstances_per_image.plot.bar(ax=ax)\n\nax.set_xticklabels([])\nax.set_xlabel('Images')\nax.set_ylabel('Number of Instances')\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:23.941997Z","iopub.execute_input":"2021-12-15T01:26:23.944800Z","iopub.status.idle":"2021-12-15T01:26:27.355252Z","shell.execute_reply.started":"2021-12-15T01:26:23.944761Z","shell.execute_reply":"2021-12-15T01:26:27.354520Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Observing this data, it is easy to find each image is associated with a unique cell type. Those types are cort (neurons), shsy5y (neuroblastoma) and astro (astrocytes).","metadata":{}},{"cell_type":"code","source":"fig, ax = plt.subplots(1, 1)\ndf_train.groupby(['id','cell_type'])['cell_type'].first().value_counts().plot.bar(ax=ax)\nax.set_ylabel('Number of Images')\nax.set_xlabel('Cell Types')\nfig.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:27.357456Z","iopub.execute_input":"2021-12-15T01:26:27.357929Z","iopub.status.idle":"2021-12-15T01:26:27.580267Z","shell.execute_reply.started":"2021-12-15T01:26:27.357886Z","shell.execute_reply":"2021-12-15T01:26:27.579200Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### 3.2 Image\nHere we first show 3 image of each cell types, then randomly show 9 image, then show the relationship of image and mask.","metadata":{}},{"cell_type":"code","source":"def decode_rle_mask(rle_mask, shape):\n\n    rle_mask = rle_mask.split()\n    starts, lengths = [np.asarray(x, dtype=int) for x in (rle_mask[0:][::2], rle_mask[1:][::2])]\n    starts -= 1\n    ends = starts + lengths\n\n    mask = np.zeros((shape[0] * shape[1]), dtype=np.uint8)\n    for start, end in zip(starts, ends):\n        mask[start:end] = 1\n\n    mask = mask.reshape(shape[0], shape[1])\n    return mask\n\ndef visualize_image(df, image_id):   \n    image_path = df.loc[df['id'] == image_id, 'id'].values[0]\n    cell_type = df.loc[df['id'] == image_id, 'cell_type'].values[0]\n    plate_time = df.loc[df['id'] == image_id, 'plate_time'].values[0]\n    sample_date = df.loc[df['id'] == image_id, 'sample_date'].values[0]\n    sample_id = df.loc[df['id'] == image_id, 'sample_id'].values[0]\n\n    image = cv2.imread(f'../input/sartorius-cell-instance-segmentation/train/{image_path}.png')\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\n\n    fig, axes = plt.subplots(figsize=(10, 10), ncols=2)\n    fig.tight_layout(pad=5.0)\n    \n    axes[0].imshow(image, cmap='gray')\n    masks = []\n    for mask in df.loc[df['id'] == image_id, 'annotation'].values:\n        decoded_mask = decode_rle_mask(rle_mask=mask, shape=image.shape)\n        masks.append(decoded_mask)\n    mask = np.stack(masks)\n    mask = np.any(mask == 1, axis=0)\n    axes[1].imshow(image, cmap='gray')\n    axes[1].imshow(mask, alpha=0.4)\n\n    for i in range(2):\n        axes[i].set_xlabel('')\n        axes[i].set_ylabel('')\n        axes[i].tick_params(axis='x', labelsize=10, pad=10)\n        axes[i].tick_params(axis='y', labelsize=10, pad=10)\n        \n    axes[0].set_title(f'{image_path} - {cell_type} Annotations\\n{plate_time} - {sample_date} - {sample_id}', fontsize=10, pad=12)\n    axes[1].set_title('Segmentation Mask', fontsize=10, pad=12)\n    plt.show()\n    plt.close(fig)","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:27.587935Z","iopub.execute_input":"2021-12-15T01:26:27.588310Z","iopub.status.idle":"2021-12-15T01:26:27.608476Z","shell.execute_reply.started":"2021-12-15T01:26:27.588268Z","shell.execute_reply":"2021-12-15T01:26:27.607834Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### astro cells","metadata":{}},{"cell_type":"code","source":"select_image_ids = []\nselect_image_ids.append(df_train.loc[df_train['cell_type'] == 'astro', 'id'].sample(1).to_list()[0])\nselect_image_ids.append(df_train.loc[df_train['cell_type'] == 'astro', 'id'].sample(2).to_list()[0])\nselect_image_ids.append(df_train.loc[df_train['cell_type'] == 'astro', 'id'].sample(3).to_list()[0])\n\nfor image_id in select_image_ids:\n     visualize_image(df=df_train, image_id=image_id)","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:27.609982Z","iopub.execute_input":"2021-12-15T01:26:27.610899Z","iopub.status.idle":"2021-12-15T01:26:29.685208Z","shell.execute_reply.started":"2021-12-15T01:26:27.610854Z","shell.execute_reply":"2021-12-15T01:26:29.684513Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### cort cells","metadata":{}},{"cell_type":"code","source":"select_image_ids = []\nselect_image_ids.append(df_train.loc[df_train['cell_type'] == 'cort', 'id'].sample(1).to_list()[0])\nselect_image_ids.append(df_train.loc[df_train['cell_type'] == 'cort', 'id'].sample(2).to_list()[0])\nselect_image_ids.append(df_train.loc[df_train['cell_type'] == 'cort', 'id'].sample(3).to_list()[0])\n\nfor image_id in select_image_ids:\n     visualize_image(df=df_train, image_id=image_id)","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:29.686652Z","iopub.execute_input":"2021-12-15T01:26:29.687125Z","iopub.status.idle":"2021-12-15T01:26:31.329287Z","shell.execute_reply.started":"2021-12-15T01:26:29.687086Z","shell.execute_reply":"2021-12-15T01:26:31.328528Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"#### shsy5y cell","metadata":{}},{"cell_type":"code","source":"select_image_ids = []\nselect_image_ids.append(df_train.loc[df_train['cell_type'] == 'shsy5y', 'id'].sample(1).to_list()[0])\nselect_image_ids.append(df_train.loc[df_train['cell_type'] == 'shsy5y', 'id'].sample(2).to_list()[0])\nselect_image_ids.append(df_train.loc[df_train['cell_type'] == 'shsy5y', 'id'].sample(3).to_list()[0])\n\nfor image_id in select_image_ids:\n     visualize_image(df=df_train, image_id=image_id)","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:31.330890Z","iopub.execute_input":"2021-12-15T01:26:31.331400Z","iopub.status.idle":"2021-12-15T01:26:33.548765Z","shell.execute_reply.started":"2021-12-15T01:26:31.331357Z","shell.execute_reply":"2021-12-15T01:26:33.548019Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Random image","metadata":{}},{"cell_type":"code","source":"def imshow(num_to_show=9):\n    \n    plt.figure(figsize=(20,20))\n    \n    for i in range(num_to_show):\n        plt.subplot(3, 3, i+1)\n        plt.grid(False)\n        plt.xticks([])\n        plt.yticks([])\n        \n        img = mpimg.imread(f'../input/sartorius-cell-instance-segmentation/train/{data_train.iloc[i*500,0]}.png')\n        plt.imshow(img, cmap='plasma')\n\nimshow()","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:33.549953Z","iopub.execute_input":"2021-12-15T01:26:33.550324Z","iopub.status.idle":"2021-12-15T01:26:35.019890Z","shell.execute_reply.started":"2021-12-15T01:26:33.550289Z","shell.execute_reply":"2021-12-15T01:26:35.019172Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Relationship between image and mask","metadata":{}},{"cell_type":"code","source":"# plot simages and mask from dataloader\nbatch = next(iter(dl_train))\nimages, masks = batch\nprint(f\"image shape: {images.shape},\\nmask shape:{masks.shape},\\nbatch len: {len(batch)}\")\nk=11\nplt.figure(figsize=(20, 20))\n        \nplt.subplot(1, 3, 1)\nplt.xticks([])\nplt.yticks([])\nplt.imshow(images[k][0])\nplt.title('Original image')\n\nplt.subplot( 1, 3, 2)\nplt.xticks([])\nplt.yticks([])\nplt.imshow(masks[k][0])\nplt.title('Mask')\n\nplt.subplot( 1, 3, 3)\nplt.xticks([])\nplt.yticks([])\nplt.imshow(images[k][0])\nplt.imshow(masks[k][0],alpha=0.2)\nplt.title('Both')\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:35.021138Z","iopub.execute_input":"2021-12-15T01:26:35.021487Z","iopub.status.idle":"2021-12-15T01:26:42.843117Z","shell.execute_reply.started":"2021-12-15T01:26:35.021454Z","shell.execute_reply":"2021-12-15T01:26:42.839053Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 4.K-means","metadata":{}},{"cell_type":"markdown","source":"In this part, we use k-means to achieve cell instance segmentation task.","metadata":{}},{"cell_type":"markdown","source":"### Helper class to load data, transfer mask to RLE, and binarization images.","metadata":{}},{"cell_type":"code","source":"class RLE:\n    def __init__(self):\n        return\n    def mask2rle(self, img):\n        '''\n        Efficient implementation of mask2rle, from @paulorzp\n        --\n        img: numpy array, 1 - mask, 0 - background\n        Returns run length as string formated\n        Source: https://www.kaggle.com/xhlulu/efficient-mask2rle\n        '''\n        pixels = img.T.flatten()\n        pixels = np.pad(pixels, ((1, 1),))\n        runs = np.where(pixels[1:] != pixels[:-1])[0] + 1\n        runs[1::2] -= runs[::2]\n        return ' '.join(str(x) for x in runs)\n\n\n    def rle_decode(self, mask_rle, shape, color=1):\n        '''\n        mask_rle: run-length as string formated (start length)\n        shape: (height, width, channels) of array to return\n        color: color for the mask\n        Returns numpy array (mask)\n\n        '''\n        s = mask_rle.split()\n        starts = list(map(lambda x: int(x) - 1, s[0::2]))\n        lengths = list(map(int, s[1::2]))\n        ends = [x + y for x, y in zip(starts, lengths)]\n\n        img = np.zeros((shape[0] * shape[1], shape[2]), dtype=np.float32)\n\n        for start, end in zip(starts, ends):\n            img[start: end] = color\n\n        return img.reshape(shape)\n    \n    def loadData(self):\n#         df = pd.read_csv(f'../input/sartorius-cell-instance-segmentation/train.csv')\n        df = df_train\n        df['image_path'] = TRAIN_PATH + '/' + df['id'] + '.png'\n        # data = df.head(2)\n        # labels = ['id', 'annotation', 'width', 'height', 'cell_type',\n        #           'plate_time', 'sample_date', 'sample_id', 'elapsed_timedelta']\n        # annotation = df['annotation']\n        tmp_df = df.drop_duplicates(subset=[\"id\", \"image_path\"]).reset_index(drop=True)\n        tmp_df[\"annotation\"] = df.groupby(\"id\")[\"annotation\"].agg(list).reset_index(drop=True)\n        df = tmp_df.copy()\n#         print(df['image_path'][20])\n        return df\n    \n    def show(self, winname, src):\n        cv2.namedWindow(winname, cv2.WINDOW_GUI_NORMAL)\n        cv2.imshow(winname, src)\n    #     cv2.waitKey()\n    \n    def thre_method(self, img_src):\n        ret, thresh = cv2.threshold(img_src, 127, 255, cv2.THRESH_BINARY)\n        thresh_gray = cv2.cvtColor(thresh, cv2.COLOR_BGR2GRAY)\n        return thresh_gray","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:42.845389Z","iopub.execute_input":"2021-12-15T01:26:42.845697Z","iopub.status.idle":"2021-12-15T01:26:42.862724Z","shell.execute_reply.started":"2021-12-15T01:26:42.845641Z","shell.execute_reply":"2021-12-15T01:26:42.861976Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Implement K-means clustering, and caculate accuracy and F1 score of results.","metadata":{}},{"cell_type":"code","source":"rle = RLE()\n    \ndef Kmeans(data, imageIndex):\n    print(data['image_path'][1])\n    fileName = data['image_path'][imageIndex]\n    img = cv2.imread(fileName)\n\n    plt.subplot(1, 3, 1)\n    plt.xticks([])\n    plt.yticks([])\n    plt.imshow(img)\n    plt.title('Original image')\n    \n    img = cv2.fastNlMeansDenoising(img, 10, 10, 7, 21)\n\n\n    data = img.reshape((-1, 3))\n    data = np.float32(data)\n    \n    # set parameters of K-means\n    critera = (cv2.TermCriteria_EPS+cv2.TermCriteria_MAX_ITER, 10, 0.1)\n    flags = cv2.KMEANS_RANDOM_CENTERS\n    \n    # Implement K-means\n    r, best, center = cv2.kmeans(data, 4, None, criteria=critera, attempts=10, flags=flags)\n\n    center = np.uint8(center)\n\n    # set different color to the image\n    data[best.ravel() == 0] = (0, 0, 0)\n    data[best.ravel() == 1] = (0, 0, 255)\n    data[best.ravel() == 2] = (255, 0, 0)\n    data[best.ravel() == 3] = (255, 255, 255)\n\n    data = np.uint8(data)\n    oi = data.reshape((img.shape))\n\n    # show image\n    plt.subplot(1, 3, 2)\n    plt.xticks([])\n    plt.yticks([])\n    plt.imshow(oi)\n    plt.title('K-means')\n\n    thre = rle.thre_method(oi)\n\n    contours, _ = cv2.findContours(thre, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)\n    # make a mask\n    img_mask = np.zeros(thre.shape, np.uint8)\n    \n    cv2.drawContours(img_mask, contours, -1, (255, 255, 255), -1)\n\n    # kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))\n    # img_mask = cv.morphologyEx(img_mask, cv.MORPH_OPEN, kernel)\n\n    plt.subplot(1, 3, 3)\n    plt.xticks([])\n    plt.yticks([])\n    plt.imshow(img_mask)\n    plt.title('Mask img')\n    plt.show()\n    flat_image = img_mask.flatten()\n    r = list(rle.mask2rle(img_mask))\n\n    return r, flat_image\n\n\ndef accuracy(index):\n    data = rle.loadData()\n    _, labels = testKmeans(index)\n    _, predicted = Kmeans(data, index)\n    acc = accuracy_score(labels, predicted)\n    print('acc:', acc)\n    black_img = np.zeros([520, 704], dtype=np.uint8)\n    black_img = black_img.flatten()\n    acc_blk = accuracy_score(labels, black_img)\n#     print('blk acc:', acc_blk)\n    f1_blk = f1_score(labels, black_img, average='macro')\n    f1 = f1_score(labels, predicted, average='macro')\n    print('f1:', f1)\n#     print('f1_black:', f1_blk)\n    \n\ndef testKmeans(imageIndex):\n\n    shape = (520, 704, 3)\n    data = rle.loadData()\n    lens = 0\n    for i in range(len(data['annotation'][imageIndex])):\n        if i == 0:\n            mask = rle.rle_decode(data['annotation'][imageIndex][i], shape)\n            lens = len(data['annotation'][imageIndex][i])\n        else:\n            mask = cv2.add(mask, rle.rle_decode(data['annotation'][imageIndex][i], shape))\n            lens += len(data['annotation'][imageIndex][i])\n        fileName = data['image_path'][imageIndex]\n        \n    img = cv2.imread(fileName)\n    mask *= 255.0\n    mask = mask.astype(np.uint8)\n\n    mask_img = cv2.addWeighted(img, 1, mask, 0.2, 0)\n\n#     cv2.imshow('origin', img)\n#     cv2.imshow('mask', mask)\n#     cv2.imshow('mask img', mask_img)\n    plt.figure(figsize=(15,15))\n    plt.subplot(1, 3, 1)\n    plt.xticks([])\n    plt.yticks([])\n    plt.imshow(img)\n    plt.title('Original image')\n    \n    plt.subplot(1, 3, 2)\n    plt.xticks([])\n    plt.yticks([])\n    plt.imshow(mask)\n    plt.title('Annotation Mask')\n    \n    plt.subplot(1, 3, 3)\n    plt.xticks([])\n    plt.yticks([])\n    plt.imshow(mask_img)\n    plt.title('Mask image')\n\n    mask = cv2.cvtColor(mask, cv2.COLOR_RGB2GRAY)\n    flat_mask = mask.flatten()\n\n    return mask, flat_mask\n\n\nrle = RLE()\nimageIndex = 15\n# mask, flat_mask = testKmeans(imageIndex)\naccuracy(imageIndex)","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:42.864126Z","iopub.execute_input":"2021-12-15T01:26:42.864484Z","iopub.status.idle":"2021-12-15T01:26:45.870831Z","shell.execute_reply.started":"2021-12-15T01:26:42.864442Z","shell.execute_reply":"2021-12-15T01:26:45.869994Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Evaluation of K-means clustering","metadata":{}},{"cell_type":"markdown","source":"### 1.Noising","metadata":{}},{"cell_type":"markdown","source":"For instance, when cells are hiding in lots of noise dots, it's tough for K-means to tell apart cells from noise dots. We try to eliminate image noise by performing morphological processing, such as combining expansion and corrosion, namely, open and closed operations, and to obtain the main object in the image, it turns out that in the images with less noise, the contours of some cells are lost in the open and closed operations, while for the images with the noise close to the cell contour shape, a large area of the cell contour is fused into a whole piece.","metadata":{}},{"cell_type":"markdown","source":"### 2.Mis-classification\nFor the parameter K = 4, the contour, background and some internal structures are classified respectively, however, some images can't be classified correctly, since they have less internal structure than usual images. ","metadata":{}},{"cell_type":"markdown","source":"### 3.Generalization\nBesides, the generalization of K-means is not good, for we don't actually know the logic of annotation which is labeled by professionals. K-means can only get the contour of most of cells, without considering the inner logic of segmentation.","metadata":{}},{"cell_type":"markdown","source":"# **5.CNN**","metadata":{}},{"cell_type":"markdown","source":"Here, we use CNN to achieve cell instance segmentation task. In this task, the input of CNN is the original image, and the output should be the mask image. In this part, four layers of fully convolutional network was used to extract feature and output mask.","metadata":{}},{"cell_type":"markdown","source":"### Implement of CNN model","metadata":{}},{"cell_type":"code","source":"class CNN(nn.Module):\n    def __init__(self, in_channels, num_classes):\n        super(CNN, self).__init__()\n        self.cov1=nn.Conv2d(in_channels, 20, kernel_size=5, padding=\"same\")\n        self.btn=nn.BatchNorm2d(20)\n        self.relu=nn.ReLU()\n        self.cov2=nn.Conv2d(20, 10, kernel_size=1)\n        self.cov3=nn.Conv2d(10, 10, kernel_size=5, padding=\"same\")\n        self.btn2=nn.BatchNorm2d(10)\n        self.cov4=nn.Conv2d(10, num_classes, kernel_size=1)\n        self.sigmod=nn.Sigmoid()\n        \n    def forward(self, x):\n        # print(x.shape)\n        x1 = self.cov1(x)\n        # print(x1.shape)\n        x2 = self.btn(x1)\n        # print(x2.shape)\n        x3 = self.relu(x2)\n        # print(x3.shape)\n        x4 = self.cov2(x3)\n        # print(x4.shape)\n        x5 = self.cov3(x4)\n        # print(x5.shape)\n        # print('up')\n        x = self.btn2(x4)\n        # print(x.shape)\n        x = self.relu(x)\n        # print(x.shape)\n        x = self.cov4(x)\n        # print(x.shape)\n        x = self.sigmod(x)\n        # print(x.shape)\n        return x","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:45.872202Z","iopub.execute_input":"2021-12-15T01:26:45.872552Z","iopub.status.idle":"2021-12-15T01:26:45.882333Z","shell.execute_reply.started":"2021-12-15T01:26:45.872509Z","shell.execute_reply":"2021-12-15T01:26:45.881234Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu')\n# device=torch.device('cpu')","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:45.884073Z","iopub.execute_input":"2021-12-15T01:26:45.884344Z","iopub.status.idle":"2021-12-15T01:26:45.899927Z","shell.execute_reply.started":"2021-12-15T01:26:45.884307Z","shell.execute_reply":"2021-12-15T01:26:45.899191Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Implement of training loop and evaluate loop ","metadata":{}},{"cell_type":"code","source":"!pip install livelossplot==0.3.4\nfrom livelossplot import PlotLosses\n\nliveloss = PlotLosses()\ndef train_loop(model, optimizer, criterion, train_loader, device=device):\n    running_loss = 0\n    model.train()\n    pbar = tqdm(train_loader, desc='Iterating over train data')\n    \n    for imgs, masks in pbar:\n        # pass to device\n        imgs = imgs.to(device)\n        masks = masks.to(device)\n        # forward\n        out = model(imgs)\n        loss = criterion(out, masks)\n        running_loss += loss.item()*imgs.shape[0]  # += loss * current batch size\n        \n        # optimize\n        optimizer.zero_grad()\n        loss.backward()\n        optimizer.step()\n    running_loss /= len(train_loader.sampler)\n    return running_loss","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:45.901010Z","iopub.execute_input":"2021-12-15T01:26:45.901612Z","iopub.status.idle":"2021-12-15T01:26:53.920822Z","shell.execute_reply.started":"2021-12-15T01:26:45.901557Z","shell.execute_reply":"2021-12-15T01:26:53.919976Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def eval_loop(model, criterion, eval_loader, device=device):\n    running_loss = 0\n    model.eval()\n    with torch.no_grad():\n        accuracy, f1_scores = [],[]\n        pbar = tqdm(eval_loader, desc='Iterating over evaluation data')\n        \n        for imgs, masks in pbar:\n            # pass to device\n            li=imgs\n            lm=masks\n            imgs = imgs.to(device)\n            masks = masks.to(device)\n            # forward\n            out = model(imgs)\n#             print(out.shape)\n            loss = criterion(out, masks)\n            running_loss += loss.item()*imgs.shape[0]\n            \n            # calculate predictions using output\n            predicted = (out > 0.5).float()\n            predicted = predicted.view(-1).cpu().numpy()\n            labels = masks.view(-1).cpu().numpy()\n            accuracy.append(accuracy_score(labels, predicted))\n            f1_scores.append(f1_score(labels, predicted))\n            \n    acc = sum(accuracy)/len(accuracy)\n    f1 = sum(f1_scores)/len(f1_scores)\n    running_loss /= len(eval_loader.sampler)\n    return {\n        'accuracy':acc,\n        'f1_macro':f1, \n        'loss':running_loss,\n        'img': li,\n        'masks': lm,\n        'out':out\n    }","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:53.923178Z","iopub.execute_input":"2021-12-15T01:26:53.923458Z","iopub.status.idle":"2021-12-15T01:26:53.933940Z","shell.execute_reply.started":"2021-12-15T01:26:53.923419Z","shell.execute_reply":"2021-12-15T01:26:53.933012Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def train(model, optimizer, criterion, train_loader, valid_loader,\n          device=device, \n          num_epochs=25, \n          valid_loss_min=np.inf,\n          logdir='logdir'):\n    \n    tb_writer = SummaryWriter(log_dir=logdir)\n    val_loss_list = []\n    for e in range(num_epochs):\n        # train for epoch\n        train_loss = train_loop(\n            model, optimizer, criterion, train_loader, device=device)\n        # evaluate on validation set\n        metrics = eval_loop(\n            model, criterion, valid_loader, device=device\n        )\n        # show progress\n        print_string = f'Epoch: {e+1} '\n        print_string+= f'TrainLoss: {train_loss:.5f} '\n        print_string+= f'ValidLoss: {metrics[\"loss\"]:.5f} '\n        print_string+= f'ACC: {metrics[\"accuracy\"]:.5f} '\n        print_string+= f'F1: {metrics[\"f1_macro\"]:.3f}'\n        liveloss.update({'Training loss': metrics[\"loss\"],'Accuracy': metrics[\"accuracy\"]})\n        liveloss.draw()\n        # Tensorboards Logging\n        tb_writer.add_scalar('UNet/Train Loss', train_loss, e)\n        tb_writer.add_scalar('UNet/Valid Loss', metrics[\"loss\"], e)\n        tb_writer.add_scalar('UNet/Accuracy', metrics[\"accuracy\"], e)\n        tb_writer.add_scalar('UNet/F1 Macro', metrics[\"f1_macro\"], e)\n\n        # save the model \n        if metrics[\"loss\"] <= valid_loss_min:\n            torch.save(model.state_dict(), 'model.pt')\n            valid_loss_min = metrics[\"loss\"]","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:53.935540Z","iopub.execute_input":"2021-12-15T01:26:53.936004Z","iopub.status.idle":"2021-12-15T01:26:53.946817Z","shell.execute_reply.started":"2021-12-15T01:26:53.935832Z","shell.execute_reply":"2021-12-15T01:26:53.946082Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Train and evaluted","metadata":{}},{"cell_type":"code","source":"model1 = CNN(3, 1).to(device)\noptimizer = optim.Adam(model1.parameters(), lr=0.01)\ncriterion = nn.BCELoss()\ntrain(model1, optimizer, criterion, dl_train, dl_test)","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:26:53.948215Z","iopub.execute_input":"2021-12-15T01:26:53.949378Z","iopub.status.idle":"2021-12-15T01:53:22.942836Z","shell.execute_reply.started":"2021-12-15T01:26:53.949346Z","shell.execute_reply":"2021-12-15T01:53:22.941901Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Load the latest model\nmodel1.load_state_dict(torch.load('model.pt'))\nmetrics = eval_loop(model1, criterion, dl_test)\n\nprint('accuracy:', metrics['accuracy'])\nprint('f1 macro:', metrics['f1_macro'])\nprint('test loss:', metrics['loss'])","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:53:22.945196Z","iopub.execute_input":"2021-12-15T01:53:22.945737Z","iopub.status.idle":"2021-12-15T01:53:28.921568Z","shell.execute_reply.started":"2021-12-15T01:53:22.945676Z","shell.execute_reply":"2021-12-15T01:53:28.920638Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 6.Unet","metadata":{}},{"cell_type":"markdown","source":"Here, we use Unet to achieve cell instance segmentation task. The input and output are same as CNN. U-net is based on the expansion and modification of a fully convolutional network. The network consists of two parts: a contracting path to obtain contextual information and a symmetric expanding path to accurately locate.","metadata":{}},{"cell_type":"markdown","source":"### Implement of Unet","metadata":{}},{"cell_type":"code","source":"class conv_block(nn.Module):\n    \"\"\"\n    Convolution Block \n    \"\"\"\n    def __init__(self, in_ch, out_ch):\n        super(conv_block, self).__init__()\n        \n        self.conv = nn.Sequential(\n            nn.Conv2d(in_ch, out_ch, kernel_size=3, stride=1, padding=1, bias=True),\n            nn.BatchNorm2d(out_ch),\n            nn.ReLU(inplace=True),\n            nn.Conv2d(out_ch, out_ch, kernel_size=3, stride=1, padding=1, bias=True),\n            nn.BatchNorm2d(out_ch),\n            nn.ReLU(inplace=True))\n\n    def forward(self, x):\n\n        x = self.conv(x)\n        return x\n\n\nclass up_conv(nn.Module):\n    \"\"\"\n    Up Convolution Block\n    \"\"\"\n    def __init__(self, in_ch, out_ch):\n        super(up_conv, self).__init__()\n        self.up = nn.Sequential(\n            nn.Upsample(scale_factor=2),\n            nn.Conv2d(in_ch, out_ch, kernel_size=3, stride=1, padding=1, bias=True),\n            nn.BatchNorm2d(out_ch),\n            nn.ReLU(inplace=True)\n        )\n\n    def forward(self, x):\n        x = self.up(x)\n        return x","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:53:28.925103Z","iopub.execute_input":"2021-12-15T01:53:28.925340Z","iopub.status.idle":"2021-12-15T01:53:28.938336Z","shell.execute_reply.started":"2021-12-15T01:53:28.925306Z","shell.execute_reply":"2021-12-15T01:53:28.937629Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class U_Net(nn.Module):\n    \"\"\"\n    UNet - Basic Implementation\n    Paper : https://arxiv.org/abs/1505.04597\n    \"\"\"\n    def __init__(self, in_ch=3, out_ch=1):\n        super(U_Net, self).__init__()\n\n        n1 = 64\n        filters = [n1, n1 * 2, n1 * 4, n1 * 8, n1 * 16]\n        \n        self.Maxpool1 = nn.MaxPool2d(kernel_size=2, stride=2)\n        self.Maxpool2 = nn.MaxPool2d(kernel_size=2, stride=2)\n        self.Maxpool3 = nn.MaxPool2d(kernel_size=2, stride=2)\n        self.Maxpool4 = nn.MaxPool2d(kernel_size=2, stride=2)\n\n        self.Conv1 = conv_block(in_ch, filters[0])\n        self.Conv2 = conv_block(filters[0], filters[1])\n        self.Conv3 = conv_block(filters[1], filters[2])\n        self.Conv4 = conv_block(filters[2], filters[3])\n        self.Conv5 = conv_block(filters[3], filters[4])\n\n        self.Up5 = up_conv(filters[4], filters[3])\n        self.Up_conv5 = conv_block(filters[4], filters[3])\n\n        self.Up4 = up_conv(filters[3], filters[2])\n        self.Up_conv4 = conv_block(filters[3], filters[2])\n\n        self.Up3 = up_conv(filters[2], filters[1])\n        self.Up_conv3 = conv_block(filters[2], filters[1])\n\n        self.Up2 = up_conv(filters[1], filters[0])\n        self.Up_conv2 = conv_block(filters[1], filters[0])\n\n        self.Conv = nn.Conv2d(filters[0], out_ch, kernel_size=1, stride=1, padding=0)\n\n        self.active = torch.nn.Sigmoid()\n\n    def forward(self, x):\n\n        e1 = self.Conv1(x)\n\n        e2 = self.Maxpool1(e1)\n        e2 = self.Conv2(e2)\n\n        e3 = self.Maxpool2(e2)\n        e3 = self.Conv3(e3)\n\n        e4 = self.Maxpool3(e3)\n        e4 = self.Conv4(e4)\n\n        e5 = self.Maxpool4(e4)\n        e5 = self.Conv5(e5)\n\n        d5 = self.Up5(e5)\n        d5 = torch.cat((e4, d5), dim=1)\n\n        d5 = self.Up_conv5(d5)\n\n        d4 = self.Up4(d5)\n        d4 = torch.cat((e3, d4), dim=1)\n        d4 = self.Up_conv4(d4)\n\n        d3 = self.Up3(d4)\n        d3 = torch.cat((e2, d3), dim=1)\n        d3 = self.Up_conv3(d3)\n\n        d2 = self.Up2(d3)\n        d2 = torch.cat((e1, d2), dim=1)\n        d2 = self.Up_conv2(d2)\n\n        out = self.Conv(d2)\n        out = self.active(out)\n\n        return out","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:53:28.939476Z","iopub.execute_input":"2021-12-15T01:53:28.939888Z","iopub.status.idle":"2021-12-15T01:53:28.959944Z","shell.execute_reply.started":"2021-12-15T01:53:28.939700Z","shell.execute_reply":"2021-12-15T01:53:28.959136Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Training and evaluation","metadata":{}},{"cell_type":"code","source":"# set_seed(21)\nmodel2 = U_Net(3, 1).to(device)\noptimizer = optim.Adam(model2.parameters(), lr=0.01)\ncriterion = nn.BCELoss()\ntrain(model2, optimizer, criterion, dl_train, dl_test)","metadata":{"execution":{"iopub.status.busy":"2021-12-15T01:53:28.961121Z","iopub.execute_input":"2021-12-15T01:53:28.961439Z","iopub.status.idle":"2021-12-15T02:21:56.451975Z","shell.execute_reply.started":"2021-12-15T01:53:28.961403Z","shell.execute_reply":"2021-12-15T02:21:56.451236Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"In order to make it easier to compare the methods, in this two picture, epoch 0-25 belongs to CNN,epoch 26-50 belong to Unet.","metadata":{}},{"cell_type":"code","source":"# Load the latest model\nmodel2.load_state_dict(torch.load('model.pt'))\nmetrics = eval_loop(model2, criterion, dl_test)\n\nprint('accuracy:', metrics['accuracy'])\nprint('f1 macro:', metrics['f1_macro'])\nprint('test loss:', metrics['loss'])","metadata":{"execution":{"iopub.status.busy":"2021-12-15T02:21:56.453400Z","iopub.execute_input":"2021-12-15T02:21:56.454238Z","iopub.status.idle":"2021-12-15T02:22:02.629590Z","shell.execute_reply.started":"2021-12-15T02:21:56.454193Z","shell.execute_reply":"2021-12-15T02:22:02.628673Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 7.Attention Unet","metadata":{}},{"cell_type":"markdown","source":"Here, we use Unet to achieve cell instance segmentation task. The input and output are same as CNN. Attention Unet will use the attention gate (a kind of soft attention) to filter the current features after each layer of convolution when upsampling. Realize the attention mechanism by supervising the features of the last level through the features of the next level\n","metadata":{}},{"cell_type":"markdown","source":"### Implement of Attention Unet","metadata":{}},{"cell_type":"code","source":"class Attention_block(nn.Module):\n    \"\"\"\n    Attention Block\n    \"\"\"\n\n    def __init__(self, F_g, F_l, F_int):\n        super(Attention_block, self).__init__()\n\n        self.W_g = nn.Sequential(\n            nn.Conv2d(F_l, F_int, kernel_size=1, stride=1, padding=0, bias=True),\n            nn.BatchNorm2d(F_int)\n        )\n\n        self.W_x = nn.Sequential(\n            nn.Conv2d(F_g, F_int, kernel_size=1, stride=1, padding=0, bias=True),\n            nn.BatchNorm2d(F_int)\n        )\n\n        self.psi = nn.Sequential(\n            nn.Conv2d(F_int, 1, kernel_size=1, stride=1, padding=0, bias=True),\n            nn.BatchNorm2d(1),\n            nn.Sigmoid()\n        )\n\n        self.relu = nn.ReLU(inplace=True)\n\n    def forward(self, g, x):\n        g1 = self.W_g(g)\n        x1 = self.W_x(x)\n        psi = self.relu(g1 + x1)\n        psi = self.psi(psi)\n        out = x * psi\n        return out\n\n\nclass AttU_Net(nn.Module):\n    \"\"\"\n    Attention Unet implementation\n    Paper: https://arxiv.org/abs/1804.03999\n    \"\"\"\n    def __init__(self, img_ch=3, output_ch=1):\n        super(AttU_Net, self).__init__()\n\n        n1 = 64\n        filters = [n1, n1 * 2, n1 * 4, n1 * 8, n1 * 16]\n\n        self.Maxpool1 = nn.MaxPool2d(kernel_size=2, stride=2)\n        self.Maxpool2 = nn.MaxPool2d(kernel_size=2, stride=2)\n        self.Maxpool3 = nn.MaxPool2d(kernel_size=2, stride=2)\n        self.Maxpool4 = nn.MaxPool2d(kernel_size=2, stride=2)\n\n        self.Conv1 = conv_block(img_ch, filters[0])\n        self.Conv2 = conv_block(filters[0], filters[1])\n        self.Conv3 = conv_block(filters[1], filters[2])\n        self.Conv4 = conv_block(filters[2], filters[3])\n        self.Conv5 = conv_block(filters[3], filters[4])\n\n        self.Up5 = up_conv(filters[4], filters[3])\n        self.Att5 = Attention_block(F_g=filters[3], F_l=filters[3], F_int=filters[2])\n        self.Up_conv5 = conv_block(filters[4], filters[3])\n\n        self.Up4 = up_conv(filters[3], filters[2])\n        self.Att4 = Attention_block(F_g=filters[2], F_l=filters[2], F_int=filters[1])\n        self.Up_conv4 = conv_block(filters[3], filters[2])\n\n        self.Up3 = up_conv(filters[2], filters[1])\n        self.Att3 = Attention_block(F_g=filters[1], F_l=filters[1], F_int=filters[0])\n        self.Up_conv3 = conv_block(filters[2], filters[1])\n\n        self.Up2 = up_conv(filters[1], filters[0])\n        self.Att2 = Attention_block(F_g=filters[0], F_l=filters[0], F_int=32)\n        self.Up_conv2 = conv_block(filters[1], filters[0])\n\n        self.Conv = nn.Conv2d(filters[0], output_ch, kernel_size=1, stride=1, padding=0)\n\n        self.active = torch.nn.Sigmoid()\n\n\n    def forward(self, x):\n\n        e1 = self.Conv1(x)\n\n        e2 = self.Maxpool1(e1)\n        e2 = self.Conv2(e2)\n\n        e3 = self.Maxpool2(e2)\n        e3 = self.Conv3(e3)\n\n        e4 = self.Maxpool3(e3)\n        e4 = self.Conv4(e4)\n\n        e5 = self.Maxpool4(e4)\n        e5 = self.Conv5(e5)\n\n        #print(x5.shape)\n        d5 = self.Up5(e5)\n        #print(d5.shape)\n        x4 = self.Att5(g=d5, x=e4)\n        d5 = torch.cat((x4, d5), dim=1)\n        d5 = self.Up_conv5(d5)\n\n        d4 = self.Up4(d5)\n        x3 = self.Att4(g=d4, x=e3)\n        d4 = torch.cat((x3, d4), dim=1)\n        d4 = self.Up_conv4(d4)\n\n        d3 = self.Up3(d4)\n        x2 = self.Att3(g=d3, x=e2)\n        d3 = torch.cat((x2, d3), dim=1)\n        d3 = self.Up_conv3(d3)\n\n        d2 = self.Up2(d3)\n        x1 = self.Att2(g=d2, x=e1)\n        d2 = torch.cat((x1, d2), dim=1)\n        d2 = self.Up_conv2(d2)\n\n        out = self.Conv(d2)\n#         print(out.shape)\n\n        out = self.active(out)\n\n        return out","metadata":{"execution":{"iopub.status.busy":"2021-12-15T02:22:02.632456Z","iopub.execute_input":"2021-12-15T02:22:02.633015Z","iopub.status.idle":"2021-12-15T02:22:02.659168Z","shell.execute_reply.started":"2021-12-15T02:22:02.632967Z","shell.execute_reply":"2021-12-15T02:22:02.658460Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Training and evaluation","metadata":{}},{"cell_type":"code","source":"# set_seed(21)\nmodel3 = AttU_Net(3, 1).to(device)\noptimizer = optim.Adam(model3.parameters(), lr=0.01)\ncriterion = nn.BCELoss()\ntrain(model3, optimizer, criterion, dl_train, dl_test)","metadata":{"execution":{"iopub.status.busy":"2021-12-15T02:22:02.660267Z","iopub.execute_input":"2021-12-15T02:22:02.660501Z","iopub.status.idle":"2021-12-15T02:51:28.398215Z","shell.execute_reply.started":"2021-12-15T02:22:02.660467Z","shell.execute_reply":"2021-12-15T02:51:28.397381Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"In order to make it easier to compare the methods, in this two picture, epoch 0-25 belongs to CNN,epoch 26-50 belong to Unet and epoch 51-75 belong to Attention Unet.","metadata":{}},{"cell_type":"code","source":"# Load the latest model\nmodel3.load_state_dict(torch.load('model.pt'))\nmetrics = eval_loop(model3, criterion, dl_test)\n\nprint('accuracy:', metrics['accuracy'])\nprint('f1 macro:', metrics['f1_macro'])\nprint('test loss:', metrics['loss'])","metadata":{"execution":{"iopub.status.busy":"2021-12-15T02:51:28.400430Z","iopub.execute_input":"2021-12-15T02:51:28.400950Z","iopub.status.idle":"2021-12-15T02:51:34.942608Z","shell.execute_reply.started":"2021-12-15T02:51:28.400900Z","shell.execute_reply":"2021-12-15T02:51:34.941669Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### Evaluation of Unet and Attention Unet\nCombined with the accuracy rate, the Unet network is slightly better than the Attention Unet network in terms of effect. Possible reason:\n\nAttention Unet uses a soft attention mechanism. Our data is a picture of nerve cells. The distribution is very random and cannot produce regional features. The attention mechanism is not well applied.\n","metadata":{}},{"cell_type":"markdown","source":"# **8. comparison of 3 supervised learning methods**","metadata":{}},{"cell_type":"markdown","source":"![image.png](attachment:cac62d76-777f-4bc9-9662-d1f255e1cd52.png)","metadata":{},"attachments":{"cac62d76-777f-4bc9-9662-d1f255e1cd52.png":{"image/png":"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9deTAk19E0wS+E881YNPiiMANT0ARC4HIPgaANsrkZYW8U9BvgtCKYjeFcB2dvLxL5Em29lO+SJ5IK3J4/HxtyYA4EoA+FoyPj5WMz7+tQZJ9iEAbTlTff2EKB0GYM+wtQMz+H57HvinTPX8f6nxnzOYyMAe/HP+E2fUHMRZkwUHAAAAOGVYSWZNTQAqAAAACAABh2kABAAAAAEAAAAaAAAAAAACoAIABAAAAAEAAAVuoAMABAAAAAEAAAHWAAAAAHv+yhQAAEAASURBVHgB7N0FnBTl/8DxLxzH0d3dKagI2GCgYmCLioqdfxuxuzt/tmI3dqCICgIGgoh0d+dRx3HE//nOOXszs7Nxt7t3u7efx9e6O/XMzHtvH3a/88z3KbPbFKEggAACCCCAAAIIIIAAAggggAACCCCAAAIIJI1AuUnLcpLmYDgQBBIhsGejila1M1dtk207uE6RCGPqRACB6AUyypSRPRpWsDaYvnKbbN9JuxS9HmsigAACCCCAAAIIIIAAAqVHIKOs+X3YIP/3od9ZlZHr/+YXo58M80qNwK7H9xYTJ5Euj02XKSu2lZrz4kQQQCA1BapVyJDsB7paB9/8/qmyaP321DwRjhoBBBBAAAEEEEAAAQQQQCAmgZoVM2Td/fm/D/0qKus3k3kIIIAAAggggAACCCCAAAIIIIAAAggggAACJSdA4Lbk7NkzAggggAACCCCAAAIIIIAAAggggAACCCDgK0Dg1peFmQgggAACCCCAAAIIIIAAAggggAACCCCAQMkJELgtOXv2jAACCCCAAAIIIIAAAggggAACCCCAAAII+AoQuPVlYSYCCCCAAAIIIIAAAggggAACCCCAAAIIIFByAgRuS86ePSOAAAIIIIAAAggggAACCCCAAAIIIIAAAr4CBG59WZiJAAIIIIAAAggggAACCCCAAAIIIIAAAgiUnACB25KzZ88IIIAAAggggAACCCCAAAIIIIAAAggggICvAIFbXxZmIoAAAggggAACCCCAAAIIIIAAAggggAACJSdA4Lbk7NkzAggggAACCCCAAAIIIIAAAggggAACCCDgK0Dg1peFmQgggAACCCCAAAIIIIAAAggggAACCCCAQMkJELgtOXv2jAACCCCAAAIIIIAAAggggAACCCCAAAII+AoQuPVlYSYCCCCAAAIIIIAAAggggAACCCCA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zkyuqu1FGa4u6JAZs6NPy+fxg3T2uStTNqnnciVpQJI6zgFwHCWH8ril4TaOHjZvxZ5Achpu7a/IVBIgARJwJpDchlvnK/MICZAACSSNQHIabpNWI55FAiRAAt4RSE7DrXe1ZEkkQALxSiCU4TZuFyeL1wfK+yIBEiABEiABEiABEiABEiABEiABEiABEiABEoh/AjTcxv8z5h2SAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAnEGAEabmPsgbG6JEACJEACJEACJEACJEACJEACJEACJEACJEAC8U+Ahtv4f8a8QxIgARIgARIgARIgARIgARIgARIgARIgARIggRgjQMNtjD0wVpcESIAESIAESIAESIAESIAESIAESIAESIAESCD+CdBwG//PmHdIAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiQQYwRouI2xB8bqkgAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJxD8BGm7j/xnzDkmABEiABEiABEiABEiABEiABEiABEiABEiABGKMAA23MfbAWF0SIAESIAESIAESIAESIAESIAESIAESIAESIIH4J0DDbfw/Y94hCZAACZAACZAACZAACZAACZAACZAACZAACZBAjBGg4TbGHhirSwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEP8EaLiN/2fMOyQBEiABEiABEiABEiABEiABEiABEiABEiABEogxAjTcxtgDY3VJgARIgARIgARIgARIgARIgARIgARIgARIgATinwANt/H/jHmHJEACJEACJEACJEACJEACJEACJEACJEACJEACMUaAhtsYe2CsLgmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQPwToOE2/p8x75AESIAESIAESIAESIAESIAESIAESIAESIAESCDGCNBwG2MPjNUlARIgARIgARIgARIgARIgARIgARIgARIgARKIfwI03Mb/M+YdkgAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJxBgBGm5j7IGxuiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAvFPgIbb+H/GvEMSIAESIAESIAESIAESIAESIAESIAESIAESIIEYI0DDbYw9MFaXBEiABEiABEiABEiABEiABEiABEiABEiABEgg/gnQcBv/z5h3SAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEGMEaLiNsQfG6pIACZAACZAACZAACZAACZAACZAACZAACZAACcQ/ARpu4/8Z8w5JgARIgARIgARIgARIgARIgARIgARIgARIgARijAANtzH2wFhdEiABEiABEiABEiABEiABEiABEiABEiABEiCB+CdAw238P2PeIQmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQQIwRoOE2xh4Yq0sCJEACJEACJEACJEACJEACJEACJEACJEACJBD/BGi4jf9nzDskARIgARIgARIgARIgARIgARIgARIgARIgARKIMQI03MbYA2N1SYAESIAESIAESIAESIAESIAESIAESIAESIAE4p8ADbfx/4x5hyRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAjFGgIbbGHtgrC4JkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkED8E6DhNv6fMe+QBEiABEiABEiABEiABEiABEiABEiABEiABEggxgjQcBtjD4zVJQESIAESIAESIAESIAESIAESIAESIAESIAESiH8CNNzG/zPmHZIACZAACZAACZAACZAACZAACZAACZAACZAACcQYARpuY+yBsbokQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQALxT4CG2/h/xrxDEiABEiABEiABEiABEiABEiABEiABEiABEiCBGCNAw22MPTBWlwRIgARIgARIgARIgARIgARIgARIgARIgARIIP4J0HAb/8+Yd0gCJEACJEACJEACJEACJEACJEACJEACJEACJBBjBGi4jbEHxuqSAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAnEPwEabuP/GfMOSYAESIAESIAESIAESIAESIAESIAESIAESIAEYowADbcx9sBYXRIgARIgARIgARIgARIgARIgARIgARIgARIggfgnQMNt/D9j3iEJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkECMEaDhNsYeGKtLAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiQQ/wRouI3/Z8w7JAESIAESIAESIAESIAESIAESIAESIAESIAESiDECNNzG2ANjdUmABEiABEiABEiABEiABEiABEiABEiABEiABOKfAA238f+MeYckQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIxRoCG2xh7YKwuCZAACZAACZAACZAACZAACZAACZAACZAACZBA/BOg4Tb+nzHvkARIgARIgARIgARIgARIgARIgARIgARIgARIIMYI0HAbYw+M1SUBEiABEiABEiABEiABEiABEiABEiABEiABEoh/AjTcxv8z5h2SAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAmQAAnEGAEabmPsgbG6JEACJEACJEACJEACJEACJEACJEACJEACJEAC8U+Ahtv4f8a8QxIgARIgARIgARIgARIgARIgARIgARIgARIggRgjQMNtjD0wVpcESIAESIAESIAESIAESIAESIAESIAESIAESCD+CdBwG//PmHdIAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiRAAiQQYwRouI2xB8bqkgAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJkAAJxD8BGm7j/xnzDkmABEiABEiABEiABEiABEiABEiABEiABEiABGKMAA23MfbAWF0SIAESIAESIAESIAESIAESIAESIAESIAESIIH4J0DDbfw/Y94hCZAACZAACZAACZAACZAACZAACZAACZAACZBAjBGg4TbGHhirSwIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkQAIkEP8EaLiN/2fMOyQBEiABEiABEiABEiABEiABEiABEiABEiABEogxAv8H58IKgOTGiyYAAAAASUVORK5CYII="}}},{"cell_type":"markdown","source":"### Visualized results","metadata":{}},{"cell_type":"code","source":"batchs = next(iter(dl_train))\nimages, masks = batchs\nim=images\nk=11\nimages = images.to(device)\nplt.figure(figsize=(20, 20))\nout1=model1(images)\nout1=out1.cpu().detach()\nout2=model2(images)\nout2=out2.cpu().detach()\nout3=model3(images)\nout3=out3.cpu().detach()\n\nplt.subplot(1, 3, 1)\nplt.xticks([])\nplt.yticks([])\nplt.imshow(im[k][1])\nplt.title('Original image')\n\nplt.subplot( 1, 3, 2)\nplt.xticks([])\nplt.yticks([])\n\nplt.imshow(masks[k][0])\nplt.title('Mask (Ground Truth)')\n\nplt.subplot( 1, 3, 3)\nplt.xticks([])\nplt.yticks([])\nplt.imshow(im[k][1])\nplt.imshow(masks[k][0],alpha=0.2)\nplt.title('Both')\nplt.tight_layout()\nplt.show()\n\nplt.figure(figsize=(20, 20))\nplt.subplot( 1, 3, 1)\nplt.xticks([])\nplt.yticks([])\n# plt.imshow(im[k][1])\nplt.imshow(out1[k][0])\nplt.title('Mask predicted by CNN')\n\nplt.subplot( 1, 3, 2)\nplt.xticks([])\nplt.yticks([])\n# plt.imshow(im[k][1])\nplt.imshow(out2[k][0])\nplt.title('Mask predicted by UNet')\n\nplt.subplot( 1, 3, 3)\nplt.xticks([])\nplt.yticks([])\n# plt.imshow(im[k][1])\nplt.imshow(out3[k][0])\nplt.title('Mask predicted by AttUNet')\n\nplt.tight_layout()\nplt.show()","metadata":{"execution":{"iopub.status.busy":"2021-12-15T02:51:34.945027Z","iopub.execute_input":"2021-12-15T02:51:34.945733Z","iopub.status.idle":"2021-12-15T02:51:49.588289Z","shell.execute_reply.started":"2021-12-15T02:51:34.945686Z","shell.execute_reply":"2021-12-15T02:51:49.587550Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# 9. Conclusion","metadata":{}},{"cell_type":"markdown","source":"Combined with the accuracy rate and visualized results, we found that The results of Unet related method far exceed those of CNN and K-means, which may be due to the fact that this kind of U-shaped network is more suitable for cell image segmentation task. What's more,To our surprise, the Unet network is slightly better than the Attention Unet network in terms of effect. The possible reason might be Attention Unet uses a soft attention mechanism, but our data is a picture of nerve cells, so, the distribution is very random and cannot produce regional features. Therefore, the attention mechanism is not well applied.\n","metadata":{}},{"cell_type":"markdown","source":"\n","metadata":{}}]}