{"cells":[{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\n# for dirname, _, filenames in os.walk('/kaggle/input'):\n#     for filename in filenames:\n#         print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"import matplotlib.pyplot as plt\nimport seaborn as sns\nimport cv2\nplt.rcParams['figure.figsize'] = (15, 8)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true,"_kg_hide-output":true},"cell_type":"code","source":"!pip install git+https://github.com/qubvel/efficientnet","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import json\nimport math\nimport os\n\nfrom keras import layers\nfrom keras.applications import DenseNet121\nfrom keras.callbacks import Callback, ModelCheckpoint\nfrom keras.preprocessing.image import ImageDataGenerator\nfrom keras.models import Sequential\nfrom keras.optimizers import Adam\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.metrics import cohen_kappa_score, accuracy_score, auc, roc_auc_score, roc_curve\nimport sklearn\nimport scipy\nimport tensorflow as tf\nfrom tqdm import tqdm\nfrom keras.preprocessing import image\nfrom keras.models import Model\nfrom keras.layers import BatchNormalization, Dropout, Conv2D, MaxPooling2D, GlobalAveragePooling2D, Flatten, Dense\n\nfrom efficientnet.tfkeras import EfficientNetB7 as effnetb7\n\n\n%matplotlib inline","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## CONSTANTS"},{"metadata":{"trusted":true},"cell_type":"code","source":"SEED = 2020","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Functions"},{"metadata":{},"cell_type":"markdown","source":"### Perc_Data"},{"metadata":{"trusted":true},"cell_type":"code","source":"def perc_data(column, df):\n    cls = column.unique()\n    x = column.value_counts()\n    rows = df.shape[0]\n    print(\"CLASS\\t\\t : \\tPERCENTAGE\")\n    print(\"------------------------------------\")\n    for i in cls:\n        print(f\"{i}\\t\\t : \\t{(x[i]/rows)*100}\")\n    print(f\"NULL\\t\\t : \\t{(column.isna().sum()/rows)*100}\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### BGR2RGB"},{"metadata":{"trusted":true},"cell_type":"code","source":"def bgr2rgb(img):\n    return cv2.cvtColor(img, cv2.COLOR_BGR2RGB)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Sample Images"},{"metadata":{"trusted":true},"cell_type":"code","source":"def sample_images(df, train_img_path):\n    img_l = df.loc[df[\"target\"]==1].sample(7)[\"image_name\"].values\n    print(\"Target : 1\")\n    plt.figure(figsize = (30, 15))\n    for i, img_name in enumerate(img_l):\n        img = bgr2rgb(cv2.imread(f\"{train_img_path}/{img_name}.jpg\"))\n        plt.subplot(1,7,i+1)\n        plt.axis(\"off\")\n        plt.imshow(img)\n    plt.show()\n    img_l = df.loc[df[\"target\"]==0].sample(7)[\"image_name\"].values\n    print(\"Target : 0\")\n    plt.figure(figsize = (30, 15))\n    for i, img_name in enumerate(img_l):\n        img = bgr2rgb(cv2.imread(f\"{train_img_path}/{img_name}.jpg\"))\n        plt.subplot(1,7,i+1)\n        plt.axis(\"off\")\n        plt.imshow(img)\n    plt.draw()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 2019 Dataset"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df = pd.read_csv(\"../input/jpeg-isic2019-512x512/train.csv\")\ntrain_df.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df.shape","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"perc_data(train_df.diagnosis, train_df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"perc_data(train_df.benign_malignant, train_df)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"perc_data(train_df.sex, train_df)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## 2020 Dataset"},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df2020 = pd.read_csv(\"../input/jpeg-melanoma-512x512/train.csv\")\ntrain_df2020.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_df2020.info()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"perc_data(train_df2020.diagnosis, train_df2020)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"perc_data(train_df2020.target, train_df2020)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"perc_data(train_df2020.benign_malignant, train_df2020)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Plot images"},{"metadata":{},"cell_type":"markdown","source":"### 2019 data"},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_images(train_df, \"../input/jpeg-isic2019-512x512/train/\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### 2020 data"},{"metadata":{"trusted":true},"cell_type":"code","source":"sample_images(train_df2020, \"../input/jpeg-melanoma-512x512/train/\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Combine 2019 and 2020 datasets"},{"metadata":{},"cell_type":"markdown","source":"### Mapping 2020 diagnosis with 2019 diagnosis"},{"metadata":{"trusted":true},"cell_type":"code","source":"temp2020 = train_df2020\ntemp2020.loc[temp2020['diagnosis']=='seborrheic keratosis', 'diagnosis'] = 'BKL'\ntemp2020.loc[temp2020['diagnosis']=='lichenoid keratosis', 'diagnosis'] = 'BKL'\ntemp2020.loc[temp2020['diagnosis']=='solar lentigo', 'diagnosis'] = 'BKL'\ntemp2020.loc[temp2020['diagnosis']=='lentigo NOS', 'diagnosis'] = 'BKL'\ntemp2020.loc[temp2020['diagnosis']=='cafe-au-lait macule', 'diagnosis'] = 'unknown'\ntemp2020.loc[temp2020['diagnosis']=='atypical melanocytic proliferation', 'diagnosis'] = 'unknown'\ntemp2020.loc[temp2020['diagnosis']=='nevus', 'diagnosis'] = 'NV'\ntemp2020.loc[temp2020['diagnosis']=='melanoma', 'diagnosis'] = 'MEL'","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"perc_data(temp2020['diagnosis'], temp2020)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Adding path column"},{"metadata":{"trusted":true},"cell_type":"code","source":"temp2020['path'] = \"../input/jpeg-melanoma-512x512/train/\"+temp2020['image_name']+\".jpg\"","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img = cv2.imread(temp2020.iloc[0]['path'])\nplt.imshow(img)\nprint(img.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"temp2020.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"temp2019 = train_df","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"temp2019['path'] = \"../input/jpeg-isic2019-512x512/train/\"+temp2019['image_name']+\".jpg\"\ntemp2019.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_temp = temp2019.append(temp2020, ignore_index=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_temp","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train_temp = train_temp.sample(frac = 1, random_state = SEED).reset_index(drop=True)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"perc_data(train_temp['diagnosis'], train_temp)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = train_temp","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df['diagnosis'].value_counts()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"mel = df[df['diagnosis']==\"MEL\"].sample(1000, random_state = SEED)\nnv = df[df[\"diagnosis\"]==\"NV\"].sample(750, random_state = SEED)\nunknown = df[df[\"diagnosis\"]==\"unknown\"].sample(625, random_state = SEED)\nbcc = df[df[\"diagnosis\"]==\"BCC\"].sample(250, random_state = SEED)\nbkl = df[df[\"diagnosis\"]==\"BKL\"].sample(125, random_state = SEED)\nak = df[df[\"diagnosis\"]==\"AK\"].sample(125, random_state = SEED)\nvasc = df[df[\"diagnosis\"]==\"VASC\"].sample(125, random_state = SEED)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"mel = mel.append(nv, ignore_index = True)\nmel = mel.append(unknown, ignore_index = True)\nmel = mel.append(bcc, ignore_index = True)\nmel = mel.append(bkl, ignore_index = True)\nmel = mel.append(ak, ignore_index = True)\nmel = mel.append(vasc, ignore_index = True)\nmel","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"perc_data(mel['diagnosis'], mel)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train=mel\ntrain = train.sample(frac = 1, random_state = SEED).reset_index(drop=True)\ntrain","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Image Processing"},{"metadata":{"trusted":true},"cell_type":"code","source":"path1 = train.loc[train['target']==1, 'path'].sample(1).values[0]\npath0 = train.loc[train['target']==0, 'path'].sample(1).values[0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img1 = bgr2rgb(cv2.imread(path1))\nimg0 = bgr2rgb(cv2.imread(path0))\nplt.figure(figsize = (30, 15))\nplt.subplot(1, 2, 1)\nplt.imshow(img1)\nplt.title(\"Target : 1\")\nplt.subplot(1,2,2)\nplt.imshow(img0)\nplt.title(\"Target : 0\")\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def clahe_lab(img):\n    lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)\n    # lab = img\n    lab_planes = cv2.split(lab)\n    clahe = cv2.createCLAHE(clipLimit=1.0)\n    lab_planes[0] = clahe.apply(lab_planes[0])\n    lab_planes[1] = clahe.apply(lab_planes[1])\n    lab_planes[2] = clahe.apply(lab_planes[2])\n    lab = cv2.merge(lab_planes)\n    rgb = cv2.cvtColor(lab, cv2.COLOR_LAB2RGB)\n    return rgb\n\ndef crop_image_from_gray(img,tol=30):\n    if img.ndim ==2:\n        mask = img>tol\n        return img[np.ix_(mask.any(1),mask.any(0))]\n    elif img.ndim==3:\n        gray_img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)\n        mask = gray_img>tol\n      \n        check_shape = img[:,:,0][np.ix_(mask.any(1),mask.any(0))].shape[0]\n        if (check_shape == 0): # image is too dark so that we crop out everything,\n            return img # return original image\n        else:\n            img1=img[:,:,0][np.ix_(mask.any(1),mask.any(0))]\n            img2=img[:,:,1][np.ix_(mask.any(1),mask.any(0))]\n            img3=img[:,:,2][np.ix_(mask.any(1),mask.any(0))]\n  #         print(img1.shape,img2.shape,img3.shape)\n            img = np.stack([img1,img2,img3],axis=-1)\n  #         print(img.shape)\n    if img.shape!=(512, 512, 3):\n        img = cv2.resize(img, (512, 512))\n    return img\n\ndef preprocess(img):\n    hist_eq = clahe_lab(img)\n    img = crop_image_from_gray(hist_eq)\n    return img","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"N = len(train['path'].values)\nimg_train = np.empty((N, 512, 512, 3), dtype = np.uint8)\n\nfor i, img_path in enumerate(tqdm(train['path'].values)):\n    img = cv2.imread(img_path)\n    img = preprocess(img)\n    img_train[i, :, :, :] = img\n\nnp.save(\"x_train\", img_train)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Preapring the dataset"},{"metadata":{"trusted":true},"cell_type":"code","source":"diag_dict = {}\ndiag_unique = train.diagnosis.unique()\nfor i in range(len(diag_unique)):\n    diag_dict[diag_unique[i]] = i\n\ndiag_dict","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train[\"y\"] = train['diagnosis'].map(diag_dict)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_onehot = pd.get_dummies(train[\"y\"]).values\n\nmulti = y_onehot","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for i in range(len(multi)):\n    l = multi[i]\n    for j in range(5, -1, -1):\n        l[j] = np.logical_or(l[j], l[j+1])\n    multi[i] = l","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"multi[0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"np.save(\"multilabel_y\", multi)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train.to_csv(\"dataset.csv\", index = False)","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}