Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Aniket025
GitHub Repository: Aniket025/Medical-Prescription-OCR
Path: blob/master/Model-3/ocr/charSeg.py
426 views
1
# -*- coding: utf-8 -*-
2
import numpy as np
3
import tensorflow as tf
4
from .helpers import *
5
from .tfhelpers import Graph
6
import cv2
7
import math
8
9
# Preloading trained model with activation function
10
# Loading is slow -> prevent multiple loads
11
print("Loading Segmantation model:")
12
segCNNGraph = Graph('models/gap-clas/CNN-CG')
13
segRNNGraph = Graph('models/gap-clas/RNN/Bi-RNN-new', 'prediction')
14
15
def classify(img, step=2, RNN=False, slider=(60, 60)):
16
""" Slice the image and return raw output of classifier """
17
length = (img.shape[1] - slider[1]) // 2 + 1
18
if RNN:
19
input_seq = np.zeros((1, length, slider[0]*slider[1]), dtype=np.float32)
20
input_seq[0][:] = [img[:, loc * step: loc * step + slider[1]].flatten()
21
for loc in range(length)]
22
pred = segRNNGraph.eval_feed({'inputs:0': input_seq,
23
'length:0': [length],
24
'keep_prob:0': 1})[0]
25
else:
26
input_seq = np.zeros((length, slider[0]*slider[1]), dtype=np.float32)
27
input_seq[:] = [img[:, loc * step: loc * step + slider[1]].flatten()
28
for loc in range(length)]
29
pred = segCNNGraph.run(input_seq)
30
31
return pred
32
33
34
def segmentation(img, step=2, RNN=False, debug=False):
35
"""
36
Take preprocessed image of word
37
and return array of positions separating chars - gaps
38
"""
39
slider = (60, 30)
40
if RNN:
41
slider = (60, 60)
42
43
# Run the classifier
44
pred = classify(img, step=step, RNN=RNN, slider=slider)
45
46
# Finalize the gap positions from raw prediction
47
gaps = []
48
lastGap = 0
49
gapCount = 1
50
gapPositionSum = slider[1] / 2
51
firstGap = True
52
gapBlockFirst = 0
53
gapBlockLast = slider[1] / 2
54
55
for i, p in enumerate(pred):
56
if p == 1:
57
gapPositionSum += i * step + slider[1] / 2
58
gapBlockLast = i * step + slider[1] / 2
59
gapCount += 1
60
lastGap = 0
61
if gapBlockFirst == 0:
62
gapBlockFirst = i * step + slider[1] / 2
63
else:
64
if gapCount != 0 and lastGap >= 1:
65
if firstGap:
66
gaps.append(int(gapBlockLast))
67
firstGap = False
68
else:
69
gaps.append(int(gapPositionSum // gapCount))
70
gapPositionSum = 0
71
gapCount = 0
72
gapBlockFirst = 0
73
lastGap += 1
74
75
# Adding final gap position
76
if gapBlockFirst != 0:
77
gaps.append(int(gapBlockFirst))
78
else:
79
gapPositionSum += (len(pred) - 1) * 2 + slider[1]/2
80
gaps.append(int(gapPositionSum / (gapCount + 1)))
81
82
if debug:
83
# Drawing lines
84
img = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB)
85
for gap in gaps:
86
cv2.line(img,
87
((int)(gap), 0),
88
((int)(gap), slider[0]),
89
(0, 255, 0), 1)
90
implt(img, t="Separated characters")
91
92
return gaps
93