Freigeben über


Extrahieren von Text und Informationen aus Bildern mithilfe von KI-Anreicherung

Durch die KI-Anreicherung bietet Ihnen Azure KI Search mehrere Optionen zum Erstellen und Extrahieren von durchsuchbarem Text aus Bildern, einschließlich:

Mithilfe der optische Zeichenerkennung können Sie Text aus Fotos oder Bildern extrahieren, die alphanumerischen Text enthalten (z. B. das Wort STOPP auf einem Stoppschild). Mittels Bildanalyse können Sie eine Textdarstellung eines Bilds generieren – etwa Löwenzahn (oder die Farbe Gelb) für ein Foto eines Löwenzahns. Des Weiteren können Sie Metadaten des Bilds extrahieren (beispielsweise die Größe).

Dieser Artikel behandelt die Grundlagen der Arbeit mit Bildern und beschreibt auch mehrere übliche Szenarien, wie die Arbeit mit eingebetteten Bildern, benutzerdefinierten Fertigkeiten und die Überlagerung von Visualisierungen auf Originalbildern.

Um mit Bildinhalten in einem Skillset arbeiten zu können, benötigen Sie Folgendes:

  • Quelldateien, die Bilder enthalten
  • Ein Suchindexer, der für Bildaktionen konfiguriert ist
  • Ein Skillset mit integrierten oder benutzerdefinierten Qualifikationen, die OCR oder Bildanalyse aufrufen
  • Einen Suchindex mit Feldern zum Empfangen der analysierten Textausgabe sowie Ausgabefeldzuordnungen im Indexer, die eine Zuordnung herstellen.

Optional können Sie Projektionen definieren, um bild analysierte Ausgaben für Data Mining-Szenarien in einen Wissensspeicher zu übernehmen.

Einrichten von Quelldateien

Die Bildverarbeitung ist indexergesteuert, was bedeutet, dass die Roheingaben sich an einer unterstützten Datenquelle befinden müssen.

  • Bildanalyse unterstützt JPEG, PNG, GIF und BMP.
  • Die optische Zeichenerkennung (Optical Character Recognition, OCR) unterstützt JPEG, PNG, BMP und TIF.

Bilder können eigenständige Binärdateien oder in Dokumente eingebettet sein (z. B. PDF-, RTF- oder Microsoft-Anwendungsdateien). Aus einem Dokument können maximal 1.000 Bilder extrahiert werden. Wenn in einem Dokument mehr als 1.000 Bilder vorhanden sind, wird eine Warnung generiert, nachdem die ersten 1.000 Bilder extrahiert wurden.

Azure Blob Storage ist der am häufigsten verwendete Speicher für die Bildverarbeitung in Azure KI Search. Es gibt drei Hauptaufgaben im Zusammenhang mit dem Abrufen von Bildern aus einem Blobcontainer:

Konfigurieren von Indexern für die Bildverarbeitung

Aktivieren Sie nach dem Einrichten der Quelldateien die Bildnormalisierung, indem Sie den imageAction-Parameter in der Indexerkonfiguration festlegen. Die Bildnormalisierung macht Bilder für die Downstreamverarbeitung einheitlicher. Die Bildnormalisierung umfasst die folgenden Vorgänge:

  • Große Bilder werden auf eine maximale Höhe und Breite festgelegt, um sie einheitlich zu machen.
  • Bei Bildern mit Metadaten zur Ausrichtung wird die Bilddrehung angepasst, um vertikales Laden zu ermöglichen.

Metadatenanpassungen werden in einem komplexen Typ erfasst, der für jedes Bild erstellt wird. Sie können die Anforderung für die Bildnormalisierung nicht deaktivieren. Qualifikationen, die Bilder wie OCR und Bildanalyse durchlaufen, erwarten normalisierte Bilder.

  1. Erstellen oder aktualisieren Sie einen Indexer, um die Konfigurationseigenschaften festzulegen:

    {
      "parameters":
      {
        "configuration": 
        {
           "dataToExtract": "contentAndMetadata",
           "parsingMode": "default",
           "imageAction": "generateNormalizedImages"
        }
      }
    }
    
  2. Legen Sie dataToExtract auf contentAndMetadata fest (erforderlich).

  3. Vergewissern Sie sich, dass parsingMode auf Standard festgelegt ist (erforderlich).

    Dieser Parameter bestimmt die Granularität der im Index erstellten Suchdokumente. Der Standardmodus richtet eine 1:1-Entsprechung ein, sodass ein Blob zu einem Suchdokument führt. Wenn Dokumente groß sind oder Skills kleinere Textblöcke erfordern, können Sie den Textaufteilungsskill hinzufügen, um ein Dokument zu Verarbeitungszwecken in Seiten zu unterteilen. Für Suchszenarien ist jedoch ein Blob pro Dokument erforderlich, wenn die Anreicherung die Bildverarbeitung umfasst.

  4. Legen Sie imageAction fest, um den Knoten normalized_images in einer Anreicherungsstruktur zu aktivieren (erforderlich):

    • generateNormalizedImages um ein Array normalisierter Bilder im Rahmen der Dokumententschlüsselung zu generieren.

    • generateNormalizedImagePerPage (gilt nur für PDF), um ein Array normalisierter Bilder zu generieren, wobei jede Seite in der PDF-Datei in einem Ausgabebild gerendert wird. Bei Dateien, die nicht im PDF-Format vorliegen, ist das Verhalten dieses Parameters vergleichbar mit dem Festlegen von generateNormalizedImages. Das Festlegen von generateNormalizedImagePerPage kann allerdings die Leistung des Indizierungsvorgangs beeinträchtigen (insbesondere für große Dokumente), da mehrere Bilder generiert werden müssen.

  5. Passen Sie optional die Breite oder Höhe der generierten normalisierten Bilder an:

    • normalizedImageMaxWidth in Pixeln. Der Standardwert ist 2.000. Der Maximalwert ist 10.000.

    • normalizedImageMaxHeight in Pixeln. Der Standardwert ist 2.000. Der Maximalwert ist 10.000.

    Der Standardwert von 2.000 Pixeln für die maximale Breite und Höhe der normalisierten Bilder basiert auf der maximal unterstützten Größe des OCR-Skills und des Skills für Bildanalyse. Der OCR-Skill unterstützt eine maximale Breite und Höhe von 4.200 für nicht englische Sprachen und 10.000 für Englisch. Wenn Sie die maximalen Grenzwerte erhöhen, können bei größeren Images je nach Skillsetdefinition und Sprache der Dokumente Fehler bei der Verarbeitung auftreten.

  • Optional können Sie Dateitypkriterien festlegen, wenn die Arbeitsauslastung auf einen bestimmten Dateityp abzielt. Die Konfiguration des Blob-Indexers umfasst Einstellungen für das Ein- und Ausschließen von Dateien. Sie können Dateien herausfiltern, die Sie nicht möchten.

    {
      "parameters" : { 
          "configuration" : { 
              "indexedFileNameExtensions" : ".pdf, .docx",
              "excludedFileNameExtensions" : ".png, .jpeg" 
          } 
      }
    }
    

Informationen zu normalisierten Bildern

Wenn imageAction auf einen anderen Wert als none festgelegt wird, enthält das neue Feld normalized_images ein Array von Bildern. Jedes Bild ist ein komplexer Typ mit folgenden Elementen:

Bildelement Beschreibung
data Base64-codierte Zeichenfolge mit dem normalisierten Bild im JPEG-Format.
width Breite des normalisierten Bilds (in Pixel).
height Höhe des normalisierten Bilds (in Pixel).
originalWidth Ursprüngliche Breite des Bilds vor der Normalisierung.
originalHeight Ursprüngliche Höhe des Bilds vor der Normalisierung.
rotationFromOriginal Drehung gegen den Uhrzeigersinn zur Erstellung des normalisierten Bilds (in Grad). Der Wert muss zwischen 0 und 360 Grad liegen. In diesem Schritt werden die durch eine Kamera oder einen Scanner generierten Metadaten aus dem Bild gelesen. Der Wert ist in der Regel ein Vielfaches von 90 Grad.
contentOffset Das Zeichenoffset in dem Inhaltsfeld, aus dem das Bild extrahiert wurde. Dieses Feld ist nur für Dateien mit eingebetteten Bildern relevant. contentOffset für Bilder, die aus PDF-Dokumenten extrahiert werden, steht immer am Ende des Texts auf der Seite, aus der er im Dokument extrahiert wurde. Dies bedeutet, dass Bilder nach dem gesamten Text auf dieser Seite angezeigt werden, unabhängig von der ursprünglichen Position des Bilds auf der Seite.
pageNumber Wenn das Bild aus einer PDF-Datei extrahiert oder gerendert wurde, enthält dieses Feld die Seitenzahl in der PDF-Datei, aus der es extrahiert oder gerendert wurde, beginnend bei 1. Wenn das Bild nicht aus einer PDF-Datei stammt, ist dieses Feld 0.

Beispielwert normalized_images:

[
  {
    "data": "BASE64 ENCODED STRING OF A JPEG IMAGE",
    "width": 500,
    "height": 300,
    "originalWidth": 5000,  
    "originalHeight": 3000,
    "rotationFromOriginal": 90,
    "contentOffset": 500,
    "pageNumber": 2
  }
]

Definieren von Skillsets für die Bildverarbeitung

Dieser Abschnitt ergänzt den Artikel zur Referenz der Qualifikationen durch eine ganzheitliche Einführung in Qualifikationseingaben, -ausgaben und -muster, da sie sich auf die Bildverarbeitung beziehen.

  1. Erstellen oder aktualisieren Sie ein Skillset, um Qualifikationen hinzuzufügen.

  2. Fügen Sie Vorlagen für OCR und Bildanalyse aus dem Portal hinzu, oder kopieren Sie die Definitionen aus der Referenzdokumentation zu Qualifikationen. Fügen Sie sie in das Kompetenz-Array Ihrer Skillset-Definition ein.

  3. Schließen Sie bei Bedarf einen Schlüssel für mehrere Dienste in die Azure KI Services-Eigenschaft des Skillsets ein. Azure KI Search führt Aufrufe zu einer abrechenbaren Azure KI Services-Ressource für OCR und Bildanalyse für Transaktionen aus, die den kostenlosen Grenzwert überschreiten (20 pro Indexer pro Tag). Azure KI Services müssen sich in derselben Region wie Ihr Suchdienst befinden.

  4. Falls Originalbilder in PDF-Dateien oder in Anwendungsdateien wie PPTX oder DOCX eingebettet sind, müssen Sie den Textzusammenführungsskill hinzufügen, wenn Sie Bild und Text zusammen ausgeben möchten. Die Arbeit mit eingebetteten Bildern wird weiter in diesem Artikel erläutert.

Sobald das grundlegende Framework Ihres Skillset erstellt wurde und Azure KI Services konfiguriert ist, können Sie sich auf jeden einzelnen Bildskill konzentrieren, Eingaben und Quellkontext definieren und Ausgaben zu Feldern in einem Index oder Wissensspeicher zuordnen.

Hinweis

Das REST-Tutorial Verwenden von REST und KI zum Generieren durchsuchbarer Inhalte aus Azure-Blobs enthält ein Beispiel-Skillset, das die Bildverarbeitung mit einer nachgelagerten Verarbeitung natürlicher Sprache kombiniert. Es wird gezeigt, wie die Ausgabe der Qualifikationsbilderstellung in die Entitätserkennung und Schlüsselbegriffserkennung übertragen wird.

Eingaben für die Bildverarbeitung

Wie bereits erwähnt, werden Bilder während der Dokumententschlüsselung extrahiert und dann als vorläufiger Schritt normalisiert. Die normalisierten Bilder sind die Eingaben für jede Bildverarbeitungs-Qualifikation und werden immer auf eine von zwei Arten in einer angereicherten Dokumentstruktur dargestellt:

  • /document/normalized_images/* ist für Dokumente, die als Ganzes verarbeitet werden.

  • /document/normalized_images/*/pages ist für Dokumente, die in Blöcken (Seiten) verarbeitet werden.

Unabhängig davon, ob Sie OCR und bildanalyse in derselben verwenden, weisen Eingaben praktisch die gleiche Konstruktion auf:

    {
      "@odata.type": "#Microsoft.Skills.Vision.OcrSkill",
      "context": "/document/normalized_images/*",
      "detectOrientation": true,
      "inputs": [
        {
          "name": "image",
          "source": "/document/normalized_images/*"
        }
      ],
      "outputs": [ ]
    },
    {
      "@odata.type": "#Microsoft.Skills.Vision.ImageAnalysisSkill",
      "context": "/document/normalized_images/*",
      "visualFeatures": [ "tags", "description" ],
      "inputs": [
        {
          "name": "image",
          "source": "/document/normalized_images/*"
        }
      ],
      "outputs": [ ]
    }

Zuordnen von Ausgaben zu Suchfeldern

In einem Skillset ist die Ausgabe von Bildanalyse- und OCR-Skills immer Text. Der Ausgabetext wird als Knoten in einer internen angereicherten Dokumentstruktur dargestellt, und jeder Knoten muss Feldern in einem Suchindex oder Projektionen in einem Wissensspeicher zugeordnet werden, um den Inhalt in Ihrer App verfügbar zu machen.

  1. Überprüfen Sie im Skillset den Abschnitt outputs der einzelnen Skills, um zu ermitteln, welche Knoten im angereicherten Dokument vorhanden sind:

    {
      "@odata.type": "#Microsoft.Skills.Vision.OcrSkill",
      "context": "/document/normalized_images/*",
      "detectOrientation": true,
      "inputs": [ ],
      "outputs": [
        {
          "name": "text",
          "targetName": "text"
        },
        {
          "name": "layoutText",
          "targetName": "layoutText"
        }
      ]
    }
    
  2. Erstellen oder aktualisieren Sie einen Suchindex, um Felder hinzuzufügen, um die Skillausgaben zu akzeptieren.

    Im folgenden Beispiel für die Feldsammlung handelt es sich bei content um Blobinhalt. Metadata_storage_name enthält den Namen der Datei. (Legen Sie retrievable auf true fest.) Metadata_storage_path ist der eindeutige Pfad des Blobs und der Standarddokumentschlüssel. Merged_content ist die Ausgabe der Textzusammenführung (nützlich, wenn Bilder eingebettet sind).

    Text und layoutText sind Ausgaben des OCR-Skills und müssen eine Zeichenfolgensammlung sein, um die gesamte OCR-generierte Ausgabe für das gesamte Dokument zu erfassen.

      "fields": [
        {
          "name": "content",
          "type": "Edm.String",
          "filterable": false,
          "retrievable": true,
          "searchable": true,
          "sortable": false
        },
        {
          "name": "metadata_storage_name",
          "type": "Edm.String",
          "filterable": true,
          "retrievable": true,
          "searchable": true,
          "sortable": false
        },
        {
          "name": "metadata_storage_path",
          "type": "Edm.String",
          "filterable": false,
          "key": true,
          "retrievable": true,
          "searchable": false,
          "sortable": false
        },
        {
          "name": "merged_content",
          "type": "Edm.String",
          "filterable": false,
          "retrievable": true,
          "searchable": true,
          "sortable": false
        },
        {
          "name": "text",
          "type": "Collection(Edm.String)",
          "filterable": false,
          "retrievable": true,
          "searchable": true
        },
        {
          "name": "layoutText",
          "type": "Collection(Edm.String)",
          "filterable": false,
          "retrievable": true,
          "searchable": true
        }
      ],
    
  3. Aktualisieren Sie den Indexer, um die Skillsetausgabe (Knoten in einer Anreicherungsstruktur) Indexfeldern zuzuordnen.

    Angereicherte Dokumente sind intern. Um die Knoten in einer angereicherten Dokumentstruktur zu externalisieren, richten Sie eine Ausgabefeldzuordnung ein, die angibt, welches Indexfeld Knoteninhalte empfängt. Auf angereicherte Daten wird von Ihrer App über ein Indexfeld zugegriffen. Das folgende Beispiel zeigt einen Knoten vom Typ Text (OCR-Ausgabe) in einem angereicherten Dokument, das einem Feld vom Typ text in einem Suchindex zugeordnet ist.

      "outputFieldMappings": [
        {
          "sourceFieldName": "/document/normalized_images/*/text",
          "targetFieldName": "text"
        },
        {
          "sourceFieldName": "/document/normalized_images/*/layoutText",
          "targetFieldName": "layoutText"
        }
      ]
    
  4. Führen Sie den Indexer aus, um den Abruf, die Bildverarbeitung und die Indizierung von Quelldokumenten aufzurufen.

Überprüfen der Ergebnisse

Führen Sie eine Abfrage für den Index aus, um die Ergebnisse der Bildverarbeitung zu überprüfen. Verwenden Sie den Such-Explorer als Suchclient oder ein beliebiges Tool, das HTTP-Anforderungen sendet. Die folgende Abfrage wählt Felder aus, die die Ausgabe der Bildverarbeitung enthalten.

POST /indexes/[index name]/docs/search?api-version=[api-version]
{
    "search": "*",
    "select": "metadata_storage_name, text, layoutText, imageCaption, imageTags"
}

OCR erkennt Text in Bilddateien. Das bedeutet, dass OCR-Felder (text und layoutText) leer sind, wenn es sich bei Quelldokumenten um reinen Text oder reine Bilder handelt. Analog dazu sind Bildanalysefelder (imageCaption und imageTags) leer, wenn Quelldokumenteingaben ausschließlich aus Text bestehen. Die Indexerausführung gibt Warnungen aus, wenn Bildverarbeitungseingaben leer sind. Solche Warnungen sind zu erwarten, wenn Knoten im angereicherten Dokument nicht aufgefüllt werden. Denken Sie daran, dass Sie mithilfe der Blobindizierung Dateitypen einschließen oder ausschließen können, wenn Sie isoliert mit Inhaltstypen arbeiten möchten. Sie können diese Einstellungen verwenden, um Rauschen während der Indexerausführung zu reduzieren.

Eine alternative Abfrage zum Überprüfen der Ergebnisse kann die Felder content und merged_content enthalten. Beachten Sie, dass diese Felder Inhalte für alle Blobdateien enthalten, auch wenn keine Bildverarbeitung für sie durchgeführt wurde.

Informationen zu Skillausgaben

Skillausgaben umfassen text (OCR), layoutText (OCR), merged_content, captions (Bildanalyse) und tags (Bildanalyse):

  • text speichert die OCR-generierte Ausgabe. Dieser Knoten sollte dem Feld vom TypCollection(Edm.String) zugeordnet werden. Bei Dokumenten mit mehreren Bildern gibt es pro Suchdokument jeweils ein text-Feld, das aus durch Trennzeichen getrennten Zeichenfolgen besteht. Die folgende Abbildung zeigt die OCR-Ausgabe für drei Dokumente. Zuerst ist ein Dokument, das eine Datei ohne Bilder enthält. Zweitens ist ein Dokument (Bilddatei) mit einem einzelnen Wort (Microsoft). Drittens ist ein Dokument mit mehreren Bildern, einige ohne Text ("",).

    "value": [
        {
            "@search.score": 1,
            "metadata_storage_name": "facts-about-microsoft.html",
            "text": []
        },
        {
            "@search.score": 1,
            "metadata_storage_name": "guthrie.jpg",
            "text": [ "Microsoft" ]
        },
        {
            "@search.score": 1,
            "metadata_storage_name": "Azure AI services and Content Intelligence.pptx",
            "text": [
                "",
                "Microsoft",
                "",
                "",
                "",
                "Azure AI Search and Augmentation Combining Microsoft Azure AI services and Azure Search"
            ]
        }
    ]
    
  • layoutText speichert OCR-generierte Informationen zur Textposition auf der Seite, die in Bezug auf Begrenzungsfelder und Koordinaten des normalisierten Bilds beschrieben werden. Dieser Knoten sollte dem Feld vom TypCollection(Edm.String) zugeordnet werden. Pro Suchdokument gibt es jeweils ein layoutText-Feld, das aus durch Trennzeichen getrennten Zeichenfolgen besteht.

  • merged_content speichert die Ausgabe eines Textzusammenführungsskills. Hierbei sollte es sich um ein großes Feld vom Typ Edm.String mit unformatiertem Text aus dem Quelldokument handeln – mit eingebettetem Text (text) anstelle eines Bilds. Wenn Dateien nur aus Text bestehen, müssen keine OCR- und Bildanalysevorgänge ausgeführt werden, und merged_content ist mit content identisch (eine Blobeigenschaft, die den Inhalt des Blobs enthält).

  • imageCaption erfasst eine Beschreibung eines Bilds in Form von Einzelpersonentags und einer längeren Textbeschreibung.

  • imageTags speichert Tags zu einem Bild als Sammlung von Schlüsselwörtern (eine einzelne Sammlung für alle Bilder im Quelldokument).

Der folgende Screenshot ist eine Abbildung einer PDF, die Text und eingebettete Bilder enthält. Die Dokumententschlüsselung erkannte drei eingebettete Bilder: eine Gruppe Möwen, Karte, Adler. Anderer Text im Beispiel (einschließlich Titel, Überschriften und Textkörper) wurde als Text extrahiert und von der Bildverarbeitung ausgeschlossen.

Screenshot: Drei Bilder in einer PDF-Datei

Die Ausgabe der Bildanalyse wird im JSON-Code (Suchergebnis) weiter unten veranschaulicht. Mit der Qualifikationsdefinition können Sie angeben, welche visuellen Funktionen von Interesse sind. In diesem Beispiel wurden Tags und Beschreibungen erstellt, es gibt jedoch weitere Ausgaben, aus denen Sie auswählen können.

  • Die imageCaption-Ausgabe ist ein Array von Beschreibungen (jeweils eine pro Bild) – gekennzeichnet durch tags und bestehend aus einzelnen Wörtern und längeren Phrasen zur Beschreibung des Bilds. Beachten Sie die Tags mit dem Text a flock of seagulls are swimming in the water (ein Schwarm Möwen schwimmt im Wasser) oder a close up of a bird (eine Nahaufnahme eines Vogels).

  • Die imageTags-Ausgabe ist ein Array von Einzeltags in der Reihenfolge ihrer Erstellung. Beachten Sie, dass Tags wiederholt werden. Es gibt keine Aggregation oder Gruppierung.

 "imageCaption": [
      "{\"tags\":[\"bird\",\"outdoor\",\"water\",\"flock\",\"many\",\"lot\",\"bunch\",\"group\",\"several\",\"gathered\",\"pond\",\"lake\",\"different\",\"family\",\"flying\",\"standing\",\"little\",\"air\",\"beach\",\"swimming\",\"large\",\"dog\",\"landing\",\"jumping\",\"playing\"],\"captions\":[{\"text\":\"a flock of seagulls are swimming in the water\",\"confidence\":0.70419257326275686}]}",
      "{\"tags\":[\"map\"],\"captions\":[{\"text\":\"map\",\"confidence\":0.99942880868911743}]}",
      "{\"tags\":[\"animal\",\"bird\",\"raptor\",\"eagle\",\"sitting\",\"table\"],\"captions\":[{\"text\":\"a close up of a bird\",\"confidence\":0.89643581933539462}]}",
    . . .

 "imageTags": [
    "bird",
    "outdoor",
    "water",
    "flock",
    "animal",
    "bunch",
    "group",
    "several",
    "drink",
    "gathered",
    "pond",
    "different",
    "family",
    "same",
    "map",
    "text",
    "animal",
    "bird",
    "bird of prey",
    "eagle"
    . . .

Szenario: Eingebettete Bilder in PDFs

Wenn die Bilder, die Sie verarbeiten möchten, in andere Dateien eingebettet sind (z. B. in PDF- oder DOCX-Dateien), extrahiert die Anreicherungspipeline nur die Bilder und übergibt sie dann zur Verarbeitung an OCR oder die Bildanalyse. Die Bildextraktion erfolgt während der Dokumententschlüsselungsphase, und sobald die Bilder getrennt sind, bleiben sie getrennt, es sei denn, Sie führen die verarbeitete Ausgabe explizit wieder in den Quelltext zusammen.

Textzusammenführung wird verwendet, um die Bildverarbeitungsausgabe wieder in das Dokument zu integrieren. Obwohl die Textzusammenführung keine zwingende Anforderung ist, wird sie häufig aufgerufen, sodass die Bildausgabe („text“ oder „layoutText“ in OCR, Bildtags, Bildbeschriftungen) erneut in das Dokument eingefügt werden kann. Je nach Skill ersetzt die Bildausgabe ein eingebettetes binäres Bild durch ein direktes Textäquivalent. Die Ausgabe der Bildanalyse kann am Bildspeicherort zusammengeführt werden. Die OCR-Ausgabe wird immer am Ende jeder Seite angezeigt.

Der folgende Workflow beschreibt den Prozess der Bildextraktion, -analyse, -zusammenführung und wie die Pipeline erweitert wird, um bildverarbeitete Ausgaben in andere textbasierte Qualifikationen wie Entitätserkennung oder Textübersetzung zu pushen.

  1. Nach dem Herstellen einer Verbindung mit der Datenquelle lädt und entpackt der Indexer Quelldokumente, extrahiert Bilder und Text und warteschlanget jeden Inhaltstyp zur Verarbeitung in die Warteschlange. Ein angereichertes Dokument, das nur aus einem Stammknoten (document) besteht, wird erstellt.

  2. Bilder in der Warteschlange werden normalisiert und als Knoten document/normalized_images an angereicherte Dokumente übergeben.

  3. Bildanreicherungen werden unter Verwendung von "/document/normalized_images" als Eingabe ausgeführt.

  4. Bildausgaben werden an die Struktur der angereicherten Dokumente übergeben, wobei jede Ausgabe als separater Knoten fungiert. Ausgaben variieren je nach Skill („text“ und „layoutText“ für OCR, „tags“ und „captions“ für die Bildanalyse).

  5. Optional, aber empfohlen, wenn Suchdokumente text- und bildursprungsbasierten Text zusammen enthalten sollen, wird Textzusammenführung ausgeführt, wobei die Textdarstellung dieser Bilder mit dem aus der Datei extrahierten Rohtext kombiniert wird. Textblöcke werden in eine einzelne große Zeichenfolge konsolidiert, in der der Text zuerst in die Zeichenfolge eingefügt wird, und dann in der OCR-Textausgabe oder Bildtags und Untertitel.

    Die Ausgabe von Textzusammenführung ist jetzt der endgültige Text, der für alle Downstreamqualifikationen analysiert werden soll, die textverarbeitungsbereit sind. Wenn Ihr Skillset z. B. sowohl OCR als auch Entitätserkennung enthält, sollte die Eingabe für die Entitätserkennung "document/merged_text" (targetName der Textzusammenführungs-Skillausgabe) lauten.

  6. Nachdem alle Qualifikationen ausgeführt wurden, ist das angereicherte Dokument abgeschlossen. Im letzten Schritt verweisen Indexer auf Ausgabefeldzuordnungen, um angereicherte Inhalte an einzelne Felder im Suchindex zu senden.

Das folgende Beispiel-Skillset erstellt ein merged_text Feld, das den ursprünglichen Text Ihres Dokuments mit eingebetteten OCRed-Text anstelle eingebetteter Bilder enthält. Sie enthält auch eine Qualifikation für die Entitätserkennung, die merged_text als Eingabe verwendet.

Syntax des Anforderungstexts

{
  "description": "Extract text from images and merge with content text to produce merged_text",
  "skills":
  [
    {
        "description": "Extract text (plain and structured) from image.",
        "@odata.type": "#Microsoft.Skills.Vision.OcrSkill",
        "context": "/document/normalized_images/*",
        "defaultLanguageCode": "en",
        "detectOrientation": true,
        "inputs": [
          {
            "name": "image",
            "source": "/document/normalized_images/*"
          }
        ],
        "outputs": [
          {
            "name": "text"
          }
        ]
    },
    {
      "@odata.type": "#Microsoft.Skills.Text.MergeSkill",
      "description": "Create merged_text, which includes all the textual representation of each image inserted at the right location in the content field.",
      "context": "/document",
      "insertPreTag": " ",
      "insertPostTag": " ",
      "inputs": [
        {
          "name":"text", "source": "/document/content"
        },
        {
          "name": "itemsToInsert", "source": "/document/normalized_images/*/text"
        },
        {
          "name":"offsets", "source": "/document/normalized_images/*/contentOffset" 
        }
      ],
      "outputs": [
        {
          "name": "mergedText", "targetName" : "merged_text"
        }
      ]
    },
    {
      "@odata.type": "#Microsoft.Skills.Text.V3.EntityRecognitionSkill",
      "context": "/document",
      "categories": [ "Person"],
      "defaultLanguageCode": "en", 
      "minimumPrecision": 0.5, 
      "inputs": [
        {
            "name": "text", "source": "/document/merged_text"
        }
      ],
      "outputs": [
        {
            "name": "persons", "targetName": "people"
        }
      ]
    }
  ]
}

Das merged_text-Feld kann nun in der Indexerdefinition als durchsuchbares Feld zugeordnet werden. Der gesamte Inhalt Ihrer Dateien – einschließlich des Texts der Bilder – wird somit durchsuchbar.

Szenario: Visualisieren von Begrenzungsfeldern

Ein weiteres gängiges Szenario ist die Visualisierung der Layoutinformationen von Suchergebnissen. So können Sie beispielsweise in Ihren Suchergebnissen den Ort in einem Bild hervorheben, an dem ein Textelement gefunden wurde.

Da der OCR-Schritt für die normalisierten Bilder ausgeführt wird, befinden sich die Layoutkoordinaten im normalisierten Bildbereich. Wenn Sie jedoch das ursprüngliche Bild anzeigen müssen, konvertieren Sie Koordinatenpunkte im Layout in das ursprüngliche Bildkoordinatensystem.

Der folgende Algorithmus veranschaulicht das Muster:

/// <summary>
///  Converts a point in the normalized coordinate space to the original coordinate space.
///  This method assumes the rotation angles are multiples of 90 degrees.
/// </summary>
public static Point GetOriginalCoordinates(Point normalized,
                            int originalWidth,
                            int originalHeight,
                            int width,
                            int height,
                            double rotationFromOriginal)
{
    Point original = new Point();
    double angle = rotationFromOriginal % 360;

    if (angle == 0 )
    {
        original.X = normalized.X;
        original.Y = normalized.Y;
    } else if (angle == 90)
    {
        original.X = normalized.Y;
        original.Y = (width - normalized.X);
    } else if (angle == 180)
    {
        original.X = (width -  normalized.X);
        original.Y = (height - normalized.Y);
    } else if (angle == 270)
    {
        original.X = height - normalized.Y;
        original.Y = normalized.X;
    }

    double scalingFactor = (angle % 180 == 0) ? originalHeight / height : originalHeight / width;
    original.X = (int) (original.X * scalingFactor);
    original.Y = (int)(original.Y * scalingFactor);

    return original;
}

Szenario: Benutzerdefinierte Bildqualifikationen

Bilder können auch an benutzerdefinierte Skills übergeben und von benutzerdefinierten Skills zurückgegeben werden. Das Skillset codiert das Bild, das an den benutzerdefinierten Qualifikation übergeben wird, mit Base64. Um das Image innerhalb des benutzerdefinierten Skills zu verwenden, legen Sie "/document/normalized_images/*/data" als Eingabe für den benutzerdefinierten Skill fest. Decodieren Sie in dem Code des benutzerdefinierten Skills die Zeichenfolge mit Base64, bevor Sie sie in ein Bild konvertieren. Um ein Bild an das Skillset zurückzugeben, codieren Sie es mit Base64, bevor Sie es an das Skillset zurückgeben.

Das Bild wird als Objekt mit den folgenden Eigenschaften zurückgegeben:

 { 
  "$type": "file", 
  "data": "base64String" 
 }

Das Repository mit Azure Search-Python-Beispielen enthält ein vollständiges in Python implementiertes Beispiel für einen benutzerdefinierten Skill, der Bilder anreichert.

Übergeben von Bildern an benutzerdefinierte Skills

Für Szenarios, in denen Sie einen benutzerdefinierten Skill für Bilder erfordern, können Sie Bilder an den benutzerdefinierten Skill übergeben, damit dieser Text oder Bilder zurückgibt. Das folgende Skillset stammt aus einem Beispiel.

Das folgende Skillset erfasst das normalisierte Bild (das bei der Dokumententschlüsselung abgerufen wird) und gibt Segmente des Bilds aus.

Beispielskillset

{
  "description": "Extract text from images and merge with content text to produce merged_text",
  "skills":
  [
    {
          "@odata.type": "#Microsoft.Skills.Custom.WebApiSkill",
          "name": "ImageSkill",
          "description": "Segment Images",
          "context": "/document/normalized_images/*",
          "uri": "https://your.custom.skill.url",
          "httpMethod": "POST",
          "timeout": "PT30S",
          "batchSize": 100,
          "degreeOfParallelism": 1,
          "inputs": [
            {
              "name": "image",
              "source": "/document/normalized_images/*"
            }
          ],
          "outputs": [
            {
              "name": "slices",
              "targetName": "slices"
            }
          ],
          "httpHeaders": {}
        }
  ]
}

Beispiel einer benutzerdefinierten Qualifikation

Der benutzerdefinierte Skill selbst ist extern vom Skillset. In diesem Fall durchläuft der Python-Code zunächst den Batch der Anforderungsaufzeichnung im Format für den benutzerdefinierten Skill und konvertiert dann die mit Base64 verschlüsselte Zeichenfolge in ein Bild.

# deserialize the request, for each item in the batch
for value in values:
  data = value['data']
  base64String = data["image"]["data"]
  base64Bytes = base64String.encode('utf-8')
  inputBytes = base64.b64decode(base64Bytes)
  # Use numpy to convert the string to an image
  jpg_as_np = np.frombuffer(inputBytes, dtype=np.uint8)
  # you now have an image to work with

Analog dazu gilt: Wenn Sie ein Bild zurückgeben möchten, geben Sie eine Base64-verschlüsselte Zeichenfolge in einem JSON-Objekt mit der $type-Eigenschaft file zurück.

def base64EncodeImage(image):
    is_success, im_buf_arr = cv2.imencode(".jpg", image)
    byte_im = im_buf_arr.tobytes()
    base64Bytes = base64.b64encode(byte_im)
    base64String = base64Bytes.decode('utf-8')
    return base64String

 base64String = base64EncodeImage(jpg_as_np)
 result = { 
  "$type": "file", 
  "data": base64String 
}