From d9b61920f3c726c4acbfaa2132a7ca0ef97ec00b Mon Sep 17 00:00:00 2001 From: Abdul Moiz Muhammad Date: Thu, 1 Oct 2026 18:48:30 +0500 Subject: [PATCH 1/5] Rebuild docling-pk v1.0: layout-aware extraction with cross-checked fields Library (src/ layout): - extract(): paths, bytes, arrays, PIL, PDF, CNIC front+back lists; auto document type; DocumentResult with per-field status and reason - OCR backends: RapidOCR (default, CPU, no PyTorch) and EasyOCR (optional 'urdu' extra, also used as an independent verifier) - Orientation scoring robust to Urdu-script noise and to engines that rotate tall crops; skew from text-line angles; micro-text filtering with an adaptive ink-only re-read; quality warnings instead of blur rejection - CNIC: label geometry, chronological dates, CNIC/gender parity, digit-only re-reads, back side, experimental Urdu address with lexicon correction - Matric/Intermediate: column-aligned marks table validated against TOTAL, subject sums and marks-in-words; board detection - Degree/transcript parser (new) - CLI: extract, batch, info, --version Fixes from v0.1: extractor.py SyntaxError, missing top-level extract(), unpackaged CLI entry point, orientation picking Urdu noise, no-op deskew, 'Name' returned as father's name, non-ASCII Windows paths. --- .gitattributes | 5 + .gitignore | 27 +- cli.py | 67 -- docling_pk/extractor.py | 92 --- docling_pk/ocr.py | 65 -- docling_pk/parsers/__init__.py | 0 docling_pk/parsers/_federal_board.py | 172 ----- docling_pk/parsers/cnic.py | 147 ----- docling_pk/parsers/intermediate.py | 18 - docling_pk/parsers/matric.py | 21 - docling_pk/preprocessor.py | 101 --- docling_pk/schema.py | 38 -- pyproject.toml | 106 ++- src/docling_pk/__init__.py | 28 + src/docling_pk/cli.py | 197 ++++++ src/docling_pk/errors.py | 22 + src/docling_pk/extractor.py | 281 ++++++++ src/docling_pk/layout.py | 146 +++++ src/docling_pk/ocr/__init__.py | 5 + src/docling_pk/ocr/base.py | 130 ++++ src/docling_pk/ocr/easyocr_backend.py | 84 +++ src/docling_pk/ocr/rapidocr_backend.py | 54 ++ src/docling_pk/parsers/__init__.py | 1 + src/docling_pk/parsers/base.py | 156 +++++ src/docling_pk/parsers/certificate.py | 552 ++++++++++++++++ src/docling_pk/parsers/cnic.py | 618 ++++++++++++++++++ src/docling_pk/parsers/degree.py | 217 ++++++ src/docling_pk/pipeline.py | 274 ++++++++ .../__init__.py => src/docling_pk/py.typed | 0 src/docling_pk/schema.py | 211 ++++++ src/docling_pk/urdu.py | 294 +++++++++ src/docling_pk/validation/__init__.py | 1 + src/docling_pk/validation/cnic.py | 125 ++++ src/docling_pk/validation/dates.py | 136 ++++ src/docling_pk/validation/marks.py | 135 ++++ src/docling_pk/validation/text.py | 76 +++ src/docling_pk/vision/__init__.py | 1 + src/docling_pk/vision/geometry.py | 103 +++ src/docling_pk/vision/image_io.py | 138 ++++ src/docling_pk/vision/quality.py | 98 +++ 40 files changed, 4199 insertions(+), 743 deletions(-) create mode 100644 .gitattributes delete mode 100644 cli.py delete mode 100644 docling_pk/extractor.py delete mode 100644 docling_pk/ocr.py delete mode 100644 docling_pk/parsers/__init__.py delete mode 100644 docling_pk/parsers/_federal_board.py delete mode 100644 docling_pk/parsers/cnic.py delete mode 100644 docling_pk/parsers/intermediate.py delete mode 100644 docling_pk/parsers/matric.py delete mode 100644 docling_pk/preprocessor.py delete mode 100644 docling_pk/schema.py create mode 100644 src/docling_pk/__init__.py create mode 100644 src/docling_pk/cli.py create mode 100644 src/docling_pk/errors.py create mode 100644 src/docling_pk/extractor.py create mode 100644 src/docling_pk/layout.py create mode 100644 src/docling_pk/ocr/__init__.py create mode 100644 src/docling_pk/ocr/base.py create mode 100644 src/docling_pk/ocr/easyocr_backend.py create mode 100644 src/docling_pk/ocr/rapidocr_backend.py create mode 100644 src/docling_pk/parsers/__init__.py create mode 100644 src/docling_pk/parsers/base.py create mode 100644 src/docling_pk/parsers/certificate.py create mode 100644 src/docling_pk/parsers/cnic.py create mode 100644 src/docling_pk/parsers/degree.py create mode 100644 src/docling_pk/pipeline.py rename docling_pk/__init__.py => src/docling_pk/py.typed (100%) create mode 100644 src/docling_pk/schema.py create mode 100644 src/docling_pk/urdu.py create mode 100644 src/docling_pk/validation/__init__.py create mode 100644 src/docling_pk/validation/cnic.py create mode 100644 src/docling_pk/validation/dates.py create mode 100644 src/docling_pk/validation/marks.py create mode 100644 src/docling_pk/validation/text.py create mode 100644 src/docling_pk/vision/__init__.py create mode 100644 src/docling_pk/vision/geometry.py create mode 100644 src/docling_pk/vision/image_io.py create mode 100644 src/docling_pk/vision/quality.py diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..f3d4de8 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +* text=auto eol=lf +*.png binary +*.jpg binary +*.jpeg binary +*.pdf binary diff --git a/.gitignore b/.gitignore index 057506a..5a018ac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,28 @@ -*.docx +# Python __pycache__/ -.vscode/ -*.pyc -venv/ +*.py[cod] *.egg-info/ +build/ +dist/ +.eggs/ + +# Environments +venv/ +.venv/ +env/ + +# Tooling .pytest_cache/ +.ruff_cache/ +.mypy_cache/ .coverage coverage.xml +htmlcov/ +.vscode/ +.idea/ + +# Documents and data that must never be committed: real people's documents +*.docx +private/ +private-eval/ +benchmarks/results/*.full.json diff --git a/cli.py b/cli.py deleted file mode 100644 index f23d763..0000000 --- a/cli.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -Command line interface for docling-pk. - -Real extraction is not wired in yet. Every command validates that the -given image path actually exists, then returns a placeholder result -with a non-zero exit code, so callers (and CI) can tell "not -implemented" apart from "succeeded", rather than a silent success on -input that was never read. -""" - -import json -import sys -from pathlib import Path -import typer - -app = typer.Typer(help="Extract structured data from Pakistani identity and education documents.") - -NOT_IMPLEMENTED_EXIT_CODE = 1 - - -def _placeholder_result(document_type: str) -> dict: - return { - "document_type": document_type, - "fields": {}, - "confidence": 0.0, - "warnings": ["not implemented yet, this is placeholder output"], - "raw_text": None, - } - - -def _run_placeholder(document_type: str, image_path: str) -> None: - path = Path(image_path) - if not path.exists(): - typer.echo(f"Error: image path does not exist: {image_path}", err=True) - raise typer.Exit(code=2) - - result = _placeholder_result(document_type) - typer.echo(json.dumps(result, indent=2)) - raise typer.Exit(code=NOT_IMPLEMENTED_EXIT_CODE) - - -@app.command() -def cnic(image_path: str = typer.Argument(..., help="Path to a CNIC image file.")): - """Extract fields from a CNIC image. Not implemented yet, exits non-zero.""" - _run_placeholder("cnic", image_path) - - -@app.command() -def matric(image_path: str = typer.Argument(..., help="Path to a Matric certificate image file.")): - """Extract fields from a Matric certificate image. Not implemented yet, exits non-zero.""" - _run_placeholder("matric", image_path) - - -@app.command() -def intermediate(image_path: str = typer.Argument(..., help="Path to an Intermediate certificate image file.")): - """Extract fields from an Intermediate certificate image. Not implemented yet, exits non-zero.""" - _run_placeholder("intermediate", image_path) - - -@app.command() -def degree(image_path: str = typer.Argument(..., help="Path to a Degree/Transcript image file.")): - """Extract fields from a Degree/Transcript image. Not implemented yet, exits non-zero.""" - _run_placeholder("degree", image_path) - - -if __name__ == "__main__": - app() \ No newline at end of file diff --git a/docling_pk/extractor.py b/docling_pk/extractor.py deleted file mode 100644 index e87a954..0000000 --- a/docling_pk/extractor.py +++ /dev/null @@ -1,92 +0,0 @@ -""" -Main entry point for docling-pk. extract() ties preprocessing, OCR, and -the correct document-type parser together into one DocumentResult. -""" - -from docling_pk.preprocessor import preprocess, TooBlurryError -from docling_pk.ocr import run_ocr -from docling_pk.parsers import cnic, matric, intermediate -from docling_pk.parsers._federal_board import detect_document_type -from docling_pk.schema import DocumentResult, FieldResult -from __future__ import annotations - -SUPPORTED_TYPES = ("cnic", "matric", "intermediate") - -# CNIC needs Urdu for label text; certificates read better English-only, -# since the combined en+ur model introduces noise into English-heavy text. -LANGUAGES_BY_TYPE = { - "cnic": ("en", "ur"), - "matric": ("en",), - "intermediate": ("en",), -} - -PARSERS = { - "cnic": cnic, - "matric": matric, - "intermediate": intermediate, -} - - -def extract(image_path: str, document_type: str) -> DocumentResult: - """ - Extracts structured fields from a document image. - - Args: - image_path: path to the image file. - document_type: one of "cnic", "matric", "intermediate". For - matric/intermediate, the actual sub-type is confirmed - against the certificate's own title text after OCR, since - the two document types share a parser structure and the - title is the reliable way to tell them apart. - - Returns: - A DocumentResult with extracted fields, an overall confidence - score (averaged across all fields, including ones not found), - and any warnings, including a "too blurry" warning if the - image could not be reliably processed. - - Raises: - ValueError: if document_type is not one of the supported types, - or if the image file is not a valid image. - FileNotFoundError: if image_path does not exist. - """ - if document_type not in SUPPORTED_TYPES: - raise ValueError( - f"Unsupported document_type: {document_type!r}. " - f"Must be one of {SUPPORTED_TYPES}." - ) - - try: - image = preprocess(image_path) - except TooBlurryError as e: - return DocumentResult( - document_type=document_type, - fields={}, - confidence=0.0, - warnings=[str(e)], - raw_text=None, - ) - - languages = LANGUAGES_BY_TYPE[document_type] - raw_text, _ = run_ocr(image, languages=languages) - - if document_type in ("matric", "intermediate"): - actual_type = detect_document_type(raw_text) - parser = PARSERS[actual_type] - document_type = actual_type - else: - parser = PARSERS[document_type] - - fields = parser.extract(raw_text) - - warnings = [f"{name} not found" for name, result in fields.items() if result.value is None] - confidences = [result.confidence for result in fields.values()] - overall_confidence = sum(confidences) / len(confidences) if confidences else 0.0 - - return DocumentResult( - document_type=document_type, - fields=fields, - confidence=round(overall_confidence, 2), - warnings=warnings, - raw_text=raw_text, - ) \ No newline at end of file diff --git a/docling_pk/ocr.py b/docling_pk/ocr.py deleted file mode 100644 index 4c551a4..0000000 --- a/docling_pk/ocr.py +++ /dev/null @@ -1,65 +0,0 @@ -""" -OCR wrapper for docling-pk. - -Wraps EasyOCR and returns plain text plus average confidence. The -reader is created once per process and reused. Languages are -configurable: CNIC needs English plus Urdu, certificates read better -English-only since the combined model introduces Arabic-script noise -into English words. - -Phone photos are sometimes shot in the wrong orientation. run_ocr -tries all four right-angle rotations and keeps whichever one EasyOCR -reads with the highest confidence times detection count. -""" - -import numpy as np -import easyocr - -_reader = None -_reader_languages = [None] - - -def _get_reader(languages: tuple = ("en", "ur")) -> easyocr.Reader: - global _reader - if _reader is None or _reader_languages[0] != languages: - _reader = easyocr.Reader(list(languages), gpu=True) - _reader_languages[0] = languages - return _reader - - -def _ocr_once(reader: easyocr.Reader, image: np.ndarray) -> tuple[str, float, int]: - detections = reader.readtext(image) - if not detections: - return "", 0.0, 0 - - lines = [text for (_, text, _) in detections] - scores = [score for (_, _, score) in detections] - raw_text = "\n".join(lines) - avg_confidence = sum(scores) / len(scores) - return raw_text, avg_confidence, len(detections) - - -def run_ocr(image: np.ndarray, languages: tuple = ("en", "ur")) -> tuple[str, float]: - """ - Runs OCR on a preprocessed image, correcting 90-degree rotations. - - Args: - image: single-channel numpy array from preprocessor.preprocess(). - languages: EasyOCR language list. Use ("en",) for English-only - documents like certificates. - - Returns: - A tuple of (raw_text, average_confidence) from whichever of the - four right-angle rotations scored best. - """ - reader = _get_reader(languages) - best_text, best_confidence, best_score = "", 0.0, -1.0 - - for k in range(4): - rotated = np.rot90(image, k=k) - text, confidence, count = _ocr_once(reader, rotated) - score = confidence * count - if score > best_score: - best_text, best_confidence, best_score = text, confidence, score - - return best_text, best_confidence diff --git a/docling_pk/parsers/__init__.py b/docling_pk/parsers/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/docling_pk/parsers/_federal_board.py b/docling_pk/parsers/_federal_board.py deleted file mode 100644 index afb5651..0000000 --- a/docling_pk/parsers/_federal_board.py +++ /dev/null @@ -1,172 +0,0 @@ -""" -Shared field extraction for Federal Board of Intermediate and Secondary -Education (Islamabad) certificates. - -Digit matching restricted to ASCII 0-9 explicitly, not \\d, since \\d and -int() both silently accept Unicode digits (Arabic-Indic included), -which showed up in real testing as a silently wrong number instead of -a correctly failed match. - -Label patterns are kept loose since testing found labels misread in -ways that keep breaking stricter patterns ("Certiiicate", "Cerlificate", -"erlific3te"). Letter-for-digit misreads (O/o/l/I for 0/0/1/1) are -corrected inside number tokens, confirmed necessary on a real roll -number read as "1217O6" instead of "121706". The name/father-name -anchor tolerates common misspellings of "daughter" found across real -samples. The TOTAL row search stops at an all-caps subject-name line -(a hard boundary), confirmed necessary on a real sample where the true -total-possible value drifted far from the label and the search -otherwise crossed into a subject row and wrongly grabbed that -subject's own marks instead. -""" - -import re -from docling_pk.schema import FieldResult - -SERIAL_LABEL = re.compile(r"ser\w*\s*n[oa]", re.IGNORECASE) -CERTIFICATE_LABEL = re.compile(r"cer\w*\s*n[oa]", re.IGNORECASE) -ROLL_LABEL = re.compile(r"roll\s*n[oa]", re.IGNORECASE) -REGISTRATION_LABEL = re.compile(r"reg\w*\s*n[oa]", re.IGNORECASE) -GROUP_KEYWORDS = re.compile(r"\b(SCIENCE(?:\s+GENERAL)?|ARTS|COMMERCE|HUMANITIES)\b", re.IGNORECASE) -SESSION_YEAR = re.compile(r"annual\W*([0-9]{4})", re.IGNORECASE) -GRADE = re.compile(r"grade\s+([A-Z])\b", re.IGNORECASE) -DAUGHTER_OF_ANCHOR = re.compile(r"d[ao]ugh\w*\s*[o0]f", re.IGNORECASE) -DOB = re.compile(r"date of birth is\s+([0-9./-]+)", re.IGNORECASE) -TOTAL_LABEL = re.compile(r"\btotal\b", re.IGNORECASE) -NUMBER_RUN = re.compile(r"[0-9][0-9OolI./\s]{2,}[0-9]|[0-9]{3,}") -HARD_BOUNDARY = re.compile(r"^[A-Z\s]{4,}$") - -SKIP_LINE = re.compile(r"certif|cerif|^that$|board|education|islamabad|secondary|intermediate", re.IGNORECASE) - - -def _clean_number(raw: str) -> str: - corrected = raw.translate(str.maketrans("OolI", "0011")) - return re.sub(r"[^0-9/]", "", corrected) - - -def _find_number_near_label(lines: list[str], label_pattern: re.Pattern, window: int = 2) -> FieldResult: - for i, line in enumerate(lines): - if not label_pattern.search(line): - continue - - same_line = label_pattern.sub("", line) - match = NUMBER_RUN.search(same_line) - if match: - return FieldResult(value=_clean_number(match.group()), confidence=0.75) - - offsets = [] - for d in range(1, window + 1): - offsets.append(d) - offsets.append(-d) - for offset in offsets: - j = i + offset - if 0 <= j < len(lines): - match = NUMBER_RUN.search(lines[j]) - if match: - return FieldResult(value=_clean_number(match.group()), confidence=0.65) - return FieldResult(value=None, confidence=0.0) - - return FieldResult(value=None, confidence=0.0) - - -def _find_name_pair(lines: list[str]) -> tuple[FieldResult, FieldResult]: - anchor_idx = None - for i, line in enumerate(lines): - if DAUGHTER_OF_ANCHOR.search(line): - anchor_idx = i - break - - if anchor_idx is None: - return FieldResult(value=None, confidence=0.0), FieldResult(value=None, confidence=0.0) - - name = FieldResult(value=None, confidence=0.0) - for offset in (1, 2, 3): - j = anchor_idx - offset - if j < 0: - break - candidate = lines[j].strip(" '.-") - if len(candidate) >= 5 and not SKIP_LINE.search(candidate): - name = FieldResult(value=candidate, confidence=0.6) - break - - father_name = FieldResult(value=None, confidence=0.0) - for offset in (1, 2): - j = anchor_idx + offset - if j >= len(lines): - break - candidate = lines[j].strip(" '.-") - if len(candidate) >= 5 and not SKIP_LINE.search(candidate): - father_name = FieldResult(value=candidate, confidence=0.6) - break - - return name, father_name - - -def _find_total(lines: list[str]) -> tuple[FieldResult, FieldResult]: - for i, line in enumerate(lines): - if not TOTAL_LABEL.search(line): - continue - - numbers = [] - misses = 0 - for offset in range(1, 6): - j = i - offset - if j < 0: - break - candidate = lines[j].strip() - if HARD_BOUNDARY.match(candidate): - break - match = NUMBER_RUN.search(candidate) - if match: - cleaned = _clean_number(match.group()) - if cleaned: - numbers.append(int(cleaned)) - misses = 0 - else: - misses += 1 - if misses >= 2: - break - if len(numbers) == 2: - break - - if len(numbers) == 2: - possible, obtained = max(numbers), min(numbers) - return ( - FieldResult(value=str(possible), confidence=0.7), - FieldResult(value=str(obtained), confidence=0.7), - ) - return FieldResult(value=None, confidence=0.0), FieldResult(value=None, confidence=0.0) - - return FieldResult(value=None, confidence=0.0), FieldResult(value=None, confidence=0.0) - - -def extract_common_fields(raw_text: str) -> dict[str, FieldResult]: - lines = raw_text.splitlines() - - fields = { - "serial_number": _find_number_near_label(lines, SERIAL_LABEL), - "certificate_number": _find_number_near_label(lines, CERTIFICATE_LABEL), - "roll_number": _find_number_near_label(lines, ROLL_LABEL), - "registration_number": _find_number_near_label(lines, REGISTRATION_LABEL), - } - - group_match = GROUP_KEYWORDS.search(raw_text) - fields["group"] = FieldResult(value=group_match.group(1).upper(), confidence=0.75) if group_match else FieldResult(value=None, confidence=0.0) - - year_match = SESSION_YEAR.search(raw_text) - fields["session_year"] = FieldResult(value=year_match.group(1), confidence=0.8) if year_match else FieldResult(value=None, confidence=0.0) - - grade_match = GRADE.search(raw_text) - fields["grade"] = FieldResult(value=grade_match.group(1), confidence=0.6) if grade_match else FieldResult(value=None, confidence=0.0) - - fields["name"], fields["father_name"] = _find_name_pair(lines) - fields["total_marks_possible"], fields["total_marks_obtained"] = _find_total(lines) - fields["institute"] = FieldResult(value=None, confidence=0.0) - - return fields - - -def detect_document_type(raw_text: str) -> str: - if re.search(r"higher\s+secondary\s+school\s+certificate", raw_text, re.IGNORECASE): - return "intermediate" - return "matric" diff --git a/docling_pk/parsers/cnic.py b/docling_pk/parsers/cnic.py deleted file mode 100644 index 7d59513..0000000 --- a/docling_pk/parsers/cnic.py +++ /dev/null @@ -1,147 +0,0 @@ -""" -CNIC field extraction. - -Labels are matched loosely since real OCR misreads them in small, -specific ways ("Gender" as "GenUer", "of" as "o{"/"o/", "Father Name" -as "Fathgr Name"/"Father Namg"). Dates and cnic_number use format-based -matching instead of label matching, since testing showed date labels -and values are read as two separate groups, not adjacent lines. - -Digit matching is restricted to ASCII 0-9 explicitly, not the regex \\d -shorthand. Python's \\d and int() both silently accept Unicode digits -(Arabic-Indic included), so a garbled OCR read could otherwise parse -as a different, wrong number with full confidence instead of correctly -failing to match. - -Gender's search window was widened after testing with the adaptive -threshold step removed: with cleaner OCR text, the M/F value can -appear further from its label than a 1-line window would catch. -""" - -import re -from typing import Optional -from docling_pk.schema import FieldResult - -CNIC_PATTERN = re.compile(r"\b([0-9]{5}-[0-9]{7}-[0-9])\b") -DATE_PATTERN = re.compile(r"\b([0-9]{2})[.,]([0-9]{2})[.,]([0-9]{4})\b") - -FIELD_NAMES = [ - "name", "father_name", "cnic_number", - "date_of_birth", "date_of_issue", "date_of_expiry", - "gender", "address", -] - -FATHER_NAME_LABEL = re.compile(r"fath\w*", re.IGNORECASE) -NAME_LABEL = re.compile(r"\bname\b", re.IGNORECASE) -GENDER_LABEL = re.compile(r"gen.er", re.IGNORECASE) -ADDRESS_LABEL = re.compile(r"address", re.IGNORECASE) - - -def extract_cnic_number(raw_text: str) -> FieldResult: - """ - Extracts the CNIC number (format XXXXX-XXXXXXX-X). OCR sometimes - reads the dash as an underscore, colon, or backtick; all are - normalized before matching. - """ - normalized = raw_text.replace("_", "-").replace(":", "-").replace("`", "-") - match = CNIC_PATTERN.search(normalized) - if match: - return FieldResult(value=match.group(1), confidence=0.92) - return FieldResult(value=None, confidence=0.0) - - -def _value_after_label(lines: list[str], label_pattern: re.Pattern, exclude: re.Pattern = None) -> Optional[tuple[str, int]]: - for i, line in enumerate(lines): - if exclude and exclude.search(line): - continue - if label_pattern.search(line): - return line, i - return None - - -def _text_value(lines: list[str], label_pattern: re.Pattern, exclude: re.Pattern = None) -> FieldResult: - found = _value_after_label(lines, label_pattern, exclude) - if found is None: - return FieldResult(value=None, confidence=0.0) - - line, idx = found - same_line = label_pattern.sub("", line).strip(" :-") - if same_line: - return FieldResult(value=same_line, confidence=0.75) - - if idx + 1 < len(lines) and lines[idx + 1].strip(): - return FieldResult(value=lines[idx + 1].strip(), confidence=0.65) - - return FieldResult(value=None, confidence=0.0) - - -def _all_dates(raw_text: str) -> list[str]: - matches = DATE_PATTERN.findall(raw_text) - return [f"{d}.{m}.{y}" for (d, m, y) in matches] - - -def _dates_by_position(raw_text: str) -> tuple[FieldResult, FieldResult, FieldResult]: - """ - Assigns dates by order of appearance, not proximity to a label. - NADRA prints birth, issue, expiry in that fixed order, and testing - shows EasyOCR reads the value block in that order even when - separated from the labels. - """ - dates = _all_dates(raw_text) - results = [] - for i in range(3): - if i < len(dates): - results.append(FieldResult(value=dates[i], confidence=0.8)) - else: - results.append(FieldResult(value=None, confidence=0.0)) - return tuple(results) - - -def extract_gender(raw_text: str) -> FieldResult: - """ - Extracts gender as 'M' or 'F'. Searches up to 4 lines after the - label, not just the next line. - """ - lines = raw_text.splitlines() - found = _value_after_label(lines, GENDER_LABEL) - if found is None: - return FieldResult(value=None, confidence=0.0) - - line, idx = found - remainder = GENDER_LABEL.sub("", line).strip(" :-") - match = re.search(r"\b([MF])\b", remainder.upper()) - if match: - return FieldResult(value=match.group(1), confidence=0.8) - - for offset in range(1, 5): - j = idx + offset - if j >= len(lines): - break - match = re.search(r"\b([MF])\b", lines[j].strip().upper()) - if match: - return FieldResult(value=match.group(1), confidence=0.7) - - return FieldResult(value=None, confidence=0.0) - - -def extract(raw_text: str) -> dict[str, FieldResult]: - """ - Extracts all CNIC fields from raw OCR text. Missing fields return - FieldResult(None, 0.0) rather than raising. - """ - lines = raw_text.splitlines() - - father_name = _text_value(lines, FATHER_NAME_LABEL) - name = _text_value(lines, NAME_LABEL, exclude=FATHER_NAME_LABEL) - dob, issue, expiry = _dates_by_position(raw_text) - - return { - "name": name, - "father_name": father_name, - "cnic_number": extract_cnic_number(raw_text), - "date_of_birth": dob, - "date_of_issue": issue, - "date_of_expiry": expiry, - "gender": extract_gender(raw_text), - "address": _text_value(lines, ADDRESS_LABEL), - } diff --git a/docling_pk/parsers/intermediate.py b/docling_pk/parsers/intermediate.py deleted file mode 100644 index cb12fc7..0000000 --- a/docling_pk/parsers/intermediate.py +++ /dev/null @@ -1,18 +0,0 @@ -""" -Intermediate (Higher Secondary School Certificate) extraction, Federal -Board Islamabad format. No date_of_birth field, this board does not -print it on the Intermediate certificate. -""" - -from docling_pk.schema import FieldResult -from docling_pk.parsers._federal_board import extract_common_fields - -FIELD_NAMES = [ - "serial_number", "certificate_number", "roll_number", "registration_number", - "group", "session_year", "grade", "name", "father_name", "institute", - "total_marks_possible", "total_marks_obtained", -] - - -def extract(raw_text: str) -> dict[str, FieldResult]: - return extract_common_fields(raw_text) diff --git a/docling_pk/parsers/matric.py b/docling_pk/parsers/matric.py deleted file mode 100644 index 9f6565c..0000000 --- a/docling_pk/parsers/matric.py +++ /dev/null @@ -1,21 +0,0 @@ -""" -Matric (Secondary School Certificate) extraction, Federal Board Islamabad -format. Adds date_of_birth on top of the shared fields, since this board -prints DOB on the Matric certificate but not on the Intermediate one. -""" - -from docling_pk.schema import FieldResult -from docling_pk.parsers._federal_board import extract_common_fields, DOB - -FIELD_NAMES = [ - "serial_number", "certificate_number", "roll_number", "registration_number", - "group", "session_year", "grade", "name", "father_name", "institute", - "date_of_birth", "total_marks_possible", "total_marks_obtained", -] - - -def extract(raw_text: str) -> dict[str, FieldResult]: - fields = extract_common_fields(raw_text) - match = DOB.search(raw_text) - fields["date_of_birth"] = FieldResult(value=match.group(1), confidence=0.8) if match else FieldResult(value=None, confidence=0.0) - return fields diff --git a/docling_pk/preprocessor.py b/docling_pk/preprocessor.py deleted file mode 100644 index 095b226..0000000 --- a/docling_pk/preprocessor.py +++ /dev/null @@ -1,101 +0,0 @@ -""" -Image preprocessing for docling-pk. - -Prepares a document photo for OCR. Order: grayscale, then blur check, -then deskew, then denoise. Adaptive thresholding was tested directly -(A/B test comparing thresholded output against plain grayscale on real -CNIC and certificate samples) and removed: it consistently lowered -EasyOCR's own confidence on every sample tested. EasyOCR's detector is -trained on natural photos, not pre-binarized ones, so feeding it our -own black-and-white conversion worked against it rather than for it. -""" - -import cv2 -import numpy as np -from pathlib import Path - -BLUR_VARIANCE_THRESHOLD = 35.0 - - -class TooBlurryError(ValueError): - """Raised when an image is too blurry to reliably OCR.""" - - -def preprocess(image_path: str) -> np.ndarray: - """ - Prepares a document image for OCR. - - Steps: - 1. Load and validate - 2. Grayscale - 3. Blur check - 4. Deskew - 5. Denoise - - Args: - image_path: path to the input image file. - - Returns: - A single-channel numpy array ready for OCR. - - Raises: - FileNotFoundError: if image_path does not exist. - ValueError: if the file cannot be read as an image. - TooBlurryError: if the image is too blurry to reliably OCR. - """ - path = Path(image_path) - if not path.exists(): - raise FileNotFoundError(f"Image not found: {image_path}") - - img = cv2.imread(str(path)) - if img is None: - raise ValueError(f"Could not read image: {image_path}. Check the file is a valid PNG/JPG.") - - gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - _check_blur(gray) - - deskewed = _deskew(gray) - denoised = cv2.fastNlMeansDenoising(deskewed, h=10) - return denoised - - -def _check_blur(gray: np.ndarray) -> None: - """ - Measures sharpness using the variance of the Laplacian. Threshold of - 35 picked from 4 real samples: two failing blurry images scored 12.9 - and 27.1, two working images scored 48.2 and 54.9. - """ - variance = cv2.Laplacian(gray, cv2.CV_64F).var() - if variance < BLUR_VARIANCE_THRESHOLD: - raise TooBlurryError( - f"Image too blurry to process (sharpness score {variance:.1f}, " - f"minimum {BLUR_VARIANCE_THRESHOLD}). Please retake the photo." - ) - - -def _deskew(gray: np.ndarray) -> np.ndarray: - """ - Estimates and corrects rotation using the minimum-area bounding box - of dark pixels. Known limitation, confirmed by direct testing: this - fails against cluttered or textured backgrounds, since the angle is - estimated from every dark pixel in the frame, not the document - specifically. v1 assumes a plain background. - """ - inverted = cv2.bitwise_not(gray) - _, binary = cv2.threshold(inverted, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU) - coords = np.column_stack(np.where(binary > 0)) - - if coords.shape[0] < 50: - return gray - - angle = cv2.minAreaRect(coords)[-1] - if angle < -45: - angle = -(90 + angle) - else: - angle = -angle - - (h, w) = gray.shape - center = (w // 2, h // 2) - matrix = cv2.getRotationMatrix2D(center, angle, 1.0) - rotated = cv2.warpAffine(gray, matrix, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE) - return rotated diff --git a/docling_pk/schema.py b/docling_pk/schema.py deleted file mode 100644 index e7088c7..0000000 --- a/docling_pk/schema.py +++ /dev/null @@ -1,38 +0,0 @@ -""" -Output schema for docling-pk. - -Every parser (cnic, matric, intermediate, degree) returns a dict of -FieldResult objects, wrapped in a DocumentResult by the extractor. This -is the one shape every other module builds against, so a change here -affects the CLI, the tests, and every parser at once. -""" -from __future__ import annotations -from dataclasses import dataclass, field -from typing import Optional - - -@dataclass -class FieldResult: - """A single extracted field. value is None when the field could not - be reliably read, not a guess. confidence is 0.0 in that case.""" - value: Optional[str] - confidence: float - - -@dataclass -class DocumentResult: - """ - The full result of extracting one document. - - confidence is the average across all fields, including ones that - were not found, not just the ones that succeeded. An earlier - version of this averaged only the found fields, which reported a - misleadingly high score on a document that was actually missing - several fields. Averaging across all fields gives a lower, more - honest number, and is the version used throughout this project. - """ - document_type: str - fields: dict[str, FieldResult] - confidence: float - warnings: list[str] = field(default_factory=list) - raw_text: Optional[str] = None \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 81d3d25..c0300f3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,33 +1,103 @@ [build-system] -requires = ["setuptools>=68.0"] +requires = ["setuptools>=77"] build-backend = "setuptools.build_meta" [project] name = "docling-pk" -version = "0.1.0" -description = "Extract structured data from Pakistani identity and education documents" +dynamic = ["version"] +description = "Structured data extraction from Pakistani identity and education documents (CNIC, Matric, Intermediate, degrees)." readme = "README.md" requires-python = ">=3.9" -license = { text = "MIT" } -authors = [ - { name = "Abdul Moiz Muhammad" } +license = "MIT" +license-files = ["LICENSE"] +authors = [{ name = "Abdul Moiz Muhammad" }, { name = "INFERENCE Lab" }] +keywords = ["ocr", "cnic", "pakistan", "kyc", "document-ai", "information-extraction", "easyocr", "urdu"] +classifiers = [ + "Development Status :: 4 - Beta", + "Intended Audience :: Developers", + "Intended Audience :: Science/Research", + "Operating System :: OS Independent", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3 :: Only", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Topic :: Scientific/Engineering :: Image Recognition", + "Topic :: Text Processing", + "Typing :: Typed", ] dependencies = [ - "opencv-python", - "numpy", - "easyocr", - "torch", - "typer", + "numpy>=1.21", + "opencv-python-headless>=4.5", + "rapidocr>=3.0", + "onnxruntime>=1.16", + "rapidfuzz>=3.0", + "typer>=0.9", + "Pillow>=9.0", +] + +[project.optional-dependencies] +# EasyOCR (PyTorch) adds Urdu address reading and an independent second +# engine that cross-checks CNIC numbers, dates and IDs. +urdu = ["easyocr>=1.7"] +pdf = ["pymupdf>=1.23"] +all = ["docling-pk[urdu,pdf]"] +dev = [ + "pytest>=7", + "pytest-cov>=4", + "ruff>=0.5", + "mypy>=1.8", + "build>=1.0", + "twine>=5", ] [project.scripts] -docling-pk = "cli:app" +docling-pk = "docling_pk.cli:app" + +[project.urls] +Homepage = "https://github.com/Inference-LAB/docling-pk" +Repository = "https://github.com/Inference-LAB/docling-pk" +Issues = "https://github.com/Inference-LAB/docling-pk/issues" +Changelog = "https://github.com/Inference-LAB/docling-pk/blob/main/CHANGELOG.md" + +[tool.setuptools.dynamic] +version = { attr = "docling_pk.__version__" } [tool.setuptools.packages.find] -include = ["docling_pk*"] +where = ["src"] -[project.optional-dependencies] -dev = [ - "pytest", - "pytest-cov", -] \ No newline at end of file +[tool.setuptools.package-data] +docling_pk = ["py.typed"] + +[tool.pytest.ini_options] +testpaths = ["tests"] +addopts = "-ra --strict-markers" +markers = [ + "ocr: needs the EasyOCR models (downloaded on first run); deselect with -m 'not ocr'", +] + +[tool.coverage.run] +source = ["docling_pk"] +branch = true + +[tool.coverage.report] +show_missing = true +skip_covered = false +exclude_lines = ["pragma: no cover", "if __name__ == .__main__.:", "raise NotImplementedError"] + +[tool.ruff] +line-length = 120 +target-version = "py39" +src = ["src", "tests"] + +[tool.ruff.lint] +select = ["E", "F", "W", "I", "B", "UP", "SIM"] +# UP045/UP007: keep Optional[X]; Typer evaluates CLI annotations at runtime and +# "X | None" fails there on Python 3.9. +ignore = ["E501", "UP006", "UP007", "UP035", "UP045", "B008", "SIM108"] + +[tool.mypy] +python_version = "3.10" +ignore_missing_imports = true +warn_unused_ignores = true diff --git a/src/docling_pk/__init__.py b/src/docling_pk/__init__.py new file mode 100644 index 0000000..2488d4b --- /dev/null +++ b/src/docling_pk/__init__.py @@ -0,0 +1,28 @@ +""" +docling-pk: structured data extraction from Pakistani identity and education +documents. + +Example: + >>> from docling_pk import extract + >>> result = extract("cnic.jpg", document_type="cnic") # doctest: +SKIP + >>> result.fields["cnic_number"].value # doctest: +SKIP + '35202-1234567-9' +""" + +__version__ = "1.0.0" + +from docling_pk.errors import DoclingPKError, ImageLoadError, UnsupportedDocumentTypeError # noqa: E402 +from docling_pk.extractor import SUPPORTED_TYPES, extract # noqa: E402 +from docling_pk.schema import DocumentResult, FieldResult, FieldStatus # noqa: E402 + +__all__ = [ + "extract", + "SUPPORTED_TYPES", + "DocumentResult", + "FieldResult", + "FieldStatus", + "DoclingPKError", + "ImageLoadError", + "UnsupportedDocumentTypeError", + "__version__", +] diff --git a/src/docling_pk/cli.py b/src/docling_pk/cli.py new file mode 100644 index 0000000..4129230 --- /dev/null +++ b/src/docling_pk/cli.py @@ -0,0 +1,197 @@ +""" +Command line interface. + + docling-pk extract cnic_front.jpg cnic_back.jpg --type cnic + docling-pk extract certificate.jpg --type auto --output table + docling-pk batch ./scans --type matric --out results.jsonl + docling-pk info + +Exit codes: 0 success, 1 the document was processed but no field could be +extracted, 2 bad input (missing file, unreadable image, unknown type). +""" + +from __future__ import annotations + +import json +import sys +from pathlib import Path +from typing import List, Optional + +import typer + +from docling_pk import __version__ + +app = typer.Typer( + help="Extract structured data from Pakistani identity and education documents.", + no_args_is_help=True, + add_completion=False, +) + +EXIT_NO_FIELDS = 1 +EXIT_BAD_INPUT = 2 + +IMAGE_SUFFIXES = {".jpg", ".jpeg", ".png", ".bmp", ".tif", ".tiff", ".webp", ".pdf"} + + +def _version_callback(value: bool) -> None: + if value: + typer.echo(f"docling-pk {__version__}") + raise typer.Exit() + + +@app.callback() +def main( + version: bool = typer.Option( + False, "--version", callback=_version_callback, is_eager=True, help="Show version and exit." + ), +) -> None: + """docling-pk command line.""" + + +def _print_table(result) -> None: + from rich.console import Console + from rich.markup import escape + from rich.table import Table + + console = Console() + table = Table(title=f"{result.document_type} (confidence {result.confidence:.2f})") + table.add_column("field") + table.add_column("value") + table.add_column("conf", justify="right") + table.add_column("status") + colors = {"ok": "green", "low_confidence": "yellow", "not_applicable": "dim"} + for name, f in result.fields.items(): + c = colors.get(f.status.value, "red") + table.add_row( + name, "" if f.value is None else escape(f.value), f"{f.confidence:.2f}", f"[{c}]{f.status.value}[/{c}]" + ) + console.print(table) + rows = result.tables.get("subjects") + if rows: + sub = Table(title="subjects") + for col in ("subject", "max_marks", "obtained_marks"): + sub.add_column(col) + for r in rows: + sub.add_row(escape(str(r["subject"])), str(r["max_marks"]), str(r["obtained_marks"])) + console.print(sub) + for w in result.warnings: + console.print(f"[yellow]warning:[/yellow] {escape(w)}") + + +def _run(paths: List[Path], document_type: str, backend: str, urdu: bool, cpu: bool, raw: bool, verify: bool = True): + from docling_pk import extract + from docling_pk.errors import DoclingPKError + + try: + return extract( + [str(p) for p in paths] if len(paths) > 1 else str(paths[0]), + document_type=document_type, + backend=backend, + urdu=urdu, + verify=verify, + gpu=False if cpu else None, + include_raw_text=raw, + ) + except FileNotFoundError as exc: + typer.echo(f"Error: {exc}", err=True) + raise typer.Exit(code=EXIT_BAD_INPUT) from exc + except (DoclingPKError, ValueError) as exc: + typer.echo(f"Error: {exc}", err=True) + raise typer.Exit(code=EXIT_BAD_INPUT) from exc + + +@app.command() +def extract( + images: List[Path] = typer.Argument( + ..., help="Image or PDF file(s). For a CNIC, pass the front and back together." + ), + document_type: str = typer.Option("auto", "--type", "-t", help="cnic, matric, intermediate, degree or auto."), + output: str = typer.Option("json", "--output", "-o", help="json or table."), + out_file: Optional[Path] = typer.Option(None, "--out", help="Write JSON to this file instead of stdout."), + backend: str = typer.Option("auto", "--backend", "-b", help="OCR engine: auto, rapidocr or easyocr."), + urdu: bool = typer.Option( + True, "--urdu/--no-urdu", help="Read the Urdu address on CNIC backs (needs the urdu extra)." + ), + verify: bool = typer.Option( + True, "--verify/--no-verify", help="Cross-check key fields with a second OCR engine if installed." + ), + cpu: bool = typer.Option(False, "--cpu", help="Do not use a GPU even if one is available."), + raw: bool = typer.Option(False, "--raw", help="Include raw OCR text in the JSON output."), +) -> None: + """Extract fields from one document (one or more images of it).""" + if output not in ("json", "table"): + typer.echo("Error: --output must be 'json' or 'table'", err=True) + raise typer.Exit(code=EXIT_BAD_INPUT) + result = _run(images, document_type, backend, urdu, cpu, raw, verify) + if output == "table" and out_file is None: + _print_table(result) + else: + text = result.to_json(include_raw=raw) + if out_file: + out_file.write_text(text, encoding="utf-8") + typer.echo(f"Wrote {out_file}", err=True) + else: + sys.stdout.buffer.write(text.encode("utf-8") + b"\n") + sys.stdout.flush() + if not any(f.value is not None for f in result.fields.values()): + raise typer.Exit(code=EXIT_NO_FIELDS) + + +@app.command() +def batch( + folder: Path = typer.Argument(..., exists=True, file_okay=False, help="Folder of images/PDFs."), + document_type: str = typer.Option("auto", "--type", "-t", help="cnic, matric, intermediate, degree or auto."), + out_file: Path = typer.Option(Path("docling_pk_results.jsonl"), "--out", help="JSON Lines output file."), + backend: str = typer.Option("auto", "--backend", "-b", help="OCR engine: auto, rapidocr or easyocr."), + urdu: bool = typer.Option(True, "--urdu/--no-urdu"), + cpu: bool = typer.Option(False, "--cpu"), +) -> None: + """Extract every document in a folder (one file per document) to JSON Lines.""" + from docling_pk import extract as run_extract + + files = sorted(p for p in folder.iterdir() if p.suffix.lower() in IMAGE_SUFFIXES) + if not files: + typer.echo(f"Error: no images found in {folder}", err=True) + raise typer.Exit(code=EXIT_BAD_INPUT) + ok = 0 + with out_file.open("w", encoding="utf-8") as fh: + for i, path in enumerate(files, 1): + try: + result = run_extract( + str(path), + document_type=document_type, + backend=backend, + urdu=urdu, + gpu=False if cpu else None, + include_raw_text=False, + ) + record = {"file": path.name, **result.to_dict()} + ok += 1 + except Exception as exc: # keep going: one bad file must not stop a batch + record = {"file": path.name, "error": f"{type(exc).__name__}: {exc}"} + fh.write(json.dumps(record, ensure_ascii=False) + "\n") + typer.echo(f"[{i}/{len(files)}] {path.name}", err=True) + typer.echo(f"Processed {ok}/{len(files)} files -> {out_file}", err=True) + + +@app.command() +def info() -> None: + """Show version, installed OCR backends and GPU availability.""" + import importlib.util + + typer.echo(f"docling-pk {__version__}") + typer.echo(f"python {sys.version.split()[0]}") + for mod in ("easyocr", "rapidocr", "fitz"): + label = {"fitz": "pymupdf (pdf)"}.get(mod, mod) + typer.echo(f"{label:<14} {'installed' if importlib.util.find_spec(mod) else 'not installed'}") + try: + import torch + + gpu = torch.cuda.get_device_name(0) if torch.cuda.is_available() else "none (CPU mode)" + except Exception: + gpu = "not used (PyTorch not installed; RapidOCR runs on CPU)" + typer.echo(f"gpu {gpu}") + + +if __name__ == "__main__": # pragma: no cover + app() diff --git a/src/docling_pk/errors.py b/src/docling_pk/errors.py new file mode 100644 index 0000000..0a15f84 --- /dev/null +++ b/src/docling_pk/errors.py @@ -0,0 +1,22 @@ +"""Exceptions raised by docling-pk. + +Only problems with the *call* raise (missing file, undecodable data, unknown +document type). Problems with the *document* (blur, glare, an unreadable +field) never raise: they come back as warnings and per-field statuses on a +partial :class:`~docling_pk.schema.DocumentResult`. +""" + + +class DoclingPKError(Exception): + """Base class for all docling-pk errors.""" + + +class ImageLoadError(DoclingPKError, ValueError): + """The input exists but could not be decoded as an image or PDF. + + Subclasses ``ValueError`` so ``except ValueError`` keeps working. + """ + + +class UnsupportedDocumentTypeError(DoclingPKError, ValueError): + """``document_type`` is not one of the supported types.""" diff --git a/src/docling_pk/extractor.py b/src/docling_pk/extractor.py new file mode 100644 index 0000000..334d3ac --- /dev/null +++ b/src/docling_pk/extractor.py @@ -0,0 +1,281 @@ +""" +Main entry point: :func:`extract`. + +Ties together loading, image quality checks, page normalization (rotation, +deskew, OCR), document-type routing and the per-type parsers, and returns a +:class:`~docling_pk.schema.DocumentResult`. +""" + +from __future__ import annotations + +import re +import time +from typing import Dict, List, Optional, Sequence, Union + +from docling_pk import __version__ +from docling_pk.errors import UnsupportedDocumentTypeError +from docling_pk.ocr.base import OCRBackend +from docling_pk.parsers import certificate, cnic, degree +from docling_pk.pipeline import Page, prepare_page +from docling_pk.schema import DocumentResult, FieldResult, FieldStatus +from docling_pk.validation.cnic import find_cnic +from docling_pk.vision.image_io import ImageSource, load_pages +from docling_pk.vision.quality import assess + +#: Accepted ``document_type`` values (aliases map onto these). +SUPPORTED_TYPES = ("cnic", "matric", "intermediate", "degree") +_ALIASES = { + "auto": "auto", + "cnic": "cnic", + "nic": "cnic", + "id": "cnic", + "id_card": "cnic", + "snic": "cnic", + "matric": "matric", + "ssc": "matric", + "secondary": "matric", + "intermediate": "intermediate", + "inter": "intermediate", + "hssc": "intermediate", + "fsc": "intermediate", + "degree": "degree", + "transcript": "degree", + "university": "degree", +} + +BackendSpec = Union[str, OCRBackend] + + +def _make_backend(spec: BackendSpec, gpu: Optional[bool]) -> OCRBackend: + if isinstance(spec, OCRBackend): + return spec + name = str(spec).lower() + if name == "auto": + import importlib.util + + if importlib.util.find_spec("rapidocr") is not None: + name = "rapidocr" + elif importlib.util.find_spec("easyocr") is not None: + name = "easyocr" + else: # pragma: no cover - depends on environment + raise ImportError("No OCR engine installed: pip install docling-pk") + if name == "easyocr": + from docling_pk.ocr.easyocr_backend import EasyOCRBackend + + return EasyOCRBackend(("en",), gpu=gpu) + if name == "rapidocr": + from docling_pk.ocr.rapidocr_backend import RapidOCRBackend + + return RapidOCRBackend() + raise ValueError(f"Unknown OCR backend {spec!r}; use 'auto', 'rapidocr', 'easyocr' or an OCRBackend instance.") + + +def _easyocr_available() -> bool: + import importlib.util + + return importlib.util.find_spec("easyocr") is not None + + +def _urdu_backend(gpu: Optional[bool]) -> Optional[OCRBackend]: + if not _easyocr_available(): + return None + from docling_pk.ocr.easyocr_backend import EasyOCRBackend + + return EasyOCRBackend(("ur", "en"), gpu=gpu) + + +def _verifier(primary: OCRBackend, verify: bool, gpu: Optional[bool]) -> Optional[OCRBackend]: + """A second engine for re-reading critical fields, if one is installed.""" + if not verify or primary.name == "easyocr" or not _easyocr_available(): + return None + from docling_pk.ocr.easyocr_backend import EasyOCRBackend + + return EasyOCRBackend(("en",), gpu=gpu) + + +def normalize_document_type(document_type: str) -> str: + """Maps aliases (``"ssc"``, ``"fsc"``, ``"transcript"``...) to a canonical type. + + Raises: + UnsupportedDocumentTypeError: for unknown types. + """ + key = re.sub(r"[\s\-]+", "_", str(document_type).strip().lower()) + if key not in _ALIASES: + raise UnsupportedDocumentTypeError( + f"Unsupported document_type: {document_type!r}. Must be one of {('auto',) + SUPPORTED_TYPES}." + ) + return _ALIASES[key] + + +def classify(page: Page) -> Optional[str]: + """Guesses the document type from OCR text. Returns ``None`` if unsure.""" + text = page.text + level = certificate.detect_level(text) + if level and (certificate.detect_board(text) or re.search(r"marks|subject", text, re.I)): + return level + if re.search(r"identity\s*(?:card|number)|country\s*of\s*stay|holder", text, re.I): + return "cnic" + if re.search(r"university|transcript|degree|bachelor|master\s+of|cgpa", text, re.I): + return "degree" + if level: + return level + if find_cnic(text) and cnic.detect_side(page.boxes) != "unknown": + return "cnic" + return None + + +def _overall_confidence(fields: Dict[str, FieldResult]) -> float: + applicable = [f for f in fields.values() if f.status != FieldStatus.NOT_APPLICABLE] + if not applicable: + return 0.0 + return round(sum(f.confidence for f in applicable) / len(applicable), 4) + + +def _field_warnings(fields: Dict[str, FieldResult]) -> List[str]: + out = [] + for name, f in fields.items(): + if f.status in (FieldStatus.NOT_FOUND, FieldStatus.INVALID): + out.append(f"{name}: {f.reason or f.status.value}") + elif f.status == FieldStatus.LOW_CONFIDENCE: + out.append(f"{name}: low confidence ({f.reason or 'verify manually'})") + return out + + +def extract( + source: Union[ImageSource, Sequence[ImageSource]], + document_type: str = "auto", + *, + backend: BackendSpec = "auto", + urdu: bool = True, + verify: bool = True, + gpu: Optional[bool] = None, + auto_rotate: bool = True, + include_raw_text: bool = True, +) -> DocumentResult: + """Extracts structured fields from a Pakistani document image. + + Args: + source: Path to an image or PDF, raw bytes, a NumPy array, a PIL + image, or a list of these. For CNICs, pass ``[front, back]`` to + get the address (printed on the back) in the same result. + document_type: ``"cnic"``, ``"matric"``, ``"intermediate"``, + ``"degree"`` (also covers transcripts), or ``"auto"`` to detect it. + Aliases such as ``"ssc"``, ``"hssc"``, ``"fsc"`` are accepted. + Matric and intermediate are confirmed against the certificate + title, which wins if the two disagree (a warning says so). + backend: OCR engine: ``"auto"`` (default: RapidOCR if installed, + else EasyOCR), ``"rapidocr"``, ``"easyocr"`` (needs the ``urdu`` + extra) or any :class:`~docling_pk.ocr.base.OCRBackend`. + urdu: Read the Urdu address on CNIC backs (needs EasyOCR; its Urdu + model is downloaded on first use). + verify: Re-read high-stakes fields (CNIC number, dates, marks) with a + second, independent OCR engine when one is installed, and only + mark them ``ok`` when the engines agree. + gpu: Force GPU use on/off for EasyOCR. ``None`` auto-detects CUDA. + auto_rotate: Detect and fix 90/180/270 degree rotation and skew. + include_raw_text: Keep the full OCR text on ``result.raw_text``. + + Returns: + A :class:`~docling_pk.schema.DocumentResult`. Never raises for a bad + *document*: unreadable fields come back with ``value=None``, a status + and a reason, and the overall ``warnings`` list explains problems. + + Raises: + FileNotFoundError: ``source`` is a path that does not exist. + ImageLoadError: the file is not a decodable image or PDF (subclass of + ``ValueError``). + UnsupportedDocumentTypeError: unknown ``document_type`` (subclass of + ``ValueError``). + + Example: + >>> from docling_pk import extract + >>> result = extract("cnic_front.jpg", document_type="cnic") # doctest: +SKIP + >>> result.fields["cnic_number"].value # doctest: +SKIP + '35202-1234567-9' + >>> print(result.to_json()) # doctest: +SKIP + """ + requested = normalize_document_type(document_type) + started = time.perf_counter() + + sources = list(source) if isinstance(source, (list, tuple)) else [source] + images = [] + for s in sources: + images.extend(load_pages(s)) + + ocr = _make_backend(backend, gpu) + verifier = _verifier(ocr, verify, gpu) + warnings: List[str] = [] + quality = [] + pages: List[Page] = [] + for img in images: + q = assess(img) + quality.append(q.to_dict()) + for w in q.warnings: + if w not in warnings: + warnings.append(w) + pages.append(prepare_page(img, ocr, auto_rotate=auto_rotate, verifier=verifier)) + + doc_type = requested + if requested == "auto": + guesses = [classify(p) for p in pages] + doc_type = next((g for g in guesses if g), None) or "" + if not doc_type: + warnings.append("could not recognize the document type; pass document_type explicitly") + return DocumentResult( + document_type="unknown", + fields={}, + confidence=0.0, + warnings=warnings, + raw_text="\n\n".join(p.text for p in pages) if include_raw_text else None, + metadata={"version": __version__, "quality": quality}, + ) + + tables: Dict[str, list] = {} + metadata: Dict = { + "version": __version__, + "ocr_backend": ocr.name, + "verifier": verifier.name if verifier else None, + } + + if doc_type == "cnic": + urdu_ocr = _urdu_backend(gpu) if urdu else None + per_side, sides = [], [] + for p in pages: + f, side_warnings, m = cnic.extract(p, urdu_backend=urdu_ocr) + per_side.append(f) + sides.append(m["side"]) + warnings.extend(side_warnings) + fields = cnic.merge_sides(per_side) if len(per_side) > 1 else per_side[0] + metadata["sides"] = sides + if urdu and urdu_ocr is None and "back" in sides: + warnings.append('reading the Urdu address needs EasyOCR: pip install "docling-pk[urdu]"') + elif doc_type in ("matric", "intermediate"): + fields, parser_warnings, m, rows = certificate.extract(pages[0], level_hint=doc_type) + doc_type = m["level"] + warnings.extend(parser_warnings) + metadata.update(board=m["board"]) + if rows: + tables["subjects"] = rows + elif doc_type == "degree": + fields, parser_warnings, m = degree.extract(pages[0]) + warnings.extend(parser_warnings) + metadata.update(variant=m["variant"]) + else: # pragma: no cover - normalize_document_type guards this + raise UnsupportedDocumentTypeError(doc_type) + + warnings.extend(_field_warnings(fields)) + metadata["pages"] = [ + {"rotation_degrees": p.rotation * 90, "skew_degrees": round(p.skew, 2), "quality": q} + for p, q in zip(pages, quality) + ] + metadata["seconds"] = round(time.perf_counter() - started, 2) + + return DocumentResult( + document_type=doc_type, + fields=fields, + confidence=_overall_confidence(fields), + warnings=list(dict.fromkeys(warnings)), + raw_text="\n\n".join(p.text for p in pages) if include_raw_text else None, + tables=tables, + metadata=metadata, + ) diff --git a/src/docling_pk/layout.py b/src/docling_pk/layout.py new file mode 100644 index 0000000..346d220 --- /dev/null +++ b/src/docling_pk/layout.py @@ -0,0 +1,146 @@ +""" +Spatial helpers over OCR text boxes. + +The original parsers worked on newline-joined OCR text and assumed a value +always follows its label in reading order. Real EasyOCR output breaks that +assumption: on CNICs it reads all three date labels as one group and the +three date values as another, and the field-to-value mapping silently +depended on card layout. Working on positions instead of order removes that +whole class of failure: "the value is the text directly below its label, +in the same column" holds no matter how the OCR engine orders its output. +""" + +from __future__ import annotations + +import re +from typing import Iterable, List, Optional, Sequence + +from rapidfuzz import fuzz + +from docling_pk.ocr.base import TextBox + +_SPACE = re.compile(r"\s+") + + +def normalize_label(text: str) -> str: + """Lowercases and strips everything but ASCII letters, for label matching.""" + return re.sub(r"[^a-z]", "", text.lower()) + + +def label_score(text: str, label: str) -> float: + """Fuzzy similarity (0-100) between OCR text and an expected label. + + Uses the letters only, so "Date 0/ 8irth" still scores well against + "Date of Birth". + """ + a, b = normalize_label(text), normalize_label(label) + if not a or not b: + return 0.0 + return float(fuzz.ratio(a, b)) + + +def find_label( + boxes: Sequence[TextBox], + label: str, + threshold: float = 72.0, + exclude: Iterable[str] = (), +) -> Optional[TextBox]: + """Finds the box that best matches ``label``. + + A box can also *start* with the label (e.g. "Gender M"), which is scored + on the leading part of the box only. + + Args: + exclude: Other labels that must not match better than ``label`` + (prevents "Father Name" matching the "Name" label). + """ + best, best_score = None, threshold + target = normalize_label(label) + for b in boxes: + norm = normalize_label(b.text) + if not norm: + continue + score = label_score(b.text, label) + if len(norm) > len(target) + 2: + score = max(score, float(fuzz.ratio(norm[: len(target)], target)) - 5) + if score < best_score: + continue + if any(label_score(b.text, e) > score for e in exclude): + continue + best, best_score = b, score + return best + + +def boxes_below( + boxes: Sequence[TextBox], + anchor: TextBox, + max_gap: float = 3.0, + min_overlap: float = 0.0, + x_tolerance: float = 0.5, +) -> List[TextBox]: + """Boxes below ``anchor`` in roughly the same column, nearest first. + + Args: + max_gap: Maximum vertical gap, in multiples of the anchor's height. + x_tolerance: How far a box may start left of the anchor, in multiples + of the anchor height (values are often slightly left-aligned). + """ + h = max(anchor.height, 1.0) + out = [] + for b in boxes: + if b is anchor or b.cy <= anchor.cy + h * 0.5: + continue + if b.y0 - anchor.y1 > max_gap * h: + continue + left_ok = b.x0 >= anchor.x0 - x_tolerance * h * 4 + overlap = min(b.x1, anchor.x1 + h * 8) - max(b.x0, anchor.x0 - h) + if left_ok and overlap > min_overlap: + out.append(b) + return sorted(out, key=lambda b: (b.y0, b.x0)) + + +def boxes_right_of(boxes: Sequence[TextBox], anchor: TextBox, max_gap: float = 8.0) -> List[TextBox]: + """Boxes on the same text line to the right of ``anchor``, nearest first.""" + h = max(anchor.height, 1.0) + out = [ + b + for b in boxes + if b is not anchor + and b.x0 >= anchor.x1 - h * 1.0 + and b.cx > anchor.x1 + and abs(b.cy - anchor.cy) < h * 0.6 + and b.x0 - anchor.x1 < max_gap * h + ] + return sorted(out, key=lambda b: b.x0) + + +def group_lines(boxes: Sequence[TextBox], tolerance: float = 0.55) -> List[List[TextBox]]: + """Groups boxes into text lines (top to bottom, each line left to right).""" + lines: List[List[TextBox]] = [] + for b in sorted(boxes, key=lambda b: b.cy): + for line in lines: + ref = line[-1] + h = max(min(ref.height, b.height), 1.0) + if abs(ref.cy - b.cy) < h * tolerance: + line.append(b) + break + else: + lines.append([b]) + return [sorted(line, key=lambda b: b.x0) for line in lines] + + +def reading_order_text(boxes: Sequence[TextBox]) -> str: + """Joins boxes into plain text, one visual line per output line.""" + return "\n".join(" ".join(b.text for b in line) for line in group_lines(boxes)) + + +def clean_spaces(text: str) -> str: + return _SPACE.sub(" ", text).strip() + + +def ascii_ratio(text: str) -> float: + """Fraction of characters that are printable ASCII letters or digits.""" + t = text.replace(" ", "") + if not t: + return 0.0 + return sum(1 for c in t if c.isascii() and c.isalnum()) / len(t) diff --git a/src/docling_pk/ocr/__init__.py b/src/docling_pk/ocr/__init__.py new file mode 100644 index 0000000..7292b1e --- /dev/null +++ b/src/docling_pk/ocr/__init__.py @@ -0,0 +1,5 @@ +"""OCR backends.""" + +from docling_pk.ocr.base import OCRBackend, TextBox + +__all__ = ["OCRBackend", "TextBox"] diff --git a/src/docling_pk/ocr/base.py b/src/docling_pk/ocr/base.py new file mode 100644 index 0000000..48c20f8 --- /dev/null +++ b/src/docling_pk/ocr/base.py @@ -0,0 +1,130 @@ +""" +OCR backend interface. + +Parsers never see an OCR library directly. They receive a list of +:class:`TextBox` objects (text + confidence + position), which is what makes +layout-aware extraction possible: the original pipeline flattened OCR output +into plain text lines and then guessed which line belonged to which label, +which broke whenever EasyOCR grouped labels and values separately. +""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import List, Optional, Sequence, Tuple + +import numpy as np + +Point = Tuple[float, float] + + +@dataclass(frozen=True) +class TextBox: + """One detected piece of text and where it is on the page. + + Coordinates are in pixels of the image passed to the backend, with the + origin at the top-left corner. + """ + + text: str + confidence: float + polygon: Tuple[Point, ...] + + @classmethod + def from_polygon(cls, text: str, confidence: float, polygon: Sequence[Sequence[float]]) -> TextBox: + pts = tuple((float(p[0]), float(p[1])) for p in polygon) + return cls(text=text, confidence=float(confidence), polygon=pts) + + @classmethod + def from_rect(cls, text: str, confidence: float, x0: float, y0: float, x1: float, y1: float) -> TextBox: + return cls(text, float(confidence), ((x0, y0), (x1, y0), (x1, y1), (x0, y1))) + + @property + def x0(self) -> float: + return min(p[0] for p in self.polygon) + + @property + def x1(self) -> float: + return max(p[0] for p in self.polygon) + + @property + def y0(self) -> float: + return min(p[1] for p in self.polygon) + + @property + def y1(self) -> float: + return max(p[1] for p in self.polygon) + + @property + def cx(self) -> float: + return (self.x0 + self.x1) / 2 + + @property + def cy(self) -> float: + return (self.y0 + self.y1) / 2 + + @property + def width(self) -> float: + return self.x1 - self.x0 + + @property + def height(self) -> float: + return self.y1 - self.y0 + + def translated(self, dx: float, dy: float) -> TextBox: + return TextBox(self.text, self.confidence, tuple((x + dx, y + dy) for x, y in self.polygon)) + + def scaled(self, s: float) -> TextBox: + return TextBox(self.text, self.confidence, tuple((x * s, y * s) for x, y in self.polygon)) + + def to_dict(self) -> dict: + return { + "text": self.text, + "confidence": round(self.confidence, 4), + "box": [round(self.x0), round(self.y0), round(self.x1), round(self.y1)], + } + + +class OCRBackend: + """Base class for OCR engines. + + Subclasses implement :meth:`read` (detect and recognize every text region + on a page) and may override :meth:`recognize` (read one pre-cropped text + line, optionally restricted to a character allowlist) when the engine + supports it more efficiently than a full page read. + """ + + #: Short identifier reported in ``DocumentResult.metadata``. + name: str = "base" + + def read(self, image: np.ndarray) -> List[TextBox]: + """Detects and recognizes all text on ``image`` (BGR or grayscale).""" + raise NotImplementedError + + def recognize(self, image: np.ndarray, allowlist: Optional[str] = None) -> Tuple[str, float]: + """Recognizes the text of a single cropped line. + + The default implementation runs a full :meth:`read` on the crop and + joins the results left to right. ``allowlist`` is a hint that + backends may ignore. + + Returns: + ``(text, confidence)``; ``("", 0.0)`` when nothing was read. + """ + boxes = sorted(self.read(image), key=lambda b: b.x0) + if not boxes: + return "", 0.0 + text = " ".join(b.text for b in boxes) + conf = sum(b.confidence for b in boxes) / len(boxes) + return text, conf + + +def as_bgr(image: np.ndarray) -> np.ndarray: + """Returns a 3-channel uint8 copy of ``image`` suitable for any backend.""" + import cv2 + + if image.ndim == 2: + return cv2.cvtColor(image, cv2.COLOR_GRAY2BGR) + if image.shape[2] == 4: + return cv2.cvtColor(image, cv2.COLOR_BGRA2BGR) + return image diff --git a/src/docling_pk/ocr/easyocr_backend.py b/src/docling_pk/ocr/easyocr_backend.py new file mode 100644 index 0000000..8f99fb2 --- /dev/null +++ b/src/docling_pk/ocr/easyocr_backend.py @@ -0,0 +1,84 @@ +"""EasyOCR backend (the default engine, per the project brief).""" + +from __future__ import annotations + +import threading +from typing import Dict, List, Optional, Sequence, Tuple + +import numpy as np + +from docling_pk.ocr.base import OCRBackend, TextBox, as_bgr + +_READERS: Dict[Tuple[Tuple[str, ...], bool], object] = {} +_LOCK = threading.Lock() + + +def _gpu_available() -> bool: + try: + import torch + + return bool(torch.cuda.is_available()) + except Exception: # pragma: no cover - torch import problems + return False + + +def get_reader(languages: Sequence[str] = ("en",), gpu: Optional[bool] = None): + """Returns a cached ``easyocr.Reader``. + + Creating a reader loads two neural networks from disk (and downloads them + on first use), so readers are created once per process and per language + set, then reused. + """ + try: + import easyocr + except ImportError as exc: # pragma: no cover - depends on environment + raise ImportError('The EasyOCR backend needs the urdu extra: pip install "docling-pk[urdu]"') from exc + + use_gpu = _gpu_available() if gpu is None else gpu + key = (tuple(languages), use_gpu) + with _LOCK: + if key not in _READERS: + _READERS[key] = easyocr.Reader(list(languages), gpu=use_gpu, verbose=False) + return _READERS[key] + + +class EasyOCRBackend(OCRBackend): + """Wraps :class:`easyocr.Reader`. + + Args: + languages: EasyOCR language codes. ``("en",)`` for English documents; + add ``"ur"`` only where Urdu text must be read, since the combined + model injects Arabic-script noise into English words. + gpu: Force GPU on or off. ``None`` (default) uses CUDA if available. + """ + + name = "easyocr" + + def __init__(self, languages: Sequence[str] = ("en",), gpu: Optional[bool] = None): + self.languages = tuple(languages) + self.gpu = gpu + + @property + def reader(self): + return get_reader(self.languages, self.gpu) + + def read(self, image: np.ndarray) -> List[TextBox]: + results = self.reader.readtext(as_bgr(image), detail=1, paragraph=False) + return [TextBox.from_polygon(text, conf, box) for box, text, conf in results if text.strip()] + + def recognize(self, image: np.ndarray, allowlist: Optional[str] = None) -> Tuple[str, float]: + import cv2 + + gray = image if image.ndim == 2 else cv2.cvtColor(as_bgr(image), cv2.COLOR_BGR2GRAY) + h, w = gray.shape[:2] + results = self.reader.recognize( + gray, + horizontal_list=[[0, w, 0, h]], + free_list=[], + allowlist=allowlist, + detail=1, + ) + if not results: + return "", 0.0 + _, text, conf = results[0] + return text, float(conf) diff --git a/src/docling_pk/ocr/rapidocr_backend.py b/src/docling_pk/ocr/rapidocr_backend.py new file mode 100644 index 0000000..a3b477e --- /dev/null +++ b/src/docling_pk/ocr/rapidocr_backend.py @@ -0,0 +1,54 @@ +"""RapidOCR backend (PP-OCR models on ONNX Runtime). + +Optional: ``pip install "docling-pk[rapidocr]"``. Much smaller than the +EasyOCR + PyTorch stack, runs fast on CPU, and is a useful second opinion +for ensembles. English/Latin only as configured here. +""" + +from __future__ import annotations + +import threading +from typing import List, Optional, Tuple + +import numpy as np + +from docling_pk.ocr.base import OCRBackend, TextBox, as_bgr + +_ENGINE = None +_LOCK = threading.Lock() + + +def _get_engine(): + global _ENGINE + with _LOCK: + if _ENGINE is None: + try: + from rapidocr import RapidOCR + except ImportError as exc: # pragma: no cover - depends on environment + raise ImportError( + 'The RapidOCR backend needs extra packages: pip install "docling-pk[rapidocr]"' + ) from exc + # max_candidates: the default (1000) silently drops every region past + # the 1000th contour. Certificates printed on micro-text security + # paper exceed it, and the dropped regions were the whole top half + # of the page (name, roll number, board) in testing. + _ENGINE = RapidOCR(params={"Global.log_level": "critical", "Det.max_candidates": 8000}) + return _ENGINE + + +class RapidOCRBackend(OCRBackend): + """Wraps ``rapidocr.RapidOCR``.""" + + name = "rapidocr" + + def read(self, image: np.ndarray) -> List[TextBox]: + out = _get_engine()(as_bgr(image), use_det=True, use_cls=False, use_rec=True) + if out is None or out.boxes is None or out.txts is None: + return [] + return [TextBox.from_polygon(t, s, b) for b, t, s in zip(out.boxes, out.txts, out.scores) if t and t.strip()] + + def recognize(self, image: np.ndarray, allowlist: Optional[str] = None) -> Tuple[str, float]: + out = _get_engine()(as_bgr(image), use_det=False, use_cls=False, use_rec=True) + if out is None or not out.txts: + return "", 0.0 + return str(out.txts[0]), float(out.scores[0]) diff --git a/src/docling_pk/parsers/__init__.py b/src/docling_pk/parsers/__init__.py new file mode 100644 index 0000000..01afc2e --- /dev/null +++ b/src/docling_pk/parsers/__init__.py @@ -0,0 +1 @@ +"""Per-document-type field parsers.""" diff --git a/src/docling_pk/parsers/base.py b/src/docling_pk/parsers/base.py new file mode 100644 index 0000000..d3f055f --- /dev/null +++ b/src/docling_pk/parsers/base.py @@ -0,0 +1,156 @@ +"""Shared helpers for document parsers.""" + +from __future__ import annotations + +import re +from typing import Dict, Iterable, List, Optional, Sequence + +from docling_pk.layout import ascii_ratio, boxes_below, boxes_right_of, clean_spaces +from docling_pk.ocr.base import TextBox +from docling_pk.schema import FieldResult, FieldStatus + +#: Below this confidence a found value is reported as LOW_CONFIDENCE. +LOW_CONFIDENCE = 0.55 + +_NAME_CHARS = re.compile(r"[^A-Za-z .'\-]") + + +def make_field( + value: Optional[str], + confidence: float, + raw: Optional[str] = None, + reason: Optional[str] = None, + low: float = LOW_CONFIDENCE, +) -> FieldResult: + """Builds a FieldResult, downgrading weak values to LOW_CONFIDENCE.""" + if value is None: + return FieldResult.missing(reason or "not found", raw=raw) + status = FieldStatus.OK + if confidence < low: + status = FieldStatus.LOW_CONFIDENCE + reason = reason or f"OCR confidence {confidence:.2f} is low; please verify" + return FieldResult(value=value, confidence=confidence, status=status, reason=reason, raw=raw) + + +def combine_confidence(*confs: float) -> float: + """Confidence that agreeing independent reads are all wrong is the product + of their error rates; this returns 1 minus that product.""" + err = 1.0 + for c in confs: + err *= 1.0 - max(0.0, min(1.0, c)) + return 1.0 - err + + +def clean_person_name(text: str) -> Optional[str]: + """Normalizes an OCR'd person name, or returns ``None`` if it is not one. + + Keeps letters, spaces, dots, apostrophes and hyphens; requires at least + two letters and rejects anything containing digits. + + Example: + >>> clean_person_name(" Ali Hassan Khan. ") + 'Ali Hassan Khan' + >>> clean_person_name("35202") is None + True + """ + if re.search(r"[0-9]", text): + return None + t = clean_spaces(_NAME_CHARS.sub(" ", text)).strip(" .-'") + if sum(c.isalpha() for c in t) < 2: + return None + return t + + +_GLUED = re.compile(r"[A-Za-z]{11,}") + + +def respace(page, box: Optional[TextBox], text: str) -> str: + """Restores dropped word spaces ("SAUDIARABIA") using the verifier engine. + + Only runs when the text contains a suspiciously long unbroken word and a + second engine is configured. The verifier's spacing is adopted only if + its letters are identical to the original, so this can fix spacing but + can never change a character. + """ + if box is None or page is None or getattr(page, "verifier", None) is None or not _GLUED.search(text): + return text + other, _ = page.reread(box, pad_x=0.15, pad_y=0.15) + + def letters(t: str) -> str: + return re.sub(r"[^A-Za-z0-9]", "", t).upper() + + if other and letters(other) == letters(text) and other.count(" ") > text.count(" "): + return clean_spaces(other.upper() if text.isupper() else other) + return text + + +def value_near_label( + boxes: Sequence[TextBox], + label: TextBox, + accept, + label_text: str = "", + max_gap: float = 3.0, + skip: Iterable[TextBox] = (), +) -> Optional[TextBox]: + """First box below (or right of) ``label`` whose text passes ``accept``. + + Also handles a value printed in the same box as its label ("Gender M"). + """ + skip_set = set(id(b) for b in skip) + if label_text: + rest = label.text + lt = re.sub(r"[^a-z]", "", label_text.lower()) + letters = 0 + for i, ch in enumerate(rest): + if ch.isalpha(): + letters += 1 + if letters >= len(lt): + rest = rest[i + 1 :] + break + else: + rest = "" + rest = rest.strip(" :.-") + if rest and accept(rest): + return TextBox(rest, label.confidence, label.polygon) + for b in boxes_right_of(boxes, label, max_gap=4.0) + boxes_below(boxes, label, max_gap=max_gap): + if id(b) in skip_set: + continue + if accept(b.text): + return b + return None + + +def is_label_like(text: str, labels: Sequence[str]) -> bool: + """True if ``text`` is (a fragment of) one of the printed labels. + + Fragments matter: OCR often splits "Country of Stay" into "Country" and + "Of Stay", and the fragment must not be taken as a value. + """ + from rapidfuzz import fuzz + + from docling_pk.layout import label_score, normalize_label + + norm = normalize_label(text) + for lab in labels: + if label_score(text, lab) >= 72: + return True + target = normalize_label(lab) + if len(norm) >= 4 and len(norm) < len(target) and fuzz.partial_ratio(norm, target) >= 90: + return True + return False + + +def latin_text(text: str, min_ratio: float = 0.8) -> bool: + return ascii_ratio(text) >= min_ratio + + +def fields_template(names: Sequence[str], reason: str = "not found") -> Dict[str, FieldResult]: + return {n: FieldResult.missing(reason) for n in names} + + +def not_applicable(reason: str) -> FieldResult: + return FieldResult.missing(reason, status=FieldStatus.NOT_APPLICABLE) + + +def first(items: List, default=None): + return items[0] if items else default diff --git a/src/docling_pk/parsers/certificate.py b/src/docling_pk/parsers/certificate.py new file mode 100644 index 0000000..632a757 --- /dev/null +++ b/src/docling_pk/parsers/certificate.py @@ -0,0 +1,552 @@ +""" +Matric (SSC) and Intermediate (HSSC) board certificate extraction. + +Verified on real Federal Board (FBISE) certificates, both phone photos and a +digital copy. Label vocabulary also covers the wording used by the Punjab, +Khyber Pakhtunkhwa, Sindh and Balochistan boards, so their certificates are +parsed on a best-effort basis; the board is always reported in +``metadata["board"]`` so callers can decide how far to trust it. + +The marks table is read spatially: the header row gives the x-position of +the "Maximum" and "Obtained" columns, and every row between the header and +the TOTAL row contributes ``(subject, max_marks, obtained_marks)``. The table +is then validated three ways (column sums equal the TOTAL row, obtained never +exceeds maximum, the total matches "Marks in words"), and numeric cells are +re-read with a digit-only allowlist when validation fails. +""" + +from __future__ import annotations + +import re +from typing import Dict, List, Optional, Sequence, Tuple + +from docling_pk.layout import ( + ascii_ratio, + boxes_right_of, + clean_spaces, + find_label, + group_lines, + label_score, + normalize_label, +) +from docling_pk.ocr.base import TextBox +from docling_pk.parsers.base import clean_person_name, combine_confidence, make_field, respace +from docling_pk.pipeline import Page +from docling_pk.schema import FieldResult, FieldStatus +from docling_pk.validation.dates import find_dates +from docling_pk.validation.marks import check_subjects, words_to_number +from docling_pk.validation.text import digits_only, fix_digits + +FIELD_NAMES = [ + "student_name", + "father_name", + "date_of_birth", + "roll_number", + "registration_number", + "serial_number", + "certificate_number", + "board", + "exam", + "year", + "session", + "group", + "institute", + "grade", + "total_marks", + "max_marks", +] + +#: (canonical board name, regex over the page text). Order matters: the +#: Federal Board title also contains generic words used by other boards. +BOARDS: Sequence[Tuple[str, str]] = ( + ("FBISE", r"federal\s*board"), + ("AKU-EB", r"aga\s*khan\s*university\s*examination"), + ("BIEK Karachi", r"board\s*of\s*intermediate\s*education\W*karachi"), + ("BSEK Karachi", r"board\s*of\s*secondary\s*education\W*karachi"), +) +BOARD_CITIES = ( + "Lahore", + "Gujranwala", + "Faisalabad", + "Multan", + "Rawalpindi", + "Sargodha", + "Bahawalpur", + "Dera Ghazi Khan", + "D.G. Khan", + "Sahiwal", + "Peshawar", + "Mardan", + "Abbottabad", + "Swat", + "Kohat", + "Bannu", + "Malakand", + "Dera Ismail Khan", + "D.I. Khan", + "Hyderabad", + "Sukkur", + "Larkana", + "Mirpurkhas", + "Quetta", + "Mirpur", +) + +SSC_TITLE = re.compile(r"(? Optional[str]: + """Identifies the issuing board from the page text, e.g. ``"FBISE"``.""" + for name, pattern in BOARDS: + if re.search(pattern, text, re.I): + return name + if re.search(r"board\s*of\s*intermediate\s*(?:and|&)\s*secondary\s*education", text, re.I): + for city in BOARD_CITIES: + if re.search(re.escape(city).replace(r"\ ", r"\s*"), text, re.I): + return f"BISE {city}" + return "BISE" + return None + + +def detect_level(text: str) -> Optional[str]: + """``"intermediate"``, ``"matric"`` or ``None`` from the certificate title.""" + if HSSC_TITLE.search(text): + return "intermediate" + if SSC_TITLE.search(text): + return "matric" + return None + + +# ------------------------------------------------------------- labelled fields + + +def _label_any(boxes: Sequence[TextBox], labels: Sequence[str], threshold: float = 75) -> Optional[Tuple[TextBox, str]]: + best = None + for lab in labels: + b = find_label(boxes, lab, threshold=threshold) + if b is not None: + s = label_score(b.text, lab) + if best is None or s > best[2]: + best = (b, lab, s) + return (best[0], best[1]) if best else None + + +def _after_label(text: str, label: str) -> str: + """Text remaining in a box after the letters of ``label``.""" + target = len(normalize_label(label)) + seen = 0 + for i, ch in enumerate(text): + if ch.isascii() and ch.isalpha(): + seen += 1 + if seen >= target: + return text[i + 1 :].strip(" :.-_") + return "" + + +def _numeric_field(page: Page, labels: Sequence[str]) -> FieldResult: + hit = _label_any(page.boxes, labels) + if hit is None: + return FieldResult.missing(f"'{labels[0]}' label not found") + label, lab = hit + candidates: List[Tuple[str, TextBox]] = [] + rest = _after_label(label.text, lab) + if rest: + candidates.append((rest, label)) + for b in boxes_right_of(page.boxes, label, max_gap=12): + candidates.append((b.text, b)) + # Values printed slightly above or below the label line (FBISE prints + # the serial number raised, in red). + h = max(label.height, 1.0) + near = [ + b + for b in page.boxes + if b is not label + and b.x0 >= label.x1 - h + and b.x0 - label.x1 < 10 * h + and 0.6 * h <= abs(b.cy - label.cy) < 1.6 * h + ] + for b in sorted(near, key=lambda b: abs(b.cy - label.cy)): + candidates.append((b.text, b)) + for text, box in candidates: + token = fix_digits(text, 0.5).strip() + m = re.search(r"[0-9][0-9/\-]{3,}[0-9]", token) + if not m: + continue + value = m.group(0) + allow = "0123456789/-" if "/" in value or "-" in value else "0123456789" + if box is not label: + rtext, rconf = page.reread(box, allowlist=allow) + rm = re.search(r"[0-9][0-9/\-]{3,}[0-9]", rtext) + if rm and rm.group(0) == value: + return make_field(value, combine_confidence(box.confidence, rconf), raw=text) + if rm and rconf > box.confidence + 0.2: + f = make_field(rm.group(0), rconf * 0.7, raw=text, reason="OCR reads disagree; please verify") + f.status = FieldStatus.LOW_CONFIDENCE + return f + return make_field(value, box.confidence, raw=text) + return FieldResult.missing(f"no number next to '{lab}'") + + +def _name_after( + page: Page, labels: Sequence[str], stop_before: Optional[TextBox] = None +) -> Tuple[FieldResult, Optional[TextBox]]: + hit = _label_any(page.boxes, labels, threshold=78) + if hit is None: + return FieldResult.missing(f"'{labels[0]}' label not found"), None + label, lab = hit + cands: List[Tuple[str, TextBox]] = [] + rest = _after_label(label.text, lab) + if rest: + cands.append((rest, label)) + cands += [(b.text, b) for b in boxes_right_of(page.boxes, label, max_gap=20)] + for text, box in cands: + if SKIP_IN_NAMES.search(text) or ascii_ratio(text) < 0.8: + continue + name = clean_person_name(respace(page, box if box is not label else None, text)) + if name and len(name) >= 3: + return make_field(name.upper(), box.confidence, raw=text), label + return FieldResult.missing(f"no name next to '{lab}'"), label + + +def _name_on_line_above(page: Page, anchor: TextBox) -> FieldResult: + """Fallback for a garbled "Certified that" label: the trailing run of + uppercase words on the line directly above the father-name line.""" + lines = group_lines(page.boxes) + for i, line in enumerate(lines): + if anchor in line and i > 0: + prev = lines[i - 1] + text = " ".join(b.text for b in prev) + m = re.search(r"((?:[A-Z][A-Z.'\-]+\s?){1,6})\s*$", text) + if m: + name = clean_person_name(m.group(1)) + if name and len(name) >= 3 and not SKIP_IN_NAMES.search(name): + f = make_field( + name.upper(), + min(b.confidence for b in prev) * 0.8, + raw=text, + reason="label unreadable; located by position", + ) + f.status = FieldStatus.LOW_CONFIDENCE + return f + return FieldResult.missing("'Certified that' label not found") + + +def _institute(page: Page) -> FieldResult: + """Institution line: FBISE prints it on the line after "... Candidate from".""" + lines = group_lines(page.boxes) + for i, line in enumerate(lines): + text = " ".join(b.text for b in line) + if re.search(r"candidate\s*from|regular\s*candidate|private\s*candidate", text, re.I): + rest = re.split(r"from", text, flags=re.I)[-1].strip(" :.") + if len(rest) > 8 and not re.search(r"candidate", rest, re.I): + conf = min(b.confidence for b in line) + return make_field(clean_spaces(rest).upper(), conf, raw=text) + if i + 1 < len(lines): + nxt = lines[i + 1] + t = clean_spaces(" ".join(respace(page, b, b.text) for b in nxt)) + if len(t) > 5 and not re.search(r"statement|grade|marks", t, re.I): + conf = sum(b.confidence for b in nxt) / len(nxt) + return make_field(t.upper().strip(" ."), conf, raw=t) + hit = _label_any(page.boxes, INSTITUTE_LABELS[1:], threshold=85) + if hit: + label, lab = hit + right = boxes_right_of(page.boxes, label, max_gap=20) + if right: + t = clean_spaces(" ".join(b.text for b in right)) + return make_field(t.upper(), min(b.confidence for b in right), raw=t) + return FieldResult.missing("institution not found") + + +# ------------------------------------------------------------------ marks table + + +def _int(text: str) -> Optional[int]: + d = digits_only(text) + return int(d) if d and len(d) <= 4 else None + + +def _numbers_in(line: Sequence[TextBox]) -> List[TextBox]: + out = [] + for b in line: + t = b.text.strip() + if re.fullmatch(r"[0-9OoIlSB|]{2,4}", t) or (re.fullmatch(r"[0-9]{1,4}", t)): + out.append(b) + return out + + +def _column_x(boxes: Sequence[TextBox], words: Sequence[str]) -> Optional[float]: + hit = _label_any(boxes, words, threshold=75) + return hit[0].cx if hit else None + + +def extract_marks(page: Page) -> Tuple[List[Dict], Dict[str, FieldResult], List[str]]: + """Reads the subject-wise marks table. + + Returns: + ``(rows, totals, warnings)`` where rows are dicts with ``subject``, + ``max_marks`` and ``obtained_marks`` and totals holds ``total_marks`` + and ``max_marks`` FieldResults. + """ + boxes = page.boxes + warnings: List[str] = [] + max_x = _column_x(boxes, ("Maximum", "Max Marks", "Total Marks")) + obt_x = _column_x(boxes, ("Obtained", "Marks Obtained", "Obtained Marks")) + header = _label_any(boxes, ("Subject(s)", "Subjects", "Subject"), threshold=78) + total_label = _label_any(boxes, ("TOTAL", "Grand Total"), threshold=85) + + lines = group_lines(boxes) + top = header[0].y1 if header else None + bottom = total_label[0].cy if total_label else None + + rows: List[Dict] = [] + raw_rows: List[Tuple[str, Optional[int], Optional[int], List[TextBox]]] = [] + for line in lines: + cy = sum(b.cy for b in line) / len(line) + if top is not None and cy <= top: + continue + if bottom is not None and cy >= bottom - 2: + continue + nums = _numbers_in(line) + words = [b for b in line if b not in nums and re.search(r"[A-Za-z]{3,}", b.text)] + if not words or not nums: + continue + subject = clean_spaces(" ".join(b.text for b in words)) + subject = re.sub(r"^[0-9]+\s*[.)]?\s*", "", subject).strip(" .:") + if re.search(r"marks in words|islamabad|dated|grade|statement", subject, re.I): + continue + mx, ob = _assign_columns(nums, max_x, obt_x) + raw_rows.append((subject.upper(), mx, ob, nums)) + + total_max = total_ob = None + total_conf = 0.0 + if total_label is not None: + tl = total_label[0] + same = [b for b in boxes if abs(b.cy - tl.cy) < max(tl.height, 10) * 0.8 and b is not tl] + nums = _numbers_in(same) + total_max, total_ob = _assign_columns(nums, max_x, obt_x) + total_conf = min((b.confidence for b in nums), default=0.0) + + words_total = None + for line in lines: + t = " ".join(b.text for b in line) + if re.search(r"marks\s*in\s*words", t, re.I): + words_total = words_to_number(re.split(r"words\W*", t, flags=re.I)[-1]) + break + + sub_rows = [(r[0], r[1], r[2]) for r in raw_rows] + ok, problems = check_subjects(sub_rows, total_max, total_ob) + if not ok and raw_rows: + raw_rows = _repair_rows(page, raw_rows, max_x, obt_x) + sub_rows = [(r[0], r[1], r[2]) for r in raw_rows] + ok, problems = check_subjects(sub_rows, total_max, total_ob) + + # Resolve totals using every independent source. + sum_ob = sum(r[2] or 0 for r in sub_rows) if sub_rows and all(r[2] is not None for r in sub_rows) else None + sum_max = sum(r[1] or 0 for r in sub_rows) if sub_rows and all(r[1] is not None for r in sub_rows) else None + sources = [v for v in (total_ob, words_total, sum_ob) if v is not None] + totals: Dict[str, FieldResult] = {} + if sources: + best = max(set(sources), key=sources.count) + agreeing = sources.count(best) + conf = {1: 0.6, 2: 0.95, 3: 0.99}[min(agreeing, 3)] + if total_ob is not None and best == total_ob: + conf = max(conf, total_conf) if agreeing > 1 else min(conf, max(total_conf, 0.4)) + f = make_field(str(best), conf) + if agreeing == 1 and len(sources) > 1: + f.status = FieldStatus.LOW_CONFIDENCE + f.reason = "table total, marks-in-words and subject sum disagree" + warnings.append("marks total could not be confirmed by a second source") + totals["total_marks"] = f + else: + totals["total_marks"] = FieldResult.missing("total marks not found") + + mx_sources = [v for v in (total_max, sum_max) if v is not None] + if mx_sources: + if len(mx_sources) == 2 and mx_sources[0] == mx_sources[1]: + totals["max_marks"] = make_field(str(mx_sources[0]), 0.95) + else: + # Prefer the printed TOTAL row; flag it unless confirmed. + best = total_max if total_max is not None else mx_sources[0] + f = make_field(str(best), 0.5) + f.status = FieldStatus.LOW_CONFIDENCE + f.reason = "maximum marks could not be confirmed by the subject rows" + totals["max_marks"] = f + else: + totals["max_marks"] = FieldResult.missing("maximum marks not found") + + for subject, mx, ob in sub_rows: + rows.append({"subject": subject, "max_marks": mx, "obtained_marks": ob}) + if rows and not ok: + warnings.append("marks table failed validation: " + "; ".join(problems[:3])) + if not rows: + warnings.append("marks table not found") + return rows, totals, warnings + + +def _assign_columns( + nums: List[TextBox], max_x: Optional[float], obt_x: Optional[float] +) -> Tuple[Optional[int], Optional[int]]: + vals = [(b, _int(b.text)) for b in nums] + vals = [(b, v) for b, v in vals if v is not None] + if not vals: + return None, None + if max_x is not None and obt_x is not None: + mx = min(vals, key=lambda t: abs(t[0].cx - max_x)) + ob = min(vals, key=lambda t: abs(t[0].cx - obt_x)) + if mx[0] is ob[0]: + if abs(mx[0].cx - max_x) < abs(mx[0].cx - obt_x): + return mx[1], None + return None, ob[1] + return mx[1], ob[1] + if len(vals) >= 2: + vals.sort(key=lambda t: t[0].cx) + return vals[-2][1], vals[-1][1] + return None, None + + +def _repair_rows(page: Page, rows, max_x, obt_x): + """Re-reads numeric cells with a digit allowlist.""" + fixed = [] + for subject, mx, ob, nums in rows: + new_nums = [] + for b in nums: + text, conf = page.reread(b, allowlist="0123456789", pad_x=0.4) + new_nums.append(TextBox(text or b.text, conf or b.confidence, b.polygon)) + mx2, ob2 = _assign_columns(new_nums, max_x, obt_x) + fixed.append((subject, mx2 if mx2 is not None else mx, ob2 if ob2 is not None else ob, nums)) + return fixed + + +# ------------------------------------------------------------------------- main + + +def extract(page: Page, level_hint: Optional[str] = None) -> Tuple[Dict[str, FieldResult], List[str], Dict, List[Dict]]: + """Extracts a board certificate. + + Args: + level_hint: ``"matric"`` or ``"intermediate"`` from the caller; the + certificate title overrides it when they disagree. + + Returns: + ``(fields, warnings, metadata, subject_rows)``. + """ + text = page.text + warnings: List[str] = [] + fields: Dict[str, FieldResult] = {} + + level = detect_level(text) + if level and level_hint and level != level_hint: + warnings.append(f"requested {level_hint} but the certificate title says {level}; parsed as {level}") + level = level or level_hint or "matric" + board = detect_board(text) + board_conf = 0.9 + if board is None and CERT_NO_FORMAT.search(text) and re.search(r"islamabad", text, re.I): + # Title line unreadable, but FBISE's certificate-number format and its + # Islamabad header are both present. + board, board_conf = "FBISE", 0.7 + fields["board"] = make_field(board, board_conf) if board else FieldResult.missing("issuing board not recognized") + if board and board != "FBISE": + warnings.append(f"{board} layout has not been verified on real samples; check fields carefully") + + for name, labels in NUMERIC_LABELS.items(): + fields[name] = _numeric_field(page, labels) + if fields["certificate_number"].value is None: + m = CERT_NO_FORMAT.search(text) + if m: + f = make_field(m.group(0), 0.7, raw=m.group(0), reason="label unreadable; matched by number format") + fields["certificate_number"] = f + + fields["student_name"], name_label = _name_after(page, NAME_LABELS) + fields["father_name"], father_label = _name_after(page, FATHER_LABELS) + if fields["student_name"].value is None and father_label is not None: + fields["student_name"] = _name_on_line_above(page, father_label) + + dob = None + for line in group_lines(page.boxes): + t = " ".join(b.text for b in line) + if re.search(r"date\s*of\s*birth|d\.?o\.?b", t, re.I): + ds = find_dates(t) + if ds: + dob = make_field(ds[0], min(b.confidence for b in line), raw=t) + break + fields["date_of_birth"] = dob or FieldResult.missing("date of birth not printed or not found") + + m = SESSION.search(text) + if m: + year = fix_digits(m.group(2), 0.0) + fields["session"] = make_field(m.group(1).upper(), 0.9) + fields["year"] = make_field(year, 0.9) + else: + fields["session"] = FieldResult.missing("examination session not found") + fields["year"] = FieldResult.missing("examination year not found") + fields["exam"] = make_field("SSC" if level == "matric" else "HSSC", 0.9) + + gm = GROUPS.search(text) + grp_label = _label_any(page.boxes, ("Group",), threshold=85) + group_val = None + if grp_label is not None: + right = boxes_right_of(page.boxes, grp_label[0], max_gap=12) + rest = _after_label(grp_label[0].text, "Group") + cand = rest or (right[0].text if right else "") + cand = re.sub(r"^[a-z]+(?=[A-Z])", "", cand.strip()) + if cand and GROUPS.search(cand): + group_val = make_field( + clean_spaces(cand).upper(), + (right[0].confidence if right and not rest else grp_label[0].confidence), + raw=cand, + ) + if group_val is None and gm: + group_val = make_field(clean_spaces(gm.group(1)).upper(), 0.6) + fields["group"] = group_val or FieldResult.missing("group not found") + + gr = None + for line in group_lines(page.boxes): + t = " ".join(b.text for b in line) + g = GRADE.search(t) + if g: + gr = make_field(g.group(1).replace(" ", "").upper(), min(b.confidence for b in line), raw=t) + break + fields["grade"] = gr or FieldResult.missing("grade not found (often printed in a font OCR misreads)") + + fields["institute"] = _institute(page) + + rows, totals, mw = extract_marks(page) + fields.update(totals) + warnings.extend(mw) + + meta = {"board": board, "level": level} + ordered = {n: fields.get(n, FieldResult.missing("not found")) for n in FIELD_NAMES} + return ordered, warnings, meta, rows diff --git a/src/docling_pk/parsers/cnic.py b/src/docling_pk/parsers/cnic.py new file mode 100644 index 0000000..3fc26d8 --- /dev/null +++ b/src/docling_pk/parsers/cnic.py @@ -0,0 +1,618 @@ +""" +CNIC (Computerized National Identity Card) extraction. + +Handles the front and back of the current card designs (2012+ CNIC and +Smart NICOP/SNIC, green layout with English labels). Field strategy: + +* **Positions, not order.** Each value is the text box directly below (or + beside) its label, located by fuzzy label matching, so it does not matter + in what order the OCR engine emits boxes. +* **Formats, then cross-checks.** The CNIC number and dates are matched by + format, re-read from a tight crop with a digit-only allowlist, and reported + as ``ok`` only when the reads agree or validation passes. +* **Dates are assigned chronologically** when all three are present: + birth < issue < expiry is true of every valid card regardless of how the + layout scrambles labels relative to values (the failure documented in the + original lab note). Label geometry is the fallback. +* **Gender is cross-checked** against the last CNIC digit (odd = male, + even = female). When the printed letter is unreadable, the inferred value + is returned with a lower confidence and a reason that says it was inferred. + +The address is printed only on the back, in Urdu (Nastaliq). It is read with +an Urdu-capable recognizer when one is configured, and always reported as +``low_confidence``: Nastaliq OCR quality is not yet good enough to trust +without review. +""" + +from __future__ import annotations + +import datetime as _dt +import re +from typing import Dict, List, Optional, Sequence, Tuple + +from docling_pk.layout import ascii_ratio, clean_spaces, find_label, group_lines +from docling_pk.ocr.base import OCRBackend, TextBox +from docling_pk.parsers.base import ( + clean_person_name, + combine_confidence, + is_label_like, + make_field, + not_applicable, + value_near_label, +) +from docling_pk.pipeline import Page +from docling_pk.schema import FieldResult, FieldStatus +from docling_pk.validation.cnic import check_cnic, find_cnic, gender_from_cnic +from docling_pk.validation.dates import find_dates, parse_date, to_date + +FRONT_FIELDS = [ + "name", + "father_name", + "gender", + "country_of_stay", + "cnic_number", + "date_of_birth", + "date_of_issue", + "date_of_expiry", +] +BACK_FIELDS = ["address", "permanent_address"] +FIELD_NAMES = FRONT_FIELDS + BACK_FIELDS + +LABELS = { + "name": "Name", + "father_name": "Father Name", + "husband_name": "Husband Name", + "gender": "Gender", + "country_of_stay": "Country of Stay", + "cnic_number": "Identity Number", + "date_of_birth": "Date of Birth", + "date_of_issue": "Date of Issue", + "date_of_expiry": "Date of Expiry", +} +ALL_LABEL_TEXTS = list(LABELS.values()) + [ + "Holder's Signature", + "National Identity Card", + "Islamic Republic of Pakistan", + "Pakistan", +] + +CNIC_ALLOWLIST = "0123456789-" +DATE_ALLOWLIST = "0123456789." + +#: Fixed sentence printed on every card back ("if found, drop in a letter box"). +_LOST_CARD_HINT = ("گمشدہ", "کارڈ", "لیٹر", "بکس") +_PRESENT_LABEL = ("موجودہ", "موجوده") +_PERMANENT_LABEL = ("مستقل",) + + +def detect_side(boxes: Sequence[TextBox]) -> str: + """Returns ``"front"``, ``"back"`` or ``"unknown"`` for a CNIC page.""" + front_hits = sum( + 1 + for key in ("father_name", "gender", "cnic_number", "date_of_birth", "date_of_issue", "date_of_expiry") + if find_label(boxes, LABELS[key], threshold=78) is not None + ) + joined = " ".join(b.text for b in boxes) + if front_hits >= 2 or re.search(r"national\s*identity", joined, re.I): + return "front" + urdu = sum(1 for b in boxes if ascii_ratio(b.text) < 0.3 and len(b.text) > 3) + if find_cnic(joined) and (urdu >= 2 or re.search(r"registrar", joined, re.I)): + return "back" + if find_cnic(joined): + return "front" if find_dates(joined) else "back" + return "unknown" + + +# --------------------------------------------------------------------- numbers + + +def _cnic_candidates(page: Page) -> List[Tuple[str, float, TextBox]]: + out = [] + for b in page.boxes: + n = find_cnic(b.text) + if n: + out.append((n, b.confidence, b)) + if not out: + # Number split across two boxes ("35202-" "1234567-1"): try line text. + from docling_pk.layout import group_lines + + for line in group_lines(page.boxes): + for i in range(len(line)): + for j in range(i + 2, min(i + 4, len(line) + 1)): + part = line[i:j] + joined = "".join(b.text for b in part) + n = find_cnic(joined) + if not n: + continue + conf = min(b.confidence for b in part) + out.append( + ( + n, + conf, + TextBox.from_rect( + joined, + conf, + min(b.x0 for b in part), + min(b.y0 for b in part), + max(b.x1 for b in part), + max(b.y1 for b in part), + ), + ) + ) + break + return out + + +def _reread_candidates(page: Page) -> List[Tuple[str, float, TextBox]]: + """Digit-heavy boxes whose first read was garbled ("35202 /2345671"): + re-read them with a digit allowlist and keep any that now validate.""" + out = [] + for b in page.boxes: + digits = sum(c.isdigit() for c in b.text) + if digits < 9 or find_dates(b.text): + continue + text, conf = page.reread(b, allowlist=CNIC_ALLOWLIST) + n = find_cnic(text) + if n and check_cnic(n).valid: + out.append((n, conf * 0.85, b)) + return out + + +def extract_cnic_number(page: Page) -> Tuple[FieldResult, Optional[TextBox]]: + """Finds the CNIC number and confirms it with a digit-only re-read.""" + cands = _cnic_candidates(page) + rescued = False + if not cands: + cands = _reread_candidates(page) + rescued = bool(cands) + if not cands: + return FieldResult.missing("no 13-digit CNIC number pattern found"), None + if rescued: + number, conf, box = cands[0] + f = make_field(number, conf, raw=box.text, reason="first read was garbled; recovered by a digit-only re-read") + f.status = FieldStatus.LOW_CONFIDENCE + return f, box + label = find_label(page.boxes, LABELS["cnic_number"]) + if label is not None: + cands.sort(key=lambda c: abs(c[2].cy - label.cy) + abs(c[2].cx - label.cx) * 0.2) + number, conf, box = cands[0] + + reread_text, reread_conf = page.reread(box, allowlist=CNIC_ALLOWLIST) + second = find_cnic(reread_text) + check = check_cnic(number) + if second == number: + conf = combine_confidence(conf, reread_conf) + reason = None + elif second and check_cnic(second).valid and not check.valid: + number, conf, reason = second, reread_conf * 0.8, "first read failed validation; used digit-only re-read" + elif second: + # Reads disagree: keep the more confident one but flag it. + if reread_conf > conf: + number, conf = second, reread_conf + conf *= 0.6 + reason = "two OCR reads of the CNIC number disagree; please verify" + else: + reason = None + check = check_cnic(number) + if not check.valid: + return FieldResult(None, 0.0, FieldStatus.INVALID, "; ".join(check.problems), raw=box.text), box + f = make_field(check.number, conf, raw=box.text, reason=reason) + if reason and f.status == FieldStatus.OK: + f.status = FieldStatus.LOW_CONFIDENCE + return f, box + + +# ----------------------------------------------------------------------- dates + + +def _date_boxes(page: Page) -> List[Tuple[str, float, TextBox]]: + out = [] + for b in page.boxes: + for d in find_dates(b.text): + out.append((d, b.confidence, b)) + return out + + +def _reread_date(page: Page, value: str, conf: float, box: TextBox) -> Tuple[str, float, Optional[str]]: + text, rconf = page.reread(box, allowlist=DATE_ALLOWLIST) + second = parse_date(text) + if second == value: + return value, combine_confidence(conf, rconf), None + if second is None: + return value, conf, None + if rconf > conf: + return second, rconf * 0.6, "two OCR reads of this date disagree; please verify" + return value, conf * 0.6, "two OCR reads of this date disagree; please verify" + + +def extract_dates(page: Page) -> Dict[str, FieldResult]: + """Extracts birth, issue and expiry dates. + + With three distinct dates the chronological order decides the mapping; + otherwise each date label claims the nearest date box below it. + """ + names = ("date_of_birth", "date_of_issue", "date_of_expiry") + found = _date_boxes(page) + out: Dict[str, FieldResult] = {} + assigned: Dict[str, Tuple[str, float, TextBox]] = {} + + unique: Dict[str, Tuple[str, float, TextBox]] = {} + for d, c, b in found: + if d not in unique or c > unique[d][1]: + unique[d] = (d, c, b) + + if len(unique) >= 3: + ordered = sorted(unique.values(), key=lambda t: to_date(t[0]) or _dt.date.min) + if len(ordered) > 3: + # Keep the three closest to their labels; extra dates are noise. + ordered = sorted(ordered, key=lambda t: -t[1])[:3] + ordered.sort(key=lambda t: to_date(t[0]) or _dt.date.min) + for name, item in zip(names, ordered): + assigned[name] = item + else: + used = set() + for name in names: + label = find_label(page.boxes, LABELS[name], threshold=70) + if label is None: + continue + best = None + for d, c, b in found: + if id(b) in used or b.cy < label.cy - label.height * 0.5: + continue + dist = abs(b.cy - label.cy) + abs(b.x0 - label.x0) * 0.5 + if best is None or dist < best[0]: + best = (dist, (d, c, b)) + if best is not None: + assigned[name] = best[1] + used.add(id(best[1][2])) + + for name in names: + if name not in assigned: + out[name] = FieldResult.missing(f"{LABELS[name].lower()} not found") + continue + value, conf, box = assigned[name] + value, conf, reason = _reread_date(page, value, conf, box) + out[name] = make_field(value, conf, raw=box.text, reason=reason) + if reason: + out[name].status = FieldStatus.LOW_CONFIDENCE + return out + + +def check_date_logic(fields: Dict[str, FieldResult]) -> List[str]: + """Plausibility checks across CNIC dates; returns warnings.""" + warnings = [] + dob = fields["date_of_birth"].as_date() + doi = fields["date_of_issue"].as_date() + doe = fields["date_of_expiry"].as_date() + if dob and doi and not dob < doi: + warnings.append("date of birth is not before date of issue; dates may be misread") + if doi and doe and not doi < doe: + warnings.append("date of issue is not before date of expiry; dates may be misread") + for name in ("date_of_birth", "date_of_issue", "date_of_expiry"): + if warnings and fields[name].status == FieldStatus.OK: + fields[name].status = FieldStatus.LOW_CONFIDENCE + fields[name].reason = "dates failed the birth < issue < expiry check" + return warnings + + +# ----------------------------------------------------------------- text fields + + +def _name_value(text: str) -> bool: + return ascii_ratio(text) >= 0.8 and clean_person_name(text) is not None and not is_label_like(text, ALL_LABEL_TEXTS) + + +def extract_names(page: Page) -> Dict[str, FieldResult]: + boxes = page.boxes + out: Dict[str, FieldResult] = {} + father_label = find_label(boxes, LABELS["father_name"], exclude=[LABELS["name"]]) + husband_label = None + if father_label is None: + husband_label = find_label(boxes, LABELS["husband_name"], exclude=[LABELS["name"]]) + guardian_label = father_label or husband_label + name_label = find_label( + boxes, LABELS["name"], threshold=80, exclude=[LABELS["father_name"], LABELS["husband_name"]] + ) + + skip = [guardian_label] if guardian_label else [] + if name_label is not None: + b = value_near_label(boxes, name_label, _name_value, "Name", max_gap=2.5, skip=skip) + if b is not None and (guardian_label is None or b.cy < guardian_label.cy): + out["name"] = make_field(clean_person_name(b.text), b.confidence, raw=b.text) + if guardian_label is not None: + lt = "Father Name" if father_label else "Husband Name" + b = value_near_label(boxes, guardian_label, _name_value, lt, max_gap=2.5) + if b is not None: + f = make_field(clean_person_name(b.text), b.confidence, raw=b.text) + if husband_label is not None: + f.reason = "card prints Husband Name in this position" + out["father_name"] = f + if "name" not in out or "father_name" not in out: + _names_by_position(page, out) + out.setdefault("name", FieldResult.missing("name label or value not found")) + out.setdefault("father_name", FieldResult.missing("father name label or value not found")) + return out + + +def _names_by_position(page: Page, out: Dict[str, FieldResult]) -> None: + """Fallback when labels are unreadable: on the card front the holder's + name and the father's name are the first two Latin-script name lines + below the header and above the gender / identity-number rows.""" + boxes = page.boxes + header = find_label(boxes, "National Identity Card", threshold=70) or find_label(boxes, "PAKISTAN", threshold=80) + stops = [b for b in boxes if find_cnic(b.text) or find_dates(b.text)] + for key in ("gender", "country_of_stay", "cnic_number"): + lab = find_label(boxes, LABELS[key], threshold=70) + if lab is not None: + stops.append(lab) + top = header.y1 if header is not None else 0.0 + bottom = min((b.y0 for b in stops), default=float("inf")) + names = [ + b + for b in sorted(boxes, key=lambda b: b.cy) + if top - 2 <= b.y0 + and b.y1 <= bottom + 2 + and _name_value(b.text) + and len(re.sub(r"[^A-Za-z]", "", b.text)) >= 5 + and b.confidence >= 0.6 + ] + taken = {f.raw for f in out.values()} + names = [b for b in names if b.text not in taken] + # Stay in the label column: values start near the left edge of the field + # labels, not under the photo (which may carry other printed text). + found_labels = [ + find_label(boxes, LABELS[k], threshold=70) for k in ("father_name", "gender", "cnic_number", "date_of_issue") + ] + column: List[TextBox] = [b for b in found_labels if b is not None] + if column: + left = min(b.x0 for b in column) + unit = sorted(b.height for b in column)[len(column) // 2] + names = [b for b in names if left - 3 * unit <= b.x0 <= left + 4 * unit] + father = out.get("father_name") + if "name" not in out and father is not None and father.value is not None: + fbox = next((b for b in boxes if b.text == father.raw), None) + if fbox is not None: # the holder's name is printed above the father's + names = [b for b in names if b.cy < fbox.cy] + if names: + # Values are printed larger than labels; garbled labels ("Fitay Home" + # for "Father Name") would otherwise pass as names. + tallest = max(b.height for b in names) + names = [b for b in names if b.height >= 0.75 * tallest] + if "name" in out: + anchor = out["name"] + names = [b for b in names if b.text != anchor.raw] + slots = [k for k in ("name", "father_name") if k not in out] + for key, b in zip(slots, names): + f = make_field( + clean_person_name(b.text), + b.confidence * 0.85, + raw=b.text, + reason="label unreadable; located by position on the card", + ) + f.status = FieldStatus.LOW_CONFIDENCE + out[key] = f + + +def extract_gender(page: Page, cnic_number: Optional[str]) -> FieldResult: + boxes = page.boxes + inferred = gender_from_cnic(cnic_number) + label = find_label(boxes, LABELS["gender"]) + + def accept(t: str) -> bool: + return re.fullmatch(r"\s*[MFX]\s*[.|]?\s*", t.upper()) is not None + + printed: Optional[TextBox] = None + if label is not None: + printed = value_near_label(boxes, label, accept, "Gender", max_gap=2.5) + if printed is None: + # Standalone M/F box anywhere above the identity number row. + num_label = find_label(boxes, LABELS["cnic_number"]) + for b in boxes: + if accept(b.text) and (num_label is None or b.cy < num_label.cy): + printed = b + break + + if printed is not None: + value = printed.text.strip().upper()[0] + if inferred and value != "X" and value != inferred: + return make_field( + value, + printed.confidence * 0.5, + raw=printed.text, + reason=f"printed gender {value} disagrees with CNIC number (suggests {inferred})", + ) + conf = printed.confidence + if inferred == value: + conf = combine_confidence(conf, 0.9) + return make_field(value, conf, raw=printed.text) + + if inferred: + f = make_field(inferred, 0.75, reason="gender not legible; inferred from last digit of CNIC number") + f.status = FieldStatus.LOW_CONFIDENCE + return f + return FieldResult.missing("gender value not found") + + +def extract_country(page: Page) -> FieldResult: + label = find_label(page.boxes, LABELS["country_of_stay"]) + if label is None: + return FieldResult.missing("country of stay label not found") + + def accept(t: str) -> bool: + t = t.strip() + return ( + ascii_ratio(t) >= 0.9 + and len(re.sub(r"[^A-Za-z]", "", t)) >= 3 + and not is_label_like(t, list(LABELS.values())) + ) + + b = value_near_label(page.boxes, label, accept, "Country of Stay", max_gap=2.5) + if b is None: + return FieldResult.missing("country of stay value not found") + value = clean_spaces(re.sub(r"[^A-Za-z ]", "", b.text)).title() + return make_field(value, b.confidence, raw=b.text) + + +# -------------------------------------------------------------------- back side + + +URDU_WORK_SIDE = 2048 + + +def _is_label_token(token: str, label: str) -> bool: + from rapidfuzz import fuzz + + from docling_pk.urdu import _RASM + + t = token.strip(":،. ") + return len(t) >= 3 and fuzz.ratio(t.translate(_RASM), label.translate(_RASM)) >= 70 + + +def _strip_address_label(text: str) -> str: + """Drops a leading "موجودہ پتہ :" / "مستقل پتہ :" label from a line.""" + tokens = text.split(" ") + for i, tok in enumerate(tokens[:4]): + if ":" in tok or _is_label_token(tok, "پتہ"): + rest = " ".join(tokens[i + 1 :]).lstrip(": ") + if rest: + return rest + return text + + +def extract_address(page: Page, urdu_backend: Optional[OCRBackend]) -> Dict[str, FieldResult]: + """Reads the present and permanent addresses (Urdu) from a card back. + + The card back is re-read at a higher resolution with an Urdu recognizer, + lines are ordered right to left, the two blocks are split at the + "مستقل پتہ" (permanent address) label (or, failing that, at the largest + vertical gap), and each block is normalized to standard Urdu code points + and lexicon-corrected (see :mod:`docling_pk.urdu`). + """ + from docling_pk.urdu import correct_address_tokens + + if urdu_backend is None: + reason = 'address is printed in Urdu; install Urdu OCR with pip install "docling-pk[urdu]"' + return {"address": FieldResult.missing(reason), "permanent_address": FieldResult.missing(reason)} + + from docling_pk.vision.geometry import resize_long_side + + image, _ = resize_long_side(page.image, max(URDU_WORK_SIDE, max(page.image.shape[:2]))) + boxes = urdu_backend.read(image) + urdu = [b for b in boxes if ascii_ratio(b.text) < 0.6 or re.search(r"[A-Z]{1,2}-?[0-9]", b.text)] + urdu = [b for b in urdu if not find_cnic(b.text) and not re.fullmatch(r"[0-9\s]{8,}", b.text)] + + lines = [] + for line in group_lines(urdu): + line = sorted(line, key=lambda b: -b.x1) # Urdu reads right to left + text = clean_spaces(" ".join(b.text for b in line)) + if sum(text.count(w) for w in _LOST_CARD_HINT) >= 2 or "گمشد" in text: + continue + lines.append((line, text)) + + split = None + for i, (_, text) in enumerate(lines): + if i > 0 and any(_is_label_token(t, "مستقل") for t in text.split(" ")[:3]): + split = i + break + if split is None and len(lines) >= 3: + gaps = [(lines[i + 1][0][0].y0 - max(b.y1 for b in lines[i][0]), i + 1) for i in range(len(lines) - 1)] + gap, idx = max(gaps) + heights = sorted(b.height for ln, _ in lines for b in ln) + if gap > heights[len(heights) // 2] * 0.8: + split = idx + + blocks = {"address": lines[:split] if split else lines, "permanent_address": lines[split:] if split else []} + out = {} + for key, block in blocks.items(): + parts = [_strip_address_label(t) for _, t in block] + parts = [clean_spaces(p.replace(":", " ")).strip(" :،,") for p in parts] + parts = [p for p in parts if len(p) >= 3] + if not parts: + reason = "Urdu address text not detected" + if key == "permanent_address" and blocks["address"]: + reason = "permanent address not separately printed or not detected" + out[key] = FieldResult.missing(reason) + continue + confs = [b.confidence for line, _ in block for b in line] + value = correct_address_tokens(" ".join(parts)) + out[key] = FieldResult( + value=value, + confidence=min(sum(confs) / len(confs), 0.5), + status=FieldStatus.LOW_CONFIDENCE, + reason="Urdu (Nastaliq) OCR is experimental; verify the address manually", + raw=" | ".join(t for _, t in block), + ) + return out + + +# ------------------------------------------------------------------------- main + + +def extract(page: Page, urdu_backend: Optional[OCRBackend] = None) -> Tuple[Dict[str, FieldResult], List[str], Dict]: + """Extracts CNIC fields from a prepared page. + + Returns: + ``(fields, warnings, metadata)``. ``fields`` always contains every + name in :data:`FIELD_NAMES`; fields not printed on the detected side + are ``not_applicable``. + """ + side = detect_side(page.boxes) + warnings: List[str] = [] + meta = {"side": side} + fields: Dict[str, FieldResult] = {} + + number, _ = extract_cnic_number(page) + fields["cnic_number"] = number + + if side == "back": + for n in FRONT_FIELDS: + if n != "cnic_number": + fields[n] = not_applicable("printed on the front of the card") + fields.update(extract_address(page, urdu_backend)) + else: + if side == "unknown": + warnings.append("could not confirm this is a CNIC; check document_type") + fields.update(extract_names(page)) + fields.update(extract_dates(page)) + warnings.extend(check_date_logic(fields)) + fields["gender"] = extract_gender(page, number.value) + fields["country_of_stay"] = extract_country(page) + for n in BACK_FIELDS: + fields[n] = not_applicable("printed on the back of the card; pass the back image too") + + ordered = {n: fields.get(n, FieldResult.missing("not found")) for n in FIELD_NAMES} + return ordered, warnings, meta + + +def merge_sides(results: Sequence[Dict[str, FieldResult]]) -> Dict[str, FieldResult]: + """Merges per-side field dicts (front + back) into one. + + For each field, a found value beats a missing one and higher confidence + wins. If both sides read a CNIC number and they differ, the result is + flagged. + """ + merged: Dict[str, FieldResult] = {} + for fields in results: + for k, f in fields.items(): + cur = merged.get(k) + if cur is None or cur.value is None and f.value is not None: + merged[k] = f + elif cur.value is not None and f.value is not None: + if k == "cnic_number" and cur.value != f.value: + best = cur if cur.confidence >= f.confidence else f + merged[k] = FieldResult( + best.value, + best.confidence * 0.5, + FieldStatus.LOW_CONFIDENCE, + f"front and back CNIC numbers differ ({cur.value} vs {f.value})", + best.raw, + ) + elif k == "cnic_number": + merged[k] = FieldResult( + cur.value, combine_confidence(cur.confidence, f.confidence), cur.status, cur.reason, cur.raw + ) + elif f.confidence > cur.confidence: + merged[k] = f + elif cur.status == FieldStatus.NOT_APPLICABLE and f.status != FieldStatus.NOT_APPLICABLE: + merged[k] = f + return merged diff --git a/src/docling_pk/parsers/degree.py b/src/docling_pk/parsers/degree.py new file mode 100644 index 0000000..a15d8b1 --- /dev/null +++ b/src/docling_pk/parsers/degree.py @@ -0,0 +1,217 @@ +""" +University degree certificate and transcript extraction. + +Degree and transcript layouts vary by university far more than board +certificates do, so this parser relies on the phrases that recur across +Pakistani universities rather than on positions: " s/o ", +"Bachelor/Master/Doctor of ...", "Registration No", "CGPA", "First +Division", "Date of Issue". Verified on COMSATS University Islamabad +documents; other universities are best-effort. +""" + +from __future__ import annotations + +import re +from typing import Dict, List, Tuple + +from docling_pk.layout import clean_spaces, group_lines +from docling_pk.parsers.base import clean_person_name, combine_confidence, make_field +from docling_pk.pipeline import Page +from docling_pk.schema import FieldResult, FieldStatus +from docling_pk.validation.dates import find_dates + +FIELD_NAMES = [ + "student_name", + "father_name", + "degree", + "institution", + "campus", + "registration_number", + "serial_number", + "cgpa", + "division", + "date_of_birth", + "date_of_issue", + "year", +] + +_RELATION = r"(?:s|d|w)\s*[/\\|.]?\s*o\b|son\s+of|daughter\s+of|wife\s+of" +NAME_PAIR = re.compile( + rf"(?:certified\s+that\s+|that\s+)?([A-Z][A-Za-z.'\- ]{{2,60}}?)\s+(?:{_RELATION})\s+([A-Z][A-Za-z.'\- ]{{2,60}}?)" + r"(?=\s*$|\s*[,(]|\s+(?:registration|reg\.?|roll|of\b|has\b|department|enrol|bearing))", + re.I | re.M, +) +DEGREE = re.compile( + r"\b((?:Bachelor|Master|Doctor)\s+of\s+[A-Z][A-Za-z&,()]*(?:\s+(?:in|of|and|&|\(|[A-Z])[A-Za-z&,()]*){0,8}" + # The abbreviation must end at a word boundary, or "MAHMOOD" reads as "MA" + "HMOOD". + r"|(?:BS|MS|MPhil|M\.Phil|PhD|Ph\.D|BBA|MBA|BSc|B\.Sc|MSc|M\.Sc|BE|B\.E|MBBS|LLB|BA|MA)\b\.?\s*(?:\(Hons\)\s*)?(?:in\s+)?[A-Z][A-Za-z&]+(?:\s+[A-Z][A-Za-z&]+){0,5})", +) +INSTITUTION = re.compile( + r"\b([A-Z][A-Za-z&.\-]+(?:\s+[A-Z][A-Za-z&.\-]+){0,5}\s+University(?:\s+of\s+[A-Z][A-Za-z&]+(?:\s+(?:and\s+)?[A-Z][A-Za-z&]+){0,3})?(?:,?\s+(?:Islamabad|Lahore|Karachi|Peshawar|Quetta|Multan|Faisalabad|Rawalpindi))?" + r"|University\s+of\s+[A-Z][A-Za-z&]+(?:\s+(?:and\s+)?[A-Z][A-Za-z&]+){0,4}" + r"|[A-Z][A-Za-z&]+(?:\s+[A-Z][A-Za-z&]+){0,4}\s+Institute\s+of\s+[A-Z][A-Za-z&]+(?:\s+(?:and\s+)?[A-Z][A-Za-z&]+){0,3})" +) +_NO = r"(?:no|n[o0]|[0-9a-z]o|number|#)" # blackletter "No" is often read as "3o"/"2o" +REGISTRATION = re.compile( + rf"(?:registration|reg(?:d)?\.?|enrol(?:l)?ment)\s*{_NO}?\.?\s*[:\-]?\s*" + r"([A-Z0-9]{2,}[/\-][A-Z0-9/\-]{3,}(?:\s?[/\-]\s?[A-Z0-9]{2,}){0,2}|[0-9]{6,})", + re.I, +) +SERIAL = re.compile(rf"serial\s*{_NO}\.?\s*[:\-]?\s*([0-9]{{4,}})", re.I) +CGPA = re.compile(r"\bC\.?\s?G\.?\s?P\.?\s?A\.?\s*[:\-]?\s*([0-4][.,][0-9]{1,2})\b", re.I) +DIVISION = re.compile(r"\b(first|second|third|1st|2nd|3rd)\s+division\b", re.I) +CAMPUS = re.compile(r"(?:from|of|at)\s+([A-Z][A-Za-z]+(?:\s+[A-Z][A-Za-z]+)?)\s+Campus", re.I) +TRANSCRIPT = re.compile(r"transcript|semester|course\s*code|credit\s*hours", re.I) + + +_UNIVERSITY_TYPO = re.compile(r"\bUni[a-z]ersit[yv]\b|\bUnivers[il1]ty\b", re.I) + + +def fix_common_words(text: str) -> str: + """Repairs OCR misreads of words the patterns depend on ("Unibersity").""" + return _UNIVERSITY_TYPO.sub("University", text) + + +def detect_variant(text: str) -> str: + """``"transcript"`` or ``"degree"``.""" + return "transcript" if TRANSCRIPT.search(text) else "degree" + + +def _flat(page: Page) -> Tuple[str, float]: + lines = group_lines(page.boxes) + text = "\n".join(" ".join(b.text for b in line) for line in lines) + confs = [b.confidence for b in page.boxes] or [0.0] + return text, sum(confs) / len(confs) + + +def _conf_for(page: Page, snippet: str, default: float) -> float: + """Mean confidence of the boxes whose text overlaps ``snippet``.""" + words = set(w.lower() for w in re.findall(r"[A-Za-z0-9]{3,}", snippet)) + hits = [b.confidence for b in page.boxes if words & set(w.lower() for w in re.findall(r"[A-Za-z0-9]{3,}", b.text))] + return sum(hits) / len(hits) if hits else default + + +def _verify_id(page: Page, value: str, conf: float, raw: str) -> FieldResult: + """Re-reads an alphanumeric ID with the verifier engine, if configured. + + IDs such as ``UNI/SP22-BCS-001/ISB`` have no checksum, and I/l/1 and + I/H confusions are common. If an independent engine reads the same box + differently, the value is kept but downgraded to ``low_confidence``. + """ + if page.verifier is None: + return make_field(value, conf, raw=raw) + head = value.split("/")[0][:4] + box = next((b for b in page.boxes if head and head.lower() in b.text.lower().replace(" ", "")), None) + if box is None: + return make_field(value, conf, raw=raw) + other, oconf = page.reread(box, pad_x=0.1, pad_y=0.15) + norm = lambda t: re.sub(r"[^A-Z0-9]", "", t.upper()) # noqa: E731 + first = norm(value)[: max(len(norm(head)), 4)] + if first and first in norm(other): + return make_field(value, combine_confidence(conf, oconf * 0.5), raw=raw) + f = make_field(value, conf * 0.6, raw=raw, reason=f"second OCR engine read '{other.strip()}'; please verify") + f.status = FieldStatus.LOW_CONFIDENCE + return f + + +def extract(page: Page) -> Tuple[Dict[str, FieldResult], List[str], Dict]: + """Extracts a degree certificate or transcript. + + Returns: + ``(fields, warnings, metadata)``. + """ + text, mean_conf = _flat(page) + text = fix_common_words(text) + lines = [clean_spaces(line) for line in text.splitlines() if line.strip()] + one_line = clean_spaces(" ".join(lines)) + fields: Dict[str, FieldResult] = {} + warnings: List[str] = [] + variant = detect_variant(text) + + m = next((NAME_PAIR.search(ln) for ln in lines if NAME_PAIR.search(ln)), None) or NAME_PAIR.search(one_line) + if m: + name, father = clean_person_name(m.group(1)), clean_person_name(m.group(2)) + name = re.sub(r"^(?:certified\s+that|that)\s+", "", name or "", flags=re.I) or None + c = _conf_for(page, m.group(0), mean_conf) + fields["student_name"] = make_field(name.upper() if name else None, c, raw=m.group(1)) + fields["father_name"] = make_field(father.upper() if father else None, c, raw=m.group(2)) + else: + fields["student_name"] = FieldResult.missing("no ' s/o ' phrase found") + fields["father_name"] = FieldResult.missing("no ' s/o ' phrase found") + + m = next((DEGREE.search(ln) for ln in lines if DEGREE.search(ln)), None) + if m: + deg = clean_spaces(re.split(r"\s+(?:on|from|with|taught|at|,)\s", m.group(1) + " ")[0]) + fields["degree"] = make_field(deg, _conf_for(page, deg, mean_conf), raw=m.group(1)) + else: + fields["degree"] = FieldResult.missing("degree title not found") + + m = next((INSTITUTION.search(ln) for ln in lines if INSTITUTION.search(ln)), None) + fields["institution"] = ( + make_field(clean_spaces(m.group(1)), _conf_for(page, m.group(1), mean_conf), raw=m.group(1)) + if m + else FieldResult.missing("institution name not found") + ) + m = CAMPUS.search(one_line) + fields["campus"] = ( + make_field(m.group(1).title(), _conf_for(page, m.group(1), mean_conf)) + if m + else FieldResult.missing("campus not printed") + ) + + m = next((REGISTRATION.search(ln) for ln in lines if REGISTRATION.search(ln)), None) + if m and m.group(1).endswith(("-", "/")): + # Wrapped onto the next line ("CIIT/SP22-" / "BAI-010/ATK"). + idx = next(i for i, ln in enumerate(lines) if m.group(1) in ln) + if idx + 1 < len(lines): + cont = re.match(r"\s*([A-Z0-9/\-]{3,})", lines[idx + 1], re.I) + if cont: + m = REGISTRATION.search(m.string.replace(m.group(1), m.group(1) + cont.group(1))) + if m: + reg = re.sub(r"\s+", "", m.group(1)).upper() + reg = re.split(r"(?<=[A-Z0-9])(?=DEPARTMENT|DEPT)", reg)[0] + fields["registration_number"] = _verify_id(page, reg, _conf_for(page, m.group(1), mean_conf), m.group(1)) + else: + fields["registration_number"] = FieldResult.missing("registration number not found") + + m = SERIAL.search(one_line) + fields["serial_number"] = ( + make_field(m.group(1), _conf_for(page, m.group(1), mean_conf)) + if m + else FieldResult.missing("serial number not found") + ) + + m = CGPA.search(one_line) + fields["cgpa"] = ( + make_field(m.group(1).replace(",", "."), _conf_for(page, m.group(0), mean_conf)) + if m + else FieldResult.missing("CGPA not printed or not found") + ) + m = DIVISION.search(one_line) + fields["division"] = ( + make_field(m.group(1).title() + " Division", 0.8) if m else FieldResult.missing("division not printed") + ) + + dob = None + issue = None + for line in group_lines(page.boxes): + t = " ".join(b.text for b in line) + ds = find_dates(t) + if not ds: + continue + c = min(b.confidence for b in line) + if re.search(r"birth", t, re.I) and dob is None: + dob = make_field(ds[0], c, raw=t) + elif re.search(r"issu|date\s*[:\-]|dated|given", t, re.I) and issue is None: + issue = make_field(ds[0], c, raw=t) + fields["date_of_birth"] = dob or FieldResult.missing("date of birth not printed") + fields["date_of_issue"] = issue or FieldResult.missing("date of issue not found") + if issue is not None: + fields["year"] = make_field((issue.value or "")[-4:] or None, issue.confidence) + else: + years = re.findall(r"\b(?:19|20)[0-9]{2}\b", one_line) + fields["year"] = make_field(years[-1], 0.5) if years else FieldResult.missing("year not found") + + meta = {"variant": variant} + ordered = {n: fields.get(n, FieldResult.missing("not found")) for n in FIELD_NAMES} + return ordered, warnings, meta diff --git a/src/docling_pk/pipeline.py b/src/docling_pk/pipeline.py new file mode 100644 index 0000000..482e24d --- /dev/null +++ b/src/docling_pk/pipeline.py @@ -0,0 +1,274 @@ +""" +Page normalization: from an arbitrary photo to an upright, deskewed page with +positioned OCR text boxes. + +Steps: + +1. Scale to a working resolution (large phone photos are slow to OCR and + gain nothing; tiny images lose characters). +2. Pick the right-angle orientation (0/90/180/270) by reading a low-res copy + with an *English-only* reader and scoring how much of the output is + confident Latin text. The original pipeline scored ``confidence x + detection_count`` with an English+Urdu reader; on a sideways card the Urdu + model produced dozens of confident one-character Arabic-script fragments, + so a sideways read beat the correct upright one and the cleanest CNIC + photo in the sample set extracted 0 of 8 fields. +3. Correct residual skew from text-line angles. +4. Full-resolution OCR, producing :class:`~docling_pk.ocr.base.TextBox` es. + +The result, :class:`Page`, also supports re-reading a single region +(``Page.reread``), which parsers use to get a second, character-restricted +read of high-stakes fields such as the CNIC number. +""" + +from __future__ import annotations + +import re +import time +from dataclasses import dataclass, field +from typing import Dict, List, Optional, Sequence, Tuple + +import cv2 +import numpy as np + +from docling_pk.layout import ascii_ratio, reading_order_text +from docling_pk.ocr.base import OCRBackend, TextBox +from docling_pk.vision.geometry import ( + crop_box, + estimate_skew, + resize_long_side, + rotate_bound, + rotate_right_angle, +) + +#: Long side used for orientation probing. +PROBE_SIDE = 960 +#: Long side for the main OCR pass. Upscales small images, downsizes huge ones. +WORK_SIDE = 1800 +#: Skew (degrees) below which no rotation is applied. +MIN_SKEW = 1.0 + +#: Words that only read correctly when the page is upright. Matching any of +#: them strongly confirms an orientation. +ANCHOR_WORDS = ( + "pakistan", + "national", + "identity", + "card", + "name", + "father", + "gender", + "country", + "birth", + "issue", + "expiry", + "federal", + "board", + "education", + "certificate", + "secondary", + "intermediate", + "roll", + "registration", + "serial", + "university", + "transcript", + "degree", + "bachelor", + "subject", + "marks", + "total", + "islamabad", + "lahore", + "certified", + "signature", +) +_WORD = re.compile(r"[A-Za-z]{3,}") + + +@dataclass +class Page: + """An upright, deskewed page image and its OCR text boxes.""" + + image: np.ndarray + boxes: List[TextBox] + backend: OCRBackend + rotation: int = 0 + skew: float = 0.0 + verifier: Optional[OCRBackend] = None + timings: Dict[str, float] = field(default_factory=dict) + + @property + def text(self) -> str: + """All text in reading order.""" + return reading_order_text(self.boxes) + + def reread( + self, + box: TextBox, + allowlist: Optional[str] = None, + pad_x: float = 0.3, + pad_y: float = 0.25, + min_height: int = 48, + backend: Optional[OCRBackend] = None, + ) -> Tuple[str, float]: + """Re-recognizes the text inside ``box`` from a padded, upscaled crop. + + When a ``verifier`` backend is configured (a second, independent OCR + engine), it does the re-read: agreement between two different engines + is far stronger evidence than the same engine agreeing with itself. + + Args: + allowlist: Restrict output characters (e.g. ``"0123456789-"``). + min_height: Crops shorter than this are upscaled to it; the + recognizers were trained on text roughly this tall. + """ + crop = crop_box(self.image, box, pad_x=pad_x, pad_y=pad_y) + if crop.size == 0: + return "", 0.0 + h = crop.shape[0] + if h < min_height: + s = min_height / float(h) + crop = cv2.resize(crop, None, fx=s, fy=s, interpolation=cv2.INTER_CUBIC) + engine = backend or self.verifier or self.backend + return engine.recognize(crop, allowlist=allowlist) + + +def latin_score(boxes: Sequence[TextBox]) -> float: + """How strongly a set of OCR boxes looks like correctly oriented text. + + Sums, over boxes, confidence x number of Latin letters/digits, counting + only boxes that are mostly ASCII. Each recognized anchor word adds a large + bonus, because a word like "PAKISTAN" essentially never appears when the + image is upside down or sideways. + + The sum is then scaled by the share of multi-character boxes that are + wider than tall. Some engines (RapidOCR) rotate tall crops before + recognizing them, so they read sideways text correctly and the text + alone cannot tell a sideways page from an upright one; the box shapes + can. + """ + score = 0.0 + shaped = horizontal = 0 + for b in boxes: + t = b.text.strip() + if len(t) >= 3: + shaped += 1 + horizontal += b.width >= b.height + if ascii_ratio(t) < 0.7: + continue + n = sum(1 for c in t if c.isascii() and c.isalnum()) + score += b.confidence * n + for w in _WORD.findall(t.lower()): + if w in ANCHOR_WORDS and b.confidence > 0.3: + score += 25.0 + if shaped: + score *= horizontal / shaped + return score + + +def drop_noise_boxes(boxes: Sequence[TextBox]) -> List[TextBox]: + """Removes boxes that look like security-paper micro-text. + + Board certificates are printed on paper covered in tiny repeated text + ("FEDERAL BOARD OF INTERMEDIATE..."). OCR engines read it as dozens of + low-confidence junk boxes that interleave with real lines and break + line grouping. Real text on a document is printed at a consistent size, + so boxes much smaller than the confident text *and* themselves + unconfident are dropped. Confident small text (e.g. "ISLAMIC REPUBLIC + OF PAKISTAN" on a CNIC) is kept. + """ + ref = sorted(b.height for b in boxes if b.confidence >= 0.9 and len(b.text.strip()) >= 3) + if len(ref) < 3: + return list(boxes) + median = ref[len(ref) // 2] + return [b for b in boxes if not (b.height < 0.6 * median and b.confidence < 0.8)] + + +def suppress_light_ink(image: np.ndarray) -> np.ndarray: + """Whitens everything lighter than the dark ink. + + Security micro-text and background guilloche patterns are printed in + light ink; the data is printed in dark ink. The cut-off is chosen per + image with Otsu's method. Unlike binarization, pixels darker than the + cut-off keep their gray levels, so character edges stay anti-aliased the + way OCR models expect. + """ + gray = image if image.ndim == 2 else cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) + thresh, _ = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) + out = gray.copy() + out[out > thresh] = 255 + return cv2.cvtColor(out, cv2.COLOR_GRAY2BGR) + + +def detect_orientation(image: np.ndarray, backend: OCRBackend) -> Tuple[int, Dict[int, float]]: + """Returns the counter-clockwise quarter turns that make ``image`` upright. + + Upright is tried first; the other three orientations are only read when + the upright read is not already convincing, so already-upright scans pay + for one low-resolution OCR pass, not four. + """ + probe, _ = resize_long_side(image, PROBE_SIDE) + scores: Dict[int, float] = {} + scores[0] = latin_score(backend.read(probe)) + if scores[0] >= 150.0: + return 0, scores + for k in (1, 3, 2): + scores[k] = latin_score(backend.read(rotate_right_angle(probe, k))) + best = max(scores, key=lambda k: scores[k]) + return best, scores + + +def prepare_page( + image: np.ndarray, + backend: OCRBackend, + orientation_backend: Optional[OCRBackend] = None, + auto_rotate: bool = True, + verifier: Optional[OCRBackend] = None, +) -> Page: + """Runs orientation, deskew and full OCR on a BGR image. + + Args: + backend: Backend for the main read. + orientation_backend: Backend used for orientation probing; must be an + English/Latin reader. Defaults to ``backend``. + verifier: Optional second engine used by :meth:`Page.reread`. + auto_rotate: Set ``False`` to trust the input orientation. + """ + timings: Dict[str, float] = {} + t0 = time.perf_counter() + work, _ = resize_long_side(image, WORK_SIDE) + + rotation = 0 + if auto_rotate: + rotation, _ = detect_orientation(work, orientation_backend or backend) + work = rotate_right_angle(work, rotation) + timings["orientation"] = time.perf_counter() - t0 + + t1 = time.perf_counter() + boxes = backend.read(work) + skew = estimate_skew(boxes) + if abs(skew) >= MIN_SKEW: + work = rotate_bound(work, -skew) + boxes = backend.read(work) + kept = drop_noise_boxes(boxes) + dropped = len(boxes) - len(kept) + boxes = kept + if dropped >= max(10, 0.2 * (len(boxes) + dropped)): + # Heavy micro-text background: try an ink-only copy, keep the better read. + variant = suppress_light_ink(work) + alt = drop_noise_boxes(backend.read(variant)) + if latin_score(alt) > latin_score(boxes): + work, boxes = variant, alt + timings["ink_only_variant"] = 1.0 + timings["ocr"] = time.perf_counter() - t1 + + return Page( + image=work, + boxes=boxes, + backend=backend, + rotation=rotation, + skew=skew, + verifier=verifier, + timings=timings, + ) diff --git a/docling_pk/__init__.py b/src/docling_pk/py.typed similarity index 100% rename from docling_pk/__init__.py rename to src/docling_pk/py.typed diff --git a/src/docling_pk/schema.py b/src/docling_pk/schema.py new file mode 100644 index 0000000..e8347cc --- /dev/null +++ b/src/docling_pk/schema.py @@ -0,0 +1,211 @@ +""" +Output schema for docling-pk. + +Every parser returns a dict of :class:`FieldResult` objects, which the +extractor wraps in a :class:`DocumentResult`. This is the one shape every +other module builds against: the CLI, the benchmark, and the tests all +consume it, so changes here are public API changes. + +Two access styles are supported on purpose. Attribute access is the typed, +IDE-friendly way:: + + result.fields["cnic_number"].value + +Dictionary access mirrors the JSON output exactly, which is what the +project brief's examples use:: + + result["fields"]["cnic_number"]["value"] +""" + +from __future__ import annotations + +import datetime as _dt +import json +from dataclasses import dataclass, field +from enum import Enum +from typing import Any, Dict, Iterator, List, Optional, Tuple + + +class FieldStatus(str, Enum): + """Why a field has the value it has. + + The status exists because a field can fail for different reasons on + different documents, and callers need to tell them apart: a field that + is genuinely not printed on this side of the card needs a different + response than one that is printed but unreadable. + """ + + OK = "ok" + """Extracted and passed every validation check that applies to it.""" + + LOW_CONFIDENCE = "low_confidence" + """Extracted, but OCR confidence or a cross-check was weak. Review it.""" + + INVALID = "invalid" + """Text was found but failed format validation. ``value`` is ``None`` and + the offending text is kept in ``raw``.""" + + NOT_FOUND = "not_found" + """The field should be on this document but could not be located.""" + + NOT_APPLICABLE = "not_applicable" + """The field is not printed on this document variant (for example the + address on the front of a Smart CNIC).""" + + +@dataclass +class FieldResult: + """A single extracted field. + + Attributes: + value: Normalized value, or ``None`` when the field could not be read + reliably. docling-pk never returns a guess in ``value``. + confidence: 0.0 to 1.0. Combines OCR recognition confidence with + validation outcomes; 0.0 whenever ``value`` is ``None``. + status: A :class:`FieldStatus` explaining the outcome. + reason: Human-readable explanation for any status other than ``OK``. + raw: The OCR text the value was derived from, before normalization. + + Example: + >>> f = FieldResult("35202-1234567-9", 0.97) + >>> f.ok + True + """ + + value: Optional[str] + confidence: float + status: FieldStatus = FieldStatus.OK + reason: Optional[str] = None + raw: Optional[str] = None + + def __post_init__(self) -> None: + self.confidence = round(max(0.0, min(1.0, float(self.confidence))), 4) + if self.value is None: + self.confidence = 0.0 + if self.status in (FieldStatus.OK, FieldStatus.LOW_CONFIDENCE): + self.status = FieldStatus.NOT_FOUND + + @classmethod + def missing( + cls, + reason: str, + status: FieldStatus = FieldStatus.NOT_FOUND, + raw: Optional[str] = None, + ) -> FieldResult: + """Builds an empty field that records *why* it is empty.""" + return cls(value=None, confidence=0.0, status=status, reason=reason, raw=raw) + + @property + def ok(self) -> bool: + """``True`` if a value was extracted (whatever its confidence).""" + return self.value is not None + + def as_date(self) -> Optional[_dt.date]: + """Parses a ``DD-MM-YYYY`` value into a :class:`datetime.date`. + + Returns: + The date, or ``None`` if the value is missing or not a date. + + Example: + >>> FieldResult("14-02-2004", 0.9).as_date() + datetime.date(2004, 2, 14) + """ + if not self.value: + return None + try: + return _dt.datetime.strptime(self.value, "%d-%m-%Y").date() + except ValueError: + return None + + def to_dict(self, include_raw: bool = False) -> Dict[str, Any]: + """Serializes to plain JSON-compatible types.""" + out: Dict[str, Any] = { + "value": self.value, + "confidence": self.confidence, + "status": self.status.value, + } + if self.reason: + out["reason"] = self.reason + if include_raw and self.raw is not None: + out["raw"] = self.raw + return out + + +@dataclass +class DocumentResult: + """The full result of extracting one document. + + Attributes: + document_type: Canonical type, e.g. ``"cnic"``, ``"matric"``. + fields: Field name to :class:`FieldResult`. The key set is fixed per + document type, so callers can rely on every key being present. + confidence: Overall document confidence. Averaged across *all* + expected fields, including missing ones, so a document with + several unreadable fields cannot report a high score. + warnings: Non-fatal issues, written for an end user to read. + raw_text: Full OCR text in reading order, for debugging. + tables: Tabular data such as the subject-wise marks statement. + metadata: Processing details: detected variant, board, rotation + applied, image quality scores, OCR backend, timings. + + Example: + >>> r = DocumentResult("cnic", {"cnic_number": FieldResult("35202-1234567-9", 0.9)}, 0.9) + >>> r["fields"]["cnic_number"]["value"] + '35202-1234567-9' + """ + + document_type: str + fields: Dict[str, FieldResult] + confidence: float + warnings: List[str] = field(default_factory=list) + raw_text: Optional[str] = None + tables: Dict[str, List[Dict[str, Any]]] = field(default_factory=dict) + metadata: Dict[str, Any] = field(default_factory=dict) + + def get(self, name: str) -> Optional[str]: + """Shortcut for ``fields[name].value``; ``None`` for unknown names.""" + f = self.fields.get(name) + return f.value if f is not None else None + + @property + def missing_fields(self) -> List[str]: + """Names of fields that have no value.""" + return [k for k, v in self.fields.items() if v.value is None] + + def to_dict(self, include_raw: bool = False) -> Dict[str, Any]: + """Serializes to plain JSON-compatible types. + + Args: + include_raw: Also include ``raw_text`` and per-field ``raw`` OCR + text. Off by default because raw OCR output can contain + personal data that is not part of any extracted field. + """ + out: Dict[str, Any] = { + "document_type": self.document_type, + "fields": {k: v.to_dict(include_raw) for k, v in self.fields.items()}, + "confidence": self.confidence, + "warnings": list(self.warnings), + } + if self.tables: + out["tables"] = self.tables + if self.metadata: + out["metadata"] = self.metadata + if include_raw: + out["raw_text"] = self.raw_text + return out + + def to_json(self, include_raw: bool = False, indent: Optional[int] = 2) -> str: + """Serializes to a JSON string (UTF-8 safe, Urdu kept readable).""" + return json.dumps(self.to_dict(include_raw), ensure_ascii=False, indent=indent) + + # Mapping-style access so result["fields"]["name"]["value"] works. + def __getitem__(self, key: str) -> Any: + if key == "raw_text": + return self.raw_text + return self.to_dict(include_raw=True)[key] + + def keys(self) -> Iterator[str]: + return iter(self.to_dict(include_raw=True).keys()) + + +BBox = Tuple[int, int, int, int] diff --git a/src/docling_pk/urdu.py b/src/docling_pk/urdu.py new file mode 100644 index 0000000..9158ee0 --- /dev/null +++ b/src/docling_pk/urdu.py @@ -0,0 +1,294 @@ +""" +Urdu text normalization and address post-correction. + +OCR models trained on Arabic script often emit Arabic letter forms where +Urdu uses its own code points (``ي`` for ``ی``, ``ك`` for ``ک``, ``ه`` for +``ہ``) and scatter diacritics that are not printed on CNICs. Normalizing to +standard Urdu code points makes the output searchable and comparable. + +Address post-correction snaps individual OCR tokens to a lexicon of words +that recur in Pakistani addresses (house, street, tehsil, district...) and to +district / tehsil names, but only when the match is close and unambiguous. +Tokens not near any lexicon entry (house numbers, locality names) are left +exactly as read, so the correction can only fix words, never invent them. +""" + +from __future__ import annotations + +import re +import unicodedata +from typing import List + +from rapidfuzz import fuzz + +_CHAR_MAP = str.maketrans( + { + "ي": "ی", # Arabic yeh -> Farsi/Urdu yeh + "ى": "ی", # alef maksura + "ك": "ک", # Arabic kaf -> keheh + "ه": "ہ", # Arabic heh -> heh goal + "ة": "ۃ", # teh marbuta -> Urdu teh marbuta goal + "ؤ": "ؤ", + "٫": "،", + ",": "،", + } +) +_DIACRITICS = re.compile("[ً-ٰٟۖ-ۭ]") +_TATWEEL = "ـ" + +#: Words that recur in Pakistani addresses as printed on CNICs. +ADDRESS_WORDS = ( + "مکان", + "نمبر", + "محلہ", + "گلی", + "اسٹریٹ", + "سٹریٹ", + "روڈ", + "کالونی", + "سیکٹر", + "بلاک", + "فیز", + "ٹاؤن", + "گاؤں", + "موضع", + "ڈاکخانہ", + "تحصیل", + "ضلع", + "کینٹ", + "شہر", + "چک", + "بستی", + "نزد", + "مین", + "بازار", + "سوسائٹی", + "ہاؤسنگ", + "اسکیم", + "فلیٹ", + "منزل", + "اپارٹمنٹ", + "قصبہ", + "یونین", + "کونسل", + "وارڈ", + "پتہ", + "موجودہ", + "مستقل", + "ڈاک", + "خانہ", + "ہاؤس", + "پلاٹ", + "مارکیٹ", + "مسجد", + "چوک", + "کوٹ", + "پورہ", + "آباد", + "گارڈن", + "ایونیو", + "انکلیو", +) + +#: Districts and frequently printed tehsils / cities. +PLACES = ( + "راولپنڈی", + "اسلام آباد", + "لاہور", + "کراچی", + "پشاور", + "کوئٹہ", + "ملتان", + "فیصل آباد", + "گوجرانوالہ", + "سیالکوٹ", + "سرگودھا", + "بہاولپور", + "ڈیرہ غازی خان", + "ساہیوال", + "اٹک", + "چکوال", + "جہلم", + "گجرات", + "منڈی بہاؤالدین", + "حافظ آباد", + "شیخوپورہ", + "ننکانہ صاحب", + "قصور", + "اوکاڑہ", + "پاکپتن", + "وہاڑی", + "خانیوال", + "لودھراں", + "مظفر گڑھ", + "لیہ", + "راجن پور", + "رحیم یار خان", + "بہاولنگر", + "جھنگ", + "ٹوبہ ٹیک سنگھ", + "چنیوٹ", + "خوشاب", + "میانوالی", + "بھکر", + "نارووال", + "حیدرآباد", + "سکھر", + "لاڑکانہ", + "میرپور خاص", + "نوابشاہ", + "ٹھٹھہ", + "بدین", + "دادو", + "جیکب آباد", + "شکارپور", + "خیرپور", + "گھوٹکی", + "سانگھڑ", + "عمرکوٹ", + "تھرپارکر", + "مردان", + "صوابی", + "نوشہرہ", + "چارسدہ", + "کوہاٹ", + "بنوں", + "ڈیرہ اسماعیل خان", + "ایبٹ آباد", + "مانسہرہ", + "ہری پور", + "سوات", + "دیر", + "چترال", + "بونیر", + "شانگلہ", + "ملاکنڈ", + "کرک", + "لکی مروت", + "ٹانک", + "ہنگو", + "گلگت", + "اسکردو", + "مظفرآباد", + "میرپور", + "کوٹلی", + "باغ", + "راولاکوٹ", + "گوادر", + "تربت", + "خضدار", + "سبی", + "ژوب", + "لورالائی", + "چمن", + "پشین", + "ٹیکسلا", + "واہ", + "حسن ابدال", + "فتح جنگ", + "پنڈی گھیب", + "جنڈ", + "گوجر خان", + "کہوٹہ", + "مری", + "کلر سیداں", + "تلہ گنگ", + "سوہاوہ", + "کامونکی", + "مریدکے", + "رائیونڈ", + "ڈسکہ", + "سمبڑیال", + "پسرور", + "شکرگڑھ", + "وزیر آباد", + "کھاریاں", + "لالہ موسیٰ", + "سرائے عالمگیر", + "دینہ", +) + +_SINGLE_WORDS: List[str] = sorted(set(ADDRESS_WORDS) | {w for p in PLACES for w in p.split() if len(w) >= 3}) +_LEXICON_SET = set(_SINGLE_WORDS) +_ADDRESS_WORD_SET = set(ADDRESS_WORDS) + +#: Letters that differ only by dots map to one dotless "skeleton" class. +#: Most Nastaliq OCR errors are dot errors (خ read as ح, ٹ as ت, ڑ as ر), +#: so comparing skeletons catches them while plain edit distance does not. +_RASM = str.maketrans( + { + "ب": "ٮ", + "پ": "ٮ", + "ت": "ٮ", + "ٹ": "ٮ", + "ث": "ٮ", + "ن": "ٮ", + "ی": "ٮ", + "ئ": "ٮ", + "ج": "ح", + "چ": "ح", + "خ": "ح", + "ڈ": "د", + "ذ": "د", + "ڑ": "ر", + "ز": "ر", + "ژ": "ر", + "ش": "س", + "ض": "ص", + "ظ": "ط", + "غ": "ع", + "ق": "ف", + "گ": "ک", + } +) +_SKELETONS = [w.translate(_RASM) for w in _SINGLE_WORDS] + + +def _score(token: str, idx: int) -> float: + word = _SINGLE_WORDS[idx] + return max(fuzz.ratio(token, word), fuzz.ratio(token.translate(_RASM), _SKELETONS[idx]) - 4) + + +def normalize_urdu(text: str) -> str: + """Maps Arabic letter forms to Urdu code points and strips diacritics. + + Example: + >>> normalize_urdu("محلّه نوري") + 'محلہ نوری' + """ + t = unicodedata.normalize("NFC", text).translate(_CHAR_MAP) + t = _DIACRITICS.sub("", t).replace(_TATWEEL, "") + # A trailing heh goal followed by hamza variants is common OCR noise. + return re.sub(r"\s+", " ", t).strip() + + +def correct_address_tokens(text: str, min_score: float = 75.0) -> str: + """Snaps OCR'd Urdu address tokens to known address words and place names. + + A token is replaced only if it is at least 3 letters long, is not already + a lexicon word, and its best lexicon match scores ``min_score`` or more + and clearly beats the runner-up. + + Example: + >>> correct_address_tokens("خصیل کامونکی ضع گوجرانوالا") + 'تحصیل کامونکی ضلع گوجرانوالہ' + """ + out = [] + for tok in normalize_urdu(text).split(" "): + core = tok.strip("،۔:.-") + if core in _LEXICON_SET or re.search(r"[A-Za-z0-9]", core) or len(core) < 2: + out.append(tok) + continue + scored = sorted(((_score(core, i), i) for i in range(len(_SINGLE_WORDS))), reverse=True) + (score, idx), runner = scored[0], (scored[1][0] if len(scored) > 1 else 0.0) + best = _SINGLE_WORDS[idx] + threshold = min_score if len(core) >= 4 else 80.0 + if best not in _ADDRESS_WORD_SET: + # Place names are only accepted on a strong match: snapping noise + # onto a real district name would invent data. + threshold = max(threshold, 85.0) + if score >= threshold and score - runner >= 5: + out.append(tok.replace(core, best)) + else: + out.append(tok) + return " ".join(out) diff --git a/src/docling_pk/validation/__init__.py b/src/docling_pk/validation/__init__.py new file mode 100644 index 0000000..1127535 --- /dev/null +++ b/src/docling_pk/validation/__init__.py @@ -0,0 +1 @@ +"""Format validation and cross-checks.""" diff --git a/src/docling_pk/validation/cnic.py b/src/docling_pk/validation/cnic.py new file mode 100644 index 0000000..eafbe12 --- /dev/null +++ b/src/docling_pk/validation/cnic.py @@ -0,0 +1,125 @@ +""" +CNIC number validation. + +A CNIC number has 13 digits printed as ``XXXXX-XXXXXXX-X``. Two structural +facts are used to cross-check OCR output: + +* The first digit encodes the region of registration (1 Khyber + Pakhtunkhwa, 2 former FATA, 3 Punjab, 4 Sindh, 5 Balochistan, + 6 Islamabad, 7 Gilgit-Baltistan, 8 Azad Jammu & Kashmir in practice). + 0 and 9 do not occur. +* The last digit encodes gender: odd for male, even for female. + +Neither is a checksum, so a substituted middle digit cannot be detected. +That is why CNIC digits are also re-read from a tight crop with a digit-only +allowlist and compared across reads before being reported as ``ok``. +""" + +from __future__ import annotations + +import re +from dataclasses import dataclass +from typing import Optional + +from docling_pk.validation.text import fix_digits + +REGION_CODES = { + "1": "Khyber Pakhtunkhwa", + "2": "Federally Administered Tribal Areas", + "3": "Punjab", + "4": "Sindh", + "5": "Balochistan", + "6": "Islamabad Capital Territory", + "7": "Gilgit-Baltistan", + "8": "Azad Jammu and Kashmir", +} + +_SEP = r"[\s\-_.:,`~'–—=]{0,3}" +#: 5-7-1 digit groups with tolerant separators, after look-alike correction. +CNIC_GROUPED = re.compile(rf"(? bool: + return self.number is not None and not self.problems + + +def format_cnic(digits: str) -> str: + """Formats 13 digits as ``XXXXX-XXXXXXX-X``.""" + return f"{digits[:5]}-{digits[5:12]}-{digits[12]}" + + +def find_cnic(text: str) -> Optional[str]: + """Finds the first CNIC-shaped number in ``text``. + + Tolerates the separator misreads seen in real OCR output (``_ : . `` and + spaces) and letter-for-digit confusions (``O`` for ``0`` etc.). + + Example: + >>> find_cnic("Identity Number 35202-1234567.1") + '35202-1234567-1' + >>> find_cnic("no number here") is None + True + """ + for token_text in (text, fix_digits(text, 0.6)): + m = CNIC_GROUPED.search(token_text) + if m: + return format_cnic(m.group(1) + m.group(2) + m.group(3)) + m = CNIC_PLAIN.search(token_text) + if m: + return format_cnic(m.group(1)) + m = CNIC_DASH_ANCHORED.search(fix_digits(text, 0.6)) + if m: + return format_cnic(m.group(1) + m.group(2) + m.group(3)) + return None + + +def check_cnic(number: Optional[str]) -> CNICCheck: + """Validates a formatted CNIC number's structure. + + Example: + >>> check_cnic("35202-1234567-9").valid + True + >>> check_cnic("95202-1234567-9").problems + ('first digit 9 is not a valid region code',) + """ + if not number: + return CNICCheck(None, None, None, ("missing",)) + digits = re.sub(r"[^0-9]", "", number) + if len(digits) != 13: + return CNICCheck(None, None, None, (f"expected 13 digits, got {len(digits)}",)) + problems = [] + region = REGION_CODES.get(digits[0]) + if region is None: + problems.append(f"first digit {digits[0]} is not a valid region code") + return CNICCheck(format_cnic(digits), region, digits[-1], tuple(problems)) + + +def gender_from_cnic(number: Optional[str]) -> Optional[str]: + """Infers gender from the last digit: odd is ``"M"``, even is ``"F"``. + + Example: + >>> gender_from_cnic("35202-1234567-9") + 'M' + """ + if not number: + return None + digits = re.sub(r"[^0-9]", "", number) + if len(digits) != 13: + return None + return "M" if int(digits[-1]) % 2 == 1 else "F" diff --git a/src/docling_pk/validation/dates.py b/src/docling_pk/validation/dates.py new file mode 100644 index 0000000..f6adfe7 --- /dev/null +++ b/src/docling_pk/validation/dates.py @@ -0,0 +1,136 @@ +""" +Date parsing for the formats printed on Pakistani documents. + +All dates are normalized to ``DD-MM-YYYY`` (the format used in the project +brief and familiar to Pakistani users). ``FieldResult.as_date()`` converts +that to :class:`datetime.date` when a real date object is needed. + +Formats seen on real documents: + +* ``14.02.2004`` CNIC (OCR also produces ``14,02.2004`` and ``14.02 2004``) +* ``14-02-2004`` board certificates (date of birth) +* ``14-Feb-2004`` university transcripts +* ``February 22, 2022`` / ``Feb 01, 2024`` certificate issue dates +* ``20th July 2026`` degree issuance dates +""" + +from __future__ import annotations + +import datetime as _dt +import re +from typing import List, Optional + +from rapidfuzz import process + +from docling_pk.validation.text import fix_digits + +MONTHS = { + "january": 1, + "february": 2, + "march": 3, + "april": 4, + "may": 5, + "june": 6, + "july": 7, + "august": 8, + "september": 9, + "october": 10, + "november": 11, + "december": 12, +} +_MONTH_KEYS = list(MONTHS) + [m[:3] for m in MONTHS] + ["sept"] + +MIN_YEAR, MAX_YEAR = 1900, 2100 + +_NUMERIC = re.compile( + r"(? Optional[int]: + w = word.lower().strip(".") + if w in MONTHS: + return MONTHS[w] + if len(w) < 3: + return None + match = process.extractOne(w, _MONTH_KEYS, score_cutoff=75) + if not match: + return None + key = match[0] + if key == "sept": + return 9 + for name, num in MONTHS.items(): + if name.startswith(key[:3]): + return num + return None # pragma: no cover + + +def _build(day: int, month: int, year: int) -> Optional[str]: + if not (MIN_YEAR <= year <= MAX_YEAR): + return None + try: + _dt.date(year, month, day) + except ValueError: + return None + return f"{day:02d}-{month:02d}-{year:04d}" + + +def parse_date(text: str) -> Optional[str]: + """Parses the first date in ``text`` into ``DD-MM-YYYY``. + + Returns ``None`` if no valid calendar date is found (``31.02.2003`` is + rejected rather than silently corrected). + + Example: + >>> parse_date("Date of Birth 14.02.2004") + '14-02-2004' + >>> parse_date("Islamabad Dated February 22, 2022") + '22-02-2022' + >>> parse_date("20th July 2026") + '20-07-2026' + """ + found = find_dates(text) + return found[0] if found else None + + +def find_dates(text: str) -> List[str]: + """All valid dates in ``text``, in order of appearance, as ``DD-MM-YYYY``.""" + hits = [] + for m in _NUMERIC.finditer(text): + d, mo, y = (fix_digits(g, 0.0) for g in m.groups()) + try: + value = _build(int(d), int(mo), int(y)) + except ValueError: + value = None + if value: + hits.append((m.start(), value)) + for m in _DAY_MON_YEAR.finditer(text): + month = _month_number(m.group(2)) + if month: + value = _build(int(m.group(1)), month, int(m.group(3))) + if value: + hits.append((m.start(), value)) + for m in _MON_DAY_YEAR.finditer(text): + month = _month_number(m.group(1)) + if month: + value = _build(int(m.group(2)), month, int(m.group(3))) + if value: + hits.append((m.start(), value)) + hits.sort() + out: List[str] = [] + for _, v in hits: + if v not in out: + out.append(v) + return out + + +def to_date(value: Optional[str]) -> Optional[_dt.date]: + """Converts a ``DD-MM-YYYY`` string to :class:`datetime.date`.""" + if not value: + return None + try: + return _dt.datetime.strptime(value, "%d-%m-%Y").date() + except ValueError: + return None diff --git a/src/docling_pk/validation/marks.py b/src/docling_pk/validation/marks.py new file mode 100644 index 0000000..1b46e04 --- /dev/null +++ b/src/docling_pk/validation/marks.py @@ -0,0 +1,135 @@ +""" +Marks-table validation for board certificates. + +Board certificates carry two independent copies of the total: the TOTAL row +of the marks table and the "Marks in words" line. They also carry per-subject +marks that must add up to the total. Together these give a free consistency +check that catches most single-digit OCR errors in the numbers that matter +most for admissions. +""" + +from __future__ import annotations + +import re +from typing import Iterable, Optional, Sequence, Tuple + +from rapidfuzz import process + +_UNITS = { + "zero": 0, + "one": 1, + "two": 2, + "three": 3, + "four": 4, + "five": 5, + "six": 6, + "seven": 7, + "eight": 8, + "nine": 9, + "ten": 10, + "eleven": 11, + "twelve": 12, + "thirteen": 13, + "fourteen": 14, + "fifteen": 15, + "sixteen": 16, + "seventeen": 17, + "eighteen": 18, + "nineteen": 19, +} +_TENS = { + "twenty": 20, + "thirty": 30, + "forty": 40, + "fourty": 40, + "fifty": 50, + "sixty": 60, + "seventy": 70, + "eighty": 80, + "ninety": 90, +} +_SCALES = {"hundred": 100, "thousand": 1000} +_VOCAB = list(_UNITS) + list(_TENS) + list(_SCALES) +_IGNORED = {"and", "only", "marks"} + + +def _canonical_word(word: str) -> Optional[str]: + w = word.lower() + if w in _UNITS or w in _TENS or w in _SCALES: + return w + if w in _IGNORED or len(w) < 3: + return None + hit = process.extractOne(w, _VOCAB, score_cutoff=80) + return hit[0] if hit else None + + +def words_to_number(text: str) -> Optional[int]: + """Converts English number words to an integer, tolerating OCR typos. + + Example: + >>> words_to_number("Seven Hundred Eighty Seven") + 787 + >>> words_to_number("EIGHT HUNDRED EIGHTY-TWO") + 882 + >>> words_to_number("Five Hundred Fiffy Four") + 554 + >>> words_to_number("no numbers here") is None + True + """ + words = [w for w in re.split(r"[^A-Za-z]+", text) if w] + total, current, seen = 0, 0, False + for raw in words: + w = _canonical_word(raw) + if w is None: + continue + seen = True + if w in _UNITS: + current += _UNITS[w] + elif w in _TENS: + current += _TENS[w] + elif w == "hundred": + current = max(current, 1) * 100 + elif w == "thousand": + total += max(current, 1) * 1000 + current = 0 + return total + current if seen else None + + +def check_subjects( + rows: Sequence[Tuple[str, Optional[int], Optional[int]]], + total_max: Optional[int], + total_obtained: Optional[int], +) -> Tuple[bool, list]: + """Checks subject rows against the totals. + + Args: + rows: ``(subject, max_marks, obtained_marks)`` tuples. + + Returns: + ``(consistent, problems)``. ``consistent`` is ``True`` only if every + row is complete, no obtained mark exceeds its maximum, and both + column sums equal the printed totals. + """ + problems = [] + if not rows: + return False, ["no subject rows found"] + for name, mx, ob in rows: + if mx is None or ob is None: + problems.append(f"{name}: incomplete row") + elif ob > mx: + problems.append(f"{name}: obtained {ob} exceeds maximum {mx}") + if problems: + return False, problems + sum_max = sum(r[1] for r in rows) # type: ignore[misc] + sum_ob = sum(r[2] for r in rows) # type: ignore[misc] + if total_max is not None and sum_max != total_max: + problems.append(f"maximum marks add up to {sum_max}, total says {total_max}") + if total_obtained is not None and sum_ob != total_obtained: + problems.append(f"obtained marks add up to {sum_ob}, total says {total_obtained}") + return not problems, problems + + +def agree(values: Iterable[Optional[int]]) -> Optional[int]: + """Returns the value if all non-``None`` values are equal, else ``None``.""" + vals = {v for v in values if v is not None} + return vals.pop() if len(vals) == 1 else None diff --git a/src/docling_pk/validation/text.py b/src/docling_pk/validation/text.py new file mode 100644 index 0000000..722765a --- /dev/null +++ b/src/docling_pk/validation/text.py @@ -0,0 +1,76 @@ +"""Character-level cleanup for OCR output in numeric contexts.""" + +from __future__ import annotations + +import re + +#: Letters OCR engines commonly produce in place of digits. Only applied to +#: tokens that are already mostly digits, never to free text. +DIGIT_CONFUSIONS = str.maketrans( + { + "O": "0", + "o": "0", + "Q": "0", + "D": "0", + "U": "0", + "I": "1", + "l": "1", + "|": "1", + "i": "1", + "L": "1", + "!": "1", + "J": "1", + "]": "1", + "[": "1", + "Z": "2", + "z": "2", + "S": "5", + "s": "5", + "$": "5", + "G": "6", + "b": "6", + "T": "7", + "B": "8", + "g": "9", + "q": "9", + } +) + +#: Arabic-Indic and Extended Arabic-Indic digits (Urdu uses the extended set). +_EASTERN_DIGITS = str.maketrans("٠١٢٣٤٥٦٧٨٩۰۱۲۳۴۵۶۷۸۹", "01234567890123456789") + +_ASCII_DIGIT = re.compile(r"[0-9]") + + +def eastern_to_ascii_digits(text: str) -> str: + """Converts Arabic-Indic / Urdu digits to ASCII digits. + + Done explicitly and up front so the rest of the code can match with + ``[0-9]``: Python's ``\\d`` and ``int()`` silently accept Unicode digits, + which would let a garbled read parse as a different number. + """ + return text.translate(_EASTERN_DIGITS) + + +def fix_digits(token: str, min_digit_ratio: float = 0.5) -> str: + """Maps letter look-alikes to digits inside a mostly-numeric token. + + Example: + >>> fix_digits("6543O1") + '654301' + >>> fix_digits("Name") + 'Name' + """ + token = eastern_to_ascii_digits(token) + core = re.sub(r"[\s\-._,:/]", "", token) + if not core: + return token + ratio = len(_ASCII_DIGIT.findall(core)) / len(core) + if ratio < min_digit_ratio: + return token + return token.translate(DIGIT_CONFUSIONS) + + +def digits_only(text: str) -> str: + """Keeps ASCII digits only (after look-alike correction).""" + return re.sub(r"[^0-9]", "", fix_digits(text, 0.0)) diff --git a/src/docling_pk/vision/__init__.py b/src/docling_pk/vision/__init__.py new file mode 100644 index 0000000..814bf6f --- /dev/null +++ b/src/docling_pk/vision/__init__.py @@ -0,0 +1 @@ +"""Image loading, quality checks and geometry.""" diff --git a/src/docling_pk/vision/geometry.py b/src/docling_pk/vision/geometry.py new file mode 100644 index 0000000..6be98bc --- /dev/null +++ b/src/docling_pk/vision/geometry.py @@ -0,0 +1,103 @@ +""" +Geometric normalization: resizing, right-angle rotation and skew correction. + +Skew is estimated from the OCR engine's own text-line polygons rather than +from dark pixels. The original ``_deskew`` used ``cv2.minAreaRect`` over +every dark pixel in the frame; on real photos it returned -90 degrees for +15 of 16 samples (a no-op) because the background, the photo and the +document edges dominate the pixel set, and on OpenCV >= 4.5 the angle +convention changed so the correction formula was wrong anyway. Text lines +are exactly the structure we want horizontal, and the OCR detector already +finds them while ignoring backgrounds such as striped fabric. +""" + +from __future__ import annotations + +import math +from typing import Sequence, Tuple + +import cv2 +import numpy as np + +from docling_pk.ocr.base import TextBox + + +def resize_long_side(image: np.ndarray, target: int) -> Tuple[np.ndarray, float]: + """Scales ``image`` so its long side equals ``target``. + + Returns: + ``(resized, scale)`` where ``scale`` maps original to resized pixels. + """ + h, w = image.shape[:2] + scale = target / float(max(h, w)) + if abs(scale - 1.0) < 1e-3: + return image, 1.0 + interp = cv2.INTER_AREA if scale < 1 else cv2.INTER_CUBIC + return cv2.resize(image, None, fx=scale, fy=scale, interpolation=interp), scale + + +def rotate_right_angle(image: np.ndarray, quarter_turns_ccw: int) -> np.ndarray: + """Rotates by a multiple of 90 degrees counter-clockwise (lossless).""" + k = quarter_turns_ccw % 4 + if k == 0: + return image + codes = {1: cv2.ROTATE_90_COUNTERCLOCKWISE, 2: cv2.ROTATE_180, 3: cv2.ROTATE_90_CLOCKWISE} + return cv2.rotate(image, codes[k]) + + +def rotate_bound(image: np.ndarray, angle_deg: float) -> np.ndarray: + """Rotates counter-clockwise by ``angle_deg``, enlarging the canvas so no + corner is cropped. Border pixels are replicated, not black, so the OCR + detector does not see a hard artificial edge.""" + if abs(angle_deg) < 0.05: + return image + h, w = image.shape[:2] + m = cv2.getRotationMatrix2D((w / 2.0, h / 2.0), angle_deg, 1.0) + cos, sin = abs(m[0, 0]), abs(m[0, 1]) + nw, nh = int(h * sin + w * cos), int(h * cos + w * sin) + m[0, 2] += nw / 2.0 - w / 2.0 + m[1, 2] += nh / 2.0 - h / 2.0 + return cv2.warpAffine(image, m, (nw, nh), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE) + + +def estimate_skew(boxes: Sequence[TextBox], min_aspect: float = 2.5) -> float: + """Estimates document skew in degrees from text-line polygons. + + Only clearly horizontal-ish, elongated boxes vote; the result is the + confidence-weighted median of their top-edge angles. Positive means the + text rises to the right; ``rotate_bound(image, -skew)`` levels it. + Returns 0.0 when there is not enough evidence. + """ + angles, weights = [], [] + for b in boxes: + if len(b.polygon) < 4: + continue + (x0, y0), (x1, y1) = b.polygon[0], b.polygon[1] + dx, dy = x1 - x0, y1 - y0 + length = math.hypot(dx, dy) + if length < 1 or b.height < 1 or length / max(b.height, 1.0) < min_aspect: + continue + a = math.degrees(math.atan2(-dy, dx)) + if abs(a) > 30: + continue + angles.append(a) + weights.append(length * max(b.confidence, 0.05)) + if len(angles) < 3: + return 0.0 + order = np.argsort(angles) + sorted_angles = np.asarray(angles)[order] + w = np.asarray(weights)[order] + cum = np.cumsum(w) + return float(sorted_angles[np.searchsorted(cum, cum[-1] / 2.0)]) + + +def crop_box(image: np.ndarray, box: TextBox, pad_x: float = 0.25, pad_y: float = 0.25) -> np.ndarray: + """Crops a text box with padding proportional to its height.""" + h, w = image.shape[:2] + py = box.height * pad_y + px = box.height * pad_x + x0 = int(max(0, math.floor(box.x0 - px))) + x1 = int(min(w, math.ceil(box.x1 + px))) + y0 = int(max(0, math.floor(box.y0 - py))) + y1 = int(min(h, math.ceil(box.y1 + py))) + return image[y0:y1, x0:x1] diff --git a/src/docling_pk/vision/image_io.py b/src/docling_pk/vision/image_io.py new file mode 100644 index 0000000..e29066d --- /dev/null +++ b/src/docling_pk/vision/image_io.py @@ -0,0 +1,138 @@ +""" +Loading documents into images. + +Accepts file paths (images or PDFs), raw bytes, NumPy arrays and PIL images, +so the library works the same whether the caller has a file on disk, an +upload from a web form, or a frame already in memory. + +Paths are read with ``np.fromfile`` + ``cv2.imdecode`` rather than +``cv2.imread`` because ``cv2.imread`` silently returns ``None`` for paths +with non-ASCII characters on Windows (for example a folder named in Urdu), +which would surface as a misleading "not a valid image" error. +""" + +from __future__ import annotations + +import os +from pathlib import Path +from typing import Any, List, Union + +import cv2 +import numpy as np + +from docling_pk.errors import ImageLoadError + +ImageSource = Union[str, "os.PathLike[str]", bytes, bytearray, np.ndarray, Any] + +PDF_SUFFIXES = {".pdf"} +PDF_RENDER_DPI = 200 + + +def load_pages(source: ImageSource, max_pages: int = 10) -> List[np.ndarray]: + """Loads a document as a list of BGR ``uint8`` images, one per page. + + Args: + source: A path to an image or PDF, the file's bytes, a NumPy array + (grayscale, BGR or BGRA) or a ``PIL.Image.Image``. + max_pages: Upper bound on PDF pages rendered. + + Raises: + FileNotFoundError: If ``source`` is a path that does not exist. + ImageLoadError: If the data cannot be decoded as an image or PDF. + ``ImageLoadError`` is a ``ValueError`` subclass. + """ + if isinstance(source, np.ndarray): + return [_normalize_array(source)] + + if _is_pil_image(source): + rgb = np.asarray(source.convert("RGB")) # type: ignore[union-attr] + return [cv2.cvtColor(rgb, cv2.COLOR_RGB2BGR)] + + if isinstance(source, (bytes, bytearray)): + data = bytes(source) + if data[:5] == b"%PDF-": + return _render_pdf(data, max_pages) + return [_decode(np.frombuffer(data, dtype=np.uint8), "")] + + if isinstance(source, (str, os.PathLike)): + path = Path(source) + if not path.exists(): + raise FileNotFoundError(f"Image not found: {path}") + if not path.is_file(): + raise ImageLoadError(f"Not a file: {path}") + if path.suffix.lower() in PDF_SUFFIXES: + return _render_pdf(path.read_bytes(), max_pages) + return [_decode(np.fromfile(str(path), dtype=np.uint8), str(path))] + + raise TypeError( + f"Unsupported input type {type(source).__name__}; pass a path, bytes, a NumPy array or a PIL image." + ) + + +def load_image(source: ImageSource) -> np.ndarray: + """Loads the first page of ``source`` as a BGR ``uint8`` image. + + Example: + >>> img = load_image(np.zeros((10, 10), dtype=np.uint8)) + >>> img.shape + (10, 10, 3) + """ + return load_pages(source, max_pages=1)[0] + + +def _decode(buffer: np.ndarray, label: str) -> np.ndarray: + img = cv2.imdecode(buffer, cv2.IMREAD_COLOR) if buffer.size else None + if img is None: + raise ImageLoadError( + f"Could not read image: {label}. Check the file is a valid PNG, JPEG, BMP, TIFF or WebP image (or a PDF)." + ) + return img + + +def _normalize_array(arr: np.ndarray) -> np.ndarray: + if arr.size == 0: + raise ImageLoadError("Empty image array.") + if arr.dtype != np.uint8: + if np.issubdtype(arr.dtype, np.floating) and arr.max() <= 1.0: + arr = arr * 255.0 + arr = np.clip(arr, 0, 255).astype(np.uint8) + if arr.ndim == 2: + return cv2.cvtColor(arr, cv2.COLOR_GRAY2BGR) + if arr.ndim == 3 and arr.shape[2] == 1: + return cv2.cvtColor(arr[:, :, 0], cv2.COLOR_GRAY2BGR) + if arr.ndim == 3 and arr.shape[2] == 4: + return cv2.cvtColor(arr, cv2.COLOR_BGRA2BGR) + if arr.ndim == 3 and arr.shape[2] == 3: + return np.ascontiguousarray(arr) + raise ImageLoadError(f"Unsupported image array shape {arr.shape}.") + + +def _is_pil_image(obj: Any) -> bool: + try: + from PIL import Image + except ImportError: # pragma: no cover - PIL ships with easyocr + return False + return isinstance(obj, Image.Image) + + +def _render_pdf(data: bytes, max_pages: int) -> List[np.ndarray]: + try: + import fitz # PyMuPDF + except ImportError as exc: + raise ImportError('Reading PDFs needs PyMuPDF: pip install "docling-pk[pdf]"') from exc + try: + doc = fitz.open(stream=data, filetype="pdf") + except Exception as exc: + raise ImageLoadError(f"Could not open PDF: {exc}") from exc + pages = [] + zoom = PDF_RENDER_DPI / 72.0 + with doc: + for i, page in enumerate(doc): + if i >= max_pages: + break + pix = page.get_pixmap(matrix=fitz.Matrix(zoom, zoom), alpha=False) + arr = np.frombuffer(pix.samples, dtype=np.uint8).reshape(pix.height, pix.width, pix.n) + pages.append(cv2.cvtColor(arr, cv2.COLOR_RGB2BGR if pix.n == 3 else cv2.COLOR_GRAY2BGR)) + if not pages: + raise ImageLoadError("PDF has no pages.") + return pages diff --git a/src/docling_pk/vision/quality.py b/src/docling_pk/vision/quality.py new file mode 100644 index 0000000..d8a2414 --- /dev/null +++ b/src/docling_pk/vision/quality.py @@ -0,0 +1,98 @@ +""" +Image quality signals. + +These produce *warnings*, not rejections. The original pipeline rejected any +image whose Laplacian variance was below 35, a threshold calibrated on four +photos. Laplacian variance depends heavily on resolution and content, and on +real samples that gate rejected perfectly readable photos (a clean CNIC back +scored 15.8) while accepting worse ones. Measuring at a fixed working +resolution and reporting instead of rejecting lets the OCR result decide +whether the image was usable. +""" + +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Dict, List + +import cv2 +import numpy as np + +#: Long side, in pixels, at which sharpness is measured. +SHARPNESS_REFERENCE_SIDE = 1000 + +SHARPNESS_WARN = 60.0 +DARK_WARN = 60.0 +BRIGHT_WARN = 225.0 +GLARE_WARN = 0.04 +MIN_LONG_SIDE = 640 + + +@dataclass +class QualityReport: + """Image quality measurements and the warnings they triggered.""" + + sharpness: float + brightness: float + contrast: float + glare_fraction: float + width: int + height: int + warnings: List[str] = field(default_factory=list) + + def to_dict(self) -> Dict[str, float]: + return { + "sharpness": round(self.sharpness, 1), + "brightness": round(self.brightness, 1), + "contrast": round(self.contrast, 1), + "glare_fraction": round(self.glare_fraction, 4), + "width": self.width, + "height": self.height, + } + + +def _to_gray(image: np.ndarray) -> np.ndarray: + return image if image.ndim == 2 else cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) + + +def sharpness(image: np.ndarray) -> float: + """Variance of the Laplacian at a fixed reference resolution.""" + gray = _to_gray(image) + h, w = gray.shape[:2] + scale = SHARPNESS_REFERENCE_SIDE / max(h, w) + if abs(scale - 1.0) > 0.05: + interp = cv2.INTER_AREA if scale < 1 else cv2.INTER_CUBIC + gray = cv2.resize(gray, None, fx=scale, fy=scale, interpolation=interp) + return float(cv2.Laplacian(gray, cv2.CV_64F).var()) + + +def assess(image: np.ndarray) -> QualityReport: + """Measures sharpness, exposure, contrast and glare of ``image``.""" + gray = _to_gray(image) + h, w = gray.shape[:2] + report = QualityReport( + sharpness=sharpness(gray), + brightness=float(gray.mean()), + contrast=float(gray.std()), + glare_fraction=float((gray >= 250).mean()), + width=int(w), + height=int(h), + ) + if report.sharpness < SHARPNESS_WARN: + report.warnings.append( + f"Image looks blurry (sharpness {report.sharpness:.0f}); results may be " + "incomplete. Retake the photo in focus if fields are missing." + ) + if report.brightness < DARK_WARN: + report.warnings.append("Image is very dark; use more light.") + elif report.brightness > BRIGHT_WARN: + report.warnings.append("Image is overexposed; reduce light or flash.") + # Saturated pixels on a page that is mostly white are just paper, not + # glare; only photos with a darker overall tone can show specular glare. + if report.glare_fraction > GLARE_WARN and float(np.median(gray)) < 200: + report.warnings.append( + f"Glare covers {report.glare_fraction:.0%} of the image; tilt the document or remove plastic sleeves." + ) + if max(h, w) < MIN_LONG_SIDE: + report.warnings.append(f"Low resolution ({w}x{h}); small text may be misread.") + return report From bc8362c80f64e1fa323fd56446f9470c0ed33f9c Mon Sep 17 00:00:00 2001 From: Abdul Moiz Muhammad Date: Thu, 1 Oct 2026 18:48:44 +0500 Subject: [PATCH 2/5] Test suite, synthetic fixtures and benchmark - 214 unit tests on constructed OCR layouts (no models; 92% coverage) - 42 end-to-end tests with real OCR on synthetic fixtures, including the invariant that no field is returned 'ok' with a wrong value - benchmarks/synthetic/generate.py: fabricated, clearly stamped specimens (no emblems, photos or seals); 23 committed fixtures covering clean, rotated, skewed, photographed, low-res, blurry and occluded cases - benchmarks/run_benchmark.py: accuracy, coverage, precision, ok-precision, CER, marks rows, latency - Results: synthetic report, CPU-only run, and aggregate-only real-sample summary (no personal data) --- benchmarks/results/real_samples_summary.json | 603 +++ benchmarks/results/synthetic_core_cpu.json | 3999 +++++++++++++++++ benchmarks/run_benchmark.py | 218 + benchmarks/synthetic/generate.py | 571 +++ tests/__init__.py | 0 tests/benchmark_report.json | 3999 +++++++++++++++++ tests/conftest.py | 97 + .../synthetic/00_cnic_front_clean.jpg | Bin 0 -> 89554 bytes .../synthetic/01_cnic_front_clean.jpg | Bin 0 -> 69876 bytes .../synthetic/02_cnic_front_rotated90.jpg | Bin 0 -> 99603 bytes .../synthetic/03_cnic_front_rotated270.jpg | Bin 0 -> 85875 bytes .../synthetic/04_cnic_front_upside_down.jpg | Bin 0 -> 108338 bytes .../synthetic/05_cnic_front_skewed.jpg | Bin 0 -> 112832 bytes .../synthetic/06_cnic_front_photo.jpg | Bin 0 -> 128187 bytes .../synthetic/07_cnic_front_photo.jpg | Bin 0 -> 84347 bytes .../synthetic/08_cnic_front_low_res.jpg | Bin 0 -> 13375 bytes .../synthetic/09_cnic_front_blurry.jpg | Bin 0 -> 41736 bytes .../synthetic/10_cnic_front_very_blurry.jpg | Bin 0 -> 19469 bytes .../synthetic/11_cnic_front_occluded_name.jpg | Bin 0 -> 106647 bytes .../fixtures/synthetic/12_cnic_back_clean.jpg | Bin 0 -> 26059 bytes .../fixtures/synthetic/13_cnic_back_photo.jpg | Bin 0 -> 104870 bytes tests/fixtures/synthetic/14_matric_clean.jpg | Bin 0 -> 205171 bytes .../synthetic/15_matric_rotated90.jpg | Bin 0 -> 188708 bytes tests/fixtures/synthetic/16_matric_photo.jpg | Bin 0 -> 323552 bytes .../fixtures/synthetic/17_matric_low_res.jpg | Bin 0 -> 59443 bytes .../synthetic/18_intermediate_clean.jpg | Bin 0 -> 206197 bytes .../synthetic/19_intermediate_skewed.jpg | Bin 0 -> 361272 bytes .../synthetic/20_intermediate_photo.jpg | Bin 0 -> 394674 bytes tests/fixtures/synthetic/21_degree_clean.jpg | Bin 0 -> 83250 bytes tests/fixtures/synthetic/22_degree_photo.jpg | Bin 0 -> 175336 bytes tests/fixtures/synthetic/labels.json | 755 ++++ tests/test_certificate_parser.py | 239 + tests/test_cli.py | 66 - tests/test_cnic.py | 79 - tests/test_cnic_parser.py | 230 + tests/test_degree_urdu_layout.py | 150 + tests/test_integration_ocr.py | 164 + tests/test_ocr.py | 33 - tests/test_pipeline_extractor_cli.py | 435 ++ tests/test_preprocessor.py | 49 - tests/test_schema_and_io.py | 241 + tests/test_smoke.py | 34 - tests/test_validation.py | 161 + 43 files changed, 11862 insertions(+), 261 deletions(-) create mode 100644 benchmarks/results/real_samples_summary.json create mode 100644 benchmarks/results/synthetic_core_cpu.json create mode 100644 benchmarks/run_benchmark.py create mode 100644 benchmarks/synthetic/generate.py delete mode 100644 tests/__init__.py create mode 100644 tests/benchmark_report.json create mode 100644 tests/conftest.py create mode 100644 tests/fixtures/synthetic/00_cnic_front_clean.jpg create mode 100644 tests/fixtures/synthetic/01_cnic_front_clean.jpg create mode 100644 tests/fixtures/synthetic/02_cnic_front_rotated90.jpg create mode 100644 tests/fixtures/synthetic/03_cnic_front_rotated270.jpg create mode 100644 tests/fixtures/synthetic/04_cnic_front_upside_down.jpg create mode 100644 tests/fixtures/synthetic/05_cnic_front_skewed.jpg create mode 100644 tests/fixtures/synthetic/06_cnic_front_photo.jpg create mode 100644 tests/fixtures/synthetic/07_cnic_front_photo.jpg create mode 100644 tests/fixtures/synthetic/08_cnic_front_low_res.jpg create mode 100644 tests/fixtures/synthetic/09_cnic_front_blurry.jpg create mode 100644 tests/fixtures/synthetic/10_cnic_front_very_blurry.jpg create mode 100644 tests/fixtures/synthetic/11_cnic_front_occluded_name.jpg create mode 100644 tests/fixtures/synthetic/12_cnic_back_clean.jpg create mode 100644 tests/fixtures/synthetic/13_cnic_back_photo.jpg create mode 100644 tests/fixtures/synthetic/14_matric_clean.jpg create mode 100644 tests/fixtures/synthetic/15_matric_rotated90.jpg create mode 100644 tests/fixtures/synthetic/16_matric_photo.jpg create mode 100644 tests/fixtures/synthetic/17_matric_low_res.jpg create mode 100644 tests/fixtures/synthetic/18_intermediate_clean.jpg create mode 100644 tests/fixtures/synthetic/19_intermediate_skewed.jpg create mode 100644 tests/fixtures/synthetic/20_intermediate_photo.jpg create mode 100644 tests/fixtures/synthetic/21_degree_clean.jpg create mode 100644 tests/fixtures/synthetic/22_degree_photo.jpg create mode 100644 tests/fixtures/synthetic/labels.json create mode 100644 tests/test_certificate_parser.py delete mode 100644 tests/test_cli.py delete mode 100644 tests/test_cnic.py create mode 100644 tests/test_cnic_parser.py create mode 100644 tests/test_degree_urdu_layout.py create mode 100644 tests/test_integration_ocr.py delete mode 100644 tests/test_ocr.py create mode 100644 tests/test_pipeline_extractor_cli.py delete mode 100644 tests/test_preprocessor.py create mode 100644 tests/test_schema_and_io.py delete mode 100644 tests/test_smoke.py create mode 100644 tests/test_validation.py diff --git a/benchmarks/results/real_samples_summary.json b/benchmarks/results/real_samples_summary.json new file mode 100644 index 0000000..793146c --- /dev/null +++ b/benchmarks/results/real_samples_summary.json @@ -0,0 +1,603 @@ +{ + "_note": "Aggregate results on 16 real photos of Pakistani documents (8 CNIC fronts, 2 CNIC backs, 2 Matric, 2 Intermediate, 1 degree, 1 transcript). The images and per-field values contain personal data and are NOT published; only counts are.", + "dataset": { + "images": 16, + "labelled_fields": 146, + "subject_rows": 30, + "conditions": [ + "clean photo", + "rotated 90/270", + "skewed on striped cloth", + "plastic sleeve glare", + "small and soft focus", + "motion blur", + "scanned", + "watermarked digital certificate" + ] + }, + "baseline_v0_1": { + "accuracy": 0.3493150684931507, + "by_doc_type": { + "cnic": 0.35294117647058826, + "matric": 0.6333333333333333, + "intermediate": 0.27586206896551724, + "degree": 0.0, + "transcript": 0.0 + }, + "note": "original pipeline (EasyOCR, line-order regex); its extract() could not be imported, logic replicated" + }, + "v1_core_install": { + "overall": { + "n": 142, + "accuracy": 0.9436619718309859, + "coverage": 0.971830985915493, + "precision": 0.9710144927536232, + "ok_precision": 0.9849624060150376, + "ok_count": 133 + }, + "by_doc_type": { + "cnic": { + "n": 68, + "accuracy": 0.9117647058823529, + "coverage": 0.9411764705882353, + "precision": 0.96875, + "ok_precision": 1.0, + "ok_count": 59 + }, + "degree": { + "n": 9, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 9 + }, + "intermediate": { + "n": 27, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 27 + }, + "matric": { + "n": 28, + "accuracy": 0.9642857142857143, + "coverage": 1.0, + "precision": 0.9642857142857143, + "ok_precision": 0.9642857142857143, + "ok_count": 28 + }, + "transcript": { + "n": 10, + "accuracy": 0.9, + "coverage": 1.0, + "precision": 0.9, + "ok_precision": 0.9, + "ok_count": 10 + } + }, + "by_field": { + "cnic.address": { + "accuracy": 0.0, + "n": 2 + }, + "cnic.cnic_number": { + "accuracy": 0.9, + "n": 10 + }, + "cnic.country_of_stay": { + "accuracy": 0.875, + "n": 8 + }, + "cnic.date_of_birth": { + "accuracy": 1.0, + "n": 8 + }, + "cnic.date_of_expiry": { + "accuracy": 1.0, + "n": 8 + }, + "cnic.date_of_issue": { + "accuracy": 1.0, + "n": 8 + }, + "cnic.father_name": { + "accuracy": 0.875, + "n": 8 + }, + "cnic.gender": { + "accuracy": 1.0, + "n": 8 + }, + "cnic.name": { + "accuracy": 0.875, + "n": 8 + }, + "degree.campus": { + "accuracy": 1.0, + "n": 1 + }, + "degree.date_of_issue": { + "accuracy": 1.0, + "n": 1 + }, + "degree.degree": { + "accuracy": 1.0, + "n": 1 + }, + "degree.father_name": { + "accuracy": 1.0, + "n": 1 + }, + "degree.institution": { + "accuracy": 1.0, + "n": 1 + }, + "degree.registration_number": { + "accuracy": 1.0, + "n": 1 + }, + "degree.serial_number": { + "accuracy": 1.0, + "n": 1 + }, + "degree.student_name": { + "accuracy": 1.0, + "n": 1 + }, + "degree.year": { + "accuracy": 1.0, + "n": 1 + }, + "intermediate.board": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.certificate_number": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.date_of_birth": { + "accuracy": 1.0, + "n": 1 + }, + "intermediate.father_name": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.grade": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.group": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.institute": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.max_marks": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.registration_number": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.roll_number": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.serial_number": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.student_name": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.total_marks": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.year": { + "accuracy": 1.0, + "n": 2 + }, + "matric.board": { + "accuracy": 1.0, + "n": 2 + }, + "matric.certificate_number": { + "accuracy": 1.0, + "n": 2 + }, + "matric.date_of_birth": { + "accuracy": 1.0, + "n": 2 + }, + "matric.father_name": { + "accuracy": 1.0, + "n": 2 + }, + "matric.grade": { + "accuracy": 1.0, + "n": 2 + }, + "matric.group": { + "accuracy": 1.0, + "n": 2 + }, + "matric.institute": { + "accuracy": 0.5, + "n": 2 + }, + "matric.max_marks": { + "accuracy": 1.0, + "n": 2 + }, + "matric.registration_number": { + "accuracy": 1.0, + "n": 2 + }, + "matric.roll_number": { + "accuracy": 1.0, + "n": 2 + }, + "matric.serial_number": { + "accuracy": 1.0, + "n": 2 + }, + "matric.student_name": { + "accuracy": 1.0, + "n": 2 + }, + "matric.total_marks": { + "accuracy": 1.0, + "n": 2 + }, + "matric.year": { + "accuracy": 1.0, + "n": 2 + }, + "transcript.campus": { + "accuracy": 1.0, + "n": 1 + }, + "transcript.cgpa": { + "accuracy": 1.0, + "n": 1 + }, + "transcript.date_of_birth": { + "accuracy": 1.0, + "n": 1 + }, + "transcript.date_of_issue": { + "accuracy": 1.0, + "n": 1 + }, + "transcript.degree": { + "accuracy": 1.0, + "n": 1 + }, + "transcript.father_name": { + "accuracy": 1.0, + "n": 1 + }, + "transcript.institution": { + "accuracy": 1.0, + "n": 1 + }, + "transcript.registration_number": { + "accuracy": 0.0, + "n": 1 + }, + "transcript.student_name": { + "accuracy": 1.0, + "n": 1 + }, + "transcript.year": { + "accuracy": 1.0, + "n": 1 + } + }, + "subjects": { + "rows_correct": 30, + "rows_expected": 30, + "rows_returned": 30 + }, + "seconds_per_document": { + "mean": 3.3218988687499995, + "max": 9.456651 + } + }, + "v1_full_install": { + "overall": { + "n": 142, + "accuracy": 0.9436619718309859, + "coverage": 0.9788732394366197, + "precision": 0.9640287769784173, + "ok_precision": 0.9923664122137404, + "ok_count": 131 + }, + "by_doc_type": { + "cnic": { + "n": 68, + "accuracy": 0.9117647058823529, + "coverage": 0.9558823529411765, + "precision": 0.9538461538461539, + "ok_precision": 1.0, + "ok_count": 59 + }, + "degree": { + "n": 9, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 8 + }, + "intermediate": { + "n": 27, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 27 + }, + "matric": { + "n": 28, + "accuracy": 0.9642857142857143, + "coverage": 1.0, + "precision": 0.9642857142857143, + "ok_precision": 0.9642857142857143, + "ok_count": 28 + }, + "transcript": { + "n": 10, + "accuracy": 0.9, + "coverage": 1.0, + "precision": 0.9, + "ok_precision": 1.0, + "ok_count": 9 + } + }, + "by_field": { + "cnic.address": { + "accuracy": 0.0, + "n": 2 + }, + "cnic.cnic_number": { + "accuracy": 0.9, + "n": 10 + }, + "cnic.country_of_stay": { + "accuracy": 0.875, + "n": 8 + }, + "cnic.date_of_birth": { + "accuracy": 1.0, + "n": 8 + }, + "cnic.date_of_expiry": { + "accuracy": 1.0, + "n": 8 + }, + "cnic.date_of_issue": { + "accuracy": 1.0, + "n": 8 + }, + "cnic.father_name": { + "accuracy": 0.875, + "n": 8 + }, + "cnic.gender": { + "accuracy": 1.0, + "n": 8 + }, + "cnic.name": { + "accuracy": 0.875, + "n": 8 + }, + "degree.campus": { + "accuracy": 1.0, + "n": 1 + }, + "degree.date_of_issue": { + "accuracy": 1.0, + "n": 1 + }, + "degree.degree": { + "accuracy": 1.0, + "n": 1 + }, + "degree.father_name": { + "accuracy": 1.0, + "n": 1 + }, + "degree.institution": { + "accuracy": 1.0, + "n": 1 + }, + "degree.registration_number": { + "accuracy": 1.0, + "n": 1 + }, + "degree.serial_number": { + "accuracy": 1.0, + "n": 1 + }, + "degree.student_name": { + "accuracy": 1.0, + "n": 1 + }, + "degree.year": { + "accuracy": 1.0, + "n": 1 + }, + "intermediate.board": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.certificate_number": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.date_of_birth": { + "accuracy": 1.0, + "n": 1 + }, + "intermediate.father_name": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.grade": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.group": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.institute": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.max_marks": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.registration_number": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.roll_number": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.serial_number": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.student_name": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.total_marks": { + "accuracy": 1.0, + "n": 2 + }, + "intermediate.year": { + "accuracy": 1.0, + "n": 2 + }, + "matric.board": { + "accuracy": 1.0, + "n": 2 + }, + "matric.certificate_number": { + "accuracy": 1.0, + "n": 2 + }, + "matric.date_of_birth": { + "accuracy": 1.0, + "n": 2 + }, + "matric.father_name": { + "accuracy": 1.0, + "n": 2 + }, + "matric.grade": { + "accuracy": 1.0, + "n": 2 + }, + "matric.group": { + "accuracy": 1.0, + "n": 2 + }, + "matric.institute": { + "accuracy": 0.5, + "n": 2 + }, + "matric.max_marks": { + "accuracy": 1.0, + "n": 2 + }, + "matric.registration_number": { + "accuracy": 1.0, + "n": 2 + }, + "matric.roll_number": { + "accuracy": 1.0, + "n": 2 + }, + "matric.serial_number": { + "accuracy": 1.0, + "n": 2 + }, + "matric.student_name": { + "accuracy": 1.0, + "n": 2 + }, + "matric.total_marks": { + "accuracy": 1.0, + "n": 2 + }, + "matric.year": { + "accuracy": 1.0, + "n": 2 + }, + "transcript.campus": { + "accuracy": 1.0, + "n": 1 + }, + "transcript.cgpa": { + "accuracy": 1.0, + "n": 1 + }, + "transcript.date_of_birth": { + "accuracy": 1.0, + "n": 1 + }, + "transcript.date_of_issue": { + "accuracy": 1.0, + "n": 1 + }, + "transcript.degree": { + "accuracy": 1.0, + "n": 1 + }, + "transcript.father_name": { + "accuracy": 1.0, + "n": 1 + }, + "transcript.institution": { + "accuracy": 1.0, + "n": 1 + }, + "transcript.registration_number": { + "accuracy": 0.0, + "n": 1 + }, + "transcript.student_name": { + "accuracy": 1.0, + "n": 1 + }, + "transcript.year": { + "accuracy": 1.0, + "n": 1 + } + }, + "subjects": { + "rows_correct": 30, + "rows_expected": 30, + "rows_returned": 30 + }, + "seconds_per_document": { + "mean": 3.710477887499792, + "max": 9.105147599999327 + } + } +} \ No newline at end of file diff --git a/benchmarks/results/synthetic_core_cpu.json b/benchmarks/results/synthetic_core_cpu.json new file mode 100644 index 0000000..8af59a8 --- /dev/null +++ b/benchmarks/results/synthetic_core_cpu.json @@ -0,0 +1,3999 @@ +{ + "labels": "labels.json", + "backend": "rapidocr", + "overall": { + "n": 213, + "accuracy": 0.9624413145539906, + "coverage": 0.9624413145539906, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 205 + }, + "by_doc_type": { + "cnic": { + "n": 97, + "accuracy": 0.9175257731958762, + "coverage": 0.9175257731958762, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 89 + }, + "degree": { + "n": 18, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 18 + }, + "intermediate": { + "n": 42, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 42 + }, + "matric": { + "n": 56, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 56 + } + }, + "by_field": { + "cnic.cnic_number": { + "n": 14, + "accuracy": 0.9285714285714286, + "coverage": 0.9285714285714286, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 13 + }, + "cnic.country_of_stay": { + "n": 12, + "accuracy": 0.9166666666666666, + "coverage": 0.9166666666666666, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 11 + }, + "cnic.date_of_birth": { + "n": 12, + "accuracy": 0.9166666666666666, + "coverage": 0.9166666666666666, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 11 + }, + "cnic.date_of_expiry": { + "n": 12, + "accuracy": 0.9166666666666666, + "coverage": 0.9166666666666666, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 11 + }, + "cnic.date_of_issue": { + "n": 12, + "accuracy": 0.9166666666666666, + "coverage": 0.9166666666666666, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 11 + }, + "cnic.father_name": { + "n": 12, + "accuracy": 0.9166666666666666, + "coverage": 0.9166666666666666, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 11 + }, + "cnic.gender": { + "n": 12, + "accuracy": 0.9166666666666666, + "coverage": 0.9166666666666666, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 11 + }, + "cnic.name": { + "n": 11, + "accuracy": 0.9090909090909091, + "coverage": 0.9090909090909091, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 10 + }, + "degree.cgpa": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 2 + }, + "degree.date_of_issue": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 2 + }, + "degree.degree": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 2 + }, + "degree.father_name": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 2 + }, + "degree.institution": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 2 + }, + "degree.registration_number": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 2 + }, + "degree.serial_number": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 2 + }, + "degree.student_name": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 2 + }, + "degree.year": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 2 + }, + "intermediate.board": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.certificate_number": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.date_of_birth": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.father_name": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.grade": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.group": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.institute": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.max_marks": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.registration_number": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.roll_number": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.serial_number": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.student_name": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.total_marks": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.year": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "matric.board": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.certificate_number": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.date_of_birth": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.father_name": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.grade": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.group": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.institute": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.max_marks": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.registration_number": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.roll_number": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.serial_number": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.student_name": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.total_marks": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.year": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + } + }, + "subjects": { + "rows_correct": 53, + "rows_expected": 53, + "rows_returned": 53 + }, + "seconds_per_document": { + "mean": 2.511810191304348, + "max": 5.543541900000001 + }, + "cases": [ + { + "id": "00_cnic_front_clean", + "correct": 8, + "total": 8, + "seconds": 2.29, + "error": null + }, + { + "id": "01_cnic_front_clean", + "correct": 8, + "total": 8, + "seconds": 1.44, + "error": null + }, + { + "id": "02_cnic_front_rotated90", + "correct": 8, + "total": 8, + "seconds": 2.95, + "error": null + }, + { + "id": "03_cnic_front_rotated270", + "correct": 8, + "total": 8, + "seconds": 3.0, + "error": null + }, + { + "id": "04_cnic_front_upside_down", + "correct": 8, + "total": 8, + "seconds": 2.8, + "error": null + }, + { + "id": "05_cnic_front_skewed", + "correct": 8, + "total": 8, + "seconds": 3.13, + "error": null + }, + { + "id": "06_cnic_front_photo", + "correct": 8, + "total": 8, + "seconds": 1.61, + "error": null + }, + { + "id": "07_cnic_front_photo", + "correct": 8, + "total": 8, + "seconds": 1.36, + "error": null + }, + { + "id": "08_cnic_front_low_res", + "correct": 8, + "total": 8, + "seconds": 1.59, + "error": null + }, + { + "id": "09_cnic_front_blurry", + "correct": 8, + "total": 8, + "seconds": 1.39, + "error": null + }, + { + "id": "10_cnic_front_very_blurry", + "correct": 0, + "total": 8, + "seconds": 1.88, + "error": null + }, + { + "id": "11_cnic_front_occluded_name", + "correct": 7, + "total": 7, + "seconds": 1.51, + "error": null + }, + { + "id": "12_cnic_back_clean", + "correct": 1, + "total": 1, + "seconds": 2.3, + "error": null + }, + { + "id": "13_cnic_back_photo", + "correct": 1, + "total": 1, + "seconds": 3.13, + "error": null + }, + { + "id": "14_matric_clean", + "correct": 14, + "total": 14, + "seconds": 3.0, + "error": null + }, + { + "id": "15_matric_rotated90", + "correct": 14, + "total": 14, + "seconds": 5.54, + "error": null + }, + { + "id": "16_matric_photo", + "correct": 14, + "total": 14, + "seconds": 2.68, + "error": null + }, + { + "id": "17_matric_low_res", + "correct": 14, + "total": 14, + "seconds": 2.5, + "error": null + }, + { + "id": "18_intermediate_clean", + "correct": 14, + "total": 14, + "seconds": 2.79, + "error": null + }, + { + "id": "19_intermediate_skewed", + "correct": 14, + "total": 14, + "seconds": 4.98, + "error": null + }, + { + "id": "20_intermediate_photo", + "correct": 14, + "total": 14, + "seconds": 2.56, + "error": null + }, + { + "id": "21_degree_clean", + "correct": 9, + "total": 9, + "seconds": 1.71, + "error": null + }, + { + "id": "22_degree_photo", + "correct": 9, + "total": 9, + "seconds": 1.65, + "error": null + } + ], + "mean_cer_text_fields": 0.038461538461538464, + "rows": [ + { + "case": "00_cnic_front_clean", + "doc_type": "cnic", + "field": "name", + "expected": "Mahnoor Nawaz", + "actual": "Mahnoor Nawaz", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": 0.0, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "00_cnic_front_clean", + "doc_type": "cnic", + "field": "father_name", + "expected": "Ahmed Butt", + "actual": "Ahmed Butt", + "status": "ok", + "correct": true, + "confidence": 0.9983, + "cer": 0.0, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "00_cnic_front_clean", + "doc_type": "cnic", + "field": "gender", + "expected": "F", + "actual": "F", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "00_cnic_front_clean", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "00_cnic_front_clean", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "59869-8797309-2", + "actual": "59869-8797309-2", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "00_cnic_front_clean", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "08-12-1959", + "actual": "08-12-1959", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "00_cnic_front_clean", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "11-06-2018", + "actual": "11-06-2018", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "00_cnic_front_clean", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "11-06-2023", + "actual": "11-06-2023", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "01_cnic_front_clean", + "doc_type": "cnic", + "field": "name", + "expected": "Iqra Siddiqui", + "actual": "Iqra Siddiqui", + "status": "ok", + "correct": true, + "confidence": 0.9782, + "cer": 0.0, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "01_cnic_front_clean", + "doc_type": "cnic", + "field": "father_name", + "expected": "Usman Javed", + "actual": "Usman Javed", + "status": "ok", + "correct": true, + "confidence": 0.9997, + "cer": 0.0, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "01_cnic_front_clean", + "doc_type": "cnic", + "field": "gender", + "expected": "F", + "actual": "F", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "01_cnic_front_clean", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "01_cnic_front_clean", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "35568-1518844-8", + "actual": "35568-1518844-8", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "01_cnic_front_clean", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "22-08-1962", + "actual": "22-08-1962", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "01_cnic_front_clean", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "13-12-2024", + "actual": "13-12-2024", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "01_cnic_front_clean", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "13-12-2031", + "actual": "13-12-2031", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "02_cnic_front_rotated90", + "doc_type": "cnic", + "field": "name", + "expected": "Hamza Abbasi", + "actual": "Hamza Abbasi", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": 0.0, + "tags": [ + "cnic_front", + "rotated90" + ], + "error": null + }, + { + "case": "02_cnic_front_rotated90", + "doc_type": "cnic", + "field": "father_name", + "expected": "Zain Rehman", + "actual": "Zain Rehman", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": 0.0, + "tags": [ + "cnic_front", + "rotated90" + ], + "error": null + }, + { + "case": "02_cnic_front_rotated90", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated90" + ], + "error": null + }, + { + "case": "02_cnic_front_rotated90", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated90" + ], + "error": null + }, + { + "case": "02_cnic_front_rotated90", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "16987-1689768-5", + "actual": "16987-1689768-5", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated90" + ], + "error": null + }, + { + "case": "02_cnic_front_rotated90", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "05-09-1987", + "actual": "05-09-1987", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated90" + ], + "error": null + }, + { + "case": "02_cnic_front_rotated90", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "25-08-2024", + "actual": "25-08-2024", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated90" + ], + "error": null + }, + { + "case": "02_cnic_front_rotated90", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "25-08-2031", + "actual": "25-08-2031", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated90" + ], + "error": null + }, + { + "case": "03_cnic_front_rotated270", + "doc_type": "cnic", + "field": "name", + "expected": "Muhammad Tariq", + "actual": "Muhammad Tariq", + "status": "ok", + "correct": true, + "confidence": 0.9997, + "cer": 0.0, + "tags": [ + "cnic_front", + "rotated270" + ], + "error": null + }, + { + "case": "03_cnic_front_rotated270", + "doc_type": "cnic", + "field": "father_name", + "expected": "Usman Raza", + "actual": "Usman Raza", + "status": "ok", + "correct": true, + "confidence": 0.9981, + "cer": 0.0, + "tags": [ + "cnic_front", + "rotated270" + ], + "error": null + }, + { + "case": "03_cnic_front_rotated270", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated270" + ], + "error": null + }, + { + "case": "03_cnic_front_rotated270", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated270" + ], + "error": null + }, + { + "case": "03_cnic_front_rotated270", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "70819-6727317-7", + "actual": "70819-6727317-7", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated270" + ], + "error": null + }, + { + "case": "03_cnic_front_rotated270", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "14-12-1998", + "actual": "14-12-1998", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated270" + ], + "error": null + }, + { + "case": "03_cnic_front_rotated270", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "25-10-2018", + "actual": "25-10-2018", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated270" + ], + "error": null + }, + { + "case": "03_cnic_front_rotated270", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "25-10-2028", + "actual": "25-10-2028", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated270" + ], + "error": null + }, + { + "case": "04_cnic_front_upside_down", + "doc_type": "cnic", + "field": "name", + "expected": "Bilal Saleem", + "actual": "Bilal Saleem", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": 0.0, + "tags": [ + "cnic_front", + "upside_down" + ], + "error": null + }, + { + "case": "04_cnic_front_upside_down", + "doc_type": "cnic", + "field": "father_name", + "expected": "Fahad Aslam", + "actual": "Fahad Aslam", + "status": "ok", + "correct": true, + "confidence": 0.9998, + "cer": 0.0, + "tags": [ + "cnic_front", + "upside_down" + ], + "error": null + }, + { + "case": "04_cnic_front_upside_down", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "upside_down" + ], + "error": null + }, + { + "case": "04_cnic_front_upside_down", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "upside_down" + ], + "error": null + }, + { + "case": "04_cnic_front_upside_down", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "76634-4002978-7", + "actual": "76634-4002978-7", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "upside_down" + ], + "error": null + }, + { + "case": "04_cnic_front_upside_down", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "17-04-1982", + "actual": "17-04-1982", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "upside_down" + ], + "error": null + }, + { + "case": "04_cnic_front_upside_down", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "25-06-2016", + "actual": "25-06-2016", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "upside_down" + ], + "error": null + }, + { + "case": "04_cnic_front_upside_down", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "25-06-2023", + "actual": "25-06-2023", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "upside_down" + ], + "error": null + }, + { + "case": "05_cnic_front_skewed", + "doc_type": "cnic", + "field": "name", + "expected": "Fahad Aslam", + "actual": "Fahad Aslam", + "status": "ok", + "correct": true, + "confidence": 0.9735, + "cer": 0.0, + "tags": [ + "cnic_front", + "skewed" + ], + "error": null + }, + { + "case": "05_cnic_front_skewed", + "doc_type": "cnic", + "field": "father_name", + "expected": "Hassan Saleem", + "actual": "Hassan Saleem", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": 0.0, + "tags": [ + "cnic_front", + "skewed" + ], + "error": null + }, + { + "case": "05_cnic_front_skewed", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "cnic_front", + "skewed" + ], + "error": null + }, + { + "case": "05_cnic_front_skewed", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "skewed" + ], + "error": null + }, + { + "case": "05_cnic_front_skewed", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "60457-1784726-7", + "actual": "60457-1784726-7", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "skewed" + ], + "error": null + }, + { + "case": "05_cnic_front_skewed", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "08-10-1955", + "actual": "08-10-1955", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "skewed" + ], + "error": null + }, + { + "case": "05_cnic_front_skewed", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "22-12-2017", + "actual": "22-12-2017", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "skewed" + ], + "error": null + }, + { + "case": "05_cnic_front_skewed", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "22-12-2024", + "actual": "22-12-2024", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "skewed" + ], + "error": null + }, + { + "case": "06_cnic_front_photo", + "doc_type": "cnic", + "field": "name", + "expected": "Hassan Raza", + "actual": "Hassan Raza", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": 0.0, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "06_cnic_front_photo", + "doc_type": "cnic", + "field": "father_name", + "expected": "Zain Khan", + "actual": "Zain Khan", + "status": "ok", + "correct": true, + "confidence": 0.9888, + "cer": 0.0, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "06_cnic_front_photo", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "06_cnic_front_photo", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "06_cnic_front_photo", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "10798-1933190-9", + "actual": "10798-1933190-9", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "06_cnic_front_photo", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "03-02-1974", + "actual": "03-02-1974", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "06_cnic_front_photo", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "05-01-2020", + "actual": "05-01-2020", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "06_cnic_front_photo", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "05-01-2025", + "actual": "05-01-2025", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "07_cnic_front_photo", + "doc_type": "cnic", + "field": "name", + "expected": "Zain Raza", + "actual": "Zain Raza", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": 0.0, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "07_cnic_front_photo", + "doc_type": "cnic", + "field": "father_name", + "expected": "Fahad Butt", + "actual": "Fahad Butt", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": 0.0, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "07_cnic_front_photo", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "07_cnic_front_photo", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "07_cnic_front_photo", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "49298-4162294-9", + "actual": "49298-4162294-9", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "07_cnic_front_photo", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "19-12-1986", + "actual": "19-12-1986", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "07_cnic_front_photo", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "03-10-2020", + "actual": "03-10-2020", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "07_cnic_front_photo", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "03-10-2025", + "actual": "03-10-2025", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "08_cnic_front_low_res", + "doc_type": "cnic", + "field": "name", + "expected": "Hassan Hussain", + "actual": "Hassan Hussain", + "status": "ok", + "correct": true, + "confidence": 0.9998, + "cer": 0.0, + "tags": [ + "cnic_front", + "low_res" + ], + "error": null + }, + { + "case": "08_cnic_front_low_res", + "doc_type": "cnic", + "field": "father_name", + "expected": "Muhammad Abbasi", + "actual": "Muhammad Abbasi", + "status": "ok", + "correct": true, + "confidence": 0.9764, + "cer": 0.0, + "tags": [ + "cnic_front", + "low_res" + ], + "error": null + }, + { + "case": "08_cnic_front_low_res", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "low_res" + ], + "error": null + }, + { + "case": "08_cnic_front_low_res", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "low_res" + ], + "error": null + }, + { + "case": "08_cnic_front_low_res", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "65008-7547517-7", + "actual": "65008-7547517-7", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "low_res" + ], + "error": null + }, + { + "case": "08_cnic_front_low_res", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "13-04-2001", + "actual": "13-04-2001", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "low_res" + ], + "error": null + }, + { + "case": "08_cnic_front_low_res", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "08-12-2025", + "actual": "08-12-2025", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "low_res" + ], + "error": null + }, + { + "case": "08_cnic_front_low_res", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "08-12-2030", + "actual": "08-12-2030", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "low_res" + ], + "error": null + }, + { + "case": "09_cnic_front_blurry", + "doc_type": "cnic", + "field": "name", + "expected": "Usman Rehman", + "actual": "Usman Rehman", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": 0.0, + "tags": [ + "cnic_front", + "blurry" + ], + "error": null + }, + { + "case": "09_cnic_front_blurry", + "doc_type": "cnic", + "field": "father_name", + "expected": "Imran Siddiqui", + "actual": "Imran Siddiqui", + "status": "ok", + "correct": true, + "confidence": 0.9996, + "cer": 0.0, + "tags": [ + "cnic_front", + "blurry" + ], + "error": null + }, + { + "case": "09_cnic_front_blurry", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "cnic_front", + "blurry" + ], + "error": null + }, + { + "case": "09_cnic_front_blurry", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "blurry" + ], + "error": null + }, + { + "case": "09_cnic_front_blurry", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "49318-6032080-7", + "actual": "49318-6032080-7", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "blurry" + ], + "error": null + }, + { + "case": "09_cnic_front_blurry", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "30-11-1966", + "actual": "30-11-1966", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "blurry" + ], + "error": null + }, + { + "case": "09_cnic_front_blurry", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "07-11-2022", + "actual": "07-11-2022", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "blurry" + ], + "error": null + }, + { + "case": "09_cnic_front_blurry", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "07-11-2032", + "actual": "07-11-2032", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "blurry" + ], + "error": null + }, + { + "case": "10_cnic_front_very_blurry", + "doc_type": "cnic", + "field": "name", + "expected": "Ali Nawaz", + "actual": null, + "status": "not_found", + "correct": false, + "confidence": 0.0, + "cer": 1.0, + "tags": [ + "cnic_front", + "very_blurry", + "unreadable" + ], + "error": null + }, + { + "case": "10_cnic_front_very_blurry", + "doc_type": "cnic", + "field": "father_name", + "expected": "Usman Nawaz", + "actual": null, + "status": "not_found", + "correct": false, + "confidence": 0.0, + "cer": 1.0, + "tags": [ + "cnic_front", + "very_blurry", + "unreadable" + ], + "error": null + }, + { + "case": "10_cnic_front_very_blurry", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": null, + "status": "not_found", + "correct": false, + "confidence": 0.0, + "cer": null, + "tags": [ + "cnic_front", + "very_blurry", + "unreadable" + ], + "error": null + }, + { + "case": "10_cnic_front_very_blurry", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": null, + "status": "not_found", + "correct": false, + "confidence": 0.0, + "cer": null, + "tags": [ + "cnic_front", + "very_blurry", + "unreadable" + ], + "error": null + }, + { + "case": "10_cnic_front_very_blurry", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "22264-6861642-5", + "actual": null, + "status": "not_found", + "correct": false, + "confidence": 0.0, + "cer": null, + "tags": [ + "cnic_front", + "very_blurry", + "unreadable" + ], + "error": null + }, + { + "case": "10_cnic_front_very_blurry", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "03-09-1965", + "actual": null, + "status": "not_found", + "correct": false, + "confidence": 0.0, + "cer": null, + "tags": [ + "cnic_front", + "very_blurry", + "unreadable" + ], + "error": null + }, + { + "case": "10_cnic_front_very_blurry", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "28-11-2017", + "actual": null, + "status": "not_found", + "correct": false, + "confidence": 0.0, + "cer": null, + "tags": [ + "cnic_front", + "very_blurry", + "unreadable" + ], + "error": null + }, + { + "case": "10_cnic_front_very_blurry", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "28-11-2024", + "actual": null, + "status": "not_found", + "correct": false, + "confidence": 0.0, + "cer": null, + "tags": [ + "cnic_front", + "very_blurry", + "unreadable" + ], + "error": null + }, + { + "case": "11_cnic_front_occluded_name", + "doc_type": "cnic", + "field": "father_name", + "expected": "Zain Shah", + "actual": "Zain Shah", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": 0.0, + "tags": [ + "cnic_front", + "occluded_name" + ], + "error": null + }, + { + "case": "11_cnic_front_occluded_name", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "occluded_name" + ], + "error": null + }, + { + "case": "11_cnic_front_occluded_name", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "occluded_name" + ], + "error": null + }, + { + "case": "11_cnic_front_occluded_name", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "38771-8841330-1", + "actual": "38771-8841330-1", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "occluded_name" + ], + "error": null + }, + { + "case": "11_cnic_front_occluded_name", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "28-09-1990", + "actual": "28-09-1990", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "occluded_name" + ], + "error": null + }, + { + "case": "11_cnic_front_occluded_name", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "30-05-2019", + "actual": "30-05-2019", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "occluded_name" + ], + "error": null + }, + { + "case": "11_cnic_front_occluded_name", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "30-05-2026", + "actual": "30-05-2026", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "occluded_name" + ], + "error": null + }, + { + "case": "12_cnic_back_clean", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "72052-5898319-5", + "actual": "72052-5898319-5", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_back", + "clean" + ], + "error": null + }, + { + "case": "13_cnic_back_photo", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "54948-2141621-1", + "actual": "54948-2141621-1", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_back", + "photo" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "board", + "expected": "FBISE", + "actual": "FBISE", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "serial_number", + "expected": "2618161", + "actual": "2618161", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "roll_number", + "expected": "4046427", + "actual": "4046427", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "registration_number", + "expected": "5393655803", + "actual": "5393655803", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "certificate_number", + "expected": "232092060/198429", + "actual": "232092060/198429", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "group", + "expected": "GENERAL", + "actual": "GENERAL", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "year", + "expected": "2015", + "actual": "2015", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "grade", + "expected": "B", + "actual": "B", + "status": "ok", + "correct": true, + "confidence": 0.9895, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "student_name", + "expected": "RABIA HUSSAIN", + "actual": "RABIA HUSSAIN", + "status": "ok", + "correct": true, + "confidence": 0.9627, + "cer": 0.0, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "father_name", + "expected": "BILAL SIDDIQUI", + "actual": "BILAL SIDDIQUI", + "status": "ok", + "correct": true, + "confidence": 0.9949, + "cer": 0.0, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "date_of_birth", + "expected": "28-04-1997", + "actual": "28-04-1997", + "status": "ok", + "correct": true, + "confidence": 0.986, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "institute", + "expected": "FG GIRLS COLLEGE, CANTT, PESHAWAR", + "actual": "FG GIRLS COLLEGE, CANTT, PESHAWAR", + "status": "ok", + "correct": true, + "confidence": 0.9965, + "cer": 0.0, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "max_marks", + "expected": "1100", + "actual": "1100", + "status": "ok", + "correct": true, + "confidence": 0.95, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "total_marks", + "expected": "651", + "actual": "651", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "board", + "expected": "FBISE", + "actual": "FBISE", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "serial_number", + "expected": "5220771", + "actual": "5220771", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "roll_number", + "expected": "6627130", + "actual": "6627130", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "registration_number", + "expected": "8803163805", + "actual": "8803163805", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "certificate_number", + "expected": "161880504/871109", + "actual": "161880504/871109", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "group", + "expected": "SCIENCE", + "actual": "SCIENCE", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "year", + "expected": "2020", + "actual": "2020", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "grade", + "expected": "C", + "actual": "C", + "status": "ok", + "correct": true, + "confidence": 0.9911, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "student_name", + "expected": "IMRAN AHMED", + "actual": "IMRAN AHMED", + "status": "ok", + "correct": true, + "confidence": 0.9549, + "cer": 0.0, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "father_name", + "expected": "HASSAN SIDDIQUI", + "actual": "HASSAN SIDDIQUI", + "status": "ok", + "correct": true, + "confidence": 0.9923, + "cer": 0.0, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "date_of_birth", + "expected": "23-10-2004", + "actual": "23-10-2004", + "status": "ok", + "correct": true, + "confidence": 0.9811, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "institute", + "expected": "GOVT BOYS COLLEGE, MALL ROAD, LAHORE", + "actual": "GOVT BOYS COLLEGE, MALL ROAD, LAHORE", + "status": "ok", + "correct": true, + "confidence": 0.995, + "cer": 0.0, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "max_marks", + "expected": "1100", + "actual": "1100", + "status": "ok", + "correct": true, + "confidence": 0.95, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "total_marks", + "expected": "853", + "actual": "853", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "board", + "expected": "FBISE", + "actual": "FBISE", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "serial_number", + "expected": "3058316", + "actual": "3058316", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "roll_number", + "expected": "2084458", + "actual": "2084458", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "registration_number", + "expected": "1160282720", + "actual": "1160282720", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "certificate_number", + "expected": "661120183/471238", + "actual": "661120183/471238", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "group", + "expected": "SCIENCE", + "actual": "SCIENCE", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "year", + "expected": "2017", + "actual": "2017", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "grade", + "expected": "B", + "actual": "B", + "status": "ok", + "correct": true, + "confidence": 0.9927, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "student_name", + "expected": "FATIMA QURESHI", + "actual": "FATIMA QURESHI", + "status": "ok", + "correct": true, + "confidence": 0.9968, + "cer": 0.0, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "father_name", + "expected": "HASSAN SIDDIQUI", + "actual": "HASSAN SIDDIQUI", + "status": "ok", + "correct": true, + "confidence": 0.9875, + "cer": 0.0, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "date_of_birth", + "expected": "21-06-2002", + "actual": "21-06-2002", + "status": "ok", + "correct": true, + "confidence": 0.9794, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "institute", + "expected": "FG GIRLS COLLEGE, CANTT, PESHAWAR", + "actual": "FG GIRLS COLLEGE, CANTT, PESHAWAR", + "status": "ok", + "correct": true, + "confidence": 0.9883, + "cer": 0.0, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "max_marks", + "expected": "1100", + "actual": "1100", + "status": "ok", + "correct": true, + "confidence": 0.95, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "total_marks", + "expected": "688", + "actual": "688", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "board", + "expected": "FBISE", + "actual": "FBISE", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "serial_number", + "expected": "4829496", + "actual": "4829496", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "roll_number", + "expected": "491949", + "actual": "491949", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "registration_number", + "expected": "5366245723", + "actual": "5366245723", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "certificate_number", + "expected": "681055366/602103", + "actual": "681055366/602103", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "group", + "expected": "GENERAL", + "actual": "GENERAL", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "year", + "expected": "2019", + "actual": "2019", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "grade", + "expected": "C", + "actual": "C", + "status": "ok", + "correct": true, + "confidence": 0.9921, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "student_name", + "expected": "AMNA BUTT", + "actual": "AMNA BUTT", + "status": "ok", + "correct": true, + "confidence": 0.989, + "cer": 0.0, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "father_name", + "expected": "ALI SHAH", + "actual": "ALI SHAH", + "status": "ok", + "correct": true, + "confidence": 0.9913, + "cer": 0.0, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "date_of_birth", + "expected": "30-10-2001", + "actual": "30-10-2001", + "status": "ok", + "correct": true, + "confidence": 0.9724, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "institute", + "expected": "GOVT BOYS COLLEGE, MALL ROAD, LAHORE", + "actual": "GOVT BOYS COLLEGE, MALL ROAD, LAHORE", + "status": "ok", + "correct": true, + "confidence": 0.9861, + "cer": 0.0, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "max_marks", + "expected": "1100", + "actual": "1100", + "status": "ok", + "correct": true, + "confidence": 0.95, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "total_marks", + "expected": "876", + "actual": "876", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "board", + "expected": "FBISE", + "actual": "FBISE", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "serial_number", + "expected": "1191416", + "actual": "1191416", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "roll_number", + "expected": "4173617", + "actual": "4173617", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "registration_number", + "expected": "3020975659", + "actual": "3020975659", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "certificate_number", + "expected": "338197458/812133", + "actual": "338197458/812133", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "group", + "expected": "PRE-ENGINEERING", + "actual": "PRE-ENGINEERING", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "year", + "expected": "2020", + "actual": "2020", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "grade", + "expected": "A", + "actual": "A", + "status": "ok", + "correct": true, + "confidence": 0.9985, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "student_name", + "expected": "ALI SALEEM", + "actual": "ALI SALEEM", + "status": "ok", + "correct": true, + "confidence": 0.9878, + "cer": 0.0, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "father_name", + "expected": "MUHAMMAD NAWAZ", + "actual": "MUHAMMAD NAWAZ", + "status": "ok", + "correct": true, + "confidence": 0.9836, + "cer": 0.0, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "date_of_birth", + "expected": "26-04-2002", + "actual": "26-04-2002", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "institute", + "expected": "GOVT BOYS COLLEGE, MALL ROAD, LAHORE", + "actual": "GOVT BOYS COLLEGE, MALL ROAD, LAHORE", + "status": "ok", + "correct": true, + "confidence": 0.9948, + "cer": 0.0, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "max_marks", + "expected": "1100", + "actual": "1100", + "status": "ok", + "correct": true, + "confidence": 0.95, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "total_marks", + "expected": "864", + "actual": "864", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "board", + "expected": "FBISE", + "actual": "FBISE", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "serial_number", + "expected": "6237740", + "actual": "6237740", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "roll_number", + "expected": "3252477", + "actual": "3252477", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "registration_number", + "expected": "2763248246", + "actual": "2763248246", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "certificate_number", + "expected": "620610912/105569", + "actual": "620610912/105569", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "group", + "expected": "PRE-ENGINEERING", + "actual": "PRE-ENGINEERING", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "year", + "expected": "2025", + "actual": "2025", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "grade", + "expected": "B", + "actual": "B", + "status": "ok", + "correct": true, + "confidence": 0.9972, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "student_name", + "expected": "HAMZA MALIK", + "actual": "HAMZA MALIK", + "status": "ok", + "correct": true, + "confidence": 0.9963, + "cer": 0.0, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "father_name", + "expected": "HAMZA ABBASI", + "actual": "HAMZA ABBASI", + "status": "ok", + "correct": true, + "confidence": 0.9855, + "cer": 0.0, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "date_of_birth", + "expected": "04-04-2010", + "actual": "04-04-2010", + "status": "ok", + "correct": true, + "confidence": 0.9911, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "institute", + "expected": "MODEL HIGH SCHOOL, SECTOR G-7, ISLAMABAD", + "actual": "MODEL HIGH SCHOOL, SECTOR G-7, ISLAMABAD", + "status": "ok", + "correct": true, + "confidence": 0.9937, + "cer": 0.0, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "max_marks", + "expected": "1100", + "actual": "1100", + "status": "ok", + "correct": true, + "confidence": 0.95, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "total_marks", + "expected": "887", + "actual": "887", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "board", + "expected": "FBISE", + "actual": "FBISE", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "serial_number", + "expected": "7598076", + "actual": "7598076", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "roll_number", + "expected": "6485104", + "actual": "6485104", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "registration_number", + "expected": "3842279313", + "actual": "3842279313", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "certificate_number", + "expected": "646278472/210018", + "actual": "646278472/210018", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "group", + "expected": "PRE-MEDICAL", + "actual": "PRE-MEDICAL", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "year", + "expected": "2024", + "actual": "2024", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "grade", + "expected": "A1", + "actual": "A1", + "status": "ok", + "correct": true, + "confidence": 0.9909, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "student_name", + "expected": "HIRA RAZA", + "actual": "HIRA RAZA", + "status": "ok", + "correct": true, + "confidence": 0.9651, + "cer": 0.0, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "father_name", + "expected": "AHMED KHAN", + "actual": "AHMED KHAN", + "status": "ok", + "correct": true, + "confidence": 0.9979, + "cer": 0.0, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "date_of_birth", + "expected": "02-04-2006", + "actual": "02-04-2006", + "status": "ok", + "correct": true, + "confidence": 0.9949, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "institute", + "expected": "FG GIRLS COLLEGE, CANTT, PESHAWAR", + "actual": "FG GIRLS COLLEGE, CANTT, PESHAWAR", + "status": "ok", + "correct": true, + "confidence": 0.9993, + "cer": 0.0, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "max_marks", + "expected": "1100", + "actual": "1100", + "status": "ok", + "correct": true, + "confidence": 0.95, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "total_marks", + "expected": "791", + "actual": "791", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "institution", + "expected": "Sample Institute of Engineering and Technology", + "actual": "Sample Institute of Engineering and Technology", + "status": "ok", + "correct": true, + "confidence": 0.9942, + "cer": 0.0, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "student_name", + "expected": "USMAN SHAH", + "actual": "USMAN SHAH", + "status": "ok", + "correct": true, + "confidence": 0.9996, + "cer": 0.0, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "father_name", + "expected": "BILAL QURESHI", + "actual": "BILAL QURESHI", + "status": "ok", + "correct": true, + "confidence": 0.9996, + "cer": 0.0, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "degree", + "expected": "Master of Business Administration", + "actual": "Master of Business Administration", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": 0.0, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "serial_number", + "expected": "297863", + "actual": "297863", + "status": "ok", + "correct": true, + "confidence": 0.9989, + "cer": null, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "registration_number", + "expected": "EX/SP13-BCS-192", + "actual": "EX/SP13-BCS-192", + "status": "ok", + "correct": true, + "confidence": 0.9995, + "cer": null, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "cgpa", + "expected": "3.26", + "actual": "3.26", + "status": "ok", + "correct": true, + "confidence": 0.9967, + "cer": null, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "date_of_issue", + "expected": "18-07-2017", + "actual": "18-07-2017", + "status": "ok", + "correct": true, + "confidence": 0.998, + "cer": null, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "year", + "expected": "2017", + "actual": "2017", + "status": "ok", + "correct": true, + "confidence": 0.998, + "cer": null, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "institution", + "expected": "Example University of Technology", + "actual": "Example University of Technology", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": 0.0, + "tags": [ + "degree", + "photo" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "student_name", + "expected": "HASSAN ABBASI", + "actual": "HASSAN ABBASI", + "status": "ok", + "correct": true, + "confidence": 0.9997, + "cer": 0.0, + "tags": [ + "degree", + "photo" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "father_name", + "expected": "FAHAD SHAH", + "actual": "FAHAD SHAH", + "status": "ok", + "correct": true, + "confidence": 0.9997, + "cer": 0.0, + "tags": [ + "degree", + "photo" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "degree", + "expected": "Bachelor of Science in Computer Science", + "actual": "Bachelor of Science in Computer Science", + "status": "ok", + "correct": true, + "confidence": 0.9974, + "cer": 0.0, + "tags": [ + "degree", + "photo" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "serial_number", + "expected": "251776", + "actual": "251776", + "status": "ok", + "correct": true, + "confidence": 0.9923, + "cer": null, + "tags": [ + "degree", + "photo" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "registration_number", + "expected": "EX/SP16-BCS-042", + "actual": "EX/SP16-BCS-042", + "status": "ok", + "correct": true, + "confidence": 0.995, + "cer": null, + "tags": [ + "degree", + "photo" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "cgpa", + "expected": "2.06", + "actual": "2.06", + "status": "ok", + "correct": true, + "confidence": 0.9859, + "cer": null, + "tags": [ + "degree", + "photo" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "date_of_issue", + "expected": "03-10-2020", + "actual": "03-10-2020", + "status": "ok", + "correct": true, + "confidence": 0.9846, + "cer": null, + "tags": [ + "degree", + "photo" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "year", + "expected": "2020", + "actual": "2020", + "status": "ok", + "correct": true, + "confidence": 0.9846, + "cer": null, + "tags": [ + "degree", + "photo" + ], + "error": null + } + ] +} \ No newline at end of file diff --git a/benchmarks/run_benchmark.py b/benchmarks/run_benchmark.py new file mode 100644 index 0000000..49672b8 --- /dev/null +++ b/benchmarks/run_benchmark.py @@ -0,0 +1,218 @@ +""" +Accuracy benchmark for docling-pk. + + python benchmarks/run_benchmark.py benchmarks/synthetic/labels.json + python benchmarks/run_benchmark.py path/to/private/labels.json --backend rapidocr + +A labels file is JSON: ``{"cases": [{"id", "image", "doc_type", "expected": +{field: value, "subjects": [[name, max, obtained], ...]}, "tags": [...]}]}`` +with ``image`` relative to the labels file. ``image`` may also be a list +(e.g. CNIC front and back). + +Metrics, per field and overall: + +* **accuracy** exact match after normalization, over all expected fields. + A missing value counts as wrong. +* **coverage** fraction of expected fields that got any value. +* **precision** of the values that were returned, how many were right. + For KYC this matters more than accuracy: a ``None`` is safe (a human + looks at it), a wrong value is not. +* **ok-precision** precision restricted to fields with status ``ok``; the + number to quote if a pipeline auto-accepts ``ok`` fields. +* **CER** character error rate for free-text fields (names, addresses). +""" + +from __future__ import annotations + +import argparse +import json +import re +import statistics +import sys +import time +import unicodedata +from collections import defaultdict +from pathlib import Path +from typing import Any, Dict, List, Optional + +from rapidfuzz.distance import Levenshtein + +ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(ROOT / "src")) + +from docling_pk import extract # noqa: E402 + +TEXT_FIELDS = { + "name", + "father_name", + "student_name", + "address", + "permanent_address", + "institute", + "institution", + "degree", +} + + +def norm(field: str, value: Any) -> Optional[str]: + if value is None: + return None + v = unicodedata.normalize("NFKC", str(value)).strip() + if field.startswith("date"): + m = re.search(r"(\d{1,2})\D+(\d{1,2})\D+(\d{4})", v) + return f"{int(m.group(1)):02d}-{int(m.group(2)):02d}-{m.group(3)}" if m else v + if field in ("total_marks", "max_marks") or field.endswith("_number"): + v = re.sub(r"\s+", "", v) + v = re.sub(r"[\s,.]+", " ", v).upper().strip() + v = v.replace("،", " ").replace("۔", " ") + return re.sub(r"\s+", " ", v) + + +def cer(expected: str, actual: Optional[str]) -> float: + e = norm("x", expected) or "" + a = norm("x", actual) or "" + return Levenshtein.distance(e, a) / max(len(e), 1) + + +def score_subjects(expected: List, actual: List[Dict]) -> Dict[str, int]: + got = {} + for r in actual or []: + got.setdefault(re.sub(r"[^A-Z]", "", str(r.get("subject", "")).upper()), r) + correct = 0 + for name, mx, ob in expected: + key = re.sub(r"[^A-Z]", "", name.upper()) + r = got.get(key) + if r is None: + # fuzzy subject name match + best = min(got, key=lambda k: Levenshtein.distance(k, key), default=None) + if best is not None and Levenshtein.distance(best, key) <= max(2, len(key) // 6): + r = got[best] + if r is not None and r.get("max_marks") == mx and r.get("obtained_marks") == ob: + correct += 1 + return {"rows_correct": correct, "rows_expected": len(expected), "rows_returned": len(actual or [])} + + +def run(labels_path: Path, backend: str, out: Optional[Path], limit_tags: Optional[str]) -> Dict: + data = json.loads(labels_path.read_text(encoding="utf-8")) + base = labels_path.parent + rows = [] + subj_tot = defaultdict(int) + timings = [] + per_case = [] + for case in data["cases"]: + if limit_tags and not set(limit_tags.split(",")) & set(case.get("tags", [])): + continue + imgs = case["image"] if isinstance(case["image"], list) else [case["image"]] + paths = [str(base / p) for p in imgs] + t0 = time.perf_counter() + try: + result = extract(paths if len(paths) > 1 else paths[0], document_type=case["doc_type"], backend=backend) + fields = {k: v for k, v in result.fields.items()} + tables = result.tables + err = None + except Exception as exc: # report, keep going + fields, tables, err = {}, {}, f"{type(exc).__name__}: {exc}" + dt = time.perf_counter() - t0 + timings.append(dt) + case_ok = 0 + for fname, exp in case["expected"].items(): + if fname == "subjects": + s = score_subjects(exp, tables.get("subjects", [])) + for k, v in s.items(): + subj_tot[k] += v + continue + f = fields.get(fname) + got = f.value if f is not None else None + status = f.status.value if f is not None else "absent" + correct = norm(fname, got) == norm(fname, exp) + case_ok += correct + rows.append( + { + "case": case["id"], + "doc_type": case["doc_type"], + "field": fname, + "expected": exp, + "actual": got, + "status": status, + "correct": correct, + "confidence": f.confidence if f is not None else 0.0, + "cer": cer(exp, got) if fname in TEXT_FIELDS else None, + "tags": case.get("tags", []), + "error": err, + } + ) + n = len([k for k in case["expected"] if k != "subjects"]) + per_case.append((case["id"], case_ok, n, dt, err)) + print(f"{case['id']:32s} {case_ok:>3}/{n:<3} {dt:6.1f}s {err or ''}", flush=True) + + def summarize(rs): + n = len(rs) + returned = [r for r in rs if r["actual"] is not None] + okr = [r for r in rs if r["status"] == "ok"] + return { + "n": n, + "accuracy": sum(r["correct"] for r in rs) / n if n else 0.0, + "coverage": len(returned) / n if n else 0.0, + "precision": (sum(r["correct"] for r in returned) / len(returned)) if returned else None, + "ok_precision": (sum(r["correct"] for r in okr) / len(okr)) if okr else None, + "ok_count": len(okr), + } + + report: Dict[str, Any] = { + "labels": str(labels_path.name), + "backend": backend, + "overall": summarize(rows), + "by_doc_type": {}, + "by_field": {}, + "subjects": dict(subj_tot), + "seconds_per_document": { + "mean": statistics.mean(timings) if timings else 0, + "max": max(timings) if timings else 0, + }, + "cases": [ + {"id": c, "correct": k, "total": n, "seconds": round(t, 2), "error": e} for c, k, n, t, e in per_case + ], + } + by_type = defaultdict(list) + by_field = defaultdict(list) + for r in rows: + by_type[r["doc_type"]].append(r) + by_field[f"{r['doc_type']}.{r['field']}"].append(r) + report["by_doc_type"] = {k: summarize(v) for k, v in sorted(by_type.items())} + report["by_field"] = {k: summarize(v) for k, v in sorted(by_field.items())} + text_cer = [r["cer"] for r in rows if r["cer"] is not None] + report["mean_cer_text_fields"] = statistics.mean(text_cer) if text_cer else None + + o = report["overall"] + print( + f"\nOVERALL accuracy {o['accuracy']:.1%} coverage {o['coverage']:.1%} " + f"precision {o['precision'] or 0:.1%} ok-precision {o['ok_precision'] or 0:.1%} (n_ok={o['ok_count']})" + ) + for k, v in report["by_doc_type"].items(): + print(f" {k:14s} accuracy {v['accuracy']:.1%} precision {v['precision'] or 0:.1%} (n={v['n']})") + if subj_tot: + print(f" subjects rows correct {subj_tot['rows_correct']}/{subj_tot['rows_expected']}") + print("\nPer field:") + for k, v in report["by_field"].items(): + print( + f" {k:40s} {v['accuracy']:6.1%} prec {v['precision'] if v['precision'] is not None else float('nan'):6.1%} n={v['n']}" + ) + if out: + report["rows"] = rows + out.write_text(json.dumps(report, ensure_ascii=False, indent=2), encoding="utf-8") + print(f"\nWrote {out}") + return report + + +def main() -> None: + ap = argparse.ArgumentParser(description=__doc__.split("\n\n")[0]) + ap.add_argument("labels", type=Path) + ap.add_argument("--backend", default="auto") + ap.add_argument("--out", type=Path, default=None, help="Write the full JSON report here.") + ap.add_argument("--tags", default=None, help="Only cases with any of these comma-separated tags.") + args = ap.parse_args() + run(args.labels, args.backend, args.out, args.tags) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/synthetic/generate.py b/benchmarks/synthetic/generate.py new file mode 100644 index 0000000..30b24ab --- /dev/null +++ b/benchmarks/synthetic/generate.py @@ -0,0 +1,571 @@ +""" +Synthetic document generator for tests and the public benchmark. + +Real CNICs and certificates contain personal data and must never be +committed, so the repository's fixtures are generated here instead. Every +image is fabricated from random data and stamped "SYNTHETIC SPECIMEN"; the +layouts reproduce *field positions and label wording* (what the parsers +depend on), not official artwork: there are no emblems, seals, photos, +holograms or security patterns that could make an image pass as a real +document. + + python benchmarks/synthetic/generate.py # writes tests/fixtures/synthetic + python benchmarks/synthetic/generate.py --seed 7 --out /tmp/synth --count 40 + +Requires Pillow and a TrueType font (Arial on Windows, DejaVu/Liberation on +Linux, Helvetica on macOS). Output is deterministic for a given seed and font. +""" + +from __future__ import annotations + +import argparse +import datetime as dt +import json +import random +from pathlib import Path +from typing import Dict, List, Tuple + +import numpy as np +from PIL import Image, ImageDraw, ImageFilter, ImageFont + +ROOT = Path(__file__).resolve().parents[2] +DEFAULT_OUT = ROOT / "tests" / "fixtures" / "synthetic" + +FIRST = [ + "Muhammad", + "Ahmed", + "Ali", + "Usman", + "Bilal", + "Hamza", + "Hassan", + "Zain", + "Fahad", + "Imran", + "Ayesha", + "Fatima", + "Zainab", + "Maryam", + "Hira", + "Sana", + "Amna", + "Iqra", + "Mahnoor", + "Rabia", +] +LAST = [ + "Khan", + "Ahmed", + "Hussain", + "Iqbal", + "Raza", + "Shah", + "Malik", + "Butt", + "Chaudhry", + "Qureshi", + "Siddiqui", + "Abbasi", + "Javed", + "Rehman", + "Akram", + "Aslam", + "Nawaz", + "Saleem", + "Tariq", + "Yousaf", +] +SCHOOLS = [ + "MODEL HIGH SCHOOL, SECTOR G-7, ISLAMABAD", + "CITY PUBLIC SCHOOL, SADDAR, RAWALPINDI", + "GOVT BOYS COLLEGE, MALL ROAD, LAHORE", + "FG GIRLS COLLEGE, CANTT, PESHAWAR", +] +SUBJECTS_SSC = [ + "ENGLISH (COMPULSORY)", + "URDU (COMPULSORY)", + "ISLAMIYAT (COMPULSORY)", + "PAKISTAN STUDIES", + "MATHEMATICS", + "PHYSICS", + "CHEMISTRY", + "BIOLOGY", +] +MAX_SSC = [150, 150, 100, 100, 150, 150, 150, 150] +SUBJECTS_HSSC = [ + "ENGLISH (COMPULSORY)", + "URDU (COMPULSORY)", + "ISLAMIC EDUCATION", + "PAKISTAN STUDIES", + "MATHEMATICS", + "PHYSICS", + "CHEMISTRY", +] +MAX_HSSC = [200, 200, 50, 50, 200, 200, 200] +ONES = [ + "", + "One", + "Two", + "Three", + "Four", + "Five", + "Six", + "Seven", + "Eight", + "Nine", + "Ten", + "Eleven", + "Twelve", + "Thirteen", + "Fourteen", + "Fifteen", + "Sixteen", + "Seventeen", + "Eighteen", + "Nineteen", +] +TENS = ["", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"] +MONTHS = [ + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", +] + +STAMP = "SYNTHETIC SPECIMEN - NOT A REAL DOCUMENT" + + +def find_font(bold: bool = False) -> str: + candidates = ( + [ + "C:/Windows/Fonts/arialbd.ttf", + "/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", + "/usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf", + "/Library/Fonts/Arial Bold.ttf", + ] + if bold + else [ + "C:/Windows/Fonts/arial.ttf", + "/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", + "/usr/share/fonts/truetype/liberation/LiberationSans-Regular.ttf", + "/Library/Fonts/Arial.ttf", + ] + ) + for c in candidates: + if Path(c).exists(): + return c + raise SystemExit("No TrueType font found; install DejaVu or Liberation fonts.") + + +def font(size: int, bold: bool = False) -> ImageFont.FreeTypeFont: + return ImageFont.truetype(find_font(bold), size) + + +def number_words(n: int) -> str: + parts = [] + if n >= 1000: + parts += [ONES[n // 1000], "Thousand"] + n %= 1000 + if n >= 100: + parts += [ONES[n // 100], "Hundred"] + n %= 100 + if n >= 20: + parts.append(TENS[n // 10]) + n %= 10 + if n: + parts.append(ONES[n]) + return " ".join(p for p in parts if p) + + +def person(rng: random.Random, female: bool = False) -> Tuple[str, str]: + first = rng.choice(FIRST[10:] if female else FIRST[:10]) + return f"{first} {rng.choice(LAST)}", f"{rng.choice(FIRST[:10])} {rng.choice(LAST)}" + + +def rand_date(rng: random.Random, y0: int, y1: int) -> dt.date: + start = dt.date(y0, 1, 1).toordinal() + return dt.date.fromordinal(rng.randint(start, dt.date(y1, 12, 28).toordinal())) + + +def cnic_number(rng: random.Random, female: bool) -> str: + digits = [str(rng.randint(1, 7))] + [str(rng.randint(0, 9)) for _ in range(11)] + last = rng.choice("2468" if female else "13579") + d = "".join(digits) + last + return f"{d[:5]}-{d[5:12]}-{d[12]}" + + +# --------------------------------------------------------------- renderers + + +def render_cnic_front(rng: random.Random) -> Tuple[Image.Image, Dict[str, str]]: + female = rng.random() < 0.4 + name, father = person(rng, female) + number = cnic_number(rng, female) + dob = rand_date(rng, 1950, 2006) + doi = rand_date(rng, max(dob.year + 18, 2012), 2025) + doe = doi.replace(year=doi.year + rng.choice([5, 7, 10])) + W, H = 1000, 630 + img = Image.new("RGB", (W, H), (222, 240, 214)) + d = ImageDraw.Draw(img) + for y in range(0, H, 6): # faint background lines, not a security pattern + d.line([(0, y), (W, y)], fill=(214, 233, 207)) + d.text((240, 30), "PAKISTAN", font=font(46, True), fill=(30, 40, 50)) + d.text((520, 42), "National Identity Card", font=font(30, True), fill=(30, 40, 50)) + d.text((240, 88), "ISLAMIC REPUBLIC OF PAKISTAN", font=font(14, True), fill=(40, 50, 60)) + d.rectangle([760, 150, 960, 400], outline=(150, 160, 150), width=2) # photo placeholder (empty) + d.text((790, 265), "NO PHOTO", font=font(20), fill=(150, 160, 150)) + lab, val = font(19), font(31) + + def field(x, y, label, value): + d.text((x, y), label, font=lab, fill=(60, 70, 80)) + d.text((x + 8, y + 24), value, font=val, fill=(20, 20, 20)) + + field(270, 125, "Name", name) + field(270, 225, "Father Name", father) + field(270, 330, "Gender", "F" if female else "M") + field(400, 330, "Country of Stay", "Pakistan") + field(270, 410, "Identity Number", number) + field(570, 410, "Date of Birth", dob.strftime("%d.%m.%Y")) + field(270, 490, "Date of Issue", doi.strftime("%d.%m.%Y")) + field(570, 490, "Date of Expiry", doe.strftime("%d.%m.%Y")) + d.text((760, 560), "Holder's Signature", font=font(16), fill=(60, 70, 80)) + d.text((20, H - 32), STAMP, font=font(16, True), fill=(200, 60, 60)) + expected = { + "name": name, + "father_name": father, + "gender": "F" if female else "M", + "country_of_stay": "Pakistan", + "cnic_number": number, + "date_of_birth": dob.strftime("%d-%m-%Y"), + "date_of_issue": doi.strftime("%d-%m-%Y"), + "date_of_expiry": doe.strftime("%d-%m-%Y"), + } + return img, expected + + +def render_cnic_back(rng: random.Random) -> Tuple[Image.Image, Dict[str, str]]: + number = cnic_number(rng, rng.random() < 0.4) + W, H = 1000, 630 + img = Image.new("RGB", (W, H), (228, 242, 220)) + d = ImageDraw.Draw(img) + d.text((660, 30), number, font=font(34), fill=(20, 20, 20)) + d.rectangle([700, 100, 920, 320], outline=(40, 40, 40), width=3) # QR placeholder + d.text((720, 340), str(rng.randint(10**11, 10**12 - 1)), font=font(22), fill=(30, 30, 30)) + d.text((40, 420), "Registrar General of Pakistan", font=font(18), fill=(60, 60, 60)) + d.text((20, H - 32), STAMP, font=font(16, True), fill=(200, 60, 60)) + return img, {"cnic_number": number} + + +def render_certificate(rng: random.Random, level: str) -> Tuple[Image.Image, Dict]: + female = rng.random() < 0.5 + name, father = person(rng, female) + name, father = name.upper(), father.upper() + subjects = SUBJECTS_SSC if level == "matric" else SUBJECTS_HSSC + maxes = MAX_SSC if level == "matric" else MAX_HSSC + obtained = [rng.randint(int(m * 0.4), m) for m in maxes] + total_max, total_ob = sum(maxes), sum(obtained) + year = rng.randint(2015, 2025) + dob = rand_date(rng, year - 18, year - 15) + serial = str(rng.randint(10**6, 10**7 - 1)) + roll = str(rng.randint(10**5, 10**7 - 1)) + reg = str(rng.randint(10**9, 10**10 - 1)) + cert = f"{rng.randint(10**8, 10**9 - 1)}/{rng.randint(10**5, 10**6 - 1)}" + grade = rng.choice(["A1", "A", "B", "C"]) + group = rng.choice(["SCIENCE", "GENERAL"]) if level == "matric" else rng.choice(["PRE-MEDICAL", "PRE-ENGINEERING"]) + school = rng.choice(SCHOOLS) + title = ( + "SECONDARY SCHOOL CERTIFICATE EXAMINATION" + if level == "matric" + else "HIGHER SECONDARY SCHOOL CERTIFICATE EXAMINATION" + ) + award = "Secondary School Certificate" if level == "matric" else "Higher Secondary School Certificate" + + W, H = 1240, 1700 + img = Image.new("RGB", (W, H), (250, 250, 246)) + d = ImageDraw.Draw(img) + f, fb, fs = font(24), font(24, True), font(20) + d.text( + (W // 2, 70), + "FEDERAL BOARD OF INTERMEDIATE AND SECONDARY EDUCATION", + font=font(34), + fill=(20, 20, 20), + anchor="mm", + ) + d.text((W // 2, 115), "ISLAMABAD", font=font(32), fill=(20, 20, 20), anchor="mm") + d.text((90, 190), "Serial No.", font=f, fill=(30, 30, 30)) + d.text((230, 185), serial, font=font(28), fill=(170, 40, 40)) + d.text((760, 190), "Certificate No.", font=f, fill=(30, 30, 30)) + d.text((950, 190), cert, font=f, fill=(20, 20, 20)) + d.text((90, 260), "Roll No.", font=f, fill=(30, 30, 30)) + d.text((230, 260), roll, font=fb, fill=(20, 20, 20)) + d.text((760, 260), "Registration No.", font=f, fill=(30, 30, 30)) + d.text((970, 260), reg, font=f, fill=(20, 20, 20)) + d.text((90, 330), "Group", font=f, fill=(30, 30, 30)) + d.text((230, 330), group, font=f, fill=(20, 20, 20)) + d.text((760, 330), "Attempt(s)", font=f, fill=(30, 30, 30)) + d.text((970, 330), "FIRST", font=f, fill=(20, 20, 20)) + d.text((W // 2, 420), title, font=fb, fill=(20, 20, 20), anchor="mm") + d.text((W // 2, 455), f"ANNUAL {year}", font=fb, fill=(20, 20, 20), anchor="mm") + y = 520 + lines = [ + ("Certified that", name), + ("Son / Daughter of", father), + ("whose date of birth is", dob.strftime("%d-%m-%Y")), + ("has qualified for award of", award), + ("at the examination held in the month(s) of", "March / April as a Regular Candidate from"), + ] + for label, value in lines: + d.text((90, y), label, font=f, fill=(30, 30, 30)) + lw = d.textlength(label + " ", font=f) + d.text((90 + lw, y), value, font=fb if value.isupper() else f, fill=(20, 20, 20)) + y += 48 + d.text((90, y), school, font=f, fill=(20, 20, 20)) + y += 48 + d.text((90, y), f"as per statement of marks given below and has obtained grade {grade}", font=f, fill=(30, 30, 30)) + y += 70 + d.text((W // 2, y), "SUBJECT-WISE STATEMENT OF MARKS", font=fb, fill=(20, 20, 20), anchor="mm") + y += 40 + x_sn, x_sub, x_max, x_ob, x_end = 80, 170, 760, 960, 1160 + d.rectangle([x_sn, y, x_end, y + 70], outline=(20, 20, 20), width=2) + d.text((x_sn + 15, y + 22), "S.No.", font=fb, fill=(20, 20, 20)) + d.text((x_sub + 200, y + 22), "Subject(s)", font=fb, fill=(20, 20, 20)) + d.text((x_max + 50, y + 5), "MARKS", font=fb, fill=(20, 20, 20)) + d.text((x_max + 20, y + 38), "Maximum", font=fs, fill=(20, 20, 20)) + d.text((x_ob + 30, y + 38), "Obtained", font=fs, fill=(20, 20, 20)) + y += 70 + for i, (s, m, o) in enumerate(zip(subjects, maxes, obtained), 1): + d.rectangle([x_sn, y, x_end, y + 46], outline=(20, 20, 20), width=1) + d.text((x_sn + 25, y + 11), str(i), font=fs, fill=(20, 20, 20)) + d.text((x_sub + 10, y + 11), s, font=fs, fill=(20, 20, 20)) + d.text((x_max + 50, y + 11), f"{m:03d}", font=fs, fill=(20, 20, 20)) + d.text((x_ob + 50, y + 11), f"{o:03d}", font=fs, fill=(20, 20, 20)) + y += 46 + d.rectangle([x_sn, y, x_end, y + 50], outline=(20, 20, 20), width=2) + d.text((x_sub + 250, y + 12), "TOTAL", font=fb, fill=(20, 20, 20)) + d.text((x_max + 45, y + 12), str(total_max), font=fb, fill=(20, 20, 20)) + d.text((x_ob + 50, y + 12), str(total_ob), font=fb, fill=(20, 20, 20)) + y += 90 + d.text((90, y), "(Marks in words)", font=f, fill=(30, 30, 30)) + d.text((310, y), number_words(total_ob), font=fb, fill=(20, 20, 20)) + y += 60 + issued = rand_date(rng, year, year) + d.text( + (90, y), + f"Islamabad Dated {MONTHS[issued.month - 1]} {issued.day:02d}, {issued.year}", + font=f, + fill=(30, 30, 30), + ) + d.text((40, H - 40), STAMP, font=font(20, True), fill=(200, 60, 60)) + expected = { + "board": "FBISE", + "serial_number": serial, + "roll_number": roll, + "registration_number": reg, + "certificate_number": cert, + "group": group, + "year": str(year), + "grade": grade, + "student_name": name, + "father_name": father, + "date_of_birth": dob.strftime("%d-%m-%Y"), + "institute": school, + "max_marks": str(total_max), + "total_marks": str(total_ob), + "subjects": [[s, m, o] for s, m, o in zip(subjects, maxes, obtained)], + } + return img, expected + + +def render_degree(rng: random.Random) -> Tuple[Image.Image, Dict]: + female = rng.random() < 0.5 + name, father = person(rng, female) + rel = "d/o" if female else "s/o" + degree = rng.choice( + [ + "Bachelor of Science in Computer Science", + "Bachelor of Science in Electrical Engineering", + "Master of Business Administration", + "Bachelor of Science in Artificial Intelligence", + ] + ) + uni = rng.choice(["Example University of Technology", "Sample Institute of Engineering and Technology"]) + year = rng.randint(2015, 2025) + issued = rand_date(rng, year, year) + serial = str(rng.randint(10**5, 10**6 - 1)) + reg = f"EX/SP{year % 100 - 4:02d}-BCS-{rng.randint(1, 199):03d}" + cgpa = f"{rng.uniform(2.0, 4.0):.2f}" + W, H = 1400, 1000 + img = Image.new("RGB", (W, H), (252, 250, 240)) + d = ImageDraw.Draw(img) + d.text((80, 80), f"Serial No: {serial}", font=font(24), fill=(150, 40, 40)) + d.text((900, 80), f"Registration No: {reg}", font=font(22), fill=(30, 30, 30)) + d.text((W // 2, 200), uni, font=font(50, True), fill=(40, 40, 40), anchor="mm") + d.text((W // 2, 320), f"{name.upper()} {rel} {father.upper()}", font=font(32, True), fill=(20, 20, 20), anchor="mm") + d.text((W // 2, 390), "has been conferred upon the degree of", font=font(26), fill=(30, 30, 30), anchor="mm") + d.text((W // 2, 460), degree, font=font(38, True), fill=(20, 20, 20), anchor="mm") + d.text((W // 2, 530), f"with CGPA {cgpa}", font=font(26), fill=(30, 30, 30), anchor="mm") + d.text( + (180, 640), + f"Date of Issuance: {issued.day} {MONTHS[issued.month - 1]} {issued.year}", + font=font(26), + fill=(30, 30, 30), + ) + d.text((40, H - 40), STAMP, font=font(20, True), fill=(200, 60, 60)) + expected = { + "institution": uni, + "student_name": name.upper(), + "father_name": father.upper(), + "degree": degree, + "serial_number": serial, + "registration_number": reg, + "cgpa": cgpa, + "date_of_issue": issued.strftime("%d-%m-%Y"), + "year": str(issued.year), + } + return img, expected + + +# ----------------------------------------------------------- augmentations + + +def place_on_background(rng: random.Random, img: Image.Image, pad: float = 0.25) -> Image.Image: + W, H = img.size + bw, bh = int(W * (1 + pad)), int(H * (1 + pad)) + base = rng.choice([(90, 90, 100), (140, 120, 100), (200, 200, 205)]) + bg = Image.new("RGB", (bw, bh), base) + d = ImageDraw.Draw(bg) + for x in range(0, bw, 40): # striped cloth, like the real sample backgrounds + d.rectangle([x, 0, x + 18, bh], fill=tuple(max(0, c - 35) for c in base)) + bg.paste(img, ((bw - W) // 2, (bh - H) // 2)) + return bg + + +def augment(rng: random.Random, img: Image.Image, kind: str) -> Image.Image: + if kind == "clean": + return img + if kind == "rotated90": + return img.rotate(90, expand=True) + if kind == "rotated270": + return img.rotate(-90, expand=True) + if kind == "upside_down": + return img.rotate(180, expand=True) + if kind == "skewed": + return place_on_background(rng, img).rotate(rng.choice([-6, -4, 4, 6]), expand=True, fillcolor=(90, 90, 100)) + if kind == "photo": + out = place_on_background(rng, img).rotate(rng.uniform(-2, 2), expand=True, fillcolor=(90, 90, 100)) + arr = np.asarray(out).astype(np.float32) + h, w = arr.shape[:2] + grad = np.linspace(0.8, 1.1, w)[None, :, None] # uneven lighting + arr = np.clip(arr * grad + np.random.default_rng(rng.randint(0, 9999)).normal(0, 6, arr.shape), 0, 255) + return Image.fromarray(arr.astype(np.uint8)).filter(ImageFilter.GaussianBlur(0.8)) + if kind == "low_res": + w, h = img.size + return img.resize((w * 45 // 100, h * 45 // 100), Image.BILINEAR) + if kind == "blurry": + return img.filter(ImageFilter.GaussianBlur(1.6)) + if kind == "very_blurry": + return img.filter(ImageFilter.GaussianBlur(7)) + raise ValueError(kind) + + +def occlude(img: Image.Image, box: Tuple[int, int, int, int]) -> Image.Image: + out = img.copy() + ImageDraw.Draw(out).ellipse(box, fill=(70, 70, 160)) # an ink stamp over the field + return out + + +# ------------------------------------------------------------------- main + + +PLAN: List[Tuple[str, str]] = [ + ("cnic_front", "clean"), + ("cnic_front", "clean"), + ("cnic_front", "rotated90"), + ("cnic_front", "rotated270"), + ("cnic_front", "upside_down"), + ("cnic_front", "skewed"), + ("cnic_front", "photo"), + ("cnic_front", "photo"), + ("cnic_front", "low_res"), + ("cnic_front", "blurry"), + ("cnic_front", "very_blurry"), + ("cnic_front", "occluded_name"), + ("cnic_back", "clean"), + ("cnic_back", "photo"), + ("matric", "clean"), + ("matric", "rotated90"), + ("matric", "photo"), + ("matric", "low_res"), + ("intermediate", "clean"), + ("intermediate", "skewed"), + ("intermediate", "photo"), + ("degree", "clean"), + ("degree", "photo"), +] + + +def generate(out: Path, seed: int, count: int) -> Path: + rng = random.Random(seed) + out.mkdir(parents=True, exist_ok=True) + cases = [] + plan = (PLAN * (count // len(PLAN) + 1))[:count] + for i, (doc, kind) in enumerate(plan): + if doc == "cnic_front": + img, exp = render_cnic_front(rng) + dtype = "cnic" + elif doc == "cnic_back": + img, exp = render_cnic_back(rng) + dtype = "cnic" + elif doc in ("matric", "intermediate"): + img, exp = render_certificate(rng, doc) + dtype = doc + else: + img, exp = render_degree(rng) + dtype = "degree" + expect_missing: List[str] = [] + if kind == "occluded_name": + img = occlude(img, (250, 140, 640, 215)) + expect_missing = ["name"] + exp = {k: v for k, v in exp.items() if k != "name"} + kind_applied = "clean" + else: + kind_applied = kind + img = augment(rng, img, kind_applied) + name = f"{i:02d}_{doc}_{kind}.jpg" + img.save(out / name, quality=rng.choice([72, 80, 85])) + case = {"id": f"{i:02d}_{doc}_{kind}", "image": name, "doc_type": dtype, "tags": [doc, kind], "expected": exp} + if expect_missing: + case["expect_missing"] = expect_missing + if kind == "very_blurry": + case["tags"].append("unreadable") + cases.append(case) + labels = out / "labels.json" + labels.write_text( + json.dumps( + {"_note": "Synthetic data. Generated by benchmarks/synthetic/generate.py", "seed": seed, "cases": cases}, + indent=1, + ), + encoding="utf-8", + ) + return labels + + +def main() -> None: + ap = argparse.ArgumentParser(description=__doc__.split("\n\n")[0]) + ap.add_argument("--out", type=Path, default=DEFAULT_OUT) + ap.add_argument("--seed", type=int, default=2026) + ap.add_argument("--count", type=int, default=len(PLAN)) + args = ap.parse_args() + print(f"Wrote {generate(args.out, args.seed, args.count)}") + + +if __name__ == "__main__": + main() diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/tests/benchmark_report.json b/tests/benchmark_report.json new file mode 100644 index 0000000..75952c5 --- /dev/null +++ b/tests/benchmark_report.json @@ -0,0 +1,3999 @@ +{ + "labels": "labels.json", + "backend": "auto", + "overall": { + "n": 213, + "accuracy": 0.9624413145539906, + "coverage": 0.9624413145539906, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 203 + }, + "by_doc_type": { + "cnic": { + "n": 97, + "accuracy": 0.9175257731958762, + "coverage": 0.9175257731958762, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 89 + }, + "degree": { + "n": 18, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 16 + }, + "intermediate": { + "n": 42, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 42 + }, + "matric": { + "n": 56, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 56 + } + }, + "by_field": { + "cnic.cnic_number": { + "n": 14, + "accuracy": 0.9285714285714286, + "coverage": 0.9285714285714286, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 13 + }, + "cnic.country_of_stay": { + "n": 12, + "accuracy": 0.9166666666666666, + "coverage": 0.9166666666666666, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 11 + }, + "cnic.date_of_birth": { + "n": 12, + "accuracy": 0.9166666666666666, + "coverage": 0.9166666666666666, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 11 + }, + "cnic.date_of_expiry": { + "n": 12, + "accuracy": 0.9166666666666666, + "coverage": 0.9166666666666666, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 11 + }, + "cnic.date_of_issue": { + "n": 12, + "accuracy": 0.9166666666666666, + "coverage": 0.9166666666666666, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 11 + }, + "cnic.father_name": { + "n": 12, + "accuracy": 0.9166666666666666, + "coverage": 0.9166666666666666, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 11 + }, + "cnic.gender": { + "n": 12, + "accuracy": 0.9166666666666666, + "coverage": 0.9166666666666666, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 11 + }, + "cnic.name": { + "n": 11, + "accuracy": 0.9090909090909091, + "coverage": 0.9090909090909091, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 10 + }, + "degree.cgpa": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 2 + }, + "degree.date_of_issue": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 2 + }, + "degree.degree": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 2 + }, + "degree.father_name": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 2 + }, + "degree.institution": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 2 + }, + "degree.registration_number": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": null, + "ok_count": 0 + }, + "degree.serial_number": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 2 + }, + "degree.student_name": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 2 + }, + "degree.year": { + "n": 2, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 2 + }, + "intermediate.board": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.certificate_number": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.date_of_birth": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.father_name": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.grade": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.group": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.institute": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.max_marks": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.registration_number": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.roll_number": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.serial_number": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.student_name": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.total_marks": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "intermediate.year": { + "n": 3, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 3 + }, + "matric.board": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.certificate_number": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.date_of_birth": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.father_name": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.grade": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.group": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.institute": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.max_marks": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.registration_number": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.roll_number": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.serial_number": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.student_name": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.total_marks": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + }, + "matric.year": { + "n": 4, + "accuracy": 1.0, + "coverage": 1.0, + "precision": 1.0, + "ok_precision": 1.0, + "ok_count": 4 + } + }, + "subjects": { + "rows_correct": 53, + "rows_expected": 53, + "rows_returned": 53 + }, + "seconds_per_document": { + "mean": 2.662468469565362, + "max": 6.296093699998892 + }, + "cases": [ + { + "id": "00_cnic_front_clean", + "correct": 8, + "total": 8, + "seconds": 6.3, + "error": null + }, + { + "id": "01_cnic_front_clean", + "correct": 8, + "total": 8, + "seconds": 1.33, + "error": null + }, + { + "id": "02_cnic_front_rotated90", + "correct": 8, + "total": 8, + "seconds": 2.65, + "error": null + }, + { + "id": "03_cnic_front_rotated270", + "correct": 8, + "total": 8, + "seconds": 2.72, + "error": null + }, + { + "id": "04_cnic_front_upside_down", + "correct": 8, + "total": 8, + "seconds": 2.64, + "error": null + }, + { + "id": "05_cnic_front_skewed", + "correct": 8, + "total": 8, + "seconds": 2.97, + "error": null + }, + { + "id": "06_cnic_front_photo", + "correct": 8, + "total": 8, + "seconds": 1.57, + "error": null + }, + { + "id": "07_cnic_front_photo", + "correct": 8, + "total": 8, + "seconds": 1.22, + "error": null + }, + { + "id": "08_cnic_front_low_res", + "correct": 8, + "total": 8, + "seconds": 1.55, + "error": null + }, + { + "id": "09_cnic_front_blurry", + "correct": 8, + "total": 8, + "seconds": 1.32, + "error": null + }, + { + "id": "10_cnic_front_very_blurry", + "correct": 0, + "total": 8, + "seconds": 1.7, + "error": null + }, + { + "id": "11_cnic_front_occluded_name", + "correct": 7, + "total": 7, + "seconds": 1.43, + "error": null + }, + { + "id": "12_cnic_back_clean", + "correct": 1, + "total": 1, + "seconds": 4.41, + "error": null + }, + { + "id": "13_cnic_back_photo", + "correct": 1, + "total": 1, + "seconds": 3.32, + "error": null + }, + { + "id": "14_matric_clean", + "correct": 14, + "total": 14, + "seconds": 2.85, + "error": null + }, + { + "id": "15_matric_rotated90", + "correct": 14, + "total": 14, + "seconds": 5.1, + "error": null + }, + { + "id": "16_matric_photo", + "correct": 14, + "total": 14, + "seconds": 2.58, + "error": null + }, + { + "id": "17_matric_low_res", + "correct": 14, + "total": 14, + "seconds": 2.38, + "error": null + }, + { + "id": "18_intermediate_clean", + "correct": 14, + "total": 14, + "seconds": 2.61, + "error": null + }, + { + "id": "19_intermediate_skewed", + "correct": 14, + "total": 14, + "seconds": 4.72, + "error": null + }, + { + "id": "20_intermediate_photo", + "correct": 14, + "total": 14, + "seconds": 2.42, + "error": null + }, + { + "id": "21_degree_clean", + "correct": 9, + "total": 9, + "seconds": 1.75, + "error": null + }, + { + "id": "22_degree_photo", + "correct": 9, + "total": 9, + "seconds": 1.69, + "error": null + } + ], + "mean_cer_text_fields": 0.038461538461538464, + "rows": [ + { + "case": "00_cnic_front_clean", + "doc_type": "cnic", + "field": "name", + "expected": "Mahnoor Nawaz", + "actual": "Mahnoor Nawaz", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": 0.0, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "00_cnic_front_clean", + "doc_type": "cnic", + "field": "father_name", + "expected": "Ahmed Butt", + "actual": "Ahmed Butt", + "status": "ok", + "correct": true, + "confidence": 0.9983, + "cer": 0.0, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "00_cnic_front_clean", + "doc_type": "cnic", + "field": "gender", + "expected": "F", + "actual": "F", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "00_cnic_front_clean", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "00_cnic_front_clean", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "59869-8797309-2", + "actual": "59869-8797309-2", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "00_cnic_front_clean", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "08-12-1959", + "actual": "08-12-1959", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "00_cnic_front_clean", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "11-06-2018", + "actual": "11-06-2018", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "00_cnic_front_clean", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "11-06-2023", + "actual": "11-06-2023", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "01_cnic_front_clean", + "doc_type": "cnic", + "field": "name", + "expected": "Iqra Siddiqui", + "actual": "Iqra Siddiqui", + "status": "ok", + "correct": true, + "confidence": 0.9783, + "cer": 0.0, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "01_cnic_front_clean", + "doc_type": "cnic", + "field": "father_name", + "expected": "Usman Javed", + "actual": "Usman Javed", + "status": "ok", + "correct": true, + "confidence": 0.9997, + "cer": 0.0, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "01_cnic_front_clean", + "doc_type": "cnic", + "field": "gender", + "expected": "F", + "actual": "F", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "01_cnic_front_clean", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "01_cnic_front_clean", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "35568-1518844-8", + "actual": "35568-1518844-8", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "01_cnic_front_clean", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "22-08-1962", + "actual": "22-08-1962", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "01_cnic_front_clean", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "13-12-2024", + "actual": "13-12-2024", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "01_cnic_front_clean", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "13-12-2031", + "actual": "13-12-2031", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "clean" + ], + "error": null + }, + { + "case": "02_cnic_front_rotated90", + "doc_type": "cnic", + "field": "name", + "expected": "Hamza Abbasi", + "actual": "Hamza Abbasi", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": 0.0, + "tags": [ + "cnic_front", + "rotated90" + ], + "error": null + }, + { + "case": "02_cnic_front_rotated90", + "doc_type": "cnic", + "field": "father_name", + "expected": "Zain Rehman", + "actual": "Zain Rehman", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": 0.0, + "tags": [ + "cnic_front", + "rotated90" + ], + "error": null + }, + { + "case": "02_cnic_front_rotated90", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated90" + ], + "error": null + }, + { + "case": "02_cnic_front_rotated90", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated90" + ], + "error": null + }, + { + "case": "02_cnic_front_rotated90", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "16987-1689768-5", + "actual": "16987-1689768-5", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated90" + ], + "error": null + }, + { + "case": "02_cnic_front_rotated90", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "05-09-1987", + "actual": "05-09-1987", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated90" + ], + "error": null + }, + { + "case": "02_cnic_front_rotated90", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "25-08-2024", + "actual": "25-08-2024", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated90" + ], + "error": null + }, + { + "case": "02_cnic_front_rotated90", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "25-08-2031", + "actual": "25-08-2031", + "status": "ok", + "correct": true, + "confidence": 0.9876, + "cer": null, + "tags": [ + "cnic_front", + "rotated90" + ], + "error": null + }, + { + "case": "03_cnic_front_rotated270", + "doc_type": "cnic", + "field": "name", + "expected": "Muhammad Tariq", + "actual": "Muhammad Tariq", + "status": "ok", + "correct": true, + "confidence": 0.9997, + "cer": 0.0, + "tags": [ + "cnic_front", + "rotated270" + ], + "error": null + }, + { + "case": "03_cnic_front_rotated270", + "doc_type": "cnic", + "field": "father_name", + "expected": "Usman Raza", + "actual": "Usman Raza", + "status": "ok", + "correct": true, + "confidence": 0.9981, + "cer": 0.0, + "tags": [ + "cnic_front", + "rotated270" + ], + "error": null + }, + { + "case": "03_cnic_front_rotated270", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated270" + ], + "error": null + }, + { + "case": "03_cnic_front_rotated270", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated270" + ], + "error": null + }, + { + "case": "03_cnic_front_rotated270", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "70819-6727317-7", + "actual": "70819-6727317-7", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated270" + ], + "error": null + }, + { + "case": "03_cnic_front_rotated270", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "14-12-1998", + "actual": "14-12-1998", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated270" + ], + "error": null + }, + { + "case": "03_cnic_front_rotated270", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "25-10-2018", + "actual": "25-10-2018", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated270" + ], + "error": null + }, + { + "case": "03_cnic_front_rotated270", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "25-10-2028", + "actual": "25-10-2028", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "rotated270" + ], + "error": null + }, + { + "case": "04_cnic_front_upside_down", + "doc_type": "cnic", + "field": "name", + "expected": "Bilal Saleem", + "actual": "Bilal Saleem", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": 0.0, + "tags": [ + "cnic_front", + "upside_down" + ], + "error": null + }, + { + "case": "04_cnic_front_upside_down", + "doc_type": "cnic", + "field": "father_name", + "expected": "Fahad Aslam", + "actual": "Fahad Aslam", + "status": "ok", + "correct": true, + "confidence": 0.9998, + "cer": 0.0, + "tags": [ + "cnic_front", + "upside_down" + ], + "error": null + }, + { + "case": "04_cnic_front_upside_down", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "upside_down" + ], + "error": null + }, + { + "case": "04_cnic_front_upside_down", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "upside_down" + ], + "error": null + }, + { + "case": "04_cnic_front_upside_down", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "76634-4002978-7", + "actual": "76634-4002978-7", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "upside_down" + ], + "error": null + }, + { + "case": "04_cnic_front_upside_down", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "17-04-1982", + "actual": "17-04-1982", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "upside_down" + ], + "error": null + }, + { + "case": "04_cnic_front_upside_down", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "25-06-2016", + "actual": "25-06-2016", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "upside_down" + ], + "error": null + }, + { + "case": "04_cnic_front_upside_down", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "25-06-2023", + "actual": "25-06-2023", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "upside_down" + ], + "error": null + }, + { + "case": "05_cnic_front_skewed", + "doc_type": "cnic", + "field": "name", + "expected": "Fahad Aslam", + "actual": "Fahad Aslam", + "status": "ok", + "correct": true, + "confidence": 0.9735, + "cer": 0.0, + "tags": [ + "cnic_front", + "skewed" + ], + "error": null + }, + { + "case": "05_cnic_front_skewed", + "doc_type": "cnic", + "field": "father_name", + "expected": "Hassan Saleem", + "actual": "Hassan Saleem", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": 0.0, + "tags": [ + "cnic_front", + "skewed" + ], + "error": null + }, + { + "case": "05_cnic_front_skewed", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "cnic_front", + "skewed" + ], + "error": null + }, + { + "case": "05_cnic_front_skewed", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "skewed" + ], + "error": null + }, + { + "case": "05_cnic_front_skewed", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "60457-1784726-7", + "actual": "60457-1784726-7", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "skewed" + ], + "error": null + }, + { + "case": "05_cnic_front_skewed", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "08-10-1955", + "actual": "08-10-1955", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "skewed" + ], + "error": null + }, + { + "case": "05_cnic_front_skewed", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "22-12-2017", + "actual": "22-12-2017", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "cnic_front", + "skewed" + ], + "error": null + }, + { + "case": "05_cnic_front_skewed", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "22-12-2024", + "actual": "22-12-2024", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "skewed" + ], + "error": null + }, + { + "case": "06_cnic_front_photo", + "doc_type": "cnic", + "field": "name", + "expected": "Hassan Raza", + "actual": "Hassan Raza", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": 0.0, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "06_cnic_front_photo", + "doc_type": "cnic", + "field": "father_name", + "expected": "Zain Khan", + "actual": "Zain Khan", + "status": "ok", + "correct": true, + "confidence": 0.9888, + "cer": 0.0, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "06_cnic_front_photo", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "06_cnic_front_photo", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "06_cnic_front_photo", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "10798-1933190-9", + "actual": "10798-1933190-9", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "06_cnic_front_photo", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "03-02-1974", + "actual": "03-02-1974", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "06_cnic_front_photo", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "05-01-2020", + "actual": "05-01-2020", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "06_cnic_front_photo", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "05-01-2025", + "actual": "05-01-2025", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "07_cnic_front_photo", + "doc_type": "cnic", + "field": "name", + "expected": "Zain Raza", + "actual": "Zain Raza", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": 0.0, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "07_cnic_front_photo", + "doc_type": "cnic", + "field": "father_name", + "expected": "Fahad Butt", + "actual": "Fahad Butt", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": 0.0, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "07_cnic_front_photo", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "07_cnic_front_photo", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "07_cnic_front_photo", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "49298-4162294-9", + "actual": "49298-4162294-9", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "07_cnic_front_photo", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "19-12-1986", + "actual": "19-12-1986", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "07_cnic_front_photo", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "03-10-2020", + "actual": "03-10-2020", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "07_cnic_front_photo", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "03-10-2025", + "actual": "03-10-2025", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "photo" + ], + "error": null + }, + { + "case": "08_cnic_front_low_res", + "doc_type": "cnic", + "field": "name", + "expected": "Hassan Hussain", + "actual": "Hassan Hussain", + "status": "ok", + "correct": true, + "confidence": 0.9998, + "cer": 0.0, + "tags": [ + "cnic_front", + "low_res" + ], + "error": null + }, + { + "case": "08_cnic_front_low_res", + "doc_type": "cnic", + "field": "father_name", + "expected": "Muhammad Abbasi", + "actual": "Muhammad Abbasi", + "status": "ok", + "correct": true, + "confidence": 0.9764, + "cer": 0.0, + "tags": [ + "cnic_front", + "low_res" + ], + "error": null + }, + { + "case": "08_cnic_front_low_res", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "low_res" + ], + "error": null + }, + { + "case": "08_cnic_front_low_res", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "low_res" + ], + "error": null + }, + { + "case": "08_cnic_front_low_res", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "65008-7547517-7", + "actual": "65008-7547517-7", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "low_res" + ], + "error": null + }, + { + "case": "08_cnic_front_low_res", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "13-04-2001", + "actual": "13-04-2001", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "low_res" + ], + "error": null + }, + { + "case": "08_cnic_front_low_res", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "08-12-2025", + "actual": "08-12-2025", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "low_res" + ], + "error": null + }, + { + "case": "08_cnic_front_low_res", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "08-12-2030", + "actual": "08-12-2030", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "low_res" + ], + "error": null + }, + { + "case": "09_cnic_front_blurry", + "doc_type": "cnic", + "field": "name", + "expected": "Usman Rehman", + "actual": "Usman Rehman", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": 0.0, + "tags": [ + "cnic_front", + "blurry" + ], + "error": null + }, + { + "case": "09_cnic_front_blurry", + "doc_type": "cnic", + "field": "father_name", + "expected": "Imran Siddiqui", + "actual": "Imran Siddiqui", + "status": "ok", + "correct": true, + "confidence": 0.9996, + "cer": 0.0, + "tags": [ + "cnic_front", + "blurry" + ], + "error": null + }, + { + "case": "09_cnic_front_blurry", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "cnic_front", + "blurry" + ], + "error": null + }, + { + "case": "09_cnic_front_blurry", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "blurry" + ], + "error": null + }, + { + "case": "09_cnic_front_blurry", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "49318-6032080-7", + "actual": "49318-6032080-7", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "blurry" + ], + "error": null + }, + { + "case": "09_cnic_front_blurry", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "30-11-1966", + "actual": "30-11-1966", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "blurry" + ], + "error": null + }, + { + "case": "09_cnic_front_blurry", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "07-11-2022", + "actual": "07-11-2022", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "blurry" + ], + "error": null + }, + { + "case": "09_cnic_front_blurry", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "07-11-2032", + "actual": "07-11-2032", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "blurry" + ], + "error": null + }, + { + "case": "10_cnic_front_very_blurry", + "doc_type": "cnic", + "field": "name", + "expected": "Ali Nawaz", + "actual": null, + "status": "not_found", + "correct": false, + "confidence": 0.0, + "cer": 1.0, + "tags": [ + "cnic_front", + "very_blurry", + "unreadable" + ], + "error": null + }, + { + "case": "10_cnic_front_very_blurry", + "doc_type": "cnic", + "field": "father_name", + "expected": "Usman Nawaz", + "actual": null, + "status": "not_found", + "correct": false, + "confidence": 0.0, + "cer": 1.0, + "tags": [ + "cnic_front", + "very_blurry", + "unreadable" + ], + "error": null + }, + { + "case": "10_cnic_front_very_blurry", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": null, + "status": "not_found", + "correct": false, + "confidence": 0.0, + "cer": null, + "tags": [ + "cnic_front", + "very_blurry", + "unreadable" + ], + "error": null + }, + { + "case": "10_cnic_front_very_blurry", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": null, + "status": "not_found", + "correct": false, + "confidence": 0.0, + "cer": null, + "tags": [ + "cnic_front", + "very_blurry", + "unreadable" + ], + "error": null + }, + { + "case": "10_cnic_front_very_blurry", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "22264-6861642-5", + "actual": null, + "status": "not_found", + "correct": false, + "confidence": 0.0, + "cer": null, + "tags": [ + "cnic_front", + "very_blurry", + "unreadable" + ], + "error": null + }, + { + "case": "10_cnic_front_very_blurry", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "03-09-1965", + "actual": null, + "status": "not_found", + "correct": false, + "confidence": 0.0, + "cer": null, + "tags": [ + "cnic_front", + "very_blurry", + "unreadable" + ], + "error": null + }, + { + "case": "10_cnic_front_very_blurry", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "28-11-2017", + "actual": null, + "status": "not_found", + "correct": false, + "confidence": 0.0, + "cer": null, + "tags": [ + "cnic_front", + "very_blurry", + "unreadable" + ], + "error": null + }, + { + "case": "10_cnic_front_very_blurry", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "28-11-2024", + "actual": null, + "status": "not_found", + "correct": false, + "confidence": 0.0, + "cer": null, + "tags": [ + "cnic_front", + "very_blurry", + "unreadable" + ], + "error": null + }, + { + "case": "11_cnic_front_occluded_name", + "doc_type": "cnic", + "field": "father_name", + "expected": "Zain Shah", + "actual": "Zain Shah", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": 0.0, + "tags": [ + "cnic_front", + "occluded_name" + ], + "error": null + }, + { + "case": "11_cnic_front_occluded_name", + "doc_type": "cnic", + "field": "gender", + "expected": "M", + "actual": "M", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "occluded_name" + ], + "error": null + }, + { + "case": "11_cnic_front_occluded_name", + "doc_type": "cnic", + "field": "country_of_stay", + "expected": "Pakistan", + "actual": "Pakistan", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "occluded_name" + ], + "error": null + }, + { + "case": "11_cnic_front_occluded_name", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "38771-8841330-1", + "actual": "38771-8841330-1", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "occluded_name" + ], + "error": null + }, + { + "case": "11_cnic_front_occluded_name", + "doc_type": "cnic", + "field": "date_of_birth", + "expected": "28-09-1990", + "actual": "28-09-1990", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "occluded_name" + ], + "error": null + }, + { + "case": "11_cnic_front_occluded_name", + "doc_type": "cnic", + "field": "date_of_issue", + "expected": "30-05-2019", + "actual": "30-05-2019", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "occluded_name" + ], + "error": null + }, + { + "case": "11_cnic_front_occluded_name", + "doc_type": "cnic", + "field": "date_of_expiry", + "expected": "30-05-2026", + "actual": "30-05-2026", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_front", + "occluded_name" + ], + "error": null + }, + { + "case": "12_cnic_back_clean", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "72052-5898319-5", + "actual": "72052-5898319-5", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_back", + "clean" + ], + "error": null + }, + { + "case": "13_cnic_back_photo", + "doc_type": "cnic", + "field": "cnic_number", + "expected": "54948-2141621-1", + "actual": "54948-2141621-1", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "cnic_back", + "photo" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "board", + "expected": "FBISE", + "actual": "FBISE", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "serial_number", + "expected": "2618161", + "actual": "2618161", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "roll_number", + "expected": "4046427", + "actual": "4046427", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "registration_number", + "expected": "5393655803", + "actual": "5393655803", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "certificate_number", + "expected": "232092060/198429", + "actual": "232092060/198429", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "group", + "expected": "GENERAL", + "actual": "GENERAL", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "year", + "expected": "2015", + "actual": "2015", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "grade", + "expected": "B", + "actual": "B", + "status": "ok", + "correct": true, + "confidence": 0.9895, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "student_name", + "expected": "RABIA HUSSAIN", + "actual": "RABIA HUSSAIN", + "status": "ok", + "correct": true, + "confidence": 0.9627, + "cer": 0.0, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "father_name", + "expected": "BILAL SIDDIQUI", + "actual": "BILAL SIDDIQUI", + "status": "ok", + "correct": true, + "confidence": 0.9949, + "cer": 0.0, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "date_of_birth", + "expected": "28-04-1997", + "actual": "28-04-1997", + "status": "ok", + "correct": true, + "confidence": 0.986, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "institute", + "expected": "FG GIRLS COLLEGE, CANTT, PESHAWAR", + "actual": "FG GIRLS COLLEGE, CANTT, PESHAWAR", + "status": "ok", + "correct": true, + "confidence": 0.9965, + "cer": 0.0, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "max_marks", + "expected": "1100", + "actual": "1100", + "status": "ok", + "correct": true, + "confidence": 0.95, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "14_matric_clean", + "doc_type": "matric", + "field": "total_marks", + "expected": "651", + "actual": "651", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "clean" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "board", + "expected": "FBISE", + "actual": "FBISE", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "serial_number", + "expected": "5220771", + "actual": "5220771", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "roll_number", + "expected": "6627130", + "actual": "6627130", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "registration_number", + "expected": "8803163805", + "actual": "8803163805", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "certificate_number", + "expected": "161880504/871109", + "actual": "161880504/871109", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "group", + "expected": "SCIENCE", + "actual": "SCIENCE", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "year", + "expected": "2020", + "actual": "2020", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "grade", + "expected": "C", + "actual": "C", + "status": "ok", + "correct": true, + "confidence": 0.9911, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "student_name", + "expected": "IMRAN AHMED", + "actual": "IMRAN AHMED", + "status": "ok", + "correct": true, + "confidence": 0.9549, + "cer": 0.0, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "father_name", + "expected": "HASSAN SIDDIQUI", + "actual": "HASSAN SIDDIQUI", + "status": "ok", + "correct": true, + "confidence": 0.9923, + "cer": 0.0, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "date_of_birth", + "expected": "23-10-2004", + "actual": "23-10-2004", + "status": "ok", + "correct": true, + "confidence": 0.9811, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "institute", + "expected": "GOVT BOYS COLLEGE, MALL ROAD, LAHORE", + "actual": "GOVT BOYS COLLEGE, MALL ROAD, LAHORE", + "status": "ok", + "correct": true, + "confidence": 0.995, + "cer": 0.0, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "max_marks", + "expected": "1100", + "actual": "1100", + "status": "ok", + "correct": true, + "confidence": 0.95, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "15_matric_rotated90", + "doc_type": "matric", + "field": "total_marks", + "expected": "853", + "actual": "853", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "rotated90" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "board", + "expected": "FBISE", + "actual": "FBISE", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "serial_number", + "expected": "3058316", + "actual": "3058316", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "roll_number", + "expected": "2084458", + "actual": "2084458", + "status": "ok", + "correct": true, + "confidence": 0.9978, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "registration_number", + "expected": "1160282720", + "actual": "1160282720", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "certificate_number", + "expected": "661120183/471238", + "actual": "661120183/471238", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "group", + "expected": "SCIENCE", + "actual": "SCIENCE", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "year", + "expected": "2017", + "actual": "2017", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "grade", + "expected": "B", + "actual": "B", + "status": "ok", + "correct": true, + "confidence": 0.9927, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "student_name", + "expected": "FATIMA QURESHI", + "actual": "FATIMA QURESHI", + "status": "ok", + "correct": true, + "confidence": 0.9968, + "cer": 0.0, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "father_name", + "expected": "HASSAN SIDDIQUI", + "actual": "HASSAN SIDDIQUI", + "status": "ok", + "correct": true, + "confidence": 0.9875, + "cer": 0.0, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "date_of_birth", + "expected": "21-06-2002", + "actual": "21-06-2002", + "status": "ok", + "correct": true, + "confidence": 0.9794, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "institute", + "expected": "FG GIRLS COLLEGE, CANTT, PESHAWAR", + "actual": "FG GIRLS COLLEGE, CANTT, PESHAWAR", + "status": "ok", + "correct": true, + "confidence": 0.9883, + "cer": 0.0, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "max_marks", + "expected": "1100", + "actual": "1100", + "status": "ok", + "correct": true, + "confidence": 0.95, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "16_matric_photo", + "doc_type": "matric", + "field": "total_marks", + "expected": "688", + "actual": "688", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "photo" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "board", + "expected": "FBISE", + "actual": "FBISE", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "serial_number", + "expected": "4829496", + "actual": "4829496", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "roll_number", + "expected": "491949", + "actual": "491949", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "registration_number", + "expected": "5366245723", + "actual": "5366245723", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "certificate_number", + "expected": "681055366/602103", + "actual": "681055366/602103", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "group", + "expected": "GENERAL", + "actual": "GENERAL", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "year", + "expected": "2019", + "actual": "2019", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "grade", + "expected": "C", + "actual": "C", + "status": "ok", + "correct": true, + "confidence": 0.9921, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "student_name", + "expected": "AMNA BUTT", + "actual": "AMNA BUTT", + "status": "ok", + "correct": true, + "confidence": 0.989, + "cer": 0.0, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "father_name", + "expected": "ALI SHAH", + "actual": "ALI SHAH", + "status": "ok", + "correct": true, + "confidence": 0.9913, + "cer": 0.0, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "date_of_birth", + "expected": "30-10-2001", + "actual": "30-10-2001", + "status": "ok", + "correct": true, + "confidence": 0.9724, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "institute", + "expected": "GOVT BOYS COLLEGE, MALL ROAD, LAHORE", + "actual": "GOVT BOYS COLLEGE, MALL ROAD, LAHORE", + "status": "ok", + "correct": true, + "confidence": 0.9861, + "cer": 0.0, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "max_marks", + "expected": "1100", + "actual": "1100", + "status": "ok", + "correct": true, + "confidence": 0.95, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "17_matric_low_res", + "doc_type": "matric", + "field": "total_marks", + "expected": "876", + "actual": "876", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "matric", + "low_res" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "board", + "expected": "FBISE", + "actual": "FBISE", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "serial_number", + "expected": "1191416", + "actual": "1191416", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "roll_number", + "expected": "4173617", + "actual": "4173617", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "registration_number", + "expected": "3020975659", + "actual": "3020975659", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "certificate_number", + "expected": "338197458/812133", + "actual": "338197458/812133", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "group", + "expected": "PRE-ENGINEERING", + "actual": "PRE-ENGINEERING", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "year", + "expected": "2020", + "actual": "2020", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "grade", + "expected": "A", + "actual": "A", + "status": "ok", + "correct": true, + "confidence": 0.9985, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "student_name", + "expected": "ALI SALEEM", + "actual": "ALI SALEEM", + "status": "ok", + "correct": true, + "confidence": 0.9878, + "cer": 0.0, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "father_name", + "expected": "MUHAMMAD NAWAZ", + "actual": "MUHAMMAD NAWAZ", + "status": "ok", + "correct": true, + "confidence": 0.9836, + "cer": 0.0, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "date_of_birth", + "expected": "26-04-2002", + "actual": "26-04-2002", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "institute", + "expected": "GOVT BOYS COLLEGE, MALL ROAD, LAHORE", + "actual": "GOVT BOYS COLLEGE, MALL ROAD, LAHORE", + "status": "ok", + "correct": true, + "confidence": 0.9948, + "cer": 0.0, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "max_marks", + "expected": "1100", + "actual": "1100", + "status": "ok", + "correct": true, + "confidence": 0.95, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "18_intermediate_clean", + "doc_type": "intermediate", + "field": "total_marks", + "expected": "864", + "actual": "864", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "clean" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "board", + "expected": "FBISE", + "actual": "FBISE", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "serial_number", + "expected": "6237740", + "actual": "6237740", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "roll_number", + "expected": "3252477", + "actual": "3252477", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "registration_number", + "expected": "2763248246", + "actual": "2763248246", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "certificate_number", + "expected": "620610912/105569", + "actual": "620610912/105569", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "group", + "expected": "PRE-ENGINEERING", + "actual": "PRE-ENGINEERING", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "year", + "expected": "2025", + "actual": "2025", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "grade", + "expected": "B", + "actual": "B", + "status": "ok", + "correct": true, + "confidence": 0.9972, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "student_name", + "expected": "HAMZA MALIK", + "actual": "HAMZA MALIK", + "status": "ok", + "correct": true, + "confidence": 0.9963, + "cer": 0.0, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "father_name", + "expected": "HAMZA ABBASI", + "actual": "HAMZA ABBASI", + "status": "ok", + "correct": true, + "confidence": 0.9855, + "cer": 0.0, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "date_of_birth", + "expected": "04-04-2010", + "actual": "04-04-2010", + "status": "ok", + "correct": true, + "confidence": 0.9911, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "institute", + "expected": "MODEL HIGH SCHOOL, SECTOR G-7, ISLAMABAD", + "actual": "MODEL HIGH SCHOOL, SECTOR G-7, ISLAMABAD", + "status": "ok", + "correct": true, + "confidence": 0.9937, + "cer": 0.0, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "max_marks", + "expected": "1100", + "actual": "1100", + "status": "ok", + "correct": true, + "confidence": 0.95, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "19_intermediate_skewed", + "doc_type": "intermediate", + "field": "total_marks", + "expected": "887", + "actual": "887", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "skewed" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "board", + "expected": "FBISE", + "actual": "FBISE", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "serial_number", + "expected": "7598076", + "actual": "7598076", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "roll_number", + "expected": "6485104", + "actual": "6485104", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "registration_number", + "expected": "3842279313", + "actual": "3842279313", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "certificate_number", + "expected": "646278472/210018", + "actual": "646278472/210018", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "group", + "expected": "PRE-MEDICAL", + "actual": "PRE-MEDICAL", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "year", + "expected": "2024", + "actual": "2024", + "status": "ok", + "correct": true, + "confidence": 0.9, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "grade", + "expected": "A1", + "actual": "A1", + "status": "ok", + "correct": true, + "confidence": 0.9909, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "student_name", + "expected": "HIRA RAZA", + "actual": "HIRA RAZA", + "status": "ok", + "correct": true, + "confidence": 0.9651, + "cer": 0.0, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "father_name", + "expected": "AHMED KHAN", + "actual": "AHMED KHAN", + "status": "ok", + "correct": true, + "confidence": 0.9979, + "cer": 0.0, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "date_of_birth", + "expected": "02-04-2006", + "actual": "02-04-2006", + "status": "ok", + "correct": true, + "confidence": 0.9949, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "institute", + "expected": "FG GIRLS COLLEGE, CANTT, PESHAWAR", + "actual": "FG GIRLS COLLEGE, CANTT, PESHAWAR", + "status": "ok", + "correct": true, + "confidence": 0.9993, + "cer": 0.0, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "max_marks", + "expected": "1100", + "actual": "1100", + "status": "ok", + "correct": true, + "confidence": 0.95, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "20_intermediate_photo", + "doc_type": "intermediate", + "field": "total_marks", + "expected": "791", + "actual": "791", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": null, + "tags": [ + "intermediate", + "photo" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "institution", + "expected": "Sample Institute of Engineering and Technology", + "actual": "Sample Institute of Engineering and Technology", + "status": "ok", + "correct": true, + "confidence": 0.9942, + "cer": 0.0, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "student_name", + "expected": "USMAN SHAH", + "actual": "USMAN SHAH", + "status": "ok", + "correct": true, + "confidence": 0.9996, + "cer": 0.0, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "father_name", + "expected": "BILAL QURESHI", + "actual": "BILAL QURESHI", + "status": "ok", + "correct": true, + "confidence": 0.9996, + "cer": 0.0, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "degree", + "expected": "Master of Business Administration", + "actual": "Master of Business Administration", + "status": "ok", + "correct": true, + "confidence": 0.9999, + "cer": 0.0, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "serial_number", + "expected": "297863", + "actual": "297863", + "status": "ok", + "correct": true, + "confidence": 0.9989, + "cer": null, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "registration_number", + "expected": "EX/SP13-BCS-192", + "actual": "EX/SP13-BCS-192", + "status": "low_confidence", + "correct": true, + "confidence": 0.5997, + "cer": null, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "cgpa", + "expected": "3.26", + "actual": "3.26", + "status": "ok", + "correct": true, + "confidence": 0.9967, + "cer": null, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "date_of_issue", + "expected": "18-07-2017", + "actual": "18-07-2017", + "status": "ok", + "correct": true, + "confidence": 0.998, + "cer": null, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "21_degree_clean", + "doc_type": "degree", + "field": "year", + "expected": "2017", + "actual": "2017", + "status": "ok", + "correct": true, + "confidence": 0.998, + "cer": null, + "tags": [ + "degree", + "clean" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "institution", + "expected": "Example University of Technology", + "actual": "Example University of Technology", + "status": "ok", + "correct": true, + "confidence": 1.0, + "cer": 0.0, + "tags": [ + "degree", + "photo" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "student_name", + "expected": "HASSAN ABBASI", + "actual": "HASSAN ABBASI", + "status": "ok", + "correct": true, + "confidence": 0.9997, + "cer": 0.0, + "tags": [ + "degree", + "photo" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "father_name", + "expected": "FAHAD SHAH", + "actual": "FAHAD SHAH", + "status": "ok", + "correct": true, + "confidence": 0.9997, + "cer": 0.0, + "tags": [ + "degree", + "photo" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "degree", + "expected": "Bachelor of Science in Computer Science", + "actual": "Bachelor of Science in Computer Science", + "status": "ok", + "correct": true, + "confidence": 0.9974, + "cer": 0.0, + "tags": [ + "degree", + "photo" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "serial_number", + "expected": "251776", + "actual": "251776", + "status": "ok", + "correct": true, + "confidence": 0.9923, + "cer": null, + "tags": [ + "degree", + "photo" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "registration_number", + "expected": "EX/SP16-BCS-042", + "actual": "EX/SP16-BCS-042", + "status": "low_confidence", + "correct": true, + "confidence": 0.597, + "cer": null, + "tags": [ + "degree", + "photo" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "cgpa", + "expected": "2.06", + "actual": "2.06", + "status": "ok", + "correct": true, + "confidence": 0.9859, + "cer": null, + "tags": [ + "degree", + "photo" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "date_of_issue", + "expected": "03-10-2020", + "actual": "03-10-2020", + "status": "ok", + "correct": true, + "confidence": 0.9846, + "cer": null, + "tags": [ + "degree", + "photo" + ], + "error": null + }, + { + "case": "22_degree_photo", + "doc_type": "degree", + "field": "year", + "expected": "2020", + "actual": "2020", + "status": "ok", + "correct": true, + "confidence": 0.9846, + "cer": null, + "tags": [ + "degree", + "photo" + ], + "error": null + } + ] +} \ No newline at end of file diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..1864b0b --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,97 @@ +"""Shared test helpers. + +Most tests run the real parsers on *constructed* OCR output (text boxes at +known positions) via :class:`FakeBackend`. That exercises every line of +parsing, validation and layout logic without downloading OCR models, so the +suite runs in seconds on CI. Tests marked ``ocr`` run the real EasyOCR +models on synthetic fixture images. +""" + +from __future__ import annotations + +from pathlib import Path +from typing import Dict, List, Optional, Sequence, Tuple + +import numpy as np +import pytest + +from docling_pk.ocr.base import OCRBackend, TextBox +from docling_pk.pipeline import Page + +FIXTURES = Path(__file__).parent / "fixtures" + + +def box(text: str, x: float, y: float, w: Optional[float] = None, h: float = 20, conf: float = 0.95) -> TextBox: + """A text box with its top-left corner at (x, y).""" + w = w if w is not None else max(len(text) * h * 0.55, h) + return TextBox.from_rect(text, conf, x, y, x + w, y + h) + + +class FakeBackend(OCRBackend): + """Returns preset boxes; ``recognize`` returns preset re-reads by text.""" + + name = "fake" + + def __init__(self, boxes: Sequence[TextBox] = (), rereads: Optional[Dict[str, Tuple[str, float]]] = None): + self.boxes = list(boxes) + self.rereads = rereads or {} + self.last_crop_shape = None + self.calls = 0 + + def read(self, image: np.ndarray) -> List[TextBox]: + self.calls += 1 + return list(self.boxes) + + def recognize(self, image: np.ndarray, allowlist: Optional[str] = None) -> Tuple[str, float]: + self.last_crop_shape = image.shape + return self.rereads.get("*", ("", 0.0)) + + +def make_page(boxes: Sequence[TextBox], rereads=None, size=(1000, 1600)) -> Page: + backend = FakeBackend(boxes, rereads) + image = np.full((size[0], size[1], 3), 255, dtype=np.uint8) + return Page(image=image, boxes=list(boxes), backend=backend) + + +def cnic_front_boxes( + name="Muhammad Ali", + father="Muhammad Akram", + gender="M", + number="35202-1234567-9", + dob="01.01.1995", + doi="15.03.2020", + doe="14.03.2030", + shuffle_dates=False, +) -> List[TextBox]: + """Boxes laid out like the front of a current CNIC.""" + b = [ + box("PAKISTAN", 300, 40, h=40), + box("National Identity Card", 620, 45, h=28), + box("ISLAMIC REPUBLIC OF PAKISTAN", 300, 100, h=16), + box("Name", 340, 160, h=18), + box(name, 350, 185, h=30), + box("Father Name", 340, 310, h=18), + box(father, 350, 335, h=30), + box("Gender", 335, 470, h=18), + box("Country of Stay", 455, 470, h=18), + box(gender, 350, 505, h=28) if gender else None, + box("Pakistan", 470, 505, h=28), + box("Identity Number", 335, 575, h=18), + box("Date of Birth", 635, 575, h=18), + box(number, 345, 605, h=30), + box(dob, 650, 605, h=30), + box("Date of Issue", 335, 665, h=18), + box("Date of Expiry", 635, 665, h=18), + box(doi, 345, 700, h=30), + box(doe, 650, 700, h=30), + box("Holder's Signature", 910, 745, h=18), + ] + b = [x for x in b if x is not None] + if shuffle_dates: + b.reverse() + return b + + +@pytest.fixture +def fixtures_dir() -> Path: + return FIXTURES diff --git a/tests/fixtures/synthetic/00_cnic_front_clean.jpg b/tests/fixtures/synthetic/00_cnic_front_clean.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8d66f6a9895a2c08194e7400fa4132b619ed6810 GIT binary patch literal 89554 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/synthetic/01_cnic_front_clean.jpg b/tests/fixtures/synthetic/01_cnic_front_clean.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1121607298ec22529abd89974029cc0b7561496c GIT binary patch literal 69876 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 G|C<27kfZ(p literal 0 HcmV?d00001 diff --git a/tests/fixtures/synthetic/02_cnic_front_rotated90.jpg b/tests/fixtures/synthetic/02_cnic_front_rotated90.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3de57488bb503cbe69a3b957df8d4747075f996d GIT binary patch literal 99603 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/synthetic/03_cnic_front_rotated270.jpg b/tests/fixtures/synthetic/03_cnic_front_rotated270.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01fda3a5abf339ef977eb99c576856fee05f8bf8 GIT binary patch literal 85875 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

_!cAYI`%4M7Lx8q6UI^)M3JrsC)n3KCN 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/synthetic/05_cnic_front_skewed.jpg b/tests/fixtures/synthetic/05_cnic_front_skewed.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0e95a7250db9a63ae7eb15589dd855812ec46920 GIT binary patch literal 112832 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

KKuq#Hpyq- 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 #59dn9{ zztN#tok&U`#&MnLaBjbUO!Enn3bEo*;gLX=UVmI9Mo1Is>e3!2tQ62L&~LTen39M& zYD~mu1G(K6VlByJ437lxVx?XIG4CStFEuZypGd$M@O=h>`rLY)KtYo&NM7t|^UKE>uDF_qPyHSo7TL43+#c1laZz)f-aoo| z!=y_uedccix5QUq%nlEX2eO2-_xo2l1J_vmpEK~-a26?u z7J^1@&_gFelS^PV`se20f@8E%g7wWwWhG57B2*bD;fMlC)_a03F@Cj6ccfgR=!t+A z%|>7KIF{Q)kaa@wVlRL(H#jS6jH7C*K>lO8{%1;m;`l-3i878$)$>dG0FcX_5@Q zTxwHZzv9_9YGcdo(o~vPa+%s>@Y02gihM!1Duak|JE3g}=~ui(P(o#9uUV~q8d1J~ zO}#tQb7-&W%NA%Hva{`E&QIl*IKGLc4O`XKx*pPgHzX;%-h#-%l8KmTAh6N^6g*@^C$a^IXss1p%MbuWbJP#zf;Mo6`Bju^-A;Dho=H#pNjK zE*_OWmF~zgQ5m(5qsc4wvkwegaBf=9u`(#@go|QA~27;_XR)eRI`TWqIe~p11TSR$*nG zs?cSYji{GiRJmV(;kPDHa{W@^^KROKZ@rh6-vqGSyZG?h4D+g@I~QMrA*~nVWvR+M zZ1eA9%{01tql?oN%%*A|d3W1bZ&An?jfgRA>#rsh8&49q;YXr)#M%FZ>1&Z5{8+nq zw{!;{ONId0WPXO4m0w%5Q%eRo-&qjfg=_o?CvyJ-5h?;=^Y7kH_+}SQv02qevH$`S zIEtwjl)GSV4WxEw0gMO{;~$pN)3q@~^!xY7de9`Df-~Vg|35WNaMLl+CPFUXV*|Ej z_#FpHtN?5W;TMD)cOW-L@EpcJC*P-QfurX1wsl3^7xLBWx<@BQFQ{p#aoN+%@j1GXdvq5=XlH2d zExCLfvEn%MBE0$yzk&zIgDf7%Fa+W-&!~%_YX36}4juxO3^zRgj>G&--+=Uo|8^q6 zA3OU@~81C)gQ9Nhl4JaJ&Z*Ro;(^7=x z7skjO9I5a|8xgMc?@W_pqmC+iF{1Ftf$HKPBm7odU@NspX0B8kp5gOGU-@Z&!kS$s zPAb7z;l6`Jf7EC5?c8U;Dja$u@U@@M1foz?JYB{8F1keVn@1l1_|p>6s~VMwrqi<1I7>`GSZP1PqN>zBZ& zBO+Y&cUCkk@*UNSz<8qJ^9|e|$~B9+FCUM(IDw0v(+Z$L4SDkE%Rw}zI{LLU*49IO z^4H1v#G}Ue(rO~ozn*sQHrXfSao!6~ACeN#B}Luu;hd9o=a2AKJxf_G3=~8&T3AF& z58)1z0*cQ<{rAR+D2Js-`w8a_@^VFEz2#+u4f?K(pcRG0uTF1Hxv_wm59|*Q5`Ei! zZQuk#wdq)reS*w`Dy-EdEXnY6(z=`@)!sS+uL&05ZvTauiek4mQ#A~&;w|U?W2*_w z(9aGro+MwiE_pSf1`ZJ&iOk*Cm_O7MAtmh5252erPZ zVVZDrH{8-Q+P(RUrUA(vxpwZrcUr&Xj%Tn>c!>%BFoN|xkOsgLDdAI+)BPdv$wL() z_(lk*z{ezTz5Utk+%%0CaNdC-Kpp>=<@_kPjlLOelV3hM@xEGQg@t}H^Ar+bL5;&< z8_&h4H^!WP=r_E|^>80q%=DFayMcKNqh)A#PwJ!PY!j-&;;^aN2Yy$3^P5-P60C1j z>{lq}>=mtwQ=A`ij+Y2$Dazu$+lnzx*Qpo!a$sRNqE(UP8@7uh#d)LWCt|lpgrgsb z-Hl{}aiVaovTR*X>bm2Kx0fU0FW=`R<@|hrvVvd-_8>QnSMTbry%XzxJFWVDexmNi zcui{UarK$k?(I#bO`W)Pc@>J&j_NoIARUE^U0uGEBXSOnkch?ygVZv>MeeCON~aXc zUf55V99RVfTHO55XEld>|KdKiY?t@`D!)fI#2jzlqpcsXAyhn=&8Lr*lDjtJ$-h#z z`KsN1nj*@juzz~A+tK&6b?oz|2cN=rWn-^-@`Qh(5afwBO#HTnm+EI_xD;Wbr&$SMbOY?J`h# zE!&FjRQ;BM{Jj#gVRFtZO)30E?v*WHyIp->Qr5b2uWoZ+vOi4xl&#nFWT-me&bb0C zD`OWd&uF<OBOCk zTUmj!jV)T=jGkW1BuOoQpk&-}p8+Rc$lZDUVL4h*`RVLDVs3MMZ@PYmVkA1VXc)vh zsV#JVzBuxJ=980lMB}-+w5>LqGRb80oRkqmg2!c8uW(*%A5fTgd$~7MpZYjUpAy(D zN&Q&qEA&e!uZokuk1R^~MaE^5l++PtyE@}(L-N7^VR!AF7R*(ax_7Zv9s$ve1h+wx z1v2fjIVgOquCRF6+L~+KT~{4dX(r=iE5K{6{kEG`iSc=u$p?gLX)Ushvg%nmWxQ?0l@pYz6T>c3cwW`lV<+8e*8 zf+6QEmIrU$TJw%dw)mPHTAmVi(D*O9jzs2uJ#W?hmC`-oxck@^Zz4s1rmDt)Tq+qF zv&wPoGVsON3QloRUAhqD7BIkr>sxpk$bSsKB(C<5u%6e7vG*k~4|`={*Mae#+$;IU zXKM-sS0GzlxtHm-laQ9S`?A5n#kW^7b&zHbt66xjNXG%h$+~=7pI5jEBdr~^k1nKCz1}Oagm5f^xDgLp;bECkb2ax6?+akW1mvpnt2RMQH*#< zr2(d{iAAqFO!3E6n`SAU!*2Jh1$+x?gl?Z-N`2weOywsCIwR0o{8sAU(d#8X9h5>u z$g`^pu011$N&G(_*IeP>w7NExQE01sj!GW&N8ggH~F*OZ-V0tnGuJ1)Z%tnbJ31H;!rb&~!Z>L84SJmr>|dx|N2p=Yz8U6ZWVj zi%;4+%s)EE)^Wp@B|n(A99#~l9WT5=Nm6@CH`tw)0|o2b4)uSeoTlzl&G^x-+b z#18=%y1SsK@CQ4-pimf@TH|~EKG1b>xM7Z+S#^{Qli$z>gqbloxMAjeWG2WwzbN>( zrvR)pD8D^Bso;@?fFp}M%!T5sqUn!%fkDEn0vkIM2gr)&e{o%N9{nH}n8eTRpjhIo z{+{?Gz{rXA{^@oz{L~`FE^-qL?*By$^><$9f0+u3$e;nsQz9_`fFXcFXO$mfNCLhY z(AP&i*b;=1{=E-5>k8rJ9YFM<{cUy$dOAcSa@x54DTabh+tWs*sT5ej!6xo6jR-~1 z&EIP|#P#tnl1|PJpKrVGY^}7-6I3koDy|USi&!Qy4 zrDUmDc+p{9@o(|7N8K%($qUw!J>EAPRk2rM0W_` zww_Ul_u!>2LvC|)6d1AguZ~_^*za)8SULI$qhv|g(~Xw7JXwvm7;W{{Y~{ufevWwo z+T1n!4#R#B0_x4)#v>yhd%q!k@d=uy@%Shubr6m%dHf@j{!Rxg?rb1>khkU&?s=3K zx%=d;X0eaXSjT?LPUZ;1(~GITYkC#c#o-U^){S1I^L}=X3bVoCG@arTnXI?-7GIA{ zoEpk8xr5qUP(qrO9J6cgBT9-vR~{xTMO9ryM@{Xmrapf3q|&{8xZ8*cS5KCQ5y?5=JSohncH0P4=j>;rR(hpQes+m~$M; zOorYpy54X3mHeZzu6uk|oG==>%DQB@Wiuu;z`}fB{L_)_w0?!W zb{xfz52G#CE>m>WcFZ4GaZajYw0AJF9BxOX4ucY+(lZ+09d+0(%vDxgn}q5sdk2<* z1EK%XH3K7zXxcd8II$C(w=XqR`CKC$CV<*7hktVziOsW)y;7RZu;foImOM zz8{^`HMKe)=F~`QUNevG44Y?o^TYPtwCR<$sdsr9Mk)EK%5{X-f@#gUzPZ(}^W|zp zb>zNZNZ`8z7w`Tt!cC+89dP}ZRl&l(49Iqa_7{KEgLMIh$$!X{gA#<{YtYjrE8=zs zyI0u1-R^0&$p*W5zNU=ECe&C3yqydoe5@jpk5wTb?djh2TtcDyFvX4Gb07QDUEXIkLZDO8Yi#^hknu*WB5aOK%88;i zCBLGu%D+9g+-sI`+DVekl|^#pLaKRUJ%6&1lTJzCN+JtA6)ZFLa8!F|Z8(4HCk$t7 z=ssEW5*xs`H%eX?MQ)ahS=q#(bcXT2$qq&Y_RY^er_%4Nd)|R&bM!gBBl^3s)tDg} z9WU>-fZ-MWq-q273y%BJeYSDao~EBgbw^ z?{b*!RnL!=7tsg%>jX_d33J4|WA^zE_`PLd3whKlobd6M& zsn&cFi(SvuWYEhNxgTw)GOEXxKBzRlG|V4-eX-voh5oJc@Hllks}b5pa8qW|QK1#11vu z9~&;mk@iT2nUrLofFM3|*`cMVi^_)Qt#6i=`|XIUN_>>%nWj&=pp|`|^XeSmlJ1D4xUmq?f-q|@Pzh9=;!6GPZ7U!DiCM_}OwR4zdO0x=w`PwBF7sxC+q`D4iX-}b5^ zHuBIi1Bzk!SJ)E&H~3d99ApJy04i`DT+a+`2*LCQ2@-1l5+cBNcz;h}I+HX17ku)+ zQiA?DzBxXN339vWco{;U3qi0IXmScFk3xte28X#I8o+^9hIa*wdvBZUyx5$z=a}QM zy<{HWSlPHS`C@slEQ;n@V3KBH7_6m9*VzO0Xh+6x zx~<@)-&lO>(C0{H!BpVXHR?o?JNwtw%4LZZT!g%69s2-j`({a8l+Gw6xbB&(*#|!c zS!T#-4gCRZU9bF%A5l_Mmwv(d{W2H6y-TWDh&hpOwIc2Xb+O)JlJ2!Q`{|AJE0%J= z`0WX(yRK|<^T@xQ19`s~y9vk$G=GFk{x8o%CmQ!}&%?(>M;dJFt5j94k6?q~Ss?%6 zdRWpR^t^S%lS(aC`1lu?pM8cq@iIM=W+}MxkL6b)ZNBIkpk+!(m^J36xro6u^)^xh z7%K7T;50xenF>0yC1#(HiC&F^zs=??!M6zn5W;8nfanUlG4X~4QwbTV ziPANM4(xVR&O|@+C|q0WeA`L=8ojYX*EbZ5SL!SqN2g0y6me5bjdEXqZY1{}!6 zfL{<&(+hrOI%j7wQ8z5Ru(OMON7wc>TL1^Hpn0zwtb=IlN-5Y1SU6)t8;*Z6*E}H< z3%Hb+PwjGN^ow6DfBhKa7#vHcJ2by-6aE6D#ymjxN z1qxDBj7pwsp|onjC}K1$6+(%%u$$$TUs^W|pkrGtyOlyjdJ+T`{6D`=+qNW|4mmSppKTNG6{OH#N) zMq@VTF*eC;s;5>i*KaTqCl88^VI|QgkGbuTv32SZWgFEy=%!9F;s1oy$>$7<>7eDk z**c`d_mXZNuQ`^QUPc$>!+>%XAB)T6cW03=NtgPKqb_c62p}ywd#XU)e)B*Ddy1Xs z3Qopl$;fPVsxeQHF2KE&h8LLNBv`PH>oX$W{USAb2rqU`QeGH?f{v(`*V1pk&{*qn z*UHhc!Ul=bk4O92NH461xx<$k{C~V=sa+TU{G-N~)W8%oo!$)}O%g`Nkg$&Hd2PVD zl1ipDex@h(%}Ab!vZXuEdNX-xx=qQL-$f_k&Y4QD^DEm}oT=0zw$`TK@7Z;X)AAlO zd{Pj3(meS(z@3EBZ^ngwbYb0&^#J?PLxotIk!%;;5T`G}pDkCmvrN${N9?4;jE-l& z4ZpV-lOoldxSG@-MR?x`NcJ?rhx^l!5qXw?*Xp+)TRJ)4kuG|jlNa0fp}or4F{d_G zTsL-Y>*M=gleLserJBp{JPs4*GkTC;g^+uIofptKv(HW79^JoH?a6MQK1$;8{tLB> zKFDSX{n)xW`a|Tq{MOYY%bbNo^`e2v{KIFuLG9u?R&uDGun_Y&3x{bkM*@&6g$S0P z<;9&+jWrqH8IbehaaNR!YAFkJSy=KSZ^GEv&HTu#ld}|cmu*i~xVWTyg_?d-?U8)8 z&4vQ66}1&DpRn`Id@Qm#IK9bIZO*gesd3Jz+F*+TpI55U*M7_3H@Ht6gG6Tej6OW~ zOOA&jg^4aas^K|ZC*&dw89OkknXn=sHUPN zq0Q^rt`k-PA5F?=bwUvMuTPK>CNTsr7U}Jj7*%lnK{&5p!fK1LvM+BKz2dLdEVY}v zZ~mkct&&}+ggVGiH0x1&_W&!;TtXv%^+|dc5S|wj+_Dlnxd=OP?JqR?1vb8kj0aUD z>0!Il9Rh#D{qq?ZFc6Or%Z@%OO$KY%de;)yH|f^DXvF12MLz(rmq zx$ODCrAw|petvGZ7Sge6sjXxl8YVSh|{ zwou0yDu5dTP5o+QQtQg#Z8#GdW&r)x_w-eE<=nfkqlU3Qz_R*6E`Vb+QU!`d4XzIl zb~PAtl?W}dUO#6G!gn8YhOsZd<$vAProQ;F+$s4aDk+i*Tk9R(dDji8kyPTW~E` zSIBZ8yFgr-IlwZEykNDy?}dK96ys3+fDq~h?ZY}VY{R9#lnKEIa%GqDLa$V1kA4cL>oa4A-H_! zW}_p%&b=}VW(!;D+OnB{TMY@sSe+T(e5zhYJ&5RYuZpM4(^jSlB~uY}bi-kLxz(op z^b)ngK|rzj^m5c=lb2kqF|i4_YOYjUiEl46(mYr$95Lk!ob~__%T84Q0j0FVJ=$SQ zmYw>%pS7LMv`Vl}!kQEZR}weNKtmmj;06dS7^RsMZp3!IPLpJnHd5R?0$4fVOu^{w z!@jHBvwd%>aZ=|d>lgQP5A%qnGc6IlUEDA_rcIJ8cN47m+QbKhsT->G)RBV8U z`OhF+Ff%?y&caJCcrGkZ^T2;55QqLDtohHS*Qq`QOn=`)=lW^4diryLvhM<`xW`-th{6d=&{YTQAW+r;G;q(Hz+1>OBBmLSHFbC~KFMKUYrCQrSWiSIETXZUinygN zY#LM5X|VqoWztG89OjKwEvAlQ&TF>dLPaxSi?MJxoGQa6wQKL@na(2P-al#YFf4kN zvxf1&xYlLIVW-J(5z_KQZLs8|Wz!Z31^%AP$(r(j(~aSz&6X-v&uA`P4dG6oq^%d^ z7%&^;@<5b^;rDAGOk5t{bGT{p z@OzAlc2H}TG6mE9a)Cx3hyIB_uVhNz!$}i?0w?A0;JxT-SDP%Ut9z}taO8UK465v^ zmS9pAJ`p9!cW>$migodbo@cyMPR2d8>c}AHE?$Zn{$>xSMvHSEHyeXCyiL>2yM~yf zJl)mc3(axz!r`V$M?p1`u*JEnC`H^cv*`5gOaC-6czet=Dx(3dJSHV z{g@h5*)+K}q!}#LS|Yz^(=S2ORUw@@EGao)AFFdAw&toD>B|m2ZiSP=#HWT-l0je8 zOLE1P6~r{y$EXh-FNc)y&Ro%yL4bD%wsc^c;9V- zD~7ZWf5^W17BICdPmkHilkO02K2U_gZaH<=+eu_fU+Yu%YUZ_`Pvp{UWfei^zpcn{ zYzaI~$Q&a!CDAXlQXsZ<&-~!dQbU;gJ=j9>L~J`Hq>C`vY~+&shhbJEqHI z12xf5l!X4S1rP2?;j;yP?s&0oW2;y#k=}TXAQobkCUl9K3k-9dwN$798@Tu;9#%|l zTI%8rRV`3vI0%r8hL#3biDhfum*2CW zG#ZoooWwWweIWL_>ZGskyay){1&ctiN^SSkM_>tFJbt@BbC5ee&wxdu^^-fRZ5;m# z2lC28*}|HU9~NJxf(h038m=3OQwI#IW?Xm|!WPBHGBVJ^D?jG2GuJS1*M+1riAA+$ zlAUMD6+b3JH@o4JAezNBz^EOm{dABx0-?OUpqf%;A>X=4Ek#BIjPbuZyZ(l~Y z*yle(d3_b--x~U}aH7aUyR?a|dc>G^JRZT?F_2ioSWDW$SUifq(bojm94^uOqX6s; z1Cu6rE+({yLe!lId?3Qf|DRNJ;An+T2XM{~Y$e8P0a4sZ0RS36GD@o7XFYUooesO9 zRvH{V`bejN+_Q9uNi{$jBLsS9F)IH)+XzHtv_LxNKRspt`yy;ET;KhZn&NhW=@r*4 zj2z~i`+I3TSyi#f)vK{HHX5b$_$Z)GrD(6%NRG9tx-2D*(ySF^Ykh>KmOgCZS%~V2 z2fQjw3kv$|m}iL`s$m?>L+h~#F$z~;SCW%I;_=wt3jXpFHlSRXk&>qRB7W+*$Oedx zH1wk*a!=Fc1kf*Z(!eTVCoOYY{9(W_{6oB7DSxNtVQKSX6GgIW0`jjoj;z+21T_2t zoY#ul{P>pQHlQSx{w2tJoGNRCIfk8PjoH)PYkzxirbwV;PB|hg_4bIS<*u(l&w&DZ za`eq4n{xq89|B^Y{4ajERp0f|Fz(#zSx=CZESU{rU(XOwD@>k2v|$YQA7NaIF$b!9 zz5d@)ez#i?6@!iS zUX|n%pSfv1GcY$3b!~GmN3p^{=v&6s=W)z7k-qhA z&aC_&QowX;;f-&+mUIJJ1>*`nUZUtoOuA<7Hh;<)QBXbNSze)+!E7K48ejF+)3p?TUdTg2DY|TBQ zC}b-~O5YsJ1I*>(AH+@6%PcrJb@?XAq$r}IkGg0DnTLj|xjU1me zR(ujStlzaQRnS3Rr*e^7$F7-cscA{$CE{+5dHgKE{9QzG@n``{!Lg-8pXq0gcQcW9 z81wFkz-()I{q%e%y|!;<(!^$c50hdYf9{t0rn=6#nRerd!3e7)SL#iG9_duZ#Gvvb zvpwOb%+NVA3@VIXyzNvyEl&AYhG`G)M75p7o3|N6Sw74f=g2ZP*|kwfj-DFxx$O~i zrTzTDRG!uG?Va6w8_zmdMn^BTIBg{8pdL6cF0T|k=I-xyG~#?f$Bl0hAbwGpJLaG- zi@%)*>!$HFTb9q|az*Exs;}@?wxbWrm!rzE ztaCcVRb7S$bI>A7pZ9lQ|AY;93!~361l;a+h~N|4Ngwtqw>PrSymKijS9M>^BmhbF zTI2WTnYaqQLj7S}yyG(bN+YIx${QlDNL%Ka9mv_@V*1&~Bb2TVp+dHjAT#s&C(OR}n9sGv`D=lb!jCD5me=H|=;wvCv<5>vrsco3D@{J*oETUY@95a%u|$;05wbG9 zD^?{6Mhg$j^Nq0!gE?tQQRWT3eb$Qi6c$(8Ho_io@N;Keb}ii!fyiR#=TkuY-Aa;Y{SNZ2#H|V^iXGEE)+`N?koF zDz249p6T%@mM%t;z_nZK179Ay*mA=MBVZ$wttVC1r(06hwaOIA^lW&2?3@Ss{gVz9 zzMGvn+avqb*fjpCBki4HR8;3lKOPQZkj^+re|_*NPpnEOb*We~^)WOVhk_vG3mF=E zmTAkwBYd&6Qly^k#nEG9$#G{TKI+`R)I=ph{V-43yNdtyT2_EOU5TT(K`ww8BLXet z*dOb5i0OMCdC|P)=*I*m@*u9Y1L>3{2b+(}k#~_5q{GS|#W;NHvi@`&C@JZpXtLAU ziReEPtYaxj$%MZMY!A6M=0JcER+{r7*3W>+0qPeJp=k-BzqkTG)GoAtN*)898PsCI z*J{9r#{#mgfPn}K3frRH1eZU&7lHKl^APgutjqe{*&(0>3upEHsbpSgzZ>2|;ie^^ z{D*XH_;l+OsD@Z&fX9zVX!ZW+?%-j`ZkK;|Sdg?1tTIl`5rBT%1%C~HCz(LM|LK11 zET{>xO=y7~1j1_#Iy5Tb|AE2aAE-8v_I3J#{j%G`(aDIl&o*2|4jl1klJ4I-!OH*( z0}UpB_o_%5U^JB9`|RQ(hs}UFgUNYbq29YxoRpg_M@#f;wN=FB#dbG3t+quPC72nd zYCA3@;PvEYbs?BYYPymyC&y^(b03oj>Kb?JVpDDsZHP!!JXY(?eBW!eltHwcsmNS$ zyP3I$nR1#chusL#ht8w0)t5csCI~i75n}strRrP25l8pufa#KUwuw%K5HRor?;12o z`pcFH?z)6$f6DbP&@t#+X4!*4PNFn_@J8cT3LT`0Xca7|HN3sy{KSi3kP|@;G@{%UxjNR z3=weAjr;u6qq=G8r+E7yHa6|aCC&?OyI)u^e!>JPvdr20oJ32Mk3_Ye*s9iq7Kxyq zGO`VoN2Df&`=XbN0`z$GHfNJl&Xj(V33&`fSjN``#+v3Dp7&QJ2o^fUl{C#Mbn0fN1I!w@J2JE)Jn^L^gb*GNn1ifAQ!+#+cY7>!xYNEe0A)nc;ZcIVxpkRA=WHPh16YWT?gC+vie`bgkS!UYH5{Nw=Z*=~WR z{ph&2ra%U`?ph)c!S6<74*q`wgtxjzJnL^*zuqrFYIR~AEQt03VC<4ygE!fORc+D< z#+fmGcnDsSrKJ|ShJi{~OYzA0zFmW{HdPNrJU&t&WJ0ZqOHfHeNuxfowi%yt)MGNe z6Uue<7ReRPt*P{(>@WI_mW{6bhAOD)#ItEHi1pW2v95=qG^<&y;-aU4Es?<##lbn( znR5U!6799(J|Zf$Yrem(RDc!97gT>ja3kj@jK5!C7es07r4Q$?Pk%8c`I1U!!T&s8 z^YR1=21TrW){7xJRi#?8{DUqF=NLz_?dm{dqVpvMad$hASxL1P%@v-l+k{>(m)NMe zsJ9EOypKzB_&=_S5^QKsf4`$986YKEyl(2fdP6C(S4+Xfvn#}PLIOq+s}Zc!ogAv= zFPm>q>M5`4Ngdva6lYZbG1bD^ebw>gv~5!iID5U4qGONr)5x}4KLpTceua^HMBiq5 zHtUcBj}@1neflG8iC`x)cS4{!$$c@~*&#$My(o@%fO2BC1+9HqtIY?y`fNXR*hmnWzq8(BsCGb?g9z`q8Z$pqcWzdA*`KW>Su*vpr3?;wAFmjDgO8}m;V5Hp9?al=?bcX`_N@AJkP`Mxiyq0`lmTycI;AHF z2c6Z(3UY>;IU86c>Q5O`hxgs$-y{+1$$nm4+GpB&oIZ){qji}3aV5;27c;m{p}Stk z`qpPAywdV8ouCKT`lL|I_;9b3pOMCuWIjKVHrOs6EhFvlC018hure0-vUz>Poa;>} zd8eIhkUcfA$;+J)*Gr2RHIC!ImUz;d=0^@DkyV(?#qG6O?elvjG7IVvVk6s6+W2B3 zk2td}tcXXcMl(K=i@mLWYj1vSk95uVq>H08NhtN|@Ww6h24B1PgVlVCk1KtgH14s8 zYDI4$p&x_)&9AqJg{5IF`@Xb;+u3PZE5lYL`r++Dp5Z1}aU~8cyEDX-lv>!o)?z-k z#`9AY;nJZZ74Bb7X_}6`EkruyXWJ_%0rR%+JWL1e!>da z{QB1)_I)hQ?KiAf2Nof-^j7h&-@|PyV zf!|m5yw+DSmzAHPK1k3+3UlRtbi1D;%{P(0s{2qqqH7VkV^w z-(%c`U}l_G8`OKW`&Z(y#79UBp2JWqO*xQnUWH{?NRgGyMwgAY=DnJxMK82n={dm} zzqc19Q_{ouKC<~icMEsJ;b_DhzxVL_qTWJPW0~PE%63g&uzR=IIop{tWcc8 zYNLOcUs_h|r(plVi*>)|YV*QUz+um=?m6WFs>(^C1ha2x72{~#F3_ckt zS?KZpBq^rSp;0_UU}C+{w!BlO5lgeF8Y3}TM;|XJC94pw{>k}P;WbWzFZGvWyiQj6 zjN-ej{f&`Z9Um*x1Z`8>Jii!j9v(YVe*9QZh(rV@-Zc&INynDj_=VA3zrVZ4jiYox ztoC(a(aeEeyU4XId92K;yXk52p0`x*%!X!YVMljP_Q1)*DF1tX+k%%@Zc%r0QfJ zq|!?qzL1qNGOqS&^QF5htYq6ejN#3v)4ZVy1zA9ViC!}CD@ShxHh!JP(y zK_j^TWrX}yATKK2xdRoU;%7$>D8S&m9H5r#0zMl!ZUYdb#GslP9V|2c0|fzU6i#VB z$uPveTICmy^!L^SdPjjc_OIKP|CTlo1_^9HHr{Dz_TR~|I5isgB7UC)H1Mva0oh>* zfAyQwE&y~~P(+5&-G{x&)je@1aza?5vlriDe^09!3lAJ6_a>uzVeO;W{j4`TKp{lp zE?w9Ym~0RAHv{YU6Na$vM+MWJ%yk7g$zR&7rYp$?QMLucV9vKpE+;|E8;g<|Y z61|er@GqV$rKOxLO+wqrnvB3y3I(fhaDa#!Pxnu#Ca4sj$wj)Mb|3-ezmvocU*!Cc zy`!g9GJK2+kKs6zY5tpL0VpeB7D)`1RH5wcr_}+XZKW!;S>x;-yP}aE)Q~DJi1GSNW9mwll0n
}J5a+< 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/synthetic/06_cnic_front_photo.jpg b/tests/fixtures/synthetic/06_cnic_front_photo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3dcb11897bb91c6b24a5ab274bf8964900a63f86 GIT binary patch literal 128187 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

&^e1_h>&CpmLi?^;k?}(|Y@`)L2YRS$^ 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%0D*gvipqy9zb_4evAy_IPmien%6)mF7SAuudj~$S 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%0AKejXAF!_T4~P z{q+NjinuSD>5j{bnYHuFq4^2WN=TdZq+p6(lHbLyZ_CGJz8eS(nfZnZzN$KD;;=c& zhBXA(bIV_(%4=hGDwOre*6(YK7R Q8|1l!3oaxI=ilM~1O2N;V*mgE literal 0 HcmV?d00001 diff --git a/tests/fixtures/synthetic/07_cnic_front_photo.jpg b/tests/fixtures/synthetic/07_cnic_front_photo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4e16390111a72a47f9529e1e0d9a83cb35dc770e GIT binary patch literal 84347 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 z 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/synthetic/08_cnic_front_low_res.jpg b/tests/fixtures/synthetic/08_cnic_front_low_res.jpg new file mode 100644 index 0000000000000000000000000000000000000000..30408723499a91dc16777aa28f6381be0e0cbb77 GIT binary patch literal 13375 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 P|E@itN~cTmYwmvln+wu& literal 0 HcmV?d00001 diff --git a/tests/fixtures/synthetic/10_cnic_front_very_blurry.jpg b/tests/fixtures/synthetic/10_cnic_front_very_blurry.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6afcb3ace68546cf3c59eb29f615e845c8c30621 GIT binary patch literal 19469 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�UBpIb&a!f$&Qrqc@90cY$srgqLB}pBYm+ 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 literal 0 HcmV?d00001 diff --git a/tests/fixtures/synthetic/12_cnic_back_clean.jpg b/tests/fixtures/synthetic/12_cnic_back_clean.jpg new file mode 100644 index 0000000000000000000000000000000000000000..29d2447b37d02798b2fe43ec2f1acd6ddae3c02f GIT binary patch literal 26059 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