{"cells":[{"metadata":{"trusted":true,"_uuid":"68bc0f3273c80e2ab7abb10c29c4741d19fb941a"},"cell_type":"code","source":"import sys\nimport os\nimport re\nfrom glob import glob\nfrom tqdm import tqdm\nimport numpy as np\nimport pandas as pd\nimport ast\nimport matplotlib.pyplot as plt\nimport cv2\n\nimport os\nfrom glob import glob\nimport re\nimport ast\nimport numpy as np \nimport pandas as pd\nfrom PIL import Image, ImageDraw \nfrom tqdm import tqdm\nfrom dask import bag\n\nimport tensorflow as tf\nfrom tensorflow import keras\nfrom tensorflow.keras.models import Sequential\nfrom tensorflow.keras.layers import Dense, Dropout, Flatten\nfrom tensorflow.keras.layers import Conv2D, MaxPooling2D\nfrom tensorflow.keras.metrics import top_k_categorical_accuracy\nfrom tensorflow.keras.callbacks import ModelCheckpoint, ReduceLROnPlateau, EarlyStopping\nfrom keras.models import model_from_json\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport numpy as np\n\ndef get_max_pad(I,TI,R,C,M,rr,cc):\t\n\tlt = 0; lb = 0;\tll = 0;\tlr = 0;\t\n\tfor i in range(0,len(R)):\t\t\n\t\tif( (R[i]-M < 0) ):\n\t\t\tif(np.abs(R[i]-M) > lt):\n\t\t\t\tlt = np.abs(R[i]-M);\t\t\t\t\n\t\tif( (C[i]-M < 0)):\n\t\t\tif(np.abs(C[i]-M) > ll):\n\t\t\t\tll = np.abs(C[i]-M);\t\t\t\t\n\t\tif(R[i]+M > I.shape[0]): \n\t\t\tif(np.abs(I.shape[0] - (R[i]+M) + 1) > lb):\n\t\t\t\tlb = np.abs(I.shape[0] - (R[i]+M) + 1);\n\t\tif(C[i]+M > I.shape[1]):\n\t\t\tif(np.abs(I.shape[1] - (C[i]+M) + 1) > lr):\n\t\t\t\tlr = np.abs(I.shape[1] - (C[i]+M) + 1);\t\t\t\t\t\n\tI = cv2.copyMakeBorder(I,lt,lb,ll,lr,cv2.BORDER_CONSTANT,0);\n\tTI = cv2.copyMakeBorder(TI,lt,lb,ll,lr,cv2.BORDER_CONSTANT,0);\n\tR = list(np.asarray(R) + lt);\n\tC = list(np.asarray(C) + ll);\n\trr = list(np.asarray(rr) + lt);\n\tcc = list(np.asarray(cc) + ll);\n\treturn I,TI,R,C,rr,cc,lt,ll;\ndef add_rows_cols(I,N):\n\tlr = np.abs(N - I.shape[0]);\n\tlc = np.abs(N - I.shape[1]);\n\tI = cv2.copyMakeBorder(I,0,lr,lc,0,cv2.BORDER_CONSTANT,0);\n\treturn I;\ndef get_data(fname,mode,N,reshap):\n\tif(N%2!=0):\n\t\tN = N-1;\n\tif (N <= 0):\n\t\tprint('Please make sure window size >=2, window size too small, exiting');\n\t\tsys.exit(1);\n\tprint('\\nProcessing:',fname,'\\t');\n\tprint('Window Size:', N+1,'x',N+1,'\\n');\n\tdef wind_new(TI,I,r,c,R,C,mode,K,window_size):\n\t\tM = int(window_size/2);\n\t\tfinal_i = None;\t\n\t\tfor i,g in enumerate(R):\n\t\t\tif (R[i] == r) & (C[i] == c):\n\t\t\t\tfinal_i = i;\n\t\t\t\tbreak;\n\t\tif(final_i == None):\n\t\t\tprint('indexing error, skipping');\n\t\t\treturn I[1:32,1:32],0,[],[];\n\t\tlor = final_i-M;\n\t\tupp = final_i+M;\n\t\t\n\t\tif(lor < 0):\n\t\t\tlor = 0;\n\t\t\n\t\tnewr = R[lor:upp];\n\t\tnewc = C[lor:upp];\n\t\tcolo = list(np.random.choice(range(256),size=3));\n\t\twhile(colo==[255,255,255]):\n\t\t\tcolo = list(np.random.choice(range(256),size=3));\n\t\tK[newr,newc,:] = colo;\n\t\t\n\t\tnr = []; nc = [];\n\t\tnr = newr[round(len(newr)/2)];\n\t\tnc = newc[round(len(newr)/2)];\n\t\t\n\t\tif mode == 'stroke':\n\t\t\tmask = np.zeros(TI.shape,'uint8');\n\t\t\tmask[newr,newc] = 255;\n\t\t\t#cv2.imwrite('/home/vonnegut/Keras/res/'+ str(globi[0]) + '_segment.jpeg',mask[r-M:r+M,c-M:c+M]);\n\t\t\t#globi[0] = globi[0] + 1;\n\t\t\t#if(mask[r-M:r+M,c-M:c+M].shape[0] == 99):\n\t\t\t\t#pdb.set_trace();\n\t\t\treturn mask[r-M:r+M,c-M:c+M],1,nr,nc;\n\t\telif mode == 'bgr':\n\t\t\tmask = np.zeros(I.shape,'bool');\n\t\t\tmask[newr,newc,:] = True;\n\t\t\tl = np.zeros(I.shape,I.dtype) + 255;\n\t\t\tnp.copyto(l,I,'same_kind',mask);\n\t\t\treturn l[r-M:r+M,c-M:c+M],1,nr,nc;\n\t\telse:\n\t\t\tprint(\"Some error!\")\n\t\t\treturn I[1:32,1:32],0,[],[];\n\tI = cv2.imread(fname);\n\tIG = cv2.cvtColor(I,cv2.COLOR_BGR2GRAY);\n\tth2,TG = cv2.threshold(IG,0,255,cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)\n\tr = [];\n\tc = [];\t\n\tfor i in range(0,TG.shape[1]):\n\t\tif(sum(TG[:,i] != 0) != 0):\n\t\t\ttem = list(np.where(TG[:,i] != 0)[0]);\n\t\t\tr+= tem;\n\t\t\tc += [i]*len(tem);\n\trr = [];\n\tcc = [];\n\tfor i,C in enumerate(c):\n\t\tif(i%N == 0):\n\t\t\trr.append(r[i]);\n\t\t\tcc.append(C);\n\t# pdb.set_trace();\t\t\n\tI,TG,rr,cc,r,c,lt,ll = get_max_pad(I,TG,rr,cc,int(N/2),r,c);\n\tK = np.zeros(I.shape,I.dtype) + [255,255,255];\n\tL = np.zeros(I.shape,'uint8');\n\tL[rr,cc,:] = [255,255,255];\n\tNR = [];\n\tNC = [];\n\t\n\t# pdb.set_trace();\n\tif mode == 'stroke':\n\t\tfin_arr = [];\n\t\tfor i,m in enumerate(rr):\n\t\t\tiii,mm,nr,nc = wind_new(TG,I,m,cc[i],r,c,mode,K,N);\n\t\t\tnr = nr - lt;\n\t\t\tnc = nc - ll;\n\t\t\t\n\t\t\tif((iii.shape[0] != N) | (iii.shape[1] != N)):\n\t\t\t\tiii = add_rows_cols(iii,N);\t\t\t\t\n\t\t\tiii = cv2.resize(iii,(reshap,reshap));\n\t\t\t#iii = np.zeros((32,32)); mm = 1;\n\t\t\tif(mm == 0):\n\t\t\t\tcontinue;\n\t\t\tif i == 0:\n\t\t\t\tfin_arr = np.expand_dims(iii,2);\n\t\t\t\tNR.append(nr);\n\t\t\t\tNC.append(nc);\n\t\t\t\tcontinue;\n\t\t\tif ( (i > 0) & (len(fin_arr) == 0)):\n\t\t\t\tfin_arr = np.expand_dims(iii,2);\n\t\t\t\tcontinue;\n\t\t\t#if(iii.shape[0] == 0):\n\t\t\t\t# pdb.set_trace();\n\t\t\tfin_arr = np.concatenate((fin_arr,np.expand_dims(iii,2)),2);\n\t\t\tNR.append(nr);\n\t\t\tNC.append(nc);\n\t\tcv2.imwrite('strokes'+ str(N) +'_.jpg',K);\t\n\t\tfin_arr = np.rollaxis(fin_arr,2,0);\n\t\tfin_arr = np.expand_dims(fin_arr,3);\n\t\treturn fin_arr/255,NR,NC;\n\tif mode == 'bgr':\n\t\tfin_arr = [];\n\t\tfor i,m in enumerate(rr):\n\t\t\tiii,mm,nr,nc = wind_new(TG,I,m,cc[i],r,c,mode,K,N);\n\t\t\tnr = nr - lt;\n\t\t\tnc = nc - ll;\n\t\t\t\n\t\t\tif((iii.shape[0] != N) | (iii.shape[1] != N)):\n\t\t\t\tiii = add_rows_cols(iii,N);\t\n\t\t\tiii = cv2.resize(iii,(reshap,reshap));\n\t\t\tif(mm == 0):\n\t\t\t\tcontinue;\n\t\t\tif i == 0:\n\t\t\t\tfin_arr = np.expand_dims(iii,3);\n\t\t\t\tNR.append(nr);\n\t\t\t\tNC.append(nc);\n\t\t\t\tcontinue;\n\t\t\tif ((i > 0) & (len(fin_arr) == 0)):\n\t\t\t\tfin_arr = np.expand_dims(iii,3);\n\t\t\t\tcontinue;\t\t\n\t\t\tfin_arr = np.concatenate((fin_arr,np.expand_dims(iii,3)),3);\n\t\t\tprint(i);\n\t\t\tNR.append(nr);\n\t\t\tNC.append(nc);\t\t\t\n\t\tcv2.imwrite('strokes'+ str(N) +'_.jpg',K);\n\t\tfin_arr = np.rollaxis(fin_arr,3,0);\n\t\treturn fin_arr/255,NR,NC;\ndef draw_labels(labs,P,NR,NC):\n\tI = cv2.imread(P);\n\tfnam, ext = os.path.splitext(os.path.basename(P));\n\tfor i,m in enumerate(labs):\n\t\tcv2.putText (I,str(ord(m)),(NC[i],NR[i]),1, 0.8, (0,0,255),1,2);\n\tcv2.imwrite(fnam + '_labels.jpeg',I);\n\n\n\n\n\njson_file = open('/kaggle/input/plots-/model.json', 'r')\nloaded_model_json = json_file.read()\njson_file.close()\nmodel = model_from_json(loaded_model_json)\n# load weights into new model\nmodel.load_weights(\"/kaggle/input/plots-/model.h5\")\nprint(\"Loaded model from disk\")\n\nclassfiles = os.listdir('/kaggle/input/quickdraw-doodle-recognition/train_simplified/')\nnumstonames = {i: v[:-4].replace(\" \", \"_\") for i, v in enumerate(classfiles)} #adds underscores\n\ndname = \"/kaggle/input/plots/\";\n\nfor fname in os.listdir(dname):\n    ttvlist = []\n    dat,nr,nc = get_data(dname + fname,'stroke',100,32);\n    testpreds = model.predict(dat, verbose=1)\n    ttvs = np.argsort(-testpreds)[:, 0:10]  # top 10\n    preds_df = pd.DataFrame({'first': ttvs[:,0], 'second': ttvs[:,1], 'third': ttvs[:,2], 'fourth': ttvs[:,3], 'fifth': ttvs[:,4], 'sixth': ttvs[:,5], 'seventh': ttvs[:,6], 'eighth': ttvs[:,7], 'ninth': ttvs[:,8], 'tenth': ttvs[:,9]});\n    preds_df = preds_df.replace(numstonames)\n    preds_df['words'] = preds_df['first'] + \" \" + preds_df['second'] + \" \" + preds_df['third']+ \" \" + preds_df['fourth']+ \" \" + preds_df['fifth']+ \" \" + preds_df['sixth']+ \" \" + preds_df['seventh']+ \" \" + preds_df['eighth']+ \" \" + preds_df['ninth']+ \" \" + preds_df['tenth'];\n    pd.DataFrame(preds_df.words.values).to_csv(fname + '_results.csv',',');\n    print(preds_df.words.values)\n    ","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"display_name":"Python 3","language":"python","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat":4,"nbformat_minor":1}