{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import numpy as np \nimport pandas as pd \n\nimport os\nimport glob\nimport skimage.io\n\nimport skimage\nimport tifffile\nimport cv2\nimport matplotlib.pyplot as plt\nimport pandas as pd\nimport multiprocessing\n\nmultiprocessing.cpu_count()","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-10-21T21:42:24.322362Z","iopub.execute_input":"2021-10-21T21:42:24.322834Z","iopub.status.idle":"2021-10-21T21:42:24.861787Z","shell.execute_reply.started":"2021-10-21T21:42:24.322711Z","shell.execute_reply":"2021-10-21T21:42:24.860858Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"BASE_FOLDER = \"/kaggle/input/prostate-cancer-grade-assessment/\"\n!ls {BASE_FOLDER}","metadata":{"execution":{"iopub.status.busy":"2021-10-21T21:42:24.863255Z","iopub.execute_input":"2021-10-21T21:42:24.863469Z","iopub.status.idle":"2021-10-21T21:42:25.610109Z","shell.execute_reply.started":"2021-10-21T21:42:24.863445Z","shell.execute_reply":"2021-10-21T21:42:25.609196Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df = pd.read_csv(BASE_FOLDER + \"train.csv\")\ntrain_df.head()","metadata":{"execution":{"iopub.status.busy":"2021-10-21T21:45:21.109615Z","iopub.execute_input":"2021-10-21T21:45:21.109969Z","iopub.status.idle":"2021-10-21T21:45:21.165965Z","shell.execute_reply.started":"2021-10-21T21:45:21.109912Z","shell.execute_reply":"2021-10-21T21:45:21.165043Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"TRAIN = \"train_images/\"\nTRAIN_MASKS = \"train_label_masks/\"\n\nimages = glob.glob(BASE_FOLDER+\"train_images/*\")\nmasks = glob.glob(BASE_FOLDER+\"train_label_masks/*\")\nimages = set(images)\nmasks = set(masks)\nprint(len(images))\nprint(len(masks))\nprint(len(images))\n","metadata":{"execution":{"iopub.status.busy":"2021-10-21T21:46:58.304531Z","iopub.execute_input":"2021-10-21T21:46:58.30484Z","iopub.status.idle":"2021-10-21T21:46:58.405939Z","shell.execute_reply.started":"2021-10-21T21:46:58.304811Z","shell.execute_reply":"2021-10-21T21:46:58.405092Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Leer una imagen\nimage = tifffile.imread(BASE_FOLDER + \"train_images/\" + train_df[\"image_id\"][0] + \".tiff\", key=1)\nmask = tifffile.imread(BASE_FOLDER + \"train_label_masks/\" + train_df[\"image_id\"][0] + \"_mask.tiff\", key=1)\n\nplt.imshow(image)\nprint(image.shape)","metadata":{"execution":{"iopub.status.busy":"2021-10-21T21:47:03.940113Z","iopub.execute_input":"2021-10-21T21:47:03.940857Z","iopub.status.idle":"2021-10-21T21:47:09.15994Z","shell.execute_reply.started":"2021-10-21T21:47:03.940821Z","shell.execute_reply":"2021-10-21T21:47:09.158827Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Aunque también se guarda como una imagen de tres colores,\n# la máscara solo tiene información en el primero\nprint (mask.shape)\nfor i in range(3):\n    plt.subplot(1,3,i+1)\n    plt.imshow(mask[:,:,i])","metadata":{"execution":{"iopub.status.busy":"2021-10-21T20:08:56.41178Z","iopub.execute_input":"2021-10-21T20:08:56.411998Z","iopub.status.idle":"2021-10-21T20:09:01.13159Z","shell.execute_reply.started":"2021-10-21T20:08:56.411975Z","shell.execute_reply":"2021-10-21T20:09:01.130589Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(10,10))\nplt.imshow(image)\nplt.imshow(mask[:, :, 0], alpha=0.4)","metadata":{"execution":{"iopub.status.busy":"2021-10-21T20:09:01.132967Z","iopub.execute_input":"2021-10-21T20:09:01.133213Z","iopub.status.idle":"2021-10-21T20:09:16.387817Z","shell.execute_reply.started":"2021-10-21T20:09:01.133185Z","shell.execute_reply":"2021-10-21T20:09:16.386982Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Convertir a grises\nim_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)\nplt.imshow(im_gray, cmap=\"gray\")","metadata":{"execution":{"iopub.status.busy":"2021-10-21T20:09:16.388964Z","iopub.execute_input":"2021-10-21T20:09:16.389219Z","iopub.status.idle":"2021-10-21T20:09:18.669428Z","shell.execute_reply.started":"2021-10-21T20:09:16.389182Z","shell.execute_reply":"2021-10-21T20:09:18.668575Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Binarizar\n(T, im_bw) = cv2.threshold(im_gray, 200, 255, cv2.THRESH_BINARY_INV)\nshp = im_bw.shape\nim_bw[:122,:] = 0\nim_bw[shp[0]-122:shp[0],:] = 0\nim_bw[:,:122] = 0\nim_bw[:,shp[1]-122:shp[1]] = 0\nplt.imshow(im_bw, cmap=\"gray\")","metadata":{"execution":{"iopub.status.busy":"2021-10-21T06:15:28.548201Z","iopub.execute_input":"2021-10-21T06:15:28.548458Z","iopub.status.idle":"2021-10-21T06:15:31.209969Z","shell.execute_reply.started":"2021-10-21T06:15:28.548426Z","shell.execute_reply":"2021-10-21T06:15:31.209281Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Encontrar localización de los pixeles y seleccionar\n# aleatoriamente algunos de ellos\nidx = np.nonzero(im_bw.ravel())[0]\nidx = np.column_stack(np.unravel_index(idx, im_bw.shape))\ncandidates = idx[np.random.randint(0, len(idx), 49), :]","metadata":{"execution":{"iopub.status.busy":"2021-10-21T06:15:31.211738Z","iopub.execute_input":"2021-10-21T06:15:31.2123Z","iopub.status.idle":"2021-10-21T06:15:31.546862Z","shell.execute_reply.started":"2021-10-21T06:15:31.212253Z","shell.execute_reply":"2021-10-21T06:15:31.546025Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Mostrar imagen y los puntos seleccionados\nplt.figure(figsize=(10,10))\nplt.imshow(im_bw, cmap=\"gray\")\nplt.scatter(candidates[:, 1], candidates[:, 0], s=10, c=\"r\")","metadata":{"execution":{"iopub.status.busy":"2021-10-21T06:15:31.548476Z","iopub.execute_input":"2021-10-21T06:15:31.550871Z","iopub.status.idle":"2021-10-21T06:15:39.610058Z","shell.execute_reply.started":"2021-10-21T06:15:31.55082Z","shell.execute_reply":"2021-10-21T06:15:39.609356Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Función cuya única entrada es la imagen\nSZ_IM = 112\nTILES = 49\ndef tiles_rand(file, folder=\"train_images/\", mask=False):\n    \n    \n    image_mid = tifffile.imread(BASE_FOLDER +\n                            folder +\n                            file + \".tiff\",\n                            key=1)\n    \n    # Pasar a blanco y negro\n    im_gray = cv2.cvtColor(image_mid, cv2.COLOR_BGR2GRAY)\n    \n    # Thresholding para binarizar\n    (T, threshInv) = cv2.threshold(im_gray, 200, 255, cv2.THRESH_BINARY_INV)\n    \n    # Evitar seleccionar los pixeles de los bordes\n    shp = threshInv.shape\n    threshInv[:112,:] = 0\n    threshInv[shp[0]-112:shp[0],:] = 0\n    threshInv[:,:112] = 0\n    threshInv[:,shp[1]-112:shp[1]] = 0\n    \n    # Encontrar pixeles mascara\n    idx = np.nonzero(threshInv.ravel())[0]\n    idx = np.column_stack(np.unravel_index(idx, threshInv.shape))\n    candidates = idx[np.random.randint(0, len(idx), TILES), :]\n    \n    # Seccionar la imagen\n    tiles = []\n    sz_md = int(SZ_IM/2)\n    for y, x in candidates:\n        tiles.append(image_mid[y-sz_md:y+sz_md, x-sz_md:x+sz_md])\n        \n    if mask:\n        masks = []\n        mask = tifffile.imread(BASE_FOLDER +\n                               TRAIN_MASKS +\n                               file + \"_mask.tiff\",\n                               key=1)\n        for y, x in candidates:\n            masks.append(mask[y-sz_md:y+sz_md, x-sz_md:x+sz_md, 0])\n        \n        return np.array(tiles), np.array(masks)\n    else:\n        return np.array(tiles)\n\ntiles, masks = tiles_rand(train_df[\"image_id\"][0], mask=True)\nnp.shape(tiles)","metadata":{"execution":{"iopub.status.busy":"2021-10-21T06:15:39.611297Z","iopub.execute_input":"2021-10-21T06:15:39.612338Z","iopub.status.idle":"2021-10-21T06:15:40.437119Z","shell.execute_reply.started":"2021-10-21T06:15:39.612271Z","shell.execute_reply":"2021-10-21T06:15:40.436519Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Función cuya única entrada es la imagen\nSZ_IM = 112\nTILES = 49\nkernel = np.array([[0,1,0], [1,1,1], [0,1,0]], np.uint8)#np.ones((1, 1), np.uint8)\ndef tiles_rand2(file, folder=\"train_images/\", mask=False, versions=None):\n    \n    image_mid = tifffile.imread(BASE_FOLDER +\n                            folder +\n                            file + \".tiff\",\n                            key=1)\n    #print(image_mid.shape)\n    \n    scale_percent = 5 # percent of original size\n    width = int(image_mid.shape[1] * scale_percent / 100)\n    height = int(image_mid.shape[0] * scale_percent / 100)\n    dim = (width, height)\n    \n    image_min = cv2.resize(image_mid, dim, cv2.INTER_NEAREST)\n    \n    # Pasar a blanco y negro\n    im_gray = cv2.cvtColor(image_min, cv2.COLOR_BGR2GRAY)\n    \n    # Thresholding para binarizar\n    (T, threshInv) = cv2.threshold(im_gray, 200, 255, cv2.THRESH_BINARY_INV)\n    threshInv = cv2.morphologyEx(threshInv, cv2.MORPH_CLOSE, kernel)\n    \n    #plt.imshow(threshInv)\n    \n    \n    # Evitar seleccionar los pixeles de los bordes\n    shp = threshInv.shape\n    pad = int(122 * scale_percent / 100)\n    threshInv[:pad,:] = 0\n    threshInv[shp[0]-pad:shp[0],:] = 0\n    threshInv[:,:pad] = 0\n    threshInv[:,shp[1]-pad:shp[1]] = 0\n    \n    # Encontrar pixeles mascara\n    idx = np.nonzero(threshInv.ravel())[0]\n    idx = np.column_stack(np.unravel_index(idx, threshInv.shape))\n    candidates = idx[np.random.randint(0, len(idx), TILES), :] * 20\n    \n    #plt.imshow(threshInv, cmap=\"gray\")\n    #plt.scatter(candidates[:, 1]/10, candidates[:, 0]/10, s=10, c=\"r\")\n    \n    # Seccionar la imagen\n    tiles = []\n    sz_md = int(SZ_IM/2)\n    for y, x in candidates:\n        tiles.append(image_mid[y-sz_md:y+sz_md, x-sz_md:x+sz_md])\n        \n    if mask:\n        masks = []\n        mask = tifffile.imread(BASE_FOLDER +\n                               TRAIN_MASKS +\n                               file + \"_mask.tiff\",\n                               key=1)\n        for y, x in candidates:\n            masks.append(mask[y-sz_md:y+sz_md, x-sz_md:x+sz_md, 0])\n        \n        return np.array(tiles), np.array(masks), candidates\n    else:\n        return np.array(tiles)\n\ntiles, masks, candidates = tiles_rand2(train_df[\"image_id\"][2], mask=True)\nnp.shape(tiles)","metadata":{"execution":{"iopub.status.busy":"2021-10-21T21:58:41.549113Z","iopub.execute_input":"2021-10-21T21:58:41.549457Z","iopub.status.idle":"2021-10-21T21:58:41.894462Z","shell.execute_reply.started":"2021-10-21T21:58:41.549423Z","shell.execute_reply":"2021-10-21T21:58:41.893365Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def to_mosaic(tiles):\n    dims = int(np.sqrt(TILES))\n    tiles = np.array(tiles)\n    mosaic = tiles.reshape(dims, dims, SZ_IM, SZ_IM, 3)\n    mosaic = mosaic.swapaxes(1, 2)\n    mosaic = mosaic.reshape(SZ_IM * dims, SZ_IM * dims, 3)\n    \n    return mosaic\n    \nmosaic = to_mosaic(tiles)\nnp.shape(mosaic)\nplt.imshow(mosaic)","metadata":{"execution":{"iopub.status.busy":"2021-10-21T22:25:50.033968Z","iopub.execute_input":"2021-10-21T22:25:50.034527Z","iopub.status.idle":"2021-10-21T22:25:50.366539Z","shell.execute_reply.started":"2021-10-21T22:25:50.034486Z","shell.execute_reply":"2021-10-21T22:25:50.365667Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#print(idx)\nplt.figure(figsize=(5,5))\nim = tifffile.imread(BASE_FOLDER + \"train_images/\" + train_df[\"image_id\"][2] + \".tiff\", key=1)\n#print(im.shape)\nprint(im.dtype)\nplt.imshow(im)\nplt.scatter(candidates[:, 1], candidates[:, 0], s=10, c=\"r\")","metadata":{"execution":{"iopub.status.busy":"2021-10-21T20:18:39.070339Z","iopub.execute_input":"2021-10-21T20:18:39.070996Z","iopub.status.idle":"2021-10-21T20:18:40.247393Z","shell.execute_reply.started":"2021-10-21T20:18:39.070956Z","shell.execute_reply":"2021-10-21T20:18:40.246793Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(10, 10))\nfor i in range(49):\n    plt.subplot(7,7,i+1)\n    plt.imshow(tiles[i])\n    plt.axis(\"off\")","metadata":{"execution":{"iopub.status.busy":"2021-10-21T20:18:46.27735Z","iopub.execute_input":"2021-10-21T20:18:46.278255Z","iopub.status.idle":"2021-10-21T20:18:48.42512Z","shell.execute_reply.started":"2021-10-21T20:18:46.278214Z","shell.execute_reply":"2021-10-21T20:18:48.424134Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(10, 10))\nfor i in range(49):\n    plt.subplot(7,7,i+1)\n    plt.imshow(masks[i], vmin=0)\n    plt.axis(\"off\")","metadata":{"execution":{"iopub.status.busy":"2021-10-21T06:53:21.764433Z","iopub.execute_input":"2021-10-21T06:53:21.764995Z","iopub.status.idle":"2021-10-21T06:53:23.913074Z","shell.execute_reply.started":"2021-10-21T06:53:21.764945Z","shell.execute_reply":"2021-10-21T06:53:23.912137Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12, 12))\nfor i in range(49):\n    plt.subplot(7,7,i+1)\n    plt.imshow(tiles[i])\n    plt.imshow(masks[i], alpha=0.4, vmin=0)\n    plt.axis(\"off\")","metadata":{"execution":{"iopub.status.busy":"2021-10-21T06:53:24.636476Z","iopub.execute_input":"2021-10-21T06:53:24.637118Z","iopub.status.idle":"2021-10-21T06:53:28.051331Z","shell.execute_reply.started":"2021-10-21T06:53:24.637079Z","shell.execute_reply":"2021-10-21T06:53:28.050294Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"idd = 10503\nprint(train_df[\"image_id\"][idd])\n\nim = tifffile.imread(BASE_FOLDER + \"train_images/\" + train_df[\"image_id\"][idd] + \".tiff\", key=1)\nprint(im.shape)\nprint(train_df[\"gleason_score\"][idd])","metadata":{"execution":{"iopub.status.busy":"2021-10-21T20:33:05.268613Z","iopub.execute_input":"2021-10-21T20:33:05.268926Z","iopub.status.idle":"2021-10-21T20:33:05.445075Z","shell.execute_reply.started":"2021-10-21T20:33:05.268888Z","shell.execute_reply":"2021-10-21T20:33:05.44444Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import timeit\nfor i in range(5):\n    \n    #time1 = timeit.timeit('tiles_rand(\"0005f7aaab2800f6170c399693a96917\", mask=True)', \"from __main__ import tiles_rand\", number=500)\n    time2 = timeit.timeit('tiles_rand2(\"fd6fe1a3985b17d067f2cb4d5bc1e6e1\", mask=True)', \"from __main__ import tiles_rand2\", number=1)\n    print(time2)","metadata":{"execution":{"iopub.status.busy":"2021-10-21T20:33:45.091566Z","iopub.execute_input":"2021-10-21T20:33:45.092561Z","iopub.status.idle":"2021-10-21T20:33:45.659924Z","shell.execute_reply.started":"2021-10-21T20:33:45.092508Z","shell.execute_reply":"2021-10-21T20:33:45.659053Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"#print(time1)\nprint(time2/5)","metadata":{"execution":{"iopub.status.busy":"2021-10-21T07:29:20.847512Z","iopub.status.idle":"2021-10-21T07:29:20.84884Z","shell.execute_reply.started":"2021-10-21T07:29:20.848515Z","shell.execute_reply":"2021-10-21T07:29:20.848543Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image\n!mkdir mosaics","metadata":{"execution":{"iopub.status.busy":"2021-10-21T22:23:54.698772Z","iopub.execute_input":"2021-10-21T22:23:54.699342Z","iopub.status.idle":"2021-10-21T22:23:55.464646Z","shell.execute_reply.started":"2021-10-21T22:23:54.699298Z","shell.execute_reply":"2021-10-21T22:23:55.463774Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"categories = train_df.gleason_score.unique()\nfor categorie in categories:\n    names = train_df[train_df[\"gleason_score\"]==categorie].head()[\"image_id\"]\n    for name in names:\n        tiles = tiles_rand2(name)\n        mosaic = to_mosaic(tiles)\n        im = Image.fromarray(mosaic)\n        im.save(\"mosaics/\"+name+\".png\")\n        ","metadata":{"execution":{"iopub.status.busy":"2021-10-21T22:25:59.048839Z","iopub.execute_input":"2021-10-21T22:25:59.049583Z","iopub.status.idle":"2021-10-21T22:26:17.444226Z","shell.execute_reply.started":"2021-10-21T22:25:59.049533Z","shell.execute_reply":"2021-10-21T22:26:17.44318Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_df.gleason_score.unique()","metadata":{"execution":{"iopub.status.busy":"2021-10-21T20:18:56.070457Z","iopub.execute_input":"2021-10-21T20:18:56.070756Z","iopub.status.idle":"2021-10-21T20:18:56.0812Z","shell.execute_reply.started":"2021-10-21T20:18:56.070726Z","shell.execute_reply":"2021-10-21T20:18:56.080179Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}