{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":104884,"sourceType":"datasetVersion","datasetId":54339},{"sourceId":990722,"sourceType":"datasetVersion","datasetId":542792},{"sourceId":7769378,"sourceType":"datasetVersion","datasetId":4545042}],"dockerImageVersionId":30664,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"%matplotlib inline\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport pandas as pd\nimport os\nfrom glob import glob\nimport seaborn as sns\nfrom PIL import Image\nnp.random.seed(42)\nimport random\nfrom sklearn.preprocessing import label_binarize\nfrom sklearn.metrics import confusion_matrix\nimport itertools\n\nimport tensorflow as tf\nfrom tensorflow.keras.utils import to_categorical\nfrom tensorflow.keras.models import Model, Sequential\nfrom tensorflow.keras.layers import Activation, Dense, Flatten, BatchNormalization, Dropout, Conv2D, Conv2DTranspose, MaxPooling2D, MaxPool2D, UpSampling2D, Input, Reshape\n\nfrom tensorflow.keras import backend as K\nimport itertools\nfrom tensorflow.keras.layers import BatchNormalization\nfrom tensorflow.keras.optimizers import Adam\nfrom tensorflow.keras.preprocessing.image import ImageDataGenerator\nfrom tensorflow.keras.callbacks import ReduceLROnPlateau\nfrom sklearn.model_selection import train_test_split\n","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:22:51.597113Z","iopub.execute_input":"2024-03-05T14:22:51.597978Z","iopub.status.idle":"2024-03-05T14:23:10.337845Z","shell.execute_reply.started":"2024-03-05T14:22:51.597932Z","shell.execute_reply":"2024-03-05T14:23:10.336541Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"base_skin_dir = os.path.join('..', 'input/skin-cancer-mnist-ham10000')\nimageid_path_dict = {os.path.splitext(os.path.basename(x))[0]: x\n                     for x in glob(os.path.join(base_skin_dir, '*', '*.jpg'))}\n\nlesion_type_dict = {\n    'nv': 'Melanocytic nevi',\n    'mel': 'Melanoma',\n    'bkl': 'Benign keratosis-like lesions ',\n    'bcc': 'Basal cell carcinoma',\n    'akiec': 'Actinic keratoses',\n    'vasc': 'Vascular lesions',\n    'df': 'Dermatofibroma'\n}","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:23:10.339814Z","iopub.execute_input":"2024-03-05T14:23:10.340481Z","iopub.status.idle":"2024-03-05T14:23:11.529899Z","shell.execute_reply.started":"2024-03-05T14:23:10.340449Z","shell.execute_reply":"2024-03-05T14:23:11.528515Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"skin_df = pd.read_csv(os.path.join(base_skin_dir, 'HAM10000_metadata.csv'))\nskin_df['path'] = skin_df['image_id'].map(imageid_path_dict.get)\nskin_df['cell_type'] = skin_df['dx'].map(lesion_type_dict.get) \nskin_df['cell_type_idx'] = pd.Categorical(skin_df['cell_type']).codes","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:23:11.531730Z","iopub.execute_input":"2024-03-05T14:23:11.532075Z","iopub.status.idle":"2024-03-05T14:23:11.596518Z","shell.execute_reply.started":"2024-03-05T14:23:11.532048Z","shell.execute_reply":"2024-03-05T14:23:11.595322Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(skin_df.columns)","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:23:11.598134Z","iopub.execute_input":"2024-03-05T14:23:11.599243Z","iopub.status.idle":"2024-03-05T14:23:11.607621Z","shell.execute_reply.started":"2024-03-05T14:23:11.599192Z","shell.execute_reply":"2024-03-05T14:23:11.606306Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"skin_df.head(3)","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:23:11.611845Z","iopub.execute_input":"2024-03-05T14:23:11.612276Z","iopub.status.idle":"2024-03-05T14:23:11.644364Z","shell.execute_reply.started":"2024-03-05T14:23:11.612240Z","shell.execute_reply":"2024-03-05T14:23:11.643015Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Data Cleaning**","metadata":{}},{"cell_type":"code","source":"skin_df['age'].fillna((skin_df['age'].mean()), inplace=True)\nprint(skin_df.dtypes)","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:23:11.646042Z","iopub.execute_input":"2024-03-05T14:23:11.646419Z","iopub.status.idle":"2024-03-05T14:23:11.658009Z","shell.execute_reply.started":"2024-03-05T14:23:11.646388Z","shell.execute_reply":"2024-03-05T14:23:11.656285Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Distrubtion of the 7 different classes**","metadata":{}},{"cell_type":"code","source":"fig, ax1 = plt.subplots(1, 1, figsize= (10, 5))\nskin_df['cell_type'].value_counts().plot(kind='bar', ax=ax1)\n\n# Save the plot as a PNG file\nplt.savefig('Cell_Type_Counts.png')\n\nplt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:23:11.660015Z","iopub.execute_input":"2024-03-05T14:23:11.660477Z","iopub.status.idle":"2024-03-05T14:23:12.110631Z","shell.execute_reply.started":"2024-03-05T14:23:11.660435Z","shell.execute_reply":"2024-03-05T14:23:12.108301Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Apply Downsampling due to imbalance dataset**","metadata":{}},{"cell_type":"code","source":"from sklearn.utils import resample\n\nsamples_count = skin_df['cell_type'].value_counts()\nmajority_class = skin_df['cell_type'].isin([samples_count.idxmax()])\nminority_class = skin_df['cell_type'].isin([samples_count.idxmin()])\n\ndf_majority = skin_df[majority_class]\ndf_minority = skin_df[minority_class]\n\nprint(skin_df['cell_type'].value_counts().idxmax())","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:23:12.112625Z","iopub.execute_input":"2024-03-05T14:23:12.113171Z","iopub.status.idle":"2024-03-05T14:23:12.137783Z","shell.execute_reply.started":"2024-03-05T14:23:12.113127Z","shell.execute_reply":"2024-03-05T14:23:12.136710Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Downsample majority class\ndf_majority_downsampled = resample(df_majority, \n                                 replace=False,     # sample without replacement\n                                 n_samples=1500,    # to match minority class\n                                 random_state=123)  # reproducible results\n# Combine majority class with downsampled minority class\ndf_downsampled = pd.concat([df_majority_downsampled, df_minority])\n\n# Display new class counts\ndf_downsampled['cell_type'].value_counts().plot(kind='bar', title='count')\n\n# Save the plot as a PNG file\nplt.savefig('class_counts_downsamling.png')\n","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:23:12.139321Z","iopub.execute_input":"2024-03-05T14:23:12.139819Z","iopub.status.idle":"2024-03-05T14:23:12.498355Z","shell.execute_reply.started":"2024-03-05T14:23:12.139699Z","shell.execute_reply":"2024-03-05T14:23:12.497358Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Upsampling**","metadata":{}},{"cell_type":"code","source":"# Upsample minority class\ndf_minority_upsampled = resample(df_minority, \n                                 replace=True,      # sample with replacement\n                                 n_samples=3000,    # to match majority class\n                                 random_state=42)   # reproducible results\n\n# Combine majority class with upsampled minority class\ndf_upsampled = pd.concat([df_majority, df_minority_upsampled])\n\n# Display new class counts\ndf_upsampled['cell_type'].value_counts().plot(kind='bar', title='count')\n# Save the plot as a PNG file\nplt.savefig('class_counts_upsampling.png')","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:23:12.500222Z","iopub.execute_input":"2024-03-05T14:23:12.502239Z","iopub.status.idle":"2024-03-05T14:23:12.849966Z","shell.execute_reply.started":"2024-03-05T14:23:12.502195Z","shell.execute_reply":"2024-03-05T14:23:12.848759Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"skin_df = skin_df[skin_df['cell_type'] != skin_df['cell_type'].value_counts().idxmax()]\nskin_df = pd.concat([skin_df, df_majority_downsampled], sort=True)\n\n# Calculate the counts of each cell type\ncounts = skin_df['cell_type'].value_counts()\n\n# Plot the counts on a bar chart\nplt.figure(figsize=(10, 5))\ncounts.plot(kind='bar', title='Count')\n\n# Save the plot as a PNG file\nplt.savefig('cell_type_counts_resample_dataset.png')\nprint(skin_df['cell_type'].value_counts())\nplt.show","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:29:59.476232Z","iopub.execute_input":"2024-03-05T14:29:59.476707Z","iopub.status.idle":"2024-03-05T14:29:59.926394Z","shell.execute_reply.started":"2024-03-05T14:29:59.476671Z","shell.execute_reply":"2024-03-05T14:29:59.924903Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"skin_df['dx_type'].value_counts().plot(kind='bar')","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:30:10.577872Z","iopub.execute_input":"2024-03-05T14:30:10.578332Z","iopub.status.idle":"2024-03-05T14:30:10.842137Z","shell.execute_reply.started":"2024-03-05T14:30:10.578297Z","shell.execute_reply":"2024-03-05T14:30:10.840553Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Distribution of localized field**","metadata":{}},{"cell_type":"code","source":"skin_df['localization'].value_counts().plot(kind='bar')\nplt.savefig('localization.png')","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:30:25.085758Z","iopub.execute_input":"2024-03-05T14:30:25.087043Z","iopub.status.idle":"2024-03-05T14:30:25.503992Z","shell.execute_reply.started":"2024-03-05T14:30:25.086998Z","shell.execute_reply":"2024-03-05T14:30:25.502595Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Distribution of age**","metadata":{}},{"cell_type":"code","source":"skin_df['age'].hist(bins=40)\nplt.savefig('Distribution of Age')","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:30:26.136582Z","iopub.execute_input":"2024-03-05T14:30:26.137712Z","iopub.status.idle":"2024-03-05T14:30:26.526545Z","shell.execute_reply.started":"2024-03-05T14:30:26.137651Z","shell.execute_reply":"2024-03-05T14:30:26.524113Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Distribution of Gender**","metadata":{}},{"cell_type":"code","source":"skin_df['sex'].value_counts().plot(kind='bar')\nplt.savefig('Distribution_of_gender.png')","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:30:48.201826Z","iopub.execute_input":"2024-03-05T14:30:48.202335Z","iopub.status.idle":"2024-03-05T14:30:48.462170Z","shell.execute_reply.started":"2024-03-05T14:30:48.202297Z","shell.execute_reply":"2024-03-05T14:30:48.460607Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Distribution of age and cancer type**","metadata":{}},{"cell_type":"code","source":"sns.scatterplot(x='age', y='cell_type_idx', data=skin_df)\nplt.savefig('distribution_age_cancer_type.png')","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:30:57.970719Z","iopub.execute_input":"2024-03-05T14:30:57.971411Z","iopub.status.idle":"2024-03-05T14:30:58.420410Z","shell.execute_reply.started":"2024-03-05T14:30:57.971367Z","shell.execute_reply":"2024-03-05T14:30:58.419061Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Resize the images**","metadata":{}},{"cell_type":"code","source":"skin_df['image'] = skin_df['path'].map(lambda x: np.asarray(Image.open(x).resize((128,96))))","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:36:43.545376Z","iopub.execute_input":"2024-03-05T14:36:43.545922Z","iopub.status.idle":"2024-03-05T14:37:35.463856Z","shell.execute_reply.started":"2024-03-05T14:36:43.545860Z","shell.execute_reply":"2024-03-05T14:37:35.462231Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Display sample images of each cancer type**","metadata":{}},{"cell_type":"code","source":"n_samples = 5\nfig, m_axs = plt.subplots(7, n_samples, figsize = (4*n_samples, 3*7))\nfor n_axs, (type_name, type_rows) in zip(m_axs, \n                                         skin_df.sort_values(['cell_type']).groupby('cell_type')):\n    n_axs[0].set_title(type_name)\n    for c_ax, (_, c_row) in zip(n_axs, type_rows.sample(n_samples, random_state=1234).iterrows()):\n        c_ax.imshow(c_row['image'])\n        c_ax.axis('off')\nfig.savefig('category_samples.png', dpi=300)","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:38:47.383745Z","iopub.execute_input":"2024-03-05T14:38:47.384131Z","iopub.status.idle":"2024-03-05T14:38:54.791533Z","shell.execute_reply.started":"2024-03-05T14:38:47.384103Z","shell.execute_reply":"2024-03-05T14:38:54.790027Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"skin_df['image'].map(lambda x: x.shape).value_counts()","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:45:43.159716Z","iopub.execute_input":"2024-03-05T14:45:43.160161Z","iopub.status.idle":"2024-03-05T14:45:43.175600Z","shell.execute_reply.started":"2024-03-05T14:45:43.160132Z","shell.execute_reply":"2024-03-05T14:45:43.173986Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**set target and features**","metadata":{}},{"cell_type":"code","source":"features = skin_df.drop(columns=['cell_type_idx'],axis=1)\ntarget = skin_df['cell_type_idx']","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:45:48.408813Z","iopub.execute_input":"2024-03-05T14:45:48.409280Z","iopub.status.idle":"2024-03-05T14:45:48.420042Z","shell.execute_reply.started":"2024-03-05T14:45:48.409248Z","shell.execute_reply":"2024-03-05T14:45:48.418315Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Split training set**","metadata":{}},{"cell_type":"code","source":"x_train_o, x_test_o, y_train_o, y_test_o = train_test_split(features, target, test_size=0.10,random_state=1234)","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:45:52.363025Z","iopub.execute_input":"2024-03-05T14:45:52.364062Z","iopub.status.idle":"2024-03-05T14:45:52.375778Z","shell.execute_reply.started":"2024-03-05T14:45:52.364012Z","shell.execute_reply":"2024-03-05T14:45:52.374694Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Normalization**","metadata":{}},{"cell_type":"code","source":"x_train = np.asarray(x_train_o['image'].tolist())\nx_test = np.asarray(x_test_o['image'].tolist())\n\nx_train_mean = np.mean(x_train)\nx_train_std = np.std(x_train)\n\nx_test_mean = np.mean(x_test)\nx_test_std = np.std(x_test)\n\nx_train = (x_train - x_train_mean)/x_train_std\nx_test = (x_test - x_test_mean)/x_test_std","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:45:56.249593Z","iopub.execute_input":"2024-03-05T14:45:56.250545Z","iopub.status.idle":"2024-03-05T14:45:58.810685Z","shell.execute_reply.started":"2024-03-05T14:45:56.250513Z","shell.execute_reply":"2024-03-05T14:45:58.809291Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Label encoding**","metadata":{}},{"cell_type":"code","source":"y_train = to_categorical(y_train_o, num_classes = 7)\ny_test = to_categorical(y_test_o, num_classes = 7)","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:47:15.404391Z","iopub.execute_input":"2024-03-05T14:47:15.405297Z","iopub.status.idle":"2024-03-05T14:47:15.411368Z","shell.execute_reply.started":"2024-03-05T14:47:15.405250Z","shell.execute_reply":"2024-03-05T14:47:15.410330Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Spliting traning and validation**","metadata":{}},{"cell_type":"code","source":"x_train, x_validate, y_train, y_validate = train_test_split(x_train, y_train, test_size = 0.1, random_state = 2)","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:47:18.453699Z","iopub.execute_input":"2024-03-05T14:47:18.454078Z","iopub.status.idle":"2024-03-05T14:47:19.347110Z","shell.execute_reply.started":"2024-03-05T14:47:18.454051Z","shell.execute_reply":"2024-03-05T14:47:19.345838Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Reshape images into 3 dimension**","metadata":{}},{"cell_type":"code","source":"x_train = x_train.reshape(x_train.shape[0], *(96, 128, 3))\nx_test = x_test.reshape(x_test.shape[0], *(96, 128, 3))\nx_validate = x_validate.reshape(x_validate.shape[0], *(96, 128, 3))","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:47:23.407827Z","iopub.execute_input":"2024-03-05T14:47:23.408581Z","iopub.status.idle":"2024-03-05T14:47:23.414056Z","shell.execute_reply.started":"2024-03-05T14:47:23.408548Z","shell.execute_reply":"2024-03-05T14:47:23.412886Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(np.bincount(skin_df['cell_type_idx']))","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:47:27.974088Z","iopub.execute_input":"2024-03-05T14:47:27.974717Z","iopub.status.idle":"2024-03-05T14:47:27.981786Z","shell.execute_reply.started":"2024-03-05T14:47:27.974675Z","shell.execute_reply":"2024-03-05T14:47:27.980235Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Load U-Net model**","metadata":{}},{"cell_type":"code","source":"def unet():\n    input_shape = (96, 128, 3)\n    img_input = Input(shape=input_shape)\n    x = Conv2D(64, (3, 3), padding='same', name='conv1',strides= (1,1))(img_input)\n    x = BatchNormalization(name='bn1')(x)\n    x = Activation('relu')(x)\n    x = Conv2D(64, (3, 3), padding='same', name='conv2')(x)\n    x = BatchNormalization(name='bn2')(x)\n    x = Activation('relu')(x)\n    x = MaxPooling2D()(x)\n\n    x = Conv2D(128, (3, 3), padding='same', name='conv3')(x)\n    x = BatchNormalization(name='bn3')(x)\n    x = Activation('relu')(x)\n    x = Conv2D(128, (3, 3), padding='same', name='conv4')(x)\n    x = BatchNormalization(name='bn4')(x)\n    x = Activation('relu')(x)\n    x = MaxPooling2D()(x)\n\n    x = Conv2D(256, (3, 3), padding='same', name='conv5')(x)\n    x = BatchNormalization(name='bn5')(x)\n    x = Activation('relu')(x)\n    x = Conv2D(256, (3, 3), padding='same', name='conv6')(x)\n    x = BatchNormalization(name='bn6')(x)\n    x = Activation('relu')(x)\n    x = Conv2D(256, (3, 3), padding='same', name='conv7')(x)\n    x = BatchNormalization(name='bn7')(x)\n    x = Activation('relu')(x)\n    x = MaxPooling2D()(x)\n\n    x = Conv2D(512, (3, 3), padding='same', name='conv8')(x)\n    x = BatchNormalization(name='bn8')(x)\n    x = Activation('relu')(x)\n    x = Conv2D(512, (3, 3), padding='same', name='conv9')(x)\n    x = BatchNormalization(name='bn9')(x)\n    x = Activation('relu')(x)\n    x = Conv2D(512, (3, 3), padding='same', name='conv10')(x)\n    x = BatchNormalization(name='bn10')(x)\n    x = Activation('relu')(x)\n    x = MaxPooling2D()(x)\n\n    x = Conv2D(512, (3, 3), padding='same', name='conv11')(x)\n    x = BatchNormalization(name='bn11')(x)\n    x = Activation('relu')(x)\n    x = Conv2D(512, (3, 3), padding='same', name='conv12')(x)\n    x = BatchNormalization(name='bn12')(x)\n    x = Activation('relu')(x)\n    x = Conv2D(512, (3, 3), padding='same', name='conv13')(x)\n    x = BatchNormalization(name='bn13')(x)\n    x = Activation('relu')(x)\n    x = MaxPooling2D()(x)\n\n    x = Dense(1024, activation = 'relu', name='fc1')(x)\n    x = Dense(1024, activation = 'relu', name='fc2')(x)\n\n    # Decoding Layer \n    x = UpSampling2D()(x)\n    x = Conv2DTranspose(512, (3, 3), padding='same', name='deconv1')(x)\n    x = BatchNormalization(name='bn14')(x)\n    x = Activation('relu')(x)\n    x = Conv2DTranspose(512, (3, 3), padding='same', name='deconv2')(x)\n    x = BatchNormalization(name='bn15')(x)\n    x = Activation('relu')(x)\n    x = Conv2DTranspose(512, (3, 3), padding='same', name='deconv3')(x)\n    x = BatchNormalization(name='bn16')(x)\n    x = Activation('relu')(x)\n\n    x = UpSampling2D()(x)\n    x = Conv2DTranspose(512, (3, 3), padding='same', name='deconv4')(x)\n    x = BatchNormalization(name='bn17')(x)\n    x = Activation('relu')(x)\n    x = Conv2DTranspose(512, (3, 3), padding='same', name='deconv5')(x)\n    x = BatchNormalization(name='bn18')(x)\n    x = Activation('relu')(x)\n    x = Conv2DTranspose(256, (3, 3), padding='same', name='deconv6')(x)\n    x = BatchNormalization(name='bn19')(x)\n    x = Activation('relu')(x)\n\n    x = UpSampling2D()(x)\n    x = Conv2DTranspose(256, (3, 3), padding='same', name='deconv7')(x)\n    x = BatchNormalization(name='bn20')(x)\n    x = Activation('relu')(x)\n    x = Conv2DTranspose(256, (3, 3), padding='same', name='deconv8')(x)\n    x = BatchNormalization(name='bn21')(x)\n    x = Activation('relu')(x)\n    x = Conv2DTranspose(128, (3, 3), padding='same', name='deconv9')(x)\n    x = BatchNormalization(name='bn22')(x)\n    x = Activation('relu')(x)\n\n    x = UpSampling2D()(x)\n    x = Conv2DTranspose(128, (3, 3), padding='same', name='deconv10')(x)\n    x = BatchNormalization(name='bn23')(x)\n    x = Activation('relu')(x)\n    x = Conv2DTranspose(64, (3, 3), padding='same', name='deconv11')(x)\n    x = BatchNormalization(name='bn24')(x)\n    x = Activation('relu')(x)\n\n    x = UpSampling2D()(x)\n    x = Conv2DTranspose(64, (3, 3), padding='same', name='deconv12')(x)\n    x = BatchNormalization(name='bn25')(x)\n    x = Activation('relu')(x)\n    x = Conv2DTranspose(1, (3, 3), padding='same', name='deconv13')(x)\n    x = BatchNormalization(name='bn26')(x)\n    x = Activation('sigmoid')(x)\n    \n    pred = Reshape((96, 128))(x)\n    model = Model(inputs=img_input, outputs=pred)\n    model.load_weights('../input/unet-weights/unet_100_epoch.h5')\n    \n    return model\n\nunet_model = unet()","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:47:30.413759Z","iopub.execute_input":"2024-03-05T14:47:30.414792Z","iopub.status.idle":"2024-03-05T14:47:32.873883Z","shell.execute_reply.started":"2024-03-05T14:47:30.414754Z","shell.execute_reply":"2024-03-05T14:47:32.872516Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Helper method**","metadata":{}},{"cell_type":"code","source":"def enhance(img):\n    sub = (unet_model.predict(img.reshape(1,96,128,3))).flatten()\n\n    for i in range(len(sub)):\n        if sub[i] > 0.5:\n            sub[i] = 1\n        else:\n            sub[i] = 0\n    return sub","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:47:52.961829Z","iopub.execute_input":"2024-03-05T14:47:52.962210Z","iopub.status.idle":"2024-03-05T14:47:52.969315Z","shell.execute_reply.started":"2024-03-05T14:47:52.962182Z","shell.execute_reply":"2024-03-05T14:47:52.968063Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import cv2\n\ndef applyMask(img):\n    mask = np.array(enhance(img).reshape(96, 128), dtype=np.uint8)\n    \n    res = cv2.bitwise_and(img,img,mask = mask)\n    \n    return res","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:48:02.011729Z","iopub.execute_input":"2024-03-05T14:48:02.012140Z","iopub.status.idle":"2024-03-05T14:48:02.284114Z","shell.execute_reply.started":"2024-03-05T14:48:02.012111Z","shell.execute_reply":"2024-03-05T14:48:02.282886Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Apply mask**","metadata":{}},{"cell_type":"code","source":"random_sample_df = skin_df.sample(n=5)\nprint(random_sample_df['cell_type'].value_counts())\n\nimg_list = [img for img in random_sample_df['image']]\n\nseg_img_list = [applyMask(img) for img in img_list]","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:48:05.860736Z","iopub.execute_input":"2024-03-05T14:48:05.861131Z","iopub.status.idle":"2024-03-05T14:48:08.754552Z","shell.execute_reply.started":"2024-03-05T14:48:05.861102Z","shell.execute_reply":"2024-03-05T14:48:08.753187Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def show_comparison(img_list):\n    for i in range(len(img_list)):\n        plt.figure(figsize=(16,16))\n        plt.subplot(i+1,3,1)\n        plt.imshow(img_list[i])\n        plt.title('Original Image')\n        plt.subplot(i+1,3,2)\n        plt.imshow(enhance(img_list[i]).reshape(96, 128), plt.cm.binary_r)\n        plt.title('Predicted Mask')\n        plt.subplot(i+1,3,3)\n        plt.imshow(applyMask(img_list[i]), plt.cm.binary_r)\n        plt.title('Segmented Image')\n        plt.savefig('segmented_images.png')\n    \nshow_comparison(img_list)","metadata":{"execution":{"iopub.status.busy":"2024-03-05T14:48:10.767263Z","iopub.execute_input":"2024-03-05T14:48:10.768188Z","iopub.status.idle":"2024-03-05T14:48:19.652673Z","shell.execute_reply.started":"2024-03-05T14:48:10.768154Z","shell.execute_reply":"2024-03-05T14:48:19.651238Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.preprocessing import image\nfrom keras.models import Model\nfrom keras.layers import Dense, GlobalAveragePooling2D, Dropout\nfrom keras.callbacks import ReduceLROnPlateau\nfrom keras import backend as K\n\nfrom keras.applications.resnet50 import ResNet50\n\n\ndef resnet50(epochs, batch_size, classes, model_input):\n    # create the base pre-trained model\n    base_model = ResNet50(weights='/kaggle/input/resnet-50/resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5', include_top=False, input_tensor=model_input)\n  \n    x = base_model.output\n    x = Flatten()(x)\n    x = Dense(1024, activation='relu')(x)\n    predictions = Dense(classes, activation='softmax', use_bias=True)(x)\n\n    model = Model(inputs=base_model.input, outputs=predictions)\n\n    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n\n    learning_rate_reduction = ReduceLROnPlateau(monitor='val_accuracy', \n                                                patience=3, \n                                                verbose=1, \n                                                factor=0.5, \n                                                min_lr=0.00001)\n    \n    # train \n    history = model.fit(datagen.flow(x_train,y_train, batch_size=batch_size),\n                                  class_weight=class_weights,\n                                  epochs = epochs, validation_data = (x_validate,y_validate),\n                                  verbose = 1, steps_per_epoch=x_train.shape[0] // batch_size,\n                                  callbacks=callbacks)\n\n    return model, history","metadata":{"execution":{"iopub.status.busy":"2024-03-05T18:08:42.310999Z","iopub.execute_input":"2024-03-05T18:08:42.311594Z","iopub.status.idle":"2024-03-05T18:08:42.329237Z","shell.execute_reply.started":"2024-03-05T18:08:42.311537Z","shell.execute_reply":"2024-03-05T18:08:42.327694Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"learning_rate_reduction = ReduceLROnPlateau(monitor='val_accuracy', \n                                            patience=3, \n                                            verbose=1, \n                                            factor=0.5, \n                                            min_lr=0.00001)","metadata":{"execution":{"iopub.status.busy":"2024-03-05T18:10:08.717083Z","iopub.execute_input":"2024-03-05T18:10:08.717549Z","iopub.status.idle":"2024-03-05T18:10:08.722732Z","shell.execute_reply.started":"2024-03-05T18:10:08.717487Z","shell.execute_reply":"2024-03-05T18:10:08.721602Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"optimizer = Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)","metadata":{"execution":{"iopub.status.busy":"2024-03-05T18:10:07.159211Z","iopub.execute_input":"2024-03-05T18:10:07.159662Z","iopub.status.idle":"2024-03-05T18:10:07.172889Z","shell.execute_reply.started":"2024-03-05T18:10:07.159628Z","shell.execute_reply":"2024-03-05T18:10:07.171285Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from keras.callbacks import ModelCheckpoint\n\n# Save the model after every 1 epoch\ncheckpoint = ModelCheckpoint(\"resnet50_best_model.keras\", monitor='val_acc', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', save_freq='epoch')\n\ncallbacks = [learning_rate_reduction, checkpoint]\n","metadata":{"execution":{"iopub.status.busy":"2024-03-05T18:10:04.941268Z","iopub.execute_input":"2024-03-05T18:10:04.942040Z","iopub.status.idle":"2024-03-05T18:10:04.950063Z","shell.execute_reply.started":"2024-03-05T18:10:04.941990Z","shell.execute_reply":"2024-03-05T18:10:04.948695Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Data Augmentation**","metadata":{}},{"cell_type":"code","source":"datagen = ImageDataGenerator(\n        featurewise_center=False,  # set input mean to 0 over the dataset\n        samplewise_center=False,  # set each sample mean to 0\n        featurewise_std_normalization=False,  # divide inputs by std of the dataset\n        samplewise_std_normalization=False,  # divide each input by its std\n        zca_whitening=False,  # apply ZCA whitening\n        rotation_range=10,  # randomly rotate images in the range (degrees, 0 to 180)\n        zoom_range = 0.1, # Randomly zoom image \n        width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)\n        height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)\n        horizontal_flip=False,  # randomly flip images\n        vertical_flip=False)  # randomly flip images\n\ndatagen.fit(x_train)","metadata":{"execution":{"iopub.status.busy":"2024-03-05T17:47:24.070576Z","iopub.execute_input":"2024-03-05T17:47:24.070973Z","iopub.status.idle":"2024-03-05T17:47:27.772248Z","shell.execute_reply.started":"2024-03-05T17:47:24.070943Z","shell.execute_reply":"2024-03-05T17:47:27.771016Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"total_samples = skin_df.shape[0]\nclass_counts = skin_df['cell_type'].value_counts()\nclass_weights = {class_label: total_samples / count for class_label, count in class_counts.items()}\n","metadata":{"execution":{"iopub.status.busy":"2024-03-05T18:10:15.814320Z","iopub.execute_input":"2024-03-05T18:10:15.814785Z","iopub.status.idle":"2024-03-05T18:10:15.828718Z","shell.execute_reply.started":"2024-03-05T18:10:15.814752Z","shell.execute_reply":"2024-03-05T18:10:15.827275Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"**Fit the model**","metadata":{}},{"cell_type":"code","source":"epochs = 100\nbatch_size = 10\nclasses = 7\n\nmodel_input = Input(shape=(96, 128, 3))\nresnet50_model, resnet50_history = resnet50(epochs, batch_size, classes, model_input)","metadata":{"execution":{"iopub.status.busy":"2024-03-05T18:10:19.016087Z","iopub.execute_input":"2024-03-05T18:10:19.016593Z","iopub.status.idle":"2024-03-05T18:12:15.276224Z","shell.execute_reply.started":"2024-03-05T18:10:19.016548Z","shell.execute_reply":"2024-03-05T18:12:15.273828Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}