Path: blob/master/Model-5/Untitled.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 math1415get_ipython().magic(u'matplotlib inline')161718# In[2]:192021print("Loading Segmantation model:")22segCNNGraph = Graph('models/gap-clas/CNN-CG')23segRNNGraph = Graph('models/gap-clas/RNN/Bi-RNN-new', 'prediction')24MODEL_LOC = 'models/char-clas/en/CharClassifier'25charClass = Graph(MODEL_LOC)262728# In[3]:293031def classify(img, step=2, RNN=False, slider=(60, 60)):32""" Slice the image and return raw output of classifier """33length = (img.shape[1] - slider[1]) // 2 + 134if RNN:35input_seq = np.zeros((1, length, slider[0]*slider[1]), dtype=np.float32)36input_seq[0][:] = [img[:, loc * step: loc * step + slider[1]].flatten()37for loc in range(length)]38pred = segRNNGraph.eval_feed({'inputs:0': input_seq,39'length:0': [length],40'keep_prob:0': 1})[0]41else:42input_seq = np.zeros((length, slider[0]*slider[1]), dtype=np.float32)43input_seq[:] = [img[:, loc * step: loc * step + slider[1]].flatten()44for loc in range(length)]45pred = segCNNGraph.run(input_seq)4647return pred484950# In[4]:515253def segmentation(img, step=2, RNN=False, debug=False):54"""55Take preprocessed image of word56and return array of positions separating chars - gaps57"""58slider = (60, 30)59if RNN:60slider = (60, 60)6162# Run the classifier63pred = classify(img, step=step, RNN=RNN, slider=slider)6465# Finalize the gap positions from raw prediction66gaps = []67lastGap = 068gapCount = 169gapPositionSum = slider[1] / 270firstGap = True71gapBlockFirst = 072gapBlockLast = slider[1] / 27374for i, p in enumerate(pred):75if p == 1:76gapPositionSum += i * step + slider[1] / 277gapBlockLast = i * step + slider[1] / 278gapCount += 179lastGap = 080if gapBlockFirst == 0:81gapBlockFirst = i * step + slider[1] / 282else:83if gapCount != 0 and lastGap >= 1:84if firstGap:85gaps.append(int(gapBlockLast))86firstGap = False87else:88gaps.append(int(gapPositionSum // gapCount))89gapPositionSum = 090gapCount = 091gapBlockFirst = 092lastGap += 19394# Adding final gap position95if gapBlockFirst != 0:96gaps.append(int(gapBlockFirst))97else:98gapPositionSum += (len(pred) - 1) * 2 + slider[1]/299gaps.append(int(gapPositionSum / (gapCount + 1)))100101if debug:102# Drawing lines103img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)104for gap in gaps:105cv2.line(img,106((int)(gap), 0),107((int)(gap), slider[0]),108(0, 255, 0), 1)109implt(img, t="Separated characters")110111return gaps112113114# In[5]:115116117img = cv2.imread("./output/words/normal/0.jpg")118implt(img)119120121# In[6]:122123124img = cv2.imread("./output/words/normal/85.jpg")125implt(img)126img = imageNorm(img,60,border=False,tilt=True,hystNorm=True)127implt(img)128img = cv2.copyMakeBorder(img,0,0,30,30,cv2.BORDER_CONSTANT, value=[0,0,0])129implt(img)130131132# In[12]:133134135gaps = segmentation(img, step=2, RNN=True, debug=False)136137138# In[13]:139140141print gaps142143144# In[14]:145146147for i in range(0,(len(gaps)-1)):148implt(img[0:60,gaps[i]:gaps[i+1]])149150151# In[15]:152153154chars = []155for i in range(0,(len(gaps)-1)):156char = img[0:60,gaps[i]:gaps[i+1]]157char, dim = letterNorm(char, is_thresh=True, dim=True)158if dim[0]>4 and dim[1]>4:159chars.append(char.flatten())160161162# In[16]:163164165chars = np.array(chars)166word = ''167168if len(chars) != 0:169pred = charClass.run(chars)170for c in pred:171word += idx2char(c)172173print word174175176177