{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import sys\nsys.path.append('../input/pytorch-efficientnet')\nsys.path.append('../input/multistartifiedkfold')","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"import pandas as pd \nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom PIL import Image\nimport matplotlib.image as immg\nfrom pathlib import Path\nimport os,sys\nimport seaborn as sns\nimport gc\nimport torchvision\nimport cv2\nfrom fastai.data.all import *\nfrom fastai.vision.core import *\nfrom fastai.vision.data import *\nfrom tqdm.notebook import tqdm\nimport zipfile\nimport io\nfrom sklearn.decomposition import PCA\nfrom fastai.vision.all import *","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from iterstrat.ml_stratifiers import MultilabelStratifiedKFold","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.read_csv('../input/ranzcr-clip-catheter-line-classification/train.csv')","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"target_cols = ['ETT - Abnormal', 'ETT - Borderline',\n       'ETT - Normal', 'NGT - Abnormal', 'NGT - Borderline',\n       'NGT - Incompletely Imaged', 'NGT - Normal', 'CVC - Abnormal',\n       'CVC - Borderline', 'CVC - Normal', 'Swan Ganz Catheter Present']","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## MultiStratifiedKFold"},{"metadata":{"trusted":true},"cell_type":"code","source":"trn_df = df.sample(frac=1.,random_state = 2020)\ntrn_df['kfold'] = -1\ny = trn_df[target_cols].values\nkf = MultilabelStratifiedKFold(n_splits=5,random_state = 2020,shuffle = True)\nfor fold ,(trn_,val_ )in enumerate(kf.split(X=trn_df,y=y)):\n    trn_df.loc[val_,'kfold'] = fold","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"trn_df.to_csv('train_df_kfold.csv',index=False)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"trn_df.head()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Target Distribution"},{"metadata":{"trusted":true},"cell_type":"code","source":"fig = plt.figure(1,figsize=(20,12))\ncolumns = 4\nrows = 3\nfea_num = 0\nfea_cols = target_cols\nfor i in range(rows*columns):\n    fig.add_subplot(rows, columns, i+1)\n    sns.countplot(df[fea_cols[min(i,10)]])\n    plt.title(fea_cols[min(i,10)])\n    fea_num+=1\nplt.subplots_adjust(wspace=0.3, hspace=0.3)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Let us see total Number of postive sample in each group"},{"metadata":{"trusted":true},"cell_type":"code","source":"df[target_cols].sum(axis=0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"FOLD = 1","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Train and valid idxs"},{"metadata":{"trusted":true},"cell_type":"code","source":"trn_idx,val_idx = trn_df[trn_df['kfold']!=FOLD].index, trn_df[trn_df['kfold']==FOLD].index","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"item_tfms = Resize(300)\nbatch_tfms = [*aug_transforms(size=300, max_warp=0), Normalize.from_stats(*imagenet_stats)]\nbs = 8","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img_path = '../input/ranzor-clip-resized-data-512-256'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dls = ImageDataLoaders.from_df(trn_df, path=img_path, fn_col = 'StudyInstanceUID', \n                               folder='trainXray_512',label_col=target_cols,suff='.jpg',\n                               bs=bs,y_block=MultiCategoryBlock(encoded=True, vocab=target_cols),\n                               item_tfms=item_tfms,batch_tfms=batch_tfms,val_idxs=val_idx)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dls.show_batch(nrows=3, ncols=3,figsize=(20,12))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"len(dls.valid_ds),len(dls.train_ds)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Metrics column wise mean aucroc"},{"metadata":{"trusted":true},"cell_type":"code","source":"import sklearn.metrics as sklm","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def col_mean_aucroc(preds, targs, labels=range(len(target_cols))):\n    # One-hot encode targets\n    return np.mean([sklm.roc_auc_score(targs[:,i], preds[:,i]) for i in labels])\ndef ETTAbnormal_auc(*args):\n    return col_mean_aucroc(*args, labels=[0])\ndef ETTBorderline_auc(*args):\n    return col_mean_aucroc(*args, labels=[1])\ndef ETTNormal_auc(*args):\n    return col_mean_aucroc(*args, labels=[2])\ndef NGTAbnormal_auc(*args):\n    return col_mean_aucroc(*args, labels=[3])\ndef NGTBorderline_auc(*args):\n    return col_mean_aucroc(*args, labels=[4])\ndef NGTIncompletelyImaged_auc(*args):\n    return col_mean_aucroc(*args, labels=[5])\ndef NGTNormal_auc(*args):\n    return col_mean_aucroc(*args, labels=[6])\ndef CVCAbnormal_auc(*args):\n    return col_mean_aucroc(*args, labels=[7])\ndef CVCBorderline_auc(*args):\n    return col_mean_aucroc(*args, labels=[8])\ndef CVCNormal_auc(*args):\n    return col_mean_aucroc(*args, labels=[9])\ndef SwanGanzCatheterPresent_auc(*args):\n    return col_mean_aucroc(*args, labels=[10])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Model EfficientNetB0"},{"metadata":{"trusted":true},"cell_type":"code","source":"from efficientnet_pytorch import EfficientNet","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"wp = '../input/efficientnet-pytorch/efficientnet-b5-586e6cc6.pth'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"class MyModel(Module):\n    def __init__(self, num_classes):\n\n        self.effnet = EfficientNet.from_pretrained(\"efficientnet-b5\",weights_path=wp)\n        self.dropout = nn.Dropout(0.1)\n        self.out = nn.Linear(2048, num_classes)\n\n    def forward(self, image):\n        batch_size, _, _, _ = image.shape\n\n        x = self.effnet.extract_features(image)\n        x = F.adaptive_avg_pool2d(x, 1).reshape(batch_size, -1)\n        outputs = self.out(self.dropout(x))\n        return outputs","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"effnet_B5 = MyModel(dls.c)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Making The Model by adding a dropout layer and final output layer"},{"metadata":{},"cell_type":"markdown","source":"## Metrics of each target columns"},{"metadata":{"trusted":true},"cell_type":"code","source":"metrics = [ AccumMetric(col_mean_aucroc, flatten=False),#Avg AUCROC\n            AccumMetric(ETTAbnormal_auc, flatten=False),\n            AccumMetric(ETTBorderline_auc, flatten=False),\n            AccumMetric(ETTNormal_auc, flatten=False),\n            AccumMetric(NGTAbnormal_auc, flatten=False),\n            AccumMetric(NGTBorderline_auc, flatten=False),\n            AccumMetric(NGTIncompletelyImaged_auc, flatten=False),\n            AccumMetric(NGTNormal_auc, flatten=False),\n            AccumMetric(CVCAbnormal_auc, flatten=False),\n            AccumMetric(CVCBorderline_auc, flatten=False),\n            AccumMetric(CVCNormal_auc, flatten=False),\n            AccumMetric(SwanGanzCatheterPresent_auc, flatten=False)]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn = Learner(dls, \n                effnet_B5, \n                loss_func=BCEWithLogitsLossFlat(),\n                metrics=metrics,\n                model_dir='/kaggle/working').to_native_fp16()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"cb1 = SaveModelCallback(monitor='col_mean_aucroc',fname='best_model',comp=np.greater) # Callbacks\ncb2 = ReduceLROnPlateau(monitor='col_mean_aucroc', min_delta=0.1, patience=2,factor=0.2)\nlearn.fit_one_cycle(10, 1e-3, cbs = [cb1,cb2])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn.load('best_model');","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"item_tfms = Resize(380)\nbatch_tfms = [*aug_transforms(size=380, max_warp=0), Normalize.from_stats(*imagenet_stats)]\nbs = 8","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"dlsB = ImageDataLoaders.from_df(trn_df, path=img_path, fn_col = 'StudyInstanceUID', \n                               folder='trainXray_512',label_col=target_cols,suff='.jpg',\n                               bs=4,y_block=MultiCategoryBlock(encoded=True, vocab=target_cols),\n                               item_tfms=item_tfms,batch_tfms=batch_tfms,val_idxs=val_idx)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn.dls = dlsB","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"gc.collect()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn.unfreeze()\ncb1 = SaveModelCallback(monitor='col_mean_aucroc',fname='best_model_380',comp=np.greater) # Callbacks\ncb2 = ReduceLROnPlateau(monitor='col_mean_aucroc', min_delta=0.1, patience=2,factor=0.2)\nlearn.fit_one_cycle(4, 1e-3/2, cbs = [cb1,cb2])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn.load('best_model_380');","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"learn = learn.to_fp32()\nlearn.save('best_model_fp32',with_opt=True);","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Work In progress Stay Tuned\n## Please Don't forget to upvote"},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"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":4,"nbformat_minor":4}