{"metadata":{"kaggle":{"accelerator":"none","dataSources":[{"sourceId":71549,"databundleVersionId":8561470,"sourceType":"competition"}],"dockerImageVersionId":30746,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false},"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.7.12"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport matplotlib.pyplot as plt\nimport cv2\nimport pydicom\nimport numpy as np\nimport os\nimport glob\nfrom tqdm import tqdm\nimport gc\n\nimport torchvision\nimport torch\nimport torch.nn as nn\nfrom torch.utils.data import Dataset\nfrom fastai.vision.all import *\nimport segmentation_models_pytorch as smp\n\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:32.843343Z","iopub.status.busy":"2024-07-13T12:40:32.842946Z","iopub.status.idle":"2024-07-13T12:40:43.943592Z","shell.execute_reply":"2024-07-13T12:40:43.941945Z","shell.execute_reply.started":"2024-07-13T12:40:32.843311Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"CV = 5\nSEED = 777\nfold = 1\nPATCH_SIZE = 512\npatch_size = 64\nTH = .5\nSEG_TRAIN = False\nSEG = {\n    'BS':16,\n    'LR':5e-4,\n    'EPOCHS':10\n}\nINF = {\n    'BS':64,\n    'LR':1e-5,\n    'EPOCHS':10\n}","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:43.946386Z","iopub.status.busy":"2024-07-13T12:40:43.946011Z","iopub.status.idle":"2024-07-13T12:40:43.952033Z","shell.execute_reply":"2024-07-13T12:40:43.950475Z","shell.execute_reply.started":"2024-07-13T12:40:43.946354Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# DATA","metadata":{}},{"cell_type":"code","source":"train = pd.read_csv('C:/Users/Angel/kaggle/train.csv')\ntrain.tail()","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:43.953802Z","iopub.status.busy":"2024-07-13T12:40:43.953433Z","iopub.status.idle":"2024-07-13T12:40:44.027593Z","shell.execute_reply":"2024-07-13T12:40:44.026450Z","shell.execute_reply.started":"2024-07-13T12:40:43.953772Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"diagnosis = list(filter(lambda x: x.find('foraminal') > -1, train.columns))\ntrain = train[train[diagnosis].isnull().values.sum(1)==0].reset_index(drop=True)\ntrain.tail()","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.029275Z","iopub.status.busy":"2024-07-13T12:40:44.028944Z","iopub.status.idle":"2024-07-13T12:40:44.062572Z","shell.execute_reply":"2024-07-13T12:40:44.061358Z","shell.execute_reply.started":"2024-07-13T12:40:44.029247Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_meta_f = pd.read_csv('C:/Users/Angel/kaggle/train_series_descriptions.csv')\ndf_meta_f.tail()","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.066800Z","iopub.status.busy":"2024-07-13T12:40:44.065831Z","iopub.status.idle":"2024-07-13T12:40:44.087089Z","shell.execute_reply":"2024-07-13T12:40:44.085896Z","shell.execute_reply.started":"2024-07-13T12:40:44.066748Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_meta_f['series_description'].groupby(df_meta_f['series_description']).count()","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.088724Z","iopub.status.busy":"2024-07-13T12:40:44.088364Z","iopub.status.idle":"2024-07-13T12:40:44.103190Z","shell.execute_reply":"2024-07-13T12:40:44.101828Z","shell.execute_reply.started":"2024-07-13T12:40:44.088695Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_coor = pd.read_csv('C:/Users/Angel/kaggle/train_label_coordinates.csv')\ndf_coor.tail()","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.106397Z","iopub.status.busy":"2024-07-13T12:40:44.104895Z","iopub.status.idle":"2024-07-13T12:40:44.245029Z","shell.execute_reply":"2024-07-13T12:40:44.242024Z","shell.execute_reply.started":"2024-07-13T12:40:44.106339Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_coor['condition'].groupby(df_coor['condition']).count()","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.248072Z","iopub.status.busy":"2024-07-13T12:40:44.246687Z","iopub.status.idle":"2024-07-13T12:40:44.271492Z","shell.execute_reply":"2024-07-13T12:40:44.267640Z","shell.execute_reply.started":"2024-07-13T12:40:44.248012Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"LF = df_coor[df_coor['condition']=='Left Neural Foraminal Narrowing'][[\n    'study_id',\n    'series_id',\n    'instance_number',\n    'level',\n    'x',\n    'y'\n]].sort_values([\n    'study_id',\n    'series_id',\n    'level'\n])[[\n    'study_id',\n    'series_id',\n    'level',\n    'instance_number',\n    'x',\n    'y'    \n]]\nLF.tail()","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.273789Z","iopub.status.busy":"2024-07-13T12:40:44.273050Z","iopub.status.idle":"2024-07-13T12:40:44.298919Z","shell.execute_reply":"2024-07-13T12:40:44.297652Z","shell.execute_reply.started":"2024-07-13T12:40:44.273742Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"(['L1/L2','L2/L3','L3/L4','L4/L5','L5/S1']*(len(LF)//5) == LF['level']).sum() == len(LF)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"LF = LF[[\n    'study_id',\n    'series_id',\n    'instance_number',\n    'x',\n    'y'    \n]]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"LF[[\n    'x_L1L2',\n    'y_L1L2',\n    'x_L2L3',\n    'y_L2L3',\n    'x_L3L4',\n    'y_L3L4',\n    'x_L4L5',\n    'y_L4L5',\n    'x_L5S1',\n    'y_L5S1',    \n]] = np.tile(LF[['x','y']].values.reshape(-1,1,5,2),(1,5,1,1)).reshape(-1,10)\nLF = LF.drop(columns=['x','y']).drop_duplicates().reset_index(drop=True)\nLF.tail()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"diagnosis = list(filter(lambda x: x.find('left_neural') > -1, train.columns))\nLF = LF.merge(train[['study_id']+diagnosis], left_on='study_id', right_on='study_id')\nLF.tail()","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.300953Z","iopub.status.busy":"2024-07-13T12:40:44.300454Z","iopub.status.idle":"2024-07-13T12:40:44.333485Z","shell.execute_reply":"2024-07-13T12:40:44.331864Z","shell.execute_reply.started":"2024-07-13T12:40:44.300910Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"diagnosis = {x:x[5:] for x in diagnosis}\ndiagnosis","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.335761Z","iopub.status.busy":"2024-07-13T12:40:44.335291Z","iopub.status.idle":"2024-07-13T12:40:44.348226Z","shell.execute_reply":"2024-07-13T12:40:44.346298Z","shell.execute_reply.started":"2024-07-13T12:40:44.335728Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"LF = LF.rename(columns=diagnosis)\nLF.tail()","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.351505Z","iopub.status.busy":"2024-07-13T12:40:44.350452Z","iopub.status.idle":"2024-07-13T12:40:44.377111Z","shell.execute_reply":"2024-07-13T12:40:44.375753Z","shell.execute_reply.started":"2024-07-13T12:40:44.351456Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"RF = df_coor[df_coor['condition']=='Right Neural Foraminal Narrowing'][[\n    'study_id',\n    'series_id',\n    'instance_number',\n    'level',\n    'x',\n    'y'\n]].sort_values([\n    'study_id',\n    'series_id',\n    'level'\n])[[\n    'study_id',\n    'series_id',\n    'instance_number',\n    'level',\n    'x',\n    'y'    \n]].drop_duplicates()\nRF.tail()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"centers = {}\nfor i in range(len(RF)):\n    row = RF.iloc[i]\n    centers[row['study_id']]={}\nfor i in range(len(RF)):\n    row = RF.iloc[i]\n    centers[row['study_id']][row['series_id']]={'L1/L2':[],'L2/L3':[],'L3/L4':[],'L4/L5':[],'L5/S1':[]}\nfor i in range(len(RF)):\n    row = RF.iloc[i]\n    centers[row['study_id']][row['series_id']][row['level']].append([row['x'],row['y']])","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"coordinates = np.zeros((len(RF),10))\ncoordinates[:] = np.nan\nfor i in range(len(RF)):\n    row = RF.iloc[i]\n    for level in centers[row['study_id']][row['series_id']]:\n        if len(centers[row['study_id']][row['series_id']][level]) > 0:\n            center = np.array(centers[row['study_id']][row['series_id']][level]).mean(0)\n            coordinates[\n                i,\n                {'L1/L2':0, 'L2/L3':2, 'L3/L4':4, 'L4/L5':6, 'L5/S1':8}[level]:{'L1/L2':0, 'L2/L3':2, 'L3/L4':4, 'L4/L5':6, 'L5/S1':8}[level]+2\n            ] = center","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"RF = RF[[\n    'study_id',\n    'series_id',\n    'instance_number',\n    'x',\n    'y'    \n]]\nRF[[\n    'x_L1L2',\n    'y_L1L2',\n    'x_L2L3',\n    'y_L2L3',\n    'x_L3L4',\n    'y_L3L4',\n    'x_L4L5',\n    'y_L4L5',\n    'x_L5S1',\n    'y_L5S1',    \n]] = coordinates\nRF = RF.drop(columns=['x','y']).drop_duplicates().reset_index(drop=True)\nRF.tail()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"RF = RF[RF[[\n    'x_L1L2',\n    'y_L1L2',\n    'x_L2L3',\n    'y_L2L3',\n    'x_L3L4',\n    'y_L3L4',\n    'x_L4L5',\n    'y_L4L5',\n    'x_L5S1',\n    'y_L5S1',    \n]].isnull().values.sum(1)==0].reset_index(drop=True)\nRF.tail()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"diagnosis = list(filter(lambda x: x.find('right_neural_foraminal') > -1, train.columns))\nRF = RF.merge(train[['study_id']+diagnosis], left_on='study_id', right_on='study_id')\nRF.tail()","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.418790Z","iopub.status.busy":"2024-07-13T12:40:44.417737Z","iopub.status.idle":"2024-07-13T12:40:44.442676Z","shell.execute_reply":"2024-07-13T12:40:44.440923Z","shell.execute_reply.started":"2024-07-13T12:40:44.418746Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"diagnosis = {x:x[6:] for x in diagnosis}\ndiagnosis","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.444493Z","iopub.status.busy":"2024-07-13T12:40:44.443982Z","iopub.status.idle":"2024-07-13T12:40:44.453917Z","shell.execute_reply":"2024-07-13T12:40:44.451678Z","shell.execute_reply.started":"2024-07-13T12:40:44.444437Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"RF = RF.rename(columns=diagnosis)\nRF.tail()","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.455900Z","iopub.status.busy":"2024-07-13T12:40:44.455432Z","iopub.status.idle":"2024-07-13T12:40:44.474221Z","shell.execute_reply":"2024-07-13T12:40:44.472842Z","shell.execute_reply.started":"2024-07-13T12:40:44.455864Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"F = pd.concat([LF,RF],axis=0,ignore_index=True)\nF.tail()","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.476368Z","iopub.status.busy":"2024-07-13T12:40:44.475721Z","iopub.status.idle":"2024-07-13T12:40:44.498951Z","shell.execute_reply":"2024-07-13T12:40:44.497665Z","shell.execute_reply.started":"2024-07-13T12:40:44.476335Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"F = F.merge(df_meta_f[['series_id','series_description']], left_on='series_id', right_on='series_id')\nF.tail()","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.501516Z","iopub.status.busy":"2024-07-13T12:40:44.500803Z","iopub.status.idle":"2024-07-13T12:40:44.529545Z","shell.execute_reply":"2024-07-13T12:40:44.528233Z","shell.execute_reply.started":"2024-07-13T12:40:44.501425Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for c in F.columns[-6:]:\n    print(F[c].groupby(F[c]).count())","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.531266Z","iopub.status.busy":"2024-07-13T12:40:44.530911Z","iopub.status.idle":"2024-07-13T12:40:44.552864Z","shell.execute_reply":"2024-07-13T12:40:44.551595Z","shell.execute_reply.started":"2024-07-13T12:40:44.531237Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"v,c = np.unique(F['study_id'],return_counts=True)","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.554569Z","iopub.status.busy":"2024-07-13T12:40:44.554225Z","iopub.status.idle":"2024-07-13T12:40:44.561679Z","shell.execute_reply":"2024-07-13T12:40:44.559834Z","shell.execute_reply.started":"2024-07-13T12:40:44.554539Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.plot(v,c,'.')","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.563480Z","iopub.status.busy":"2024-07-13T12:40:44.563104Z","iopub.status.idle":"2024-07-13T12:40:44.862743Z","shell.execute_reply":"2024-07-13T12:40:44.861218Z","shell.execute_reply.started":"2024-07-13T12:40:44.563424Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"L = len(v)\nS = L/CV\nfold_indices = list(np.rint(np.arange(CV)*S).astype(int))+[L]","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.864623Z","iopub.status.busy":"2024-07-13T12:40:44.864224Z","iopub.status.idle":"2024-07-13T12:40:44.871309Z","shell.execute_reply":"2024-07-13T12:40:44.869922Z","shell.execute_reply.started":"2024-07-13T12:40:44.864576Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for i in range(5):\n    print(len(v[fold_indices[i]:fold_indices[i+1]]))\n    F.loc[F['study_id'].isin(v[fold_indices[i]:fold_indices[i+1]]),'series_description'] = i+1\nF.tail()","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.873863Z","iopub.status.busy":"2024-07-13T12:40:44.873354Z","iopub.status.idle":"2024-07-13T12:40:44.901121Z","shell.execute_reply":"2024-07-13T12:40:44.899720Z","shell.execute_reply.started":"2024-07-13T12:40:44.873792Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"for f in range(CV):\n    print('fold: ',f+1)\n    for c in F.columns[-6:]:\n        print(F[F['series_description']==f+1][c].groupby(F[c]).count())\n    print('\\n')","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:44.903179Z","iopub.status.busy":"2024-07-13T12:40:44.902798Z","iopub.status.idle":"2024-07-13T12:40:44.998407Z","shell.execute_reply":"2024-07-13T12:40:44.997191Z","shell.execute_reply.started":"2024-07-13T12:40:44.903150Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"target = F.columns[-6:-1]\ntarget","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:45.000489Z","iopub.status.busy":"2024-07-13T12:40:45.000122Z","iopub.status.idle":"2024-07-13T12:40:45.008285Z","shell.execute_reply":"2024-07-13T12:40:45.007039Z","shell.execute_reply.started":"2024-07-13T12:40:45.000459Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"labels = {\n    'Normal/Mild':0,\n    'Moderate':1,\n    'Severe':2\n}","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:45.010243Z","iopub.status.busy":"2024-07-13T12:40:45.009833Z","iopub.status.idle":"2024-07-13T12:40:45.020980Z","shell.execute_reply":"2024-07-13T12:40:45.019755Z","shell.execute_reply.started":"2024-07-13T12:40:45.010210Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"coor = [\n    'x_L1L2',\n    'y_L1L2',\n    'x_L2L3',\n    'y_L2L3',\n    'x_L3L4',\n    'y_L3L4',\n    'x_L4L5',\n    'y_L4L5',\n    'x_L5S1',\n    'y_L5S1',    \n]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Segmentation Dataset","metadata":{}},{"cell_type":"code","source":"def augment_image_and_centers(image,centers,alpha):\n    '''\n    # Randomly flip the image horizontally.\n    if random.random() > .5:\n      if random.random() > 1 - alpha:\n        image = image.flip(-1)\n        centers[:,0] = PATCH_SIZE - centers[:,0]\n    # Randomly flip the image vertically.\n    if random.random() > 0.5:\n      if random.random() > 1 - alpha:\n        image = image.flip(-2)\n        centers[:,1] = PATCH_SIZE - centers[:,1]\n  \n    if random.random() > 1 - alpha:\n      if random.random() > .5:\n    #   Randomly flip the image\n    #   Wich axis?\n        axis = np.random.randint(2)\n        image = image.flip(axis+1)\n        centers[:,-1-axis] = PATCH_SIZE - centers[:,-1-axis]\n    '''\n#   Randomly rotate the image.\n    angle = torch.as_tensor(random.uniform(-180, 180)*alpha)\n    image = torchvision.transforms.functional.rotate(image,angle.item())\n#   https://discuss.pytorch.org/t/rotation-matrix/128260\n    angle = -angle*math.pi/180\n    s = torch.sin(angle)\n    c = torch.cos(angle)\n    rot = torch.stack([\n        torch.stack([c, s]),\n        torch.stack([-s, c])\n      ])\n    centers = ((centers.cpu() - PATCH_SIZE//2) @ rot) + PATCH_SIZE//2\n\n    return image,centers","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class T1Dataset(Dataset):\n    def __init__(self, df, VALID=False, alpha=0):\n        self.data = df\n        self.VALID = VALID\n        self.alpha = alpha\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, index):\n        row = self.data.iloc[index]\n\n        centers = torch.as_tensor([x for x in row[coor]]).view(5,2).float()\n        \n        sample = 'C:/Users/Angel/kaggle/train/'\n        sample = sample+str(row['study_id'])+'/'+str(row['series_id'])+'/'+str(row['instance_number'])+'.dcm'\n        \n        image = pydicom.dcmread(sample).pixel_array\n        H,W = image.shape\n#       By plane resizing I've been distorting the proportions\n        if H > W:\n            d = W\n            if not self.VALID:\n                h = int((H - d)*(.5 + self.alpha*(.5 - np.random.rand())))\n            else:\n                h = (H - d)//2\n            image = image[h:h+d]\n            centers[:,1] -= h\n            H = W\n        elif H < W:\n            d = H\n            if not self.VALID:\n                w = int((W - d)*(.5 + self.alpha*(.5 - np.random.rand())))\n            else:\n                w = (W - d)//2\n            image = image[:,w:w+d]\n            centers[:,0] -= w\n            W = H\n        image = cv2.resize(image,(PATCH_SIZE,PATCH_SIZE))\n        image = torch.as_tensor(image/np.max(image)).unsqueeze(0).float()\n        \n        label = torch.as_tensor([labels[x] for x in row[target]])\n        \n        centers[:,0] = centers[:,0]*PATCH_SIZE/W\n        centers[:,1] = centers[:,1]*PATCH_SIZE/H\n\n        if not self.VALID: image,centers = augment_image_and_centers(image,centers,self.alpha)\n\n        return image.to(device),[label.to(device),centers.to(device)]","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:45.022874Z","iopub.status.busy":"2024-07-13T12:40:45.022481Z","iopub.status.idle":"2024-07-13T12:40:45.035948Z","shell.execute_reply":"2024-07-13T12:40:45.034076Z","shell.execute_reply.started":"2024-07-13T12:40:45.022843Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def seed_everything(seed):\n    random.seed(seed)\n    np.random.seed(seed)\n    os.environ[\"PYTHONHASHSEED\"] = str(seed)\n    torch.manual_seed(seed)\n    torch.cuda.manual_seed(seed)\n    torch.backends.cudnn.deterministic = True\n    torch.backends.cudnn.benchmark = False","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:45.038155Z","iopub.status.busy":"2024-07-13T12:40:45.037737Z","iopub.status.idle":"2024-07-13T12:40:45.052053Z","shell.execute_reply":"2024-07-13T12:40:45.050755Z","shell.execute_reply.started":"2024-07-13T12:40:45.038125Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"idx_map = torch.stack([torch.arange(PATCH_SIZE)]*PATCH_SIZE).to(device)\nidx_map = torch.stack([idx_map,idx_map.T]).view(1,1,2,PATCH_SIZE,PATCH_SIZE)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Segmentation UNet","metadata":{}},{"cell_type":"code","source":"class myUNet(nn.Module):\n    def __init__(self):\n        super(myUNet, self).__init__()\n\n        self.UNet = smp.Unet(\n            encoder_name=\"resnet18\",\n            classes=5,\n            in_channels=1\n        ).to(device)\n\n    def forward(self,X):\n        x = self.UNet(X)\n#       MinMaxScaling along the class plane to generate a heatmap\n        min_values = x.view(-1,5,PATCH_SIZE*PATCH_SIZE).min(-1)[0].view(-1,5,1,1) # Bug, I've been MinMaxScaling with the wrong values\n        max_values = x.view(-1,5,PATCH_SIZE*PATCH_SIZE).max(-1)[0].view(-1,5,1,1)\n        x = (x - min_values)/(max_values - min_values)\n        \n        return x","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Segmentation Loss","metadata":{}},{"cell_type":"code","source":"# Let's start by segmentation only\nclass myLoss(nn.Module):\n    def __init__(\n            self,\n            alpha=.5\n        ):\n        super().__init__()\n        self.alpha = alpha\n\n    def clone(self):\n        return myLoss(self.alpha)\n\n    def forward(\n            self,\n            y,# Predictions\n            t # Targets\n        ):\n        mask_pred = y\n        _,mask_true = t\n#       The heatmap Loss as the distance between the predicted Normal and the ideal one\n#       Let's define the ideal heatmaps as the Normal distributions\n#       centered on the diagnostic centers with s2 = PATCH_SIZE/8\n        s2 = s2 = torch.as_tensor([PATCH_SIZE/8]*5)\n#       Then the corresponding alphas and normalization constants would be\n        A = -1/(2*s2).to(device)\n        K = 1/torch.sqrt(2*math.pi*s2).to(device)\n#       Predicted heatmaps rescaling\n        mask_pred = mask_pred*K.view(1,5,1,1)\n#       Ideal heatmaps\n        mask = idx_map - mask_true.view(-1,5,2,1,1)\n        mask = torch.exp((A.view(-1,5,1,1,1)*mask*mask).sum(2))*K.view(-1,5,1,1)\n#       Distance\n        D = 1 - ((mask*mask_pred).sum())**2/((mask*mask).sum()*(mask_pred*mask_pred).sum())\n        \n        return D","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# CosineAnnealingAlpha\ndef nt(nmin,nmax,tcur,tmax):\n    return (nmax - .5*(nmax-nmin)*(1+np.cos(tcur*np.pi/tmax))).astype(np.float32)\n\nplt.plot(nt(0,1,np.arange(SEG['EPOCHS']),SEG['EPOCHS']))\nplt.show()\n\n# callback to update alpha during training\ndef cb(self):\n    alpha = torch.as_tensor(nt(.25,1,learn.train_iter,SEG['EPOCHS']*n_iter))\n    learn.dls.train_ds.alpha = alpha\nalpha_cb = Callback(before_batch=cb)#","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Segmentation Train","metadata":{}},{"cell_type":"code","source":"tdf = F[F['series_description'] != fold]\nvdf = F[F['series_description'] == fold]\n\ntds = T1Dataset(tdf)\nvds = T1Dataset(vdf,VALID=True)\ntdl = torch.utils.data.DataLoader(tds, batch_size=SEG['BS'], shuffle=True, drop_last=True)\nvdl = torch.utils.data.DataLoader(vds, batch_size=SEG['BS'], shuffle=False)\n\nif SEG_TRAIN:\n    seed_everything(SEED)\n\n    dls = DataLoaders(tdl,vdl)\n\n    n_iter = len(tds)//SEG['BS']\n\n    model = myUNet()\n    learn = Learner(\n        dls,\n        model,\n        lr=SEG['LR'],\n        loss_func=myLoss(alpha=0.5),\n        cbs=[\n            ShowGraphCallback(),\n            alpha_cb\n        ]\n    )\n    learn.fit_one_cycle(SEG['EPOCHS'])\n#   learn.fit(SEG['EPOCHS'])\n    torch.save(model,'SEG_'+str(fold))\n    del tdl,vdl,dls,model,learn\n    gc.collect()","metadata":{"execution":{"iopub.execute_input":"2024-07-13T12:40:46.890640Z","iopub.status.busy":"2024-07-13T12:40:46.890128Z","iopub.status.idle":"2024-07-13T14:32:40.080628Z","shell.execute_reply":"2024-07-13T14:32:40.078796Z","shell.execute_reply.started":"2024-07-13T12:40:46.890580Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"![image.png](attachment:image.png)","metadata":{},"attachments":{"image.png":{"image/png":"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"}}},{"cell_type":"markdown","source":"# Segmentation Validation","metadata":{}},{"cell_type":"code","source":"model = torch.load('SEG_'+str(fold))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# https://stackoverflow.com/questions/22777049/how-can-i-draw-a-circle-in-a-data-array-map-in-python\nwidth, height = 11, 11\nA, B = 5, 5\nr = 5\nEPSILON = 2.2","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"i = np.random.randint(len(vds))\nimg,centers = vds.__getitem__(i)\nOUT = model(img.unsqueeze(0)).cpu().detach()\ncenters = centers[1].cpu().long()\nprint(i)\nimg = img[0].cpu()\nfor k in range(5):\n    img += OUT[0,k].cpu()\n    Y,X = centers.cpu().long()[k]\n    for y in range(height):\n        for x in range(width):\n            # see if we're close to (x-a)**2 + (y-b)**2 == r**2\n            if abs((x-A)**2 + (y-B)**2 - r**2) < EPSILON**2:\n                img[x+X-5,y+Y-5] += 1\nplt.imshow(img)\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"i = np.random.randint(len(vds))\nimg,centers = vds.__getitem__(i)\nOUT = model(img.unsqueeze(0)).cpu().detach()\ncenters = centers[1].cpu().long()\nprint(i)\nfor k in range(5):\n    image = img[0].cpu() + OUT[0,k].cpu()\n    Y,X = centers.cpu().long()[k]\n    for y in range(height):\n        for x in range(width):\n            # see if we're close to (x-a)**2 + (y-b)**2 == r**2\n            if abs((x-A)**2 + (y-B)**2 - r**2) < EPSILON**2:\n                image[x+X-5,y+Y-5] += 1\n    plt.imshow(image)\n    plt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"i = np.random.randint(len(vds))\nimg,centers = vds.__getitem__(i)\nOUT = model(img.unsqueeze(0)).cpu().detach()\ncenters = centers[1].cpu().long()\nprint(i)\nfig, axes1 = plt.subplots(1, 5, figsize=(10,10))\nfig, axes2 = plt.subplots(1, 5, figsize=(10,10))\nfor k in range(5):\n    image = img[0].cpu() + OUT[0,k].cpu()\n    c = (OUT[0,k].unsqueeze(0)*idx_map[0,0].cpu()).sum(-1).sum(-1)\n    d = OUT[0,k].sum()\n    c = c/d\n    Y,X = centers.cpu().long()[k]\n    YY,XX = c.long()\n    for y in range(height):\n        for x in range(width):\n            # see if we're close to (x-a)**2 + (y-b)**2 == r**2\n            if abs((x-A)**2 + (y-B)**2 - r**2) < EPSILON**2:\n                image[x+X-5,y+Y-5] = 0\n    axes1[k].imshow(image)\n    axes2[k].imshow(image[XX-64:XX+64,YY-64:YY+64])\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"P = 32\ni = np.random.randint(len(vds))\nimg,centers = vds.__getitem__(i)\nE = model(img.unsqueeze(0))\nwith torch.no_grad():\n    for rot in [1,2,3]:\n        E += torch.rot90(model(torch.rot90(img.unsqueeze(0),rot,dims=[-2, -1])),-rot,dims=[-2, -1])\nOUT = E.cpu().detach()/4 > TH\ncenters = centers[1].cpu().long()\nprint(i)\nfig, axes1 = plt.subplots(1, 5, figsize=(10,10))\nfig, axes2 = plt.subplots(1, 5, figsize=(10,10))\nfor k in range(5):\n    image = img[0].cpu() + OUT[0,k].cpu()\n    c = (OUT[0,k].unsqueeze(0)*idx_map[0,0].cpu()).sum(-1).sum(-1)\n    d = OUT[0,k].sum()\n    c = c/d\n    Y,X = centers.cpu().long()[k]\n    YY,XX = c.long()\n    for y in range(height):\n        for x in range(width):\n            # see if we're close to (x-a)**2 + (y-b)**2 == r**2\n            if abs((x-A)**2 + (y-B)**2 - r**2) < EPSILON**2:\n                image[x+X-5,y+Y-5] = 0\n    axes1[k].imshow(image)\n    axes2[k].imshow(image[XX-P:XX+P,YY-P:YY+P])\nplt.show()","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Inference Dataset","metadata":{}},{"cell_type":"code","source":"def augment_image(image,alpha):\n    # Randomly rotate the image.\n    angle = torch.as_tensor(random.uniform(-180, 180)*alpha)\n    image = torchvision.transforms.functional.rotate(image,angle.item())\n\n    return image","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"class ViT_T1_Dataset(Dataset):\n    def __init__(self, df, UNet, VALID=False, P=patch_size, alpha=0):\n        self.data = df\n        self.UNet = UNet\n        self.VALID = VALID\n        self.P = P\n        self.alpha = alpha\n\n    def __len__(self):\n        return len(self.data)\n\n    def __getitem__(self, index):\n        row = self.data.iloc[index]\n        \n        sample = 'C:/Users/Angel/kaggle/train/'\n        sample = sample+str(row['study_id'])+'/'+str(row['series_id'])+'/'+str(row['instance_number'])+'.dcm'\n        \n        image = pydicom.dcmread(sample).pixel_array\n        H,W = image.shape\n#       By plane resizing I've been distorting the proportions\n        if H > W:\n            d = W\n            h = (H - d)//2\n            image = image[h:h+d]\n            centers[:,1] -= h\n            H = W\n        elif H < W:\n            d = H\n            w = (W - d)//2\n            image = image[:,w:w+d]\n            centers[:,0] -= w\n            W = H\n        image = cv2.resize(image,(PATCH_SIZE,PATCH_SIZE))\n        image = torch.as_tensor(image/np.max(image)).unsqueeze(0).unsqueeze(0).float().to(device)\n\n        OUT = 0\n        with torch.no_grad():\n                for rot in [0,1,2,3]:\n                        OUT += torch.rot90(self.UNet(torch.rot90(image,rot,dims=[-2, -1])),-rot,dims=[-2, -1])\n\n        OUT = (OUT/4 > TH)[0]\n        c = (OUT.unsqueeze(1)*idx_map[0]).view(5,2,PATCH_SIZE*PATCH_SIZE).sum(-1)\n        d = OUT.view(5,PATCH_SIZE*PATCH_SIZE).sum(-1)\n        m = d > 0\n        c[m] = (c[m]/d[m].unsqueeze(-1)).long()\n        c[~m] = self.P # I have to find a better solution\n        image = torch.stack([image[\n            0,\n            0,\n            xy[1]-self.P//2:xy[1]+self.P-self.P//2,\n            xy[0]-self.P//2:xy[0]+self.P-self.P//2\n        ] for xy in c])\n\n        if not self.VALID: image = augment_image(image,self.alpha)\n        \n        label = torch.as_tensor([labels[x] for x in row[target]])\n\n        return [image.to(device),~m.to(device)],[label.to(device),~m.to(device)]","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Inference ViT","metadata":{}},{"cell_type":"code","source":"class SinusoidalPosEmb(nn.Module):\n    def __init__(self, dim=16, M=10000):\n        super().__init__()\n        self.dim = dim\n        self.M = M\n\n    def forward(self, x):\n        device = x.device\n        half_dim = self.dim // 2\n        emb = math.log(self.M) / half_dim\n        emb = torch.exp(torch.arange(half_dim, device=device) * (-emb))\n        emb = x[...,None] * emb[None,...]\n        emb = torch.cat((emb.sin(), emb.cos()), dim=-1)\n        return emb\n\nclass myViT(nn.Module):\n    def __init__(self, dim=512, depth=12, head_size=128, **kwargs):\n        super().__init__()\n        CNN = torchvision.models.resnet18(weights='DEFAULT')\n        W = nn.Parameter(CNN.conv1.weight.sum(1, keepdim=True))\n        CNN.conv1 = nn.Conv2d(1, patch_size, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)\n        CNN.conv1.weight = W\n        CNN.fc = nn.Identity()\n        self.emb = CNN.to(device)\n        self.pos_enc = nn.Parameter(SinusoidalPosEmb(dim)(torch.arange(5, device=device).unsqueeze(0)))\n        self.transformer = nn.TransformerEncoder(\n                nn.TransformerEncoderLayer(d_model=dim, nhead=dim//head_size, dim_feedforward=4*dim,\n                dropout=0.1, activation=nn.GELU(), batch_first=True, norm_first=True, device=device), depth)\n        self.proj_out = nn.Linear(dim,3).to(device)\n    \n    def forward(self, x):\n        x,mask = x\n        x = self.emb(x.view(-1,1,patch_size,patch_size))\n        x = x.view(-1,5,512)\n        x = x + self.pos_enc\n        x = self.transformer(x,src_key_padding_mask=mask)\n        x = self.proj_out(x.view(-1,512))\n        return x","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Inference Loss","metadata":{}},{"cell_type":"markdown","source":"![image.png](attachment:image.png)","metadata":{},"attachments":{"image.png":{"image/png":"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"}}},{"cell_type":"code","source":"def myLoss(preds,target):\n    target,mask = target\n    target = target[~mask]\n    preds = preds[~mask.view(-1)]\n    return nn.CrossEntropyLoss(weight=torch.as_tensor([1.,2.,4.]).to(device))(preds,target)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Inference Training","metadata":{}},{"cell_type":"code","source":"if 1:\n    seed_everything(SEED)\n    UNet = torch.load('SEG_'+str(fold))\n    tds = ViT_T1_Dataset(tdf,UNet)\n    vds = ViT_T1_Dataset(vdf,UNet,VALID=True)\n    tdl = torch.utils.data.DataLoader(tds, batch_size=INF['BS'], shuffle=True, drop_last=True)\n    vdl = torch.utils.data.DataLoader(vds, batch_size=INF['BS'], shuffle=False)\n\n    dls = DataLoaders(tdl,vdl)\n\n    n_iter = len(tds)//INF['BS']\n\n    model = myViT()\n    learn = Learner(\n        dls,\n        model,\n        lr=INF['LR'],\n        loss_func=myLoss,\n        cbs=[\n            ShowGraphCallback(),\n            alpha_cb\n        ]\n    )\n    learn.fit_one_cycle(INF['EPOCHS'])\n    torch.save(model,'ViT_'+str(fold))","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Inference Validation","metadata":{}},{"cell_type":"code","source":"import sklearn\ny_true = []\ny_pred = []\nwith torch.no_grad():\n    for [X,mask],[Y,mask] in tqdm(vdl):\n        y_true.extend(Y[~mask].cpu().tolist())\n        y_pred.extend(torch.argmax(model([X,mask]),-1)[~mask.view(-1)].cpu().tolist())\n\nsklearn.metrics.confusion_matrix(y_true, y_pred)","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"del tds,vds,tdl,vdl,dls,model,learn\ngc.collect()","metadata":{},"execution_count":null,"outputs":[]}]}