{"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 in \n\nimport cv2\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\nfrom matplotlib import pyplot as plt\n\n# Input data files are available in the \"../input/\" directory.\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\nimport os\n#for dirname, _, filenames in os.walk('/kaggle/input/'):\n    #for filename in filenames:\n       #os.path.join(dirname, filename)\n\n# Any results you write to the current directory are saved as output.","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"df = pd.read_csv(\"/kaggle/input/diabetic-retinopathy-resized/trainLabels_cropped.csv\", header=None)\ndf = df.iloc[1:]\nnum = len(df)\nnum","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"data_size= 20000","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"s=\"/kaggle/input/diabetic-retinopathy-resized/resized_train_cropped/resized_train_cropped/\"","execution_count":null,"outputs":[]},{"metadata":{"_uuid":"d629ff2d2480ee46fbb7e2d37f6b5fab8052498a","_cell_guid":"79c7e3d0-c299-4dcb-8224-4455121ee9b0","trusted":true},"cell_type":"code","source":"class_list=[]\nimg=[]\n\none_cnt=0\nzero_cnt=0\nfor i in range(0,data_size):\n    imgloc = s+df.iloc[i,2]+'.jpeg'\n    if(df.iloc[i,3]=='0'):\n        zero_cnt=zero_cnt+1\n        if(zero_cnt%4==0):\n            class_list.append(df.iloc[i,3])\n            img1 = cv2.imread(imgloc,1)\n            img1 = cv2.resize(img1,(350,350))\n            img.append(cv2.cvtColor(img1,cv2.COLOR_BGR2RGB))\n    elif(df.iloc[i,3]=='2'):\n        one_cnt=one_cnt+1\n        if(one_cnt%2==0):    \n            class_list.append(df.iloc[i,3])\n            img1 = cv2.imread(imgloc,1)\n            img1 = cv2.resize(img1,(350,350))\n            img.append(cv2.cvtColor(img1,cv2.COLOR_BGR2RGB))\n            class_list.append(df.iloc[i,3])\n            img1 = cv2.imread(imgloc,1)\n            img1 = cv2.resize(img1,(350,350))\n            img.append(cv2.cvtColor(img1,cv2.COLOR_BGR2RGB))\n    else:\n            class_list.append(df.iloc[i,3])\n            img1 = cv2.imread(imgloc,1)\n            img1 = cv2.resize(img1,(350,350))\n            img.append(cv2.cvtColor(img1,cv2.COLOR_BGR2RGB))\n            class_list.append(df.iloc[i,3])\n            img1 = cv2.imread(imgloc,1)\n            img1 = cv2.resize(img1,(350,350))\n            img.append(cv2.cvtColor(img1,cv2.COLOR_BGR2RGB))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"new_data_size=len(class_list)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#df[3]=pd.to_numeric(df[3])\nzero = 0\none = 0\ntwo = 0\nthree = 0\nfour = 0\nfor i in range(0,len(class_list)):\n    if(class_list[i]=='0'): zero= zero+1\n    elif(class_list[i]=='1'): one= one+1\n    elif(class_list[i]=='2'): two= two+1\n    elif(class_list[i]=='3'): three= three+1\n    elif(class_list[i]=='4'): four= four+1\nprint(zero, one, two, three, four)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"img[0][0][0]","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"area_of_exudate=[]\ngre = []\nfor i in range(0,new_data_size):\n    img2 = np.array(img[i])\n    #r,img2,b=cv2.split(img2)\n    r,greencha,b=cv2.split(img2)\n    clahe = cv2.createCLAHE(clipLimit=5.0, tileGridSize=(8,8)) \n    curImg = clahe.apply(greencha)\n    gre.append(curImg)\n    strEl = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(6,6))\n    curImg = cv2.dilate(curImg, strEl)\n    curImg = cv2.medianBlur(curImg,5)\n    retValue, curImg = cv2.threshold(curImg, 235, 255, cv2.THRESH_BINARY)\n    #curImg= cv2.cvtColor(curImg,cv2.COLOR_BGR2RGB)\n    \n    count = 0\n    for i in range (0,350):\n        for j in range(0,350):\n            if(curImg[i][j] == 255):\n                count=count+1\n    area_of_exudate.append(count)\nprint(area_of_exudate)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"kernel_for_bv = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))\n\ndef extract_bv(image):\n\n    contrast_enhanced_green_fundus = image\n   \n    # applying alternate sequential filtering (3 times closing opening)\n    r1 = cv2.morphologyEx(contrast_enhanced_green_fundus, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)), iterations = 1)\n    R1 = cv2.morphologyEx(r1, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)), iterations = 1)\n    r2 = cv2.morphologyEx(R1, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11)), iterations = 1)\n   \n    R2 = cv2.morphologyEx(r2, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11)), iterations = 1)\n   \n    r3 = cv2.morphologyEx(R2, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(23,23)), iterations = 1)\n    \n    R3 = cv2.morphologyEx(r3, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(23,23)), iterations = 1)\n   # cv2.imshow('contrast_enhanced_green_fundus',contrast_enhanced_green_fundus)\n    f4 = cv2.subtract(R3,contrast_enhanced_green_fundus)\n    f5 = clahe.apply(f4)\n   # cv2.imshow('f5',f5)\n# removing very small contours through area parameter noise removal\n    ret,f6 = cv2.threshold(f5,15,255,cv2.THRESH_BINARY)\n    mask = np.ones(f5.shape[:2], dtype=\"uint8\") * 255\n    #print(mask)\n   # _, contours, _ = cv2.findContours(f6.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)\n    contours, hierarchy = cv2.findContours(f6.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[-2:]\n\n    for cnt in contours:\n        if cv2.contourArea(cnt) <= 200:\n            cv2.drawContours(mask, [cnt], -1, 0, -1)\n    im = cv2.bitwise_and(f5, f5, mask=mask)\n    ret,fin = cv2.threshold(im,15,255,cv2.THRESH_BINARY_INV)\n    newfin = cv2.erode(fin, cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3)), iterations=1)\n\n    # removing blobs of unwanted bigger chunks taking in consideration they are not straight lines like blood\n    #vessels and also in an interval of area\n    fundus_eroded = cv2.bitwise_not(newfin)\t\n    xmask = np.ones(image.shape[:2], dtype=\"uint8\") * 255\n    xcontours, xhierarchy = cv2.findContours(fundus_eroded.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)[-2:]\n    for cnt in xcontours:\n        shape = \"unidentified\"\n        peri = cv2.arcLength(cnt, True)\n        approx = cv2.approxPolyDP(cnt, 0.04 * peri, False)\n        if len(approx) > 4 and cv2.contourArea(cnt) <= 3000 and cv2.contourArea(cnt) >= 100:\n            shape = \"circle\"\n        else:\n            shape = \"veins\"\n        if(shape==\"circle\"):\n            cv2.drawContours(xmask, [cnt], -1, 0, -1)\n\n    finimage = cv2.bitwise_and(fundus_eroded,fundus_eroded,mask=xmask)\n    blood_vessels = cv2.bitwise_not(finimage)\n    return blood_vessels","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"area_of_bloodvessel=[]\n\nfor i in range(0,new_data_size):\n    bloodvessel = extract_bv(gre[i])\n    bloodvessel = cv2.resize(bloodvessel,(350,350))\n    count = 0\n    bloodvessel =255- bloodvessel\n    retValue, bloodvessel = cv2.threshold(bloodvessel, 235, 255, cv2.THRESH_BINARY)\n    bloodvessel = cv2.dilate(bloodvessel,kernel_for_bv,iterations = 1)\n    bloodvessel= cv2.cvtColor(bloodvessel,cv2.COLOR_BGR2RGB)\n    \n    for i in range (0,350):\n        for j in range(0,350):\n            if(bloodvessel[i][j][0] == 255):\n                count=count+1\n    area_of_bloodvessel.append(count)\nprint(area_of_bloodvessel)   ","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"kernelmicro = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(7,7))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"def extract_ma(image):\n     \n    median = cv2.medianBlur(image,3)\n\n    erosion_ma =255- cv2.erode(median,kernelmicro,iterations = 1)\n    ret3,thresh2 = cv2.threshold(erosion_ma,215,255,cv2.THRESH_BINARY)\n    closing_ma = cv2.morphologyEx(thresh2, cv2.MORPH_CLOSE, kernelmicro)\n    mask = np.ones(closing_ma.shape[:2], dtype=\"uint8\") * 255\n    contours_mn, hierarchy_mn = cv2.findContours(closing_ma, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)[-2:]\n   \n    for cnt_mn in contours_mn:\n        if cv2.contourArea(cnt_mn) <= 70:\n            cv2.drawContours(mask, [cnt_mn], -1, 0, -1)\n    final_ma = cv2.bitwise_and(closing_ma, closing_ma, mask=mask)\n    sub_ma = cv2.subtract(closing_ma,final_ma)\n    sub_ma = cv2.morphologyEx(sub_ma, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3)), iterations = 1)\n    sub_ma =cv2.erode(sub_ma,kernelmicro,iterations = 1)\n    return sub_ma\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"area_of_micro = []\nfor i in range(0,new_data_size):\n    count = 0\n    mcran = extract_ma(gre[i])\n    for i in range (0,350):\n        for j in range(0,350):\n            if(mcran[i][j] == 255):\n                count=count+1\n    area_of_micro.append(count)\n#print(area_of_micro)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(area_of_micro)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"X = list(zip(area_of_exudate,area_of_bloodvessel,area_of_micro))\nprint(len(X))\ny = class_list\n#df.iloc[0:new_data_size,3:4].values\n#print((y))\n\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.model_selection import train_test_split\n\nX_train, X_test , y_train, y_test = train_test_split(X,y,test_size = .25 ,random_state =0 )\n\nfrom sklearn.preprocessing import StandardScaler\nsc = StandardScaler()\nX_train = sc.fit_transform(X_train)\nX_test = sc.transform(X_test)\n","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.ensemble import RandomForestClassifier\nClassifier = RandomForestClassifier(n_estimators = 2500, criterion='gini', max_features = 'auto',  random_state=0, oob_score=True, n_jobs=-1, min_samples_split=5)\nClassifier.fit(X_train, y_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_pred = Classifier.predict(X_test)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"#print(y_pred)\nfrom sklearn.metrics import confusion_matrix\ncm = confusion_matrix(y_test,y_pred)\ncm","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"from sklearn.metrics import accuracy_score\naccuracy_score(y_test, y_pred)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"y_pred2 = Classifier.predict(X_train)","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(y_pred)\nfrom sklearn.metrics import confusion_matrix\ncm = confusion_matrix(y_train,y_pred2)\nprint(cm)","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}