{"cells":[{"metadata":{"trusted":true},"cell_type":"code","source":"import numpy as np\nimport pandas as pd\nimport os\nimport glob\nimport matplotlib.pyplot as plt\n\nfrom random import randrange\nimport keras\nfrom keras.models import load_model\nfrom keras.preprocessing.image import ImageDataGenerator\n\nfrom skimage.segmentation import mark_boundaries\nfrom skimage.morphology import skeletonize\nfrom skimage import io\nfrom skimage.feature import blob_doh\nfrom skimage.filters import sato, threshold_otsu\nfrom skimage.util import invert\nfrom skimage.color import rgb2gray\nfrom skimage.morphology import disk\n\nimport lime\nfrom lime import lime_image\n\nfrom copy import deepcopy\n\nfrom PIL import Image\nfrom PIL import ImageDraw\nfrom PIL import ImageFont\n ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img_x = 224\nimg_y = 224\nbat_siz = 32\nnum_epok = 32\n# In[2]:\n\n\ndata_generator = ImageDataGenerator(\n        zoom_range = 0.4,\n        vertical_flip  = True,\n        horizontal_flip = True,\n        rescale=1.0/255.0\n        )\n\nmodel = load_model('../input/aptos-densenet-train-submit/densenet_plus_five')\n\ntest_data_labels = pd.read_csv(\"../input/aptos2019-blindness-detection/test.csv\")\ntest_data_labels['id_code'] = test_data_labels['id_code'] + '.png'\n\n\ntest_generator = data_generator.flow_from_dataframe(dataframe = test_data_labels,\n                                                     directory = os.path.join('..', 'input','aptos2019-blindness-detection','test_images'),\n        target_size = (img_x, img_y), \n    \n        x_col = 'id_code',\n        class_mode = None,\n        batch_size = bat_siz\n        )\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def lime_explanation(timage, model):\n    explainer = lime_image.LimeImageExplainer()\n    explanation = explainer.explain_instance(timage, model.predict, hide_color = 0, \n                                             num_samples = 5000)\n    temp, mask = explanation.get_image_and_mask(explanation.top_labels[0], \n                                                positive_only=True, \n                                                num_features=20, \n                                                hide_rest=True, \n                                                min_weight = 0.0251)\n    return(temp, mask)\n\nxx = []\nfor i in range(3): \n    xx.append(randrange(bat_siz))\n\nfor img in xx:\n    print(img)\n    temp, mask = lime_explanation(test_generator[0][img], model)\n    plt.axis('off')\n    plt.imshow(mark_boundaries(temp, mask))\n    plt.savefig(\"markers\" + str(img)+ \".png\", bbox_inches = 0)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"inx = 0\nskeleton_array = np.asarray([])\nfor img_file in glob.iglob(\"*markers*png\"):\n    img = io.imread(img_file)\n    gray_image = rgb2gray(img)\n    gray_image[gray_image > .85] = 0\n    vessel_image = sato(gray_image,sigmas = np.linspace(0.1,6.0,8))\n    vessel_thresh = 0.0025\n    print('The vessel threshold is: {:3f}.'.format(vessel_thresh))\n    bin_vessels = deepcopy(vessel_image)\n\n    bin_vessels[bin_vessels >= vessel_thresh] = 1\n    bin_vessels[bin_vessels < vessel_thresh] = 0\n\n\n    blobs = blob_doh(gray_image)\n    blob_indices =  blobs[:,:2].astype(int)\n\n    for idx in blob_indices: \n        bin_vessels[idx[0], idx[1]] = 1\n\n    # perform skeletonization \n    skeleton = skeletonize(bin_vessels)\n    skeleton_prearray = (skeleton.astype('int')).ravel()\n    skeleton_npprearray = np.asarray(skeleton_prearray)\n    to_pad = img_x*img_y - (skeleton_npprearray.shape[0])\n    pad_skeleton = np.pad(array  = skeleton_npprearray, pad_width = ((0,0),(to_pad,0)), \n                      mode = 'constant')\n    skeleton_array = np.append(skeleton_array, pad_skeleton, axis = 0)\n    fig, axes = plt.subplots(nrows = 3, ncols = 2, figsize = (32, 32),\n                             sharex = True, sharey = True)\n\n    ax = axes.ravel()\n\n    ax[0].imshow(img, cmap=plt.cm.gray)\n    ax[0].axis('off')\n    ax[0].set_title('original', fontsize = 20)\n\n    ax[1].imshow(gray_image, cmap=plt.cm.gray)\n    ax[1].axis('off')\n    ax[1].set_title('grayscale', fontsize = 20)\n\n    ax[2].imshow(vessel_image, cmap=plt.cm.gray)\n    ax[2].axis('off')\n    ax[2].set_title('vessels', fontsize = 20)\n\n    ax[3].imshow(bin_vessels, cmap=plt.cm.gray)\n    ax[3].axis('off')\n    ax[3].set_title('binarized vessels', fontsize = 20)\n\n    ax[4].imshow(skeleton, cmap=plt.cm.gray)\n    ax[4].axis('off')\n    ax[4].set_title('skeleton', fontsize = 20)\n\n    ax[5].axis('off')\n    ax[5].imshow(skeleton.astype(int) + gray_image, cmap=plt.cm.gray)\n    ax[5].set_title('Skeleton overlay', fontsize = 20)\n    plt.savefig(\"skeletal_\" + str(inx) + \".png\", bbox_inches = 0)\n    inx += 1 ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"skeleton_array.shape","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.6.6"}},"nbformat":4,"nbformat_minor":1}