CIB DeepER API Dokumentation (DE)

Site: CIB eLearning
Course: CIB DeepER
Book: CIB DeepER API Dokumentation (DE)
Printed by: Guest user
Date: Monday, 6 May 2024, 9:39 AM

API-Beschreibung

Diese API Dokumentation ist für CIB DeepER Version 2.9.0 bestimmt.

Eine Alternative, um nicht direkt mit der API zu arbeiten, ist die Verwendung entweder des Texterkennungsmoduls CIB ocr oder die CIB pdf toolbox. Die entsprechende Dokumentation finden Sie hier:

OCR Ausführen

Es wird mittels eine REST-Schnittstelle Auf DeepER zugegriffen.

Um ein OCR-Ergebnis anzufordern, muss ein POST-Request an https://backend-ocr.cib.de/ocr/v4 gesendet werden.

Anmeldedaten müssen über den Authentifizierungs-Header bereitgestellt werden.

Unterstützte Eingabeformate sind PNG und JPG. Um ein Bild zu verarbeiten, muss es als Datei im Anfragekörper bereitgestellt werden. Der content-type sollte 'application/octet-stream' lauten. Die Benennung des Feldes muss 'file' lauten.

In Python sieht eine grundlegende Client-Implementierung wie folgt aus:

import requests

 files = {
           'file': ('image.png', open(r'\path\to\image.png', 'rb'), 
             'application/octet-stream'),
      }
        response = requests.post('http://backend-ocr.cib.de/ocr/v4',
                                files=files, 
                                auth=('<<username>>', '<<password>>'))
        json_response = response.json()

OCR Ergebnis: Seitenlayout und Text

Der Rückgabewert des OCR-POST-Request ist ein JSON-Objekt, das die Informationen des erkannten Textes zusammen mit einigen zusätzlichen Layoutinformationen speichert.

Ein Beispiel für ein OCR-Ergebnis sieht wie folgt aus:

    {
   "root": {
     "versions": [
       [
         "CIB deepER",
         "2.9.0"
       ]
     ],
     "angle": 0,
     "attributes": {},
     "id": "image_1",
     "image": "image1.png",
     "type": "image",
     "children": [
       {
         "attributes": {},
         "id": "page_1",
         "type": "page",
         "width": 2479,
         "height": 3508,
         "number": 1,
         "children": [
           {
             "attributes": {},
             "confidence": null,
             "top": 585,
             "width": 711,
             "id": "line_1",
             "type": "line",
             "left": 245,
             "height": 32,
             "text": "",
             "children": [
               {
                 "attributes": {},
                 "confidence": 0.70,
                 "children": [],
                 "top": 585,
                 "width": 96,
                 "id": "word_1",
                 "type": "word",
                 "left": 245,
                 "height": 32,
                 "text": "Software"
               },
               {
                 "attributes": {},
                 "confidence": 0.74,
                 "children": [],
                 "top": 585,
                 "width": 153,
                 "id": "word_2",
                 "type": "word",
                 "left": 350,
                 "height": 32,
                 "text": "Entwicklung"
               }
             ],
           },
           {
             "attributes": {},
             "confidence": null,
             "top": 626,
             "width": 147,
             "id": "line_2",
             "type": "line",
             "left": 247,
             "height": 32,
             "text": "",
             "children": [
               {
                 "attributes": {},
                 "confidence": 0.72,
                 "children": [],
                 "top": 626,
                 "width": 147,
                 "id": "word_8",
                 "type": "word",
                 "left": 247,
                 "height": 32,
                 "text": "München"
               }
             ],
           }
         ],
       }
     ],
   }
 }

    

Das Layout besteht aus einer Dictionary-Struktur, die verschiedene Arten von hierarchisch geschachtelten Nodes (=Sub-Dictionaries) enthält:

  • Root Node
    • Image Node
      • Page Node
        • Line Node
          • Word Node


Root node

Der Root-Node speichert nur einen Key 'root' mit dem Image Node als Value.

Image node

Der Image-Node speichert Informationen über das Bild, wie Name und Deskew-Winkel. Der Key „children“ hat einen Value vom Typ List, dessen einziges Element ein Page-Node ist.

Page node

Der Page-Node speichert die Seitenkoordinaten in Pixel (als Integrer) und die Seitennummer (Integrer), beginnend mit 1. Ein "children"-Key beinhaltet eine Liste aller Line Nodes.

Line node

Line Nodes speichern Informationen wie die Koordinaten  einer Zeile (obere Grenze, linke Grenze, Höhe, Breite in Pixel, als Integrer). Die Werte „confidence“ und „text“ werden nur in den untersten Knoten, also in Word-Nodes, gefüllt. Diese werden für jede Zeile im Wert von „children“ gespeichert, der wiederum eine Liste von Nodes ist. Der Text einer Zeile kann reproduziert werden, indem der Text aller seiner Wörter, getrennt durch Leerzeichen, verkettet wird.

Word node

Jeder Word Node speichert Informationen über die Koordinaten, den erkannten Text und die Erkennungs-Confidence. Die Confidence ist ein Float zwischen 0 und 1.

Leerzeichen werden in den „text“-Values nicht explizit aufgeführt. Ein Leerzeichen ist immer zwischen zwei aufeinanderfolgenden Wörtern der gleichen Zeile positioniert. Wenn der Abstand zwischen zwei Wörtern länger als ein normales Leerzeichen ist, wird die Zeile in zwei nebeneinander liegende Zeilen aufgeteilt.

Ausgabe als Flieẞtext

Alternativ kann das OCR-Ergebnis auch als Fließtext zurückgegeben werden. Dazu muss zusätzlich zum Bild auch ein JSON-File mit dem Key-Value-Paar {'output_format': 'plain_text'} im POST-Request mitgesendet werden. . Der content-type muss 'application/json' lauten. Die Benennung des Feldes muss 'json' lauten.

In Python sieht eine Client-Implementierung wie folgt aus:

import requests
import json

files = {
    'file': ('image.png', open(r'\path\to\image.png', 'rb'), 
    	      'application/octet-stream'),
    'json': (None, json.dumps({'output_format': 'plain_text'}),
             'application/json')
}
response = requests.post('http://backend-ocr.cib.de/ocr/v4', files=files, auth=('<>', '<>'))
json_response = response.json()

 

In diesem Fall besteht die Rückgabe aus einem JSON-Objekt mit drei Keys:

  • 'image': Dokumentname des Originalbildes
  • 'text': Enhält den erkannten Text als String. Zeilenumbrüche sind als ‘\n’ codiert. Backslashes im Originaltext werden durch einen zweiten Backslash escaped.
  • 'versions': Informationen über die verwendete OCR-Engine.

 

Ein Beispielergebnis mit Fließtextoutput sieht folgendermaßen aus:

{
  "image": "schaefer.png",
  "text": "Software Entwicklung\nMünchen",
  "versions": [
    [
      "CIB deepER",
      "2.9.0"
    ]
  ]
}

Zeichenerkennung

Die folgenden Zeichen können erkannt werden. Untersützt werden insbesondere die Sprachen Deutsch, Englisch und Spanisch.

  • ABCDEFGHIJKLMNOPQRSTUVWXYZÄÖÜÁÉÍÑÓÚ
  • abcdefghijklmnopqrstuvwxyzßäöüáéíñóú
  • 0123456789
  • ¿?¡!,-_.:;„“»›‹«”’‚‘
  • []{}()÷<>#%&*+/|\~•=
  • $£§€@©