Path: blob/master/Model-4/word_classification.py
427 views
1# coding: utf-823# In[1]:456import numpy as np7import tensorflow as tf8from ocr.helpers import *9from ocr.tfhelpers import Graph10from ocr.normalization import imageNorm, letterNorm11from ocr.datahelpers import idx2char12import cv213import math14151617# In[2]:181920print("Loading Segmentation model:")21segCNNGraph = Graph('models/gap-clas/CNN-CG')22segRNNGraph = Graph('models/gap-clas/RNN/Bi-RNN-new', 'prediction')23MODEL_LOC = 'models/char-clas/en/CharClassifier'24charClass = Graph(MODEL_LOC)252627# In[3]:282930def classify(img, step=2, RNN=False, slider=(60, 60)):31""" Slice the image and return raw output of classifier """32length = (img.shape[1] - slider[1]) // 2 + 133if RNN:34input_seq = np.zeros((1, length, slider[0]*slider[1]), dtype=np.float32)35input_seq[0][:] = [img[:, loc * step: loc * step + slider[1]].flatten()36for loc in range(length)]37pred = segRNNGraph.eval_feed({'inputs:0': input_seq,38'length:0': [length],39'keep_prob:0': 1})[0]40else:41input_seq = np.zeros((length, slider[0]*slider[1]), dtype=np.float32)42input_seq[:] = [img[:, loc * step: loc * step + slider[1]].flatten()43for loc in range(length)]44pred = segCNNGraph.run(input_seq)4546return pred474849# In[4]:505152def segmentation(img, step=2, RNN=False, debug=False):53"""54Take preprocessed image of word55and return array of positions separating chars - gaps56"""57slider = (60, 30)58if RNN:59slider = (60, 60)6061# Run the classifier62pred = classify(img, step=step, RNN=RNN, slider=slider)6364# Finalize the gap positions from raw prediction65gaps = []66lastGap = 067gapCount = 168gapPositionSum = slider[1] / 269firstGap = True70gapBlockFirst = 071gapBlockLast = slider[1] / 27273for i, p in enumerate(pred):74if p == 1:75gapPositionSum += i * step + slider[1] / 276gapBlockLast = i * step + slider[1] / 277gapCount += 178lastGap = 079if gapBlockFirst == 0:80gapBlockFirst = i * step + slider[1] / 281else:82if gapCount != 0 and lastGap >= 1:83if firstGap:84gaps.append(int(gapBlockLast))85firstGap = False86else:87gaps.append(int(gapPositionSum // gapCount))88gapPositionSum = 089gapCount = 090gapBlockFirst = 091lastGap += 19293# Adding final gap position94if gapBlockFirst != 0:95gaps.append(int(gapBlockFirst))96else:97gapPositionSum += (len(pred) - 1) * 2 + slider[1]/298gaps.append(int(gapPositionSum / (gapCount + 1)))99100if debug:101# Drawing lines102img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)103for gap in gaps:104cv2.line(img,105((int)(gap), 0),106((int)(gap), slider[0]),107(0, 255, 0), 1)108#implt(img, t="Separated characters")109110return gaps111112113# In[5]:114115116# img = cv2.imread("./output/words/normal/0.jpg")117# implt(img)118119120# # In[6]:121122123# img = cv2.imread("./output/words/normal/85.jpg")124# implt(img)125# img = imageNorm(img,60,border=False,tilt=True,hystNorm=True)126# implt(img)127# img = cv2.copyMakeBorder(img,0,0,30,30,cv2.BORDER_CONSTANT, value=[0,0,0])128# implt(img)129130131# # In[12]:132133134# gaps = segmentation(img, step=2, RNN=True, debug=False)135136137# # In[13]:138139140# print gaps141142143# # In[14]:144145146# for i in range(0,(len(gaps)-1)):147# implt(img[0:60,gaps[i]:gaps[i+1]])148149150# # In[15]:151152153# chars = []154# for i in range(0,(len(gaps)-1)):155# char = img[0:60,gaps[i]:gaps[i+1]]156# char, dim = letterNorm(char, is_thresh=True, dim=True)157# if dim[0]>4 and dim[1]>4:158# chars.append(char.flatten())159160161# # In[16]:162163164# chars = np.array(chars)165# word = ''166167# if len(chars) != 0:168# pred = charClass.run(chars)169# for c in pred:170# word += idx2char(c)171172# print word173174175176