Path: blob/master/Model-3/ocr/charSeg.py
426 views
# -*- coding: utf-8 -*-1import numpy as np2import tensorflow as tf3from .helpers import *4from .tfhelpers import Graph5import cv26import math78# Preloading trained model with activation function9# Loading is slow -> prevent multiple loads10print("Loading Segmantation model:")11segCNNGraph = Graph('models/gap-clas/CNN-CG')12segRNNGraph = Graph('models/gap-clas/RNN/Bi-RNN-new', 'prediction')1314def classify(img, step=2, RNN=False, slider=(60, 60)):15""" Slice the image and return raw output of classifier """16length = (img.shape[1] - slider[1]) // 2 + 117if RNN:18input_seq = np.zeros((1, length, slider[0]*slider[1]), dtype=np.float32)19input_seq[0][:] = [img[:, loc * step: loc * step + slider[1]].flatten()20for loc in range(length)]21pred = segRNNGraph.eval_feed({'inputs:0': input_seq,22'length:0': [length],23'keep_prob:0': 1})[0]24else:25input_seq = np.zeros((length, slider[0]*slider[1]), dtype=np.float32)26input_seq[:] = [img[:, loc * step: loc * step + slider[1]].flatten()27for loc in range(length)]28pred = segCNNGraph.run(input_seq)2930return pred313233def segmentation(img, step=2, RNN=False, debug=False):34"""35Take preprocessed image of word36and return array of positions separating chars - gaps37"""38slider = (60, 30)39if RNN:40slider = (60, 60)4142# Run the classifier43pred = classify(img, step=step, RNN=RNN, slider=slider)4445# Finalize the gap positions from raw prediction46gaps = []47lastGap = 048gapCount = 149gapPositionSum = slider[1] / 250firstGap = True51gapBlockFirst = 052gapBlockLast = slider[1] / 25354for i, p in enumerate(pred):55if p == 1:56gapPositionSum += i * step + slider[1] / 257gapBlockLast = i * step + slider[1] / 258gapCount += 159lastGap = 060if gapBlockFirst == 0:61gapBlockFirst = i * step + slider[1] / 262else:63if gapCount != 0 and lastGap >= 1:64if firstGap:65gaps.append(int(gapBlockLast))66firstGap = False67else:68gaps.append(int(gapPositionSum // gapCount))69gapPositionSum = 070gapCount = 071gapBlockFirst = 072lastGap += 17374# Adding final gap position75if gapBlockFirst != 0:76gaps.append(int(gapBlockFirst))77else:78gapPositionSum += (len(pred) - 1) * 2 + slider[1]/279gaps.append(int(gapPositionSum / (gapCount + 1)))8081if debug:82# Drawing lines83img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)84for gap in gaps:85cv2.line(img,86((int)(gap), 0),87((int)(gap), slider[0]),88(0, 255, 0), 1)89implt(img, t="Separated characters")9091return gaps9293