{"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)\nimport cv2\nimport matplotlib\nimport matplotlib.pyplot as plt\nfrom IPython.display import Image, display\nimport openslide\nimport PIL\n\nimport tensorflow as tf\nfrom sklearn.metrics import confusion_matrix,accuracy_score\nfrom sklearn.datasets import load_iris\nfrom sklearn.model_selection import train_test_split\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense,Conv2D,MaxPooling2D,Flatten, Conv3D,MaxPooling3D, BatchNormalization\nfrom tensorflow.keras import optimizers\nfrom sklearn.metrics import roc_auc_score\nfrom mpl_toolkits import mplot3d\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\nfor 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 5GB 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":{"trusted":true},"cell_type":"code","source":"len(os.listdir('../input/prostate-cancer-grade-assessment/train_images'))-len(os.listdir('../input/prostate-cancer-grade-assessment/train_label_masks'))","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Loading the Dataset","execution_count":null},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"data_path = \"../input/prostate-cancer-grade-assessment/\"\nimg_path = data_path + \"train_images/\"\nmask_path = data_path + \"train_label_masks/\"\ntrn = pd.read_csv(data_path+\"train.csv\").set_index('image_id')\ntrn.head()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"trn.info()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Sampling the Dataset","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"samples = trn.sample(frac=0.01, replace=True, random_state=7)\nsamples.info()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Removing Images without Masks","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"for i in samples.index:\n    path = mask_path+i+\"_mask.tiff\"\n    if(os.path.exists(path)):\n        continue\n    else:\n        samples.drop(i,inplace=True)\n\nsamples.info()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Understanding the Dataset","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"* ### Images are in .tiff Format \n* ### Images has diffrent Levels and Slices","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"slide = openslide.OpenSlide(img_path+\"0005f7aaab2800f6170c399693a96917.tiff\")\nprint(slide.level_count)\nprint(slide.level_dimensions)\nf1,ax1 = plt.subplots(3,5,figsize=(15,11))\nfor i in range(slide.level_count):\n    im = slide.read_region((0,0),slide.level_count - (i+1), slide.level_dimensions[-1])\n    imn = np.asarray(im)\n    ax1[i,0].imshow(im)\n    ax1[i,0].set_title(\"Level: {} \\tDimension:{}\".format(i+1,slide.level_dimensions[-1]))\n    ax1[i,0].axis('off')\n    for j in range(imn.shape[2]):\n        ax1[i,j+1].imshow(imn[:,:,j])\n        ax1[i,j+1].set_title(\"Slice: {}\".format(j+1))\n        ax1[i,j+1].axis('off')\nf1.tight_layout()\nf1.suptitle(\"Dimensions:{}\".format(slide.level_dimensions[-1]))\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"* ### Levels correspond to Dimension(Size) of image\n* ### Slices are channel (similar to RGB)","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"f1,ax1 = plt.subplots(3,5,figsize=(15,12))\nfor i in range(slide.level_count):\n    im = slide.read_region((0,0),slide.level_count - (i+1), slide.level_dimensions[-2])\n    imn = np.asarray(im)\n    ax1[i,0].imshow(im)\n    ax1[i,0].set_title(\"Level: {}\".format(i+1))\n    ax1[i,0].axis('off')\n    for j in range(imn.shape[2]):\n        ax1[i,j+1].imshow(imn[:,:,j])\n        ax1[i,j+1].set_title(\"Slice: {}\".format(j+1))\n        ax1[i,j+1].axis('off')\nf1.tight_layout()\nf1.suptitle(\"Dimensions:{}\".format(slide.level_dimensions[-2]))\nplt.show()\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Plotting Images\n* ### Images are of various sizes","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"images = []\nfor i in samples.index:\n    #slide = openslide.OpenSlide(img_path+\"0005f7aaab2800f6170c399693a96917.tiff\")\n    path = img_path+i+\".tiff\"\n    if(os.path.exists(path)):\n        slide = openslide.OpenSlide(path)\n        im = slide.read_region((0,0),slide.level_count - 1, slide.level_dimensions[-1])\n        images.append( (i,np.asarray(im),samples.loc[i,'isup_grade'],samples.loc[i,'gleason_score']) )\n        slide.close()\n    else:\n         images.append( (i,None,samples.loc[i,'isup_grade'],samples.loc[i,'gleason_score']) )\n    \nf,ax = plt.subplots(3,3,figsize=(10,15))\nfor i, im in enumerate(images[:9]):\n    ax[i//3,i%3].imshow(im[1])\n    ax[i//3, i%3].axis('off')  \n    ax[i//3,i%3].set_title('ISUP: {}  Gleason: {}'.format(im[2],im[3]))\nf.tight_layout()\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Mask Images\n* ### Mask Images are of the .tiff format as well\n* ### Structured same as Original Images\n* ### Only 1 channel has data others are redundant","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"slide = openslide.OpenSlide(mask_path+\"0005f7aaab2800f6170c399693a96917_mask.tiff\")\nprint(slide.level_count)\nprint(slide.level_dimensions)\n#cmap = matplotlib.colors.ListedColormap(['black', 'gray', 'green', 'yellow', 'orange', 'red'])\nf1,ax1 = plt.subplots(3,5,figsize=(15,12))\nfor i in range(slide.level_count):\n    im = slide.read_region((0,0),slide.level_count - (i+1), slide.level_dimensions[-1])\n    imn = np.asarray(im)\n    ax1[i,0].imshow(im)\n    ax1[i,0].set_title(\"Level: {}\".format(i+1))\n    ax1[i,0].axis('off')\n    for j in range(imn.shape[2]):\n        ax1[i,j+1].imshow(imn[:,:,j])\n        ax1[i,j+1].set_title(\"Slice: {}\".format(j+1))\n        ax1[i,j+1].axis('off')\nf1.tight_layout()\nf1.suptitle(\"Dimensions:{}\".format(slide.level_dimensions[-1]))\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"### Mask has 6 type of values corresponding to 6 level of severity of cancer(ISUP Grade)\n* ### Plotting mask images by colour coding them","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"masks = []\nfor i in samples.index:\n    path = mask_path+i+\"_mask.tiff\"\n    if(os.path.exists(path)):\n        slide = openslide.OpenSlide(path)\n        #print(slide.level_count - 1, slide.level_dimensions[-1])\n        im = slide.get_thumbnail(size=slide.level_dimensions[-1])\n        imn = np.asarray(im)[:,:,0]\n        masks.append( (i,imn,samples.loc[i,'isup_grade'],samples.loc[i,'gleason_score']) )\n        slide.close()\n    else:\n        masks.append( (i,None,samples.loc[i,'isup_grade'],samples.loc[i,'gleason_score']) )\n    \nf,ax = plt.subplots(3,3,figsize=(10,15))\ncmap = matplotlib.colors.ListedColormap(['black', 'gray', 'green', 'yellow', 'orange', 'red'])\nfor i, im in enumerate(masks[:9]):\n    ax[i//3,i%3].imshow(im[1],cmap=cmap)\n    ax[i//3,i%3].axis('off')  \n    ax[i//3,i%3].set_title('ISUP: {}  Gleason: {}'.format(im[2],im[3]))\nf.tight_layout()\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Overlaying of the Original and Mask Images","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"def overlay(ind, center='radboud', alpha=0.8, max_size=(1024, 1024)):\n    \n    ov_img = []\n    ptl = []\n    for i in ind:\n        slide = openslide.OpenSlide(img_path+i+\".tiff\")\n        path = mask_path+i+\"_mask.tiff\"\n        if(os.path.exists(path)):\n            mask = openslide.OpenSlide(mask_path+\"{}_mask.tiff\".format(i))\n            slide_data = slide.read_region((0,0), slide.level_count - 1, slide.level_dimensions[-1])\n            mask_data = mask.read_region((0,0), mask.level_count - 1, mask.level_dimensions[-1])\n            mask_data = mask_data.split()[0]\n    \n            alpha_int = int(round(255*alpha))\n            if center == 'radboud':\n                alpha_content = np.less(mask_data.split()[0], 2).astype('uint8') * alpha_int + (255 - alpha_int)\n            elif center == 'karolinska':\n                alpha_content = np.less(mask_data.split()[0], 1).astype('uint8') * alpha_int + (255 - alpha_int)\n\n            alpha_content = PIL.Image.fromarray(alpha_content)\n            preview_palette = np.zeros(shape=768, dtype=int)\n\n            if center == 'radboud':\n                # Mapping: {0: background, 1: stroma, 2: benign epithelium, 3: Gleason 3, 4: Gleason 4, 5: Gleason 5}\n                preview_palette[0:18] = (np.array([0, 0, 0, 0.5, 0.5, 0.5, 0, 1, 0, 1, 1, 0.7, 1, 0.5, 0, 1, 0, 0]) * 255).astype(int)\n            elif center == 'karolinska':\n                # Mapping: {0: background, 1: benign, 2: cancer}\n                preview_palette[0:9] = (np.array([0, 0, 0, 0, 1, 0, 1, 0, 0]) * 255).astype(int)\n\n            mask_data.putpalette(data=preview_palette.tolist())\n                #mask_data.putpalette(data=preview_palette.tolist())\n            mask_rgb = mask_data.convert(mode='RGB')\n            overlayed_image = PIL.Image.composite(image1=slide_data, image2=mask_rgb, mask=alpha_content)\n            overlayed_image.thumbnail(size=max_size, resample=0)\n            ov_img.append(overlayed_image)\n            ptl.append([i,np.asarray(slide_data),np.asarray(mask_data),np.asarray(overlayed_image)])\n            #print(np.asarray(alpha_content).shape)\n            #ax[i//3, i%3].imshow(overlayed_image) \n            slide.close()\n            mask.close()       \n\n        else:\n            print(\"in\")\n            slide_data = slide.read_region((0,0), slide.level_count - 1, slide.level_dimensions[-1])\n            ov_img.append(np.asarray(slide_data))\n            ptl.append([i,np.asarray(slide_data),None,np.asarray(slide_data)])\n            plt.imshow(np.asarray(slide_data))\n            slide.close()\n    return ov_img,ptl\n    ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#print(samples.index[0])\nmx = 600\novr,ptl = overlay(samples.index,max_size=(mx,mx))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"f,ax = plt.subplots(3,3, figsize=(15,10))\nfor i, enm in enumerate(ptl[:3]):\n    #print([i,i%3],[i,i%3+1],[i,i%3+2])\n    for j in range(3):\n        ax[i,j].imshow(enm[j+1])\n        ax[i,j].axis(\"off\")\n        if(j==0):\n            ax[i,j].set_title(\"Image\")\n        elif(j==1):\n            ax[i,j].set_title(\"Mask\")\n        else:\n            ax[i,j].set_title(\"Overlay Image\")\n        \n        #ax[i,j].imshow(j[1])\n        #ax[i,j].set_title(\"Mask\")\n        #ax[i,j].axis(\"off\")\n        #ax[i,j].imshow(j[2])\n        #ax[i,j].set_title(\"Overlay Image\")\n        #ax[i,j].axis(\"off\")","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Padding Images","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"def get_pad(imc,mx):\n    im1 = np.zeros([mx,mx,3]).astype('uint8')\n    #print(imc.shape)\n    if(imc.shape[0]==mx):\n        for i in range(im1.shape[2]):\n            im1[:imc.shape[0],:imc.shape[1],i] = imc[:,:,i]\n        #f,ax = plt.subplots(1,2,figsize=(7,3))\n        #ax[0].imshow(imc)\n        #ax[1].imshow(im1)\n    if(imc.shape[1]==mx):\n        for i in range(im1.shape[2]):\n            im1[:imc.shape[0],:imc.shape[1],i] = imc[:,:,i]\n        #f,ax = plt.subplots(1,2,figsize=(7,3))\n        #ax[0].imshow(imc)\n        #ax[1].imshow(im1)\n    \n    return im1\n\n\ni = 0\nwhile (i<len(ptl)):\n    if(max(ptl[i][3].shape)<mx):\n        samples.drop(ptl[i][0],inplace=True)\n        del ptl[i]\n    else:\n        ptl[i].append(get_pad(ptl[i][3],max(ptl[i][3].shape)))\n        i+=1","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Approach - 1\n## Using Overlay Images to train the CNN\n## Use trained network to extract the Vectpr\n## Create the CSV File","execution_count":null},{"metadata":{},"cell_type":"markdown","source":"* ### Creating Dataset","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"#print(np.array(ptl)[:,4].shape)\nX_train = []\n#mp = 0\nfor i in ptl:\n#    print(i[4].shape)\n    #print(i[4])\n    #tmp.shape = [tmp.shape[0],tmp.shape[1],tmp.shape[2],1]\n    X_train.append(i[4])\n\n\nX_train = np.array(X_train)\nsamples['gleason_code'] = samples['gleason_score'].astype(\"category\").cat.codes\ny1_train = samples['isup_grade'].values\ny2_train = samples['gleason_code'].values\n\n#print(X_train.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(X_train.shape)\nprint(y1_train.shape)\nprint(y2_train.shape)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\nin_shape = X_train[0].shape\ninpt = keras.Input(shape=in_shape,name = 'inputs')\ncnv1 = layers.Conv2D(16, 3, activation=\"relu\")(inpt)\nmxp1 = layers.MaxPooling2D(2)(cnv1)\ncnv2 = layers.Conv2D(32, 3, activation=\"relu\")(mxp1)\nmxp2 = layers.MaxPooling2D(2)(cnv2)\nflt = layers.Flatten()(mxp2)\n#drop = layers.Dropout(0.1)(flt)\n\n#D1_1 = layers.Dense(64, activation=\"relu\")(flt)\n#D1_2 = layers.Dense(128, activation=\"relu\")(D1_1)\n\n#D1 = layers.Dense(64, activation=\"relu\")(flt)\nD2 = layers.Dense(128, activation=\"relu\")(flt)\n\nout_1 = layers.Dense(6,activation='softmax',name= 'isup')(D2)\n\n#D2_1 = layers.Dense(64, activation=\"relu\")(flt)\n#D2_2 = layers.Dense(128, activation=\"relu\")(D2_1)\nout_2 = layers.Dense(11,activation='softmax',name = 'gleason')(D2)\n\nmodel = keras.Model(\n    inputs=[inpt],\n    outputs=[out_1,out_2],\n)\n\nkeras.utils.plot_model(model, \"multi_input_and_output_model.png\", show_shapes=True)\n\nmodel.compile(\n    optimizer=keras.optimizers.Adam(lr=0.01),\n    loss={\n        \"isup\":\"sparse_categorical_crossentropy\", #keras.losses.SparseCategoricalCrossentropy(),#\n        \"gleason\":\"sparse_categorical_crossentropy\",#keras.losses.SparseCategoricalCrossentropy(), #\n    }, metrics = ['accuracy']\n)\n\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.image as mpimg\nplt.figure(figsize=(10,20))\nimg = mpimg.imread(\"./multi_input_and_output_model.png\")\nplt.imshow(img)\nplt.axis('off')\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#model.fit(X_train,y_train,batch_size = 1,epochs = 5,shuffle=True)    \nmodel.fit({'inputs':X_train},{'gleason':y1_train, 'isup':y2_train},batch_size = 8,epochs = 10, shuffle = True)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"* ### Creating CSV File","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras import backend as K\n\n#for l in model.layers:\n#    print(l.name,l.output_shape)\n\nget_vec = K.function([model.layers[0].input],\n                      [model.layers[6].output])\n\n#get_out1 = K.function([model.layers[0].input],\n#                      [model.layers[9].output])\n\nout_vec = np.array(get_vec([X_train]) )\nout_vec = np.squeeze(out_vec)\nprint(out_vec.shape)\n\n#lyr_7 = np.array(get_6rd_layer_output([X_train]))\n#lyr_8 = np.array(get_6rd_layer_output([X_train]))\n#lyr_7.shape = [lyr_7.shape[1],lyr_7.shape[2]]\n\ndf = pd.DataFrame(out_vec)\ndf['gleason_code'] = samples['gleason_code'].values\ndf['isup_grade'] = samples['isup_grade'].values\nprint(df.info())\n#print(os.path.exists(\"../input/output\"))\ndf.to_csv(\"test4.csv\", index=False, float_format='%.4f')\n#df.head()\n#print(os.getcwd())\n","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Approach - 2\n## Plotting and Analysing Histogram of Images","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"f,ax = plt.subplots(3,3,figsize=(15,10))\nclr = ['r','g','b']\n#imn = []\n#for i in range(len(ovr[:9])):\n    #im = np.array(ovr[i])\n    #imn.append(256*( (im-np.min(im))/(np.max(im)-np.min(im)) ))\n    \n#imn = np.array(imn)\n\n    \nfor i in range(len(ovr[:9])):\n    imn = np.array(ovr[i])\n    for j in range(3):\n        uq = len(np.unique(imn[:,:,j]))\n        ax[i//3,i%3].hist(imn[:,:,j].ravel(),bins=uq,range=[0,uq],color=clr[j])\n        mn = np.mean(imn[:,:,j])\n        std = np.std(imn[:,:,j])\n        #print(mn,std)\n        #ax[i//3,i%3].set_ylim([0,])\n        #ax.set_title(\"Histogram of Image:{}\")\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"f,ax = plt.subplots(3,3,figsize=(15,10))\nclr = ['r','g','b']\n#imn = []\n#for i in range(len(ovr[:9])):\n    #im = np.array(ovr[i])\n    #imn.append(256*( (im-np.min(im))/(np.max(im)-np.min(im)) ))\n    \n#imn = np.array(imn)\n\n    \nfor i in range(len(ovr[:9])):\n    im = np.array(ovr[i])\n    for j in range(3):\n        uq = len(np.unique(im[:,:,j]))\n        imh = cv2.calcHist([im[:,:,j]],[0],None,[uq],[0,uq])\n        #np.where(imh<=50,0,imh)\n        imh.shape = imh.T.shape\n        ax[i//3,i%3].plot(range(uq),imh[0],color=clr[j])\n        #print(mn,std)\n        #ax[i//3,i%3].set_ylim([0,])\n        #ax.set_title(\"Histogram of Image:{}\")\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"f,ax = plt.subplots(3,3,figsize=(10,7))\nclr = ['r','g','b']\n#imhr = cv2.calcHist([imsr],[0],None,[256],[0,256])\n#imh = cv2.calcHist([ovrn],[3],None,[256],[0,256])\nfor i in range(len(ovr[:3])):\n    im = np.array(ovr[i])\n    for j in range(3):\n        uq = len(np.unique(im[:,:,j]))\n        imh = cv2.calcHist([im[:,:,j]],[0],None,[uq],[0,uq])\n        np.where(imh<=50,0,imh)\n        imh.shape = imh.T.shape\n        ax[i,j].plot(imh[0],color=clr[j])\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Histogram has 'obvious' troughs/vallyes and hence those can be used to segment images","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"# UDF\ndef thresh(arr,th):\n    for i in range(len(arr)):\n        if(arr[i]<=th):\n            arr[i] = 0\n    \n    return arr\n\ndef get_zeros(arr,th):\n    #cnt = 0; st = 0; end = 0;\n    arr = thresh(arr,th)\n    rng_dict = {}\n    def rngs(arr,j):\n        rng ={}\n        cnt = 0; end = 0; k = j; flag = 0\n        while ( k < len(arr) ):\n            if (arr[k]==0):\n                cnt+=1\n            else:\n                end = k;flag = 1\n                break\n            k+=1\n        if(flag==0):\n            end = k\n        rng[(j,end-1)] = cnt\n        return rng,end\n    i = 0\n    while ( i < len(arr) ):\n        if (arr[i]==0):\n            zrng,ind = rngs(arr,i) \n            rng_dict.update(zrng)\n            i = ind\n        i+=1\n    return rng_dict   \n\ndef get_hist2(im):\n    uq = len(np.unique(im))\n    return cv2.calcHist([im],[0],None,[uq],[0,uq])\n\ndef get_segments(im,*args,th=10):\n    seg = {}\n    clr = ['r','g','b']\n    #hst_im = []\n    def segs(im,dct):\n        #rng = len(list(dct.jeys()):)\n        sg = []\n        keys = np.array(list(dct.keys()))\n        for k in range(keys.shape[0]):\n            if( k == (keys.shape[0]-1) ):\n                sg.append( np.where( im>keys[k][1],im,0 ) )\n                continue\n            #f,ax = plt.subplots(1,2,figsize=(7,3))\n            #ax[0].imshow(im)\n            #ax[1].imshow(np.where( ( (im>=keys[k][1]) & (im<=keys[k+1][0]) ), im, 0))\n            sg.append( np.where( ( (im>=keys[k][1]) & (im<=keys[k+1][0]) ), im, 0) )\n        sg = np.array(sg)\n        #print(\"Sg:\",sg.shape)\n        return sg\n\n    for i in range(im.shape[2]):\n        hst_im = get_hist2(im[:,:,i]).T[0]\n        hst_zeros = get_zeros(hst_im,th)\n        seg[clr[i]] = segs(im,hst_zeros)\n        #seg.append( np.where( ( (im>=j[1]) & (im<=j[0]) ), a, 0) )\n    return seg\n    \ndef get_seg_data(ptl,*args,th=10):\n    x_train = []\n    y1_train = []\n    y2_train = []\n    #clr = ['r','g','b']\n    #hst_im = []\n    def segs(im,dct,plit):\n        #rng = len(list(dct.jeys()):)\n        #print(im.shape)\n        keys = np.array(list(dct.keys()))\n        for k in range(keys.shape[0]):\n            if( k == (keys.shape[0]-1) ):\n                tmp_img = np.where( im>keys[k][1],im,0 )\n                if(tmp_img.mean()>=50):\n                    x_train.append( tmp_img )\n                    y1_train.append(samples.loc[plit[0]]['gleason_code'])\n                    y2_train.append(samples.loc[plit[0]]['isup_grade'])\n                continue\n            tmp_im = np.where( ( (im>=keys[k][1]) & (im<=keys[k+1][0]) ), im, 0)\n            if(tmp_im.mean()>=50):\n                x_train.append( tmp )\n                y1_train.append(samples.loc[plit[0]]['gleason_code'])\n                y2_train.append(samples.loc[plit[0]]['isup_grade'])\n        \n        #print(\"Sg:\",sg.shape)\n    \n    for i in ptl:#range(len(ptl)):\n        im = i[4]\n        for j in range(im.shape[2]):\n            hst_im = get_hist2(im[:,:,j]).T[0]\n            hst_zeros = get_zeros(hst_im,th)\n            segs(im[:,:,j],hst_zeros,i) \n    \n    x_train = np.array(x_train)\n    y1_train = np.array(y1_train)\n    y2_train = np.array(y2_train)\n        #seg[clr[i]] = segs(im,hst_zeros)\n        #seg.append( np.where( ( (im>=j[1]) & (im<=j[0]) ), a, 0) )\n    return x_train,y1_train,y2_train\n    ","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Zero Ranges","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"imh1 = []\nimx = np.array(ovr[1])\nfor j in range(imx.shape[2]):\n    uq = len(np.unique(imx[:,:,j]))\n    #print(im[:,:,j])\n    imh = cv2.calcHist([im[:,:,j]],[0],None,[uq],[0,uq])\n    imh.shape = imh.T.shape\n    imh1.append(imh[0])\n    #ax[i,j].bar(range(uq),imh[0],color=clr[j])\n\nimh1 = np.array(imh1)\n\nimhz = []\nfor i in range(imh1.shape[0]):\n    imhz.append(get_zeros(imh1[i],10))\nimhz = np.array(imhz)\n\nprint(imhz)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Dataframe of Histograms of Images","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"hovr = {}\nhovr['image_id'] = []\nhovr['hist_r'] = []\nhovr['hist_g'] = []\nhovr['hist_b'] = []\n\nfor i in (ptl):\n    hso = []\n    #print(i[3].shape)\n    for j in range(i[3].shape[2]):\n        #print(i[3][:,:,j].shape)\n        hso.append(get_hist2(i[3][:,:,j]).T[0])\n    #print(np.array(hso).shape)\n    hovr['image_id'].append(i[0])\n    hovr['hist_r'].append(np.array(hso[0]))\n    hovr['hist_g'].append(np.array(hso[1]))\n    hovr['hist_b'].append(np.array(hso[2]))\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img_hist = pd.DataFrame(hovr)\nimg_hist","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## Segmentation and Creating Dataset from Segmented Images","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"segs = {}\nfor i in ptl:\n    segs[i[0]] = get_segments(i[4])\n#get_segments(ptl[0][4])\n#plt.imshow(ptl[0][3])\n#print(\"See\")\nX_trains = None;y1_trains=None;y2_trains=None;\nX_trains,y1_trains,y2_trains = get_seg_data(ptl)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X_trains.shape = [ X_trains.shape[0], X_trains.shape[1], X_trains.shape[2], 1]\nprint(X_trains.shape)\nprint(y1_trains.shape)\nprint(y2_trains.shape)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Segments","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"f,ax = plt.subplots(3,3,figsize=(15,10))\nfor i in range(len(X_trains[3:12])):\n    ax[i//3,i%3].imshow(np.squeeze(X_trains[i*i]),cmap='gray')\n    ax[i//3,i%3].axis(\"off\")\n#plt.figure(figsize=(10,15))\n#plt.imshow(X_train[0])","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"* ### Creating Model","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras import layers\n\ninpt = keras.Input(shape=X_trains[0].shape,name = 'inputs')\ncnv1 = layers.Conv2D(16, 3, activation=\"relu\")(inpt)\nmxp1 = layers.MaxPooling2D(2)(cnv1)\ncnv2 = layers.Conv2D(32, 3, activation=\"relu\")(mxp1)\nmxp2 = layers.MaxPooling2D(2)(cnv2)\nflt = layers.Flatten()(mxp2)\n\n#D1_1 = layers.Dense(256, activation=\"relu\")(flt)\n#D1_2 = layers.Dense(512, activation=\"relu\")(D1_1)\n\n#D1 = layers.Dense(128, activation=\"relu\")(flt)\nD2 = layers.Dense(128, activation=\"relu\")(flt)\nout_1 = layers.Dense(6,activation='softmax',name= 'isup')(D2)\n\n#D2_1 = layers.Dense(256, activation=\"relu\")(flt)\n#D2_2 = layers.Dense(512, activation=\"relu\")(D2_1)\nout_2 = layers.Dense(11,activation='softmax',name = 'gleason')(D2)\n\nmodel = keras.Model(\n    inputs=[inpt],\n    outputs=[out_1,out_2],\n)\n\n\nkeras.utils.plot_model(model, \"multi_input_and_output_model.png\", show_shapes=True)\n\nmodel.compile(\n    optimizer=keras.optimizers.Adam(lr=0.01),\n    loss={\n        \"isup\":\"sparse_categorical_crossentropy\", #keras.losses.SparseCategoricalCrossentropy(),#\n        \"gleason\":\"sparse_categorical_crossentropy\",#keras.losses.SparseCategoricalCrossentropy(), #\n    }, metrics = ['accuracy']\n)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import matplotlib.image as mpimg\nplt.figure(figsize=(10,20))\nimg = mpimg.imread(\"./multi_input_and_output_model.png\")\nplt.imshow(img)\nplt.show()","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"model.fit({'inputs':X_trains},{'gleason':y1_trains, 'isup':y2_trains},batch_size=4,epochs = 10, shuffle = True)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"* ### Creating CSV File","execution_count":null},{"metadata":{"trusted":true},"cell_type":"code","source":"from keras import backend as K\n\n#for l in model.layers:\n#    print(l.name,l.output_shape)\n\nget_vec = K.function([model.layers[0].input],\n                      [model.layers[6].output])\n\n#get_out1 = K.function([model.layers[0].input],\n#                      [model.layers[9].output])\n\nout_vec = np.array(get_vec([X_trains]) )\nout_vec = np.squeeze(out_vec)\nprint(out_vec.shape)\n\n#lyr_7 = np.array(get_6rd_layer_output([X_train]))\n#lyr_8 = np.array(get_6rd_layer_output([X_train]))\n#lyr_7.shape = [lyr_7.shape[1],lyr_7.shape[2]]\n\ndf = pd.DataFrame(out_vec)\ndf['gleason_code'] = y1_trains#samples['gleason_code'].values\ndf['isup_grade'] = y2_trains#samples['isup_grade'].values\nprint(df.info())\n#print(os.path.exists(\"../input/output\"))\ndf.to_csv(\"test5.csv\", index=False, float_format='%.4f')\n#df.head()\n#print(os.getcwd())\n","execution_count":null,"outputs":[]},{"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}