From e0996e35862256114826a6314dc649972972a60c Mon Sep 17 00:00:00 2001
From: Samo Penic <samo.penic@gmail.com>
Date: Sat, 17 Nov 2018 13:42:52 +0000
Subject: [PATCH] Multiple SID robustness..
---
aoiOcr.py | 30 ++++++---
sid_process.py | 4
Ocr.py | 97 ++++++++++++++++++-------------
3 files changed, 77 insertions(+), 54 deletions(-)
diff --git a/Ocr.py b/Ocr.py
index 33d9457..6e9a082 100644
--- a/Ocr.py
+++ b/Ocr.py
@@ -10,10 +10,10 @@
self.filename = filename
self.invalid = None
self.QRData = None
- self.settings={'answer_treshold':0.25,} if settings is None else settings
+ self.settings = {"answer_threshold": 0.25} if settings is None else settings
self.errors = []
self.warnings = []
- self.sid=None
+ self.sid = None
self.sid_classifier = sid_classifier
if filename is not None:
self.loadImage(filename)
@@ -57,6 +57,11 @@
self.data = None
self.invalid = True
return
+ if(len(d)>1): #if there are multiple codes, get first ean or qr code available.
+ for dd in d:
+ if(dd.type=="EAN13" or dd.type=="QR"):
+ d[0]=dd
+ break
self.QRDecode = d
self.QRData = d[0].data
xpos = d[0].rect.left
@@ -66,11 +71,11 @@
self.rotateAngle(180)
def rotateAngle(self, angle=0):
- #rot_mat = cv2.getRotationMatrix2D(
+ # rot_mat = cv2.getRotationMatrix2D(
# (self.imgHeight / 2, self.imgWidth / 2), angle, 1.0
- #)
+ # )
rot_mat = cv2.getRotationMatrix2D(
- (self.imgWidth/2, self.imgHeight/2), angle, 1.0
+ (self.imgWidth / 2, self.imgHeight / 2), angle, 1.0
)
result = cv2.warpAffine(
self.img,
@@ -222,58 +227,68 @@
if self.sid_classifier is None:
return "x"
if self.settings is not None:
- sid_mask=self.settings.get("sid_mask", None)
- es,err,warn = getSID(
+ sid_mask = self.settings.get("sid_mask", None)
+ es, err, warn = getSID(
self.img[
int(0.04 * self.imgHeight) : int(0.095 * self.imgHeight),
int(0.7 * self.imgWidth) : int(0.99 * self.imgWidth),
],
self.sid_classifier,
- sid_mask
+ sid_mask,
)
[self.errors.append(e) for e in err]
[self.warnings.append(w) for w in warn]
return es
-
def get_code_data(self):
if self.QRData is None:
self.errors.append("Could not read QR or EAN code! Not an exam?")
- retval = {'exam_id': None,
- 'page_no': None,
- 'paper_id': None,
- 'faculty_id': None,
- 'sid':None
- }
- return retval
- qrdata = bytes.decode(self.QRData, 'utf8')
- if self.QRDecode[0].type=='EAN13':
- return {'exam_id': int(qrdata[0:7]),
- 'page_no': int(qrdata[7]),
- 'paper_id': int(qrdata[-5:-1]),
- 'faculty_id': None,
- 'sid': None
- }
- else:
- data=qrdata.split(',')
- retval={'exam_id': int(data[1]),
- 'page_no': int(data[3]),
- 'paper_id':int(data[2]),
- 'faculty_id':int(data[0]),
+ retval = {
+ "exam_id": None,
+ "page_no": None,
+ "paper_id": None,
+ "faculty_id": None,
+ "sid": None,
}
- if(len(data)>4):
- retval['sid']=data[4]
+ return retval
+ qrdata = bytes.decode(self.QRData, "utf8")
+ if self.QRDecode[0].type == "EAN13":
+ return {
+ "exam_id": int(qrdata[0:7]),
+ "page_no": int(qrdata[7]),
+ "paper_id": int(qrdata[-5:-1]),
+ "faculty_id": None,
+ "sid": None,
+ }
+ else:
+ data = qrdata.split(",")
+ retval = {
+ "exam_id": int(data[1]),
+ "page_no": int(data[3]),
+ "paper_id": int(data[2]),
+ "faculty_id": int(data[0]),
+ }
+ if len(data) > 4:
+ retval["sid"] = data[4]
return retval
def get_paper_ocr_data(self):
- data=self.get_code_data()
- data['qr']=self.QRData
- data['errors']=self.errors
- data['warnings']=self.warnings
- data['up_position']=(list(self.xMarkerLocations[1]/self.imgWidth), list(self.yMarkerLocations[1]/self.imgHeight))
- data['right_position']=(list(self.xMarkerLocations[1]/self.imgWidth), list(self.yMarkerLocations[1]/self.imgHeight))
- data['ans_matrix']=((np.array(self.answerMatrix)>self.settings['answer_treshold'])*1).tolist()
- if data['sid'] is None:
- data['sid']=self.get_enhanced_sid()
+ data = self.get_code_data()
+ data["qr"] = self.QRData
+ data["errors"] = self.errors
+ data["warnings"] = self.warnings
+ data["up_position"] = (
+ list(self.xMarkerLocations[1] / self.imgWidth),
+ list(self.yMarkerLocations[1] / self.imgHeight),
+ )
+ data["right_position"] = (
+ list(self.xMarkerLocations[1] / self.imgWidth),
+ list(self.yMarkerLocations[1] / self.imgHeight),
+ )
+ data["ans_matrix"] = (
+ (np.array(self.answerMatrix) > self.settings["answer_threshold"]) * 1
+ ).tolist()
+ if data["sid"] is None and data["page_no"] == 0:
+ data["sid"] = self.get_enhanced_sid()
return data
diff --git a/aoiOcr.py b/aoiOcr.py
index 3554c92..9188b0a 100644
--- a/aoiOcr.py
+++ b/aoiOcr.py
@@ -3,11 +3,11 @@
from glob import glob
-settings = {"sid_mask": "64xx0xxx", "answer_treshold": 0.25}
+settings = {"sid_mask": "64xx0xxx", "answer_threshold": 0.25}
classifier = joblib.load("filename.joblib")
#p = Paper(filename="testpage300dpi_scan1.png")
-#p=Paper(filename='sizif111.tif', sid_classifier=classifier, settings={"sid_mask": "11xx0xxx", "answer_treshold": 0.25})
+#p=Paper(filename='sizif111.tif', sid_classifier=classifier, settings={"sid_mask": "11xx0xxx", "answer_threshold": 0.25})
#p=Paper(filename='processed_scans/20141016095134535_0006.tif', sid_classifier=classifier, settings=settings)
#p = Paper(filename="processed_scans/20151111080408825_0001.tif",sid_classifier=classifier,settings=settings,)
#p=Paper(filename='processed_scans/20151028145444607_0028.tif', sid_classifier=classifier, settings=settings)
@@ -20,9 +20,10 @@
"processed_scans/20141021095744144_0009.tif",
"processed_scans/20141028095553745_0018.tif",
"processed_scans/20151013180545275_0011.tif",
- "processed_scans/20160408140801098_0004.tif"
+ "processed_scans/20160408140801098_0004.tif",
+ "processed_scans/20160510075445995_0026.tif"
]
-p=Paper(filename=pa[8], sid_classifier=classifier, settings=settings)
+p=Paper(filename=pa[9], sid_classifier=classifier, settings=settings)
# print(p.QRData)
# print(p.errors)
@@ -35,13 +36,20 @@
print(p.get_paper_ocr_data())
-exit(0)
+
+
filelist = glob("processed_scans/*.tif")
+wrong_sid=0;
+total=0
for f in sorted(filelist):
print("processing: {}".format(f))
- print(
- f,
- Paper(
- filename=f, sid_classifier=classifier, settings=settings
- ).get_paper_ocr_data(),
- )
+ p=Paper(filename=f, sid_classifier=classifier, settings=settings).get_paper_ocr_data()
+ print(f,p)
+ if(p['page_no']==0):
+ total+=1
+ if(len(p['errors'])!=0):
+ wrong_sid+=1
+ if total%10 == 0:
+ print("Total:{}, wrong SID: {}".format(total,wrong_sid))
+
+print("Total:{}, wrong SID: {}".format(total,wrong_sid))
\ No newline at end of file
diff --git a/sid_process.py b/sid_process.py
index ab8aaa3..f21fafb 100644
--- a/sid_process.py
+++ b/sid_process.py
@@ -210,11 +210,11 @@
cv2.imwrite("enhancedSID.png", image)
sid_no = segment_by_contours(image, image_original, classifier, sid_mask)
- print(sid_no)
+
if len(sid_no) != len(sid_mask) or not sid_compare(sid_no, sid_mask):
sid_warn.append("Trying second SID algorithm.")
sid_no = segment_by_7segments(image, image_original, sid_mask, classifier)
- print(sid_no)
+
if (len(sid_no)) != len(sid_mask):
sid_no = segment_by_sid_len(image, image_original, sid_mask, classifier)
sid_warn.append("Trying third SID algorithm.")
--
Gitblit v1.8.0