Estrarre testo e informazioni dalle immagini nell'arricchimento tramite intelligenza artificiale

Grazie all'arricchimento tramite intelligenza artificiale, Ricerca di intelligenza artificiale di Azure offre diverse opzioni per creare ed estrarre testo ricercabile dalle immagini, tra cui:

  • OCR per il riconoscimento ottico dei caratteri di testo e cifre
  • Analisi delle immagini che descrive le immagini tramite funzionalità visive
  • Competenze personalizzate per richiamare qualsiasi elaborazione di immagini esterna da fornire

Tramite OCR, è possibile estrarre testo da foto o immagini contenenti testo alfanumerico, ad esempio la parola "STOP" in un segno di arresto. Tramite l'analisi delle immagini, è possibile generare una rappresentazione testuale di un'immagine, ad esempio "dente di leone" per una foto di un dente di leone o il colore "giallo". È possibile anche estrarre i metadati relativi all'immagine, ad esempio le dimensioni.

Questo articolo illustra i concetti fondamentali dell'uso delle immagini e descrive anche diversi scenari comuni, ad esempio l'uso di immagini incorporate, competenze personalizzate e visualizzazioni sovrapposte alle immagini originali.

Per usare il contenuto delle immagini in un set di competenze, è necessario:

  • File di origine che includono immagini
  • Indicizzatore di ricerca configurato per le azioni dell'immagine
  • Set di competenze con competenze predefinite o personalizzate che richiamano OCR o analisi delle immagini
  • Indice di ricerca con campi per ricevere l'output di testo analizzato, oltre ai mapping dei campi di output nell'indicizzatore che stabilisce l'associazione.

Facoltativamente, è possibile definire proiezioni per accettare l'output analizzato dall'immagine in un archivio conoscenze per scenari di data mining.

Configurare i file di origine

L'elaborazione delle immagini è basata sull'indicizzatore, il che significa che gli input non elaborati devono trovarsi in un'origine dati supportata.

  • L'analisi delle immagini supporta JPEG, PNG, GIF e BMP
  • OCR supporta JPEG, PNG, BMP e TIF

Le immagini sono file binari autonomi o incorporati nei documenti (file pdf, RTF e applicazioni Microsoft). È possibile estrarre un massimo di 1000 immagini da un determinato documento. Se in un documento sono presenti più di 1000 immagini, vengono estratti i primi 1000 e viene generato un avviso.

Archiviazione BLOB di Azure è l'archiviazione usata più di frequente per l'elaborazione di immagini in Ricerca di intelligenza artificiale di Azure. Esistono tre attività principali correlate al recupero di immagini da un contenitore BLOB:

  • Abilitare l'accesso al contenuto nel contenitore. Se si usa un stringa di connessione di accesso completo che include una chiave, la chiave concede l'autorizzazione per il contenuto. In alternativa, è possibile eseguire l'autenticazione usando Microsoft Entra ID o connettersi come servizio attendibile.

  • Creare un'origine dati di tipo "azureblob" che si connette al contenitore BLOB che archivia i file.

  • Esaminare i limiti del livello di servizio per assicurarsi che i dati di origine siano limitati a dimensioni e quantità massime per gli indicizzatori e l'arricchimento.

Configurare gli indicizzatori per l'elaborazione di immagini

Dopo aver configurato i file di origine, abilitare la normalizzazione delle immagini impostando il parametro nella configurazione dell'indicizzatore imageAction . La normalizzazione delle immagini consente di rendere le immagini più uniformi per l'elaborazione downstream. La normalizzazione delle immagini include le operazioni seguenti:

  • Le immagini di grandi dimensioni vengono ridimensionate in base a un'altezza e una larghezza massime per renderle uniformi.
  • Per le immagini con metadati sull'orientamento, la rotazione delle immagini viene modificata per il caricamento verticale.

Le modifiche a livello di metadati vengono acquisite in un tipo complesso creato per ogni immagine. Non è possibile rifiutare esplicitamente il requisito di normalizzazione dell'immagine. Le competenze che consentono di eseguire l'iterazione delle immagini, ad esempio OCR e analisi delle immagini, si aspettano immagini normalizzate.

  1. Creare o aggiornare un indicizzatore per impostare le proprietà di configurazione:

    {
      "parameters":
      {
        "configuration": 
        {
           "dataToExtract": "contentAndMetadata",
           "parsingMode": "default",
           "imageAction": "generateNormalizedImages"
        }
      }
    }
    
  2. Impostare su dataToExtractcontentAndMetadata (obbligatorio).

  3. Verificare che sia parsingMode impostato su predefinito (obbligatorio).

    Questo parametro determina la granularità dei documenti di ricerca creati nell'indice. La modalità predefinita configura una corrispondenza uno-a-uno in modo che un BLOB restituisca un documento di ricerca. Se i documenti sono di grandi dimensioni o se le competenze richiedono blocchi di testo più piccoli, è possibile aggiungere una competenza Suddivisione testo che suddivide un documento in paging a scopo di elaborazione. Tuttavia, per gli scenari di ricerca, è necessario un BLOB per ogni documento se l'arricchimento include l'elaborazione delle immagini.

  4. Impostare imageAction per abilitare il nodo normalized_images in un albero di arricchimento (obbligatorio):

    • generateNormalizedImages per generare una matrice di immagini normalizzate come parte del cracking del documento.

    • generateNormalizedImagePerPage (si applica solo a PDF) per generare una matrice di immagini normalizzate in cui viene eseguito il rendering di ogni pagina nel PDF in un'immagine di output. Per i file non PDF, il comportamento di questo parametro è simile a quello di "generateNormalizedImages". Si noti tuttavia che l'impostazione di "generateNormalizedImagePerPage" può rendere l'operazione di indicizzazione meno efficiente in base alla progettazione (in particolare per i documenti di grandi dimensioni) perché devono essere generate diverse immagini.

  5. Facoltativamente, regolare la larghezza o l'altezza delle immagini normalizzate generate:

    • normalizedImageMaxWidth (in pixel). Il valore predefinito è 2000. Il valore massimo è 10000.

    • normalizedImageMaxHeight (in pixel). Il valore predefinito è 2000. Il valore massimo è 10000.

    Il valore predefinito di 2000 pixel per i valori massimi di altezza e larghezza delle immagini normalizzate è basato sulle dimensioni massime supportate dalla competenza OCR e dalla competenza di analisi delle immagini. La competenza OCR supporta una larghezza e un'altezza massima di 4200 per le lingue non inglesi e 10000 per l'inglese. Se si aumentano i limiti massimi, l'elaborazione potrebbe non riuscire nelle immagini più grandi a seconda della definizione del set di competenze e della lingua dei documenti.

  • Facoltativamente, impostare i criteri del tipo di file se il carico di lavoro è destinato a un tipo di file specifico. La configurazione dell'indicizzatore BLOB include le impostazioni di inclusione e esclusione dei file. È possibile filtrare i file che non si desidera.

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

Informazioni sulle immagini normalizzate

Quando imageAction è impostato su un valore diverso da "none", il nuovo campo normalized_images contiene una matrice di immagini. Ogni immagine è un tipo complesso che contiene i membri seguenti:

Membro immagine Descrizione
data Stringa con codifica Base64 dell'immagine normalizzata in formato JPEG.
width Larghezza dell'immagine normalizzata in pixel.
height Altezza dell'immagine normalizzata in pixel.
originalWidth Larghezza originale dell'immagine prima della normalizzazione.
originalHeight Altezza originale dell'immagine prima della normalizzazione.
rotationFromOriginal Rotazione in senso antiorario, espressa in gradi, effettuata per creare l'immagine normalizzata. Un valore compreso tra 0 e 360 gradi. Questo passaggio legge i metadati dall'immagine generata da una fotocamera o da uno scanner. In genere, è un multiplo di 90 gradi.
contentOffset L'offset di carattere all'interno del campo di contenuto da cui è stata estratta l'immagine. Questo campo è applicabile solo ai file con immagini incorporate. Il contentOffset per le immagini estratte dai documenti PDF è sempre alla fine del testo nella pagina da cui è stato estratto nel documento. Ciò significa che le immagini vengono visualizzate dopo tutto il testo della pagina, indipendentemente dalla posizione originale dell'immagine nella pagina.
Pagenumber Se l'immagine è stata estratta o sottoposta a rendering da un PDF, questo campo contiene il numero di pagina nel PDF da cui è stato estratto o sottoposto a rendering, a partire da 1. Se l'immagine non proviene da un PDF, questo campo è 0.

Valore di esempio di normalized_images:

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

Definire set di competenze per l'elaborazione di immagini

Questa sezione integra gli articoli di riferimento sulle competenze fornendo il contesto per l'uso di input, output e modelli delle competenze, in relazione all'elaborazione delle immagini.

  1. Creare o aggiornare un set di competenze per aggiungere competenze.

  2. Aggiungere modelli per OCR e Analisi immagini dal portale oppure copiare le definizioni dalla documentazione di riferimento sulle competenze. Inserirli nella matrice di competenze della definizione del set di competenze.

  3. Se necessario, includere la chiave multiservizio nella proprietà dei servizi di intelligenza artificiale di Azure del set di competenze. Ricerca di intelligenza artificiale di Azure effettua chiamate a una risorsa dei servizi di intelligenza artificiale di Azure fatturabile per OCR e analisi delle immagini per le transazioni che superano il limite gratuito (20 per indicizzatore al giorno). I servizi di intelligenza artificiale di Azure devono trovarsi nella stessa area del servizio di ricerca.

  4. Se le immagini originali sono incorporate in file PDF o di applicazioni come PPTX o DOCX, è necessario aggiungere una competenza Unione testo se si vuole l'output dell'immagine e l'output di testo insieme. L'uso delle immagini incorporate è illustrato più avanti in questo articolo.

Dopo aver creato il framework di base del set di competenze e aver configurato i servizi di intelligenza artificiale di Azure, è possibile concentrarsi su ogni singola competenza di immagine, definire input e contesto di origine e mappare gli output ai campi in un indice o in un archivio conoscenze.

Nota

Vedere Esercitazione REST: Usare REST e intelligenza artificiale per generare contenuto ricercabile dai BLOB di Azure per un set di competenze di esempio che combina l'elaborazione delle immagini con l'elaborazione del linguaggio naturale downstream. Illustra come inserire l'output dell'immagine delle competenze nel riconoscimento delle entità e nell'estrazione di frasi chiave.

Informazioni sugli input per l'elaborazione delle immagini

Come indicato, le immagini vengono estratte durante il cracking del documento e quindi normalizzate come passaggio preliminare. Le immagini normalizzate sono gli input di qualsiasi competenza di elaborazione delle immagini e sono sempre rappresentate in un albero del documento arricchito in uno dei due modi seguenti:

  • /document/normalized_images/* è per i documenti elaborati interi.

  • /document/normalized_images/*/pages è per i documenti elaborati in blocchi (pagine).

Indipendentemente dal fatto che si usi OCR e l'analisi delle immagini nello stesso, gli input hanno praticamente la stessa costruzione:

    {
      "@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": [ ]
    }

Eseguire il mapping degli output ai campi di ricerca

In un set di competenze, l'output delle competenze di Analisi immagini e OCR è sempre testo. Il testo di output è rappresentato come nodi in un albero dei documenti arricchito interno e ogni nodo deve essere mappato ai campi in un indice di ricerca o alle proiezioni in un archivio conoscenze per rendere disponibile il contenuto nell'app.

  1. Nel set di competenze esaminare la outputs sezione di ogni competenza per determinare quali nodi esistono nel documento arricchito:

    {
      "@odata.type": "#Microsoft.Skills.Vision.OcrSkill",
      "context": "/document/normalized_images/*",
      "detectOrientation": true,
      "inputs": [ ],
      "outputs": [
        {
          "name": "text",
          "targetName": "text"
        },
        {
          "name": "layoutText",
          "targetName": "layoutText"
        }
      ]
    }
    
  2. Creare o aggiornare un indice di ricerca per aggiungere campi per accettare gli output delle competenze.

    Nell'esempio di raccolta di campi seguente "content" è contenuto BLOB. "Metadata_storage_name" contiene il nome del file (assicurarsi che sia "recuperabile"). "Metadata_storage_path" è il percorso univoco del BLOB ed è la chiave del documento predefinita. "Merged_content" viene restituito dall'unione di testo (utile quando le immagini sono incorporate).

    "Text" e "layoutText" sono output della competenza OCR e devono essere una raccolta di stringhe per acquisire tutto l'output generato da OCR per l'intero documento.

      "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. Aggiornare l'indicizzatore per eseguire il mapping dell'output del set di competenze (nodi in un albero di arricchimento) ai campi di indice.

    I documenti arricchiti sono interni. Per esternalizzare i nodi in un albero dei documenti arricchiti, configurare un mapping dei campi di output che specifica il campo indice che riceve il contenuto del nodo. I dati arricchiti sono accessibili dall'app tramite un campo indice. L'esempio seguente mostra un nodo "text" (output OCR) in un documento arricchito mappato a un campo "text" in un indice di ricerca.

      "outputFieldMappings": [
        {
          "sourceFieldName": "/document/normalized_images/*/text",
          "targetFieldName": "text"
        },
        {
          "sourceFieldName": "/document/normalized_images/*/layoutText",
          "targetFieldName": "layoutText"
        }
      ]
    
  4. Eseguire l'indicizzatore per richiamare il recupero del documento di origine, l'elaborazione delle immagini e l'indicizzazione.

Verificare i risultati

Eseguire una query sull'indice per controllare i risultati dell'elaborazione delle immagini. Usare Esplora ricerche come client di ricerca o qualsiasi strumento che invia richieste HTTP. La query seguente seleziona i campi che contengono l'output dell'elaborazione delle immagini.

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

OCR riconosce il testo nei file di immagine. Ciò significa che i campi OCR ("text" e "layoutText") sono vuoti se i documenti di origine sono testo puro o immagini pure. Analogamente, i campi di analisi delle immagini ("imageCaption" e "imageTags") sono vuoti se gli input del documento di origine sono rigorosamente testo. L'esecuzione dell'indicizzatore genera avvisi se gli input di imaging sono vuoti. Tali avvisi devono essere previsti quando i nodi non vengono popolati nel documento arricchito. Tenere presente che l'indicizzazione BLOB consente di includere o escludere tipi di file se si vogliono usare tipi di contenuto in isolamento. È possibile usare queste impostazioni per ridurre il rumore durante l'esecuzione dell'indicizzatore.

Una query alternativa per il controllo dei risultati potrebbe includere i campi "content" e "merged_content". Si noti che questi campi includono il contenuto per qualsiasi file BLOB, anche quelli in cui non è stata eseguita alcuna elaborazione delle immagini.

Informazioni sugli output delle competenze

Gli output delle competenze includono "text" (OCR), "layoutText" (OCR), "merged_content", "didascalia s" (analisi delle immagini), "tags" (analisi delle immagini):

  • "text" archivia l'output generato da OCR. Questo nodo deve essere mappato al campo di tipo Collection(Edm.String). Esiste un campo "text" per ogni documento di ricerca costituito da stringhe delimitate da virgole per i documenti che contengono più immagini. La figura seguente mostra l'output OCR per tre documenti. Il primo è un documento contenente un file senza immagini. Il secondo è un documento (file di immagine) contenente una parola, "Microsoft". Terzo è un documento contenente più immagini, alcune senza testo ("",).

    "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" archivia le informazioni generate da OCR sulla posizione del testo nella pagina, descritte in termini di rettangoli delimitatori e coordinate dell'immagine normalizzata. Questo nodo deve essere mappato al campo di tipo Collection(Edm.String). Esiste un campo "layoutText" per ogni documento di ricerca costituito da stringhe delimitate da virgole.

  • "merged_content" archivia l'output di una competenza Unione testo e deve essere un campo di grandi dimensioni che Edm.String contiene testo non elaborato dal documento di origine, con "text" incorporato al posto di un'immagine. Se i file sono solo testo, l'analisi OCR e dell'immagine non hanno nulla a che fare e "merged_content" è uguale a "contenuto" (una proprietà BLOB che contiene il contenuto del BLOB).

  • "imageCaption" acquisisce una descrizione di un'immagine come singoli tag e una descrizione di testo più lunga.

  • "imageTags" archivia i tag relativi a un'immagine come raccolta di parole chiave, una raccolta per tutte le immagini nel documento di origine.

Lo screenshot seguente è un'illustrazione di un PDF che include testo e immagini incorporate. Il cracking dei documenti ha rilevato tre immagini incorporate: stormo di gabbiani, mappa, aquila. Altro testo nell'esempio (inclusi titoli, intestazioni e testo del corpo) è stato estratto come testo ed escluso dall'elaborazione delle immagini.

Screenshot of three images in a PDF

L'output dell'analisi delle immagini è illustrato nel codice JSON seguente (risultato della ricerca). La definizione della competenza consente di specificare quali funzionalità visive sono di interesse. Per questo esempio sono stati prodotti tag e descrizioni, ma sono disponibili più output tra cui scegliere.

  • L'output "imageCaption" è una matrice di descrizioni, una per immagine, indicata da "tag" costituita da singole parole e frasi più lunghe che descrivono l'immagine. Si notino i tag costituiti da "un gregge di gabbiani stanno nuotando nell'acqua" o "un primo piano di un uccello".

  • L'output "imageTags" è una matrice di singoli tag, elencati nell'ordine di creazione. Si noti che i tag si ripetono. Nessuna aggregazione o raggruppamento.

 "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"
    . . .

Scenario: Immagini incorporate nei PDF

Quando le immagini da elaborare sono incorporate in altri file, ad esempio PDF o DOCX, la pipeline di arricchimento estrae solo le immagini e quindi le passa a OCR o all'analisi delle immagini per l'elaborazione. L'estrazione delle immagini viene eseguita durante la fase di cracking del documento e, una volta separate, le immagini rimangono separate, a meno che non si unisce esplicitamente l'output elaborato nel testo di origine.

L'unione testo viene usata per riportare l'output dell'elaborazione delle immagini nel documento. Anche se l'unione testo non è un requisito rigido, viene spesso richiamata in modo che l'output dell'immagine (testo OCR, layout OCRText, tag di immagine, didascalia immagine) possa essere reintrodotto nel documento. A seconda della competenza, l'output dell'immagine sostituisce un'immagine binaria incorporata con un equivalente di testo sul posto. L'output dell'analisi delle immagini può essere unito in corrispondenza della posizione dell'immagine. L'output OCR viene sempre visualizzato alla fine di ogni pagina.

Il flusso di lavoro seguente illustra il processo di estrazione, analisi, unione e come estendere la pipeline per eseguire il push dell'output elaborato dall'immagine in altre competenze basate su testo, ad esempio Riconoscimento di entità o Traduzione testuale.

  1. Dopo la connessione all'origine dati, l'indicizzatore carica e viola i documenti di origine, estrae immagini e testo e accoda ogni tipo di contenuto per l'elaborazione. Viene creato un documento arricchito costituito solo da un nodo radice ("document").

  2. Le immagini nella coda vengono normalizzate e passate in documenti arricchiti come "document/normalized_images" nodo.

  3. Gli arricchimenti delle immagini vengono eseguiti usando "/document/normalized_images" come input.

  4. Gli output delle immagini vengono passati nell'albero dei documenti arricchiti, con ogni output come nodo separato. Gli output variano in base alla competenza (testo e layoutText per OCR, tag e didascalia per l'analisi delle immagini).

  5. Facoltativo ma consigliato se si desidera che i documenti di ricerca includano testo e testo di origine immagine insieme, l'unione di testo viene eseguita combinando la rappresentazione testuale di tali immagini con il testo non elaborato estratto dal file. I blocchi di testo vengono consolidati in una singola stringa di grandi dimensioni, in cui il testo viene inserito prima nella stringa e quindi nell'output di testo OCR o tag di immagine e didascalia.

    L'output di Unione testo è ora il testo definitivo da analizzare per eventuali competenze downstream che eseguono l'elaborazione del testo. Ad esempio, se il set di competenze include sia OCR che Riconoscimento entità, l'input per Riconoscimento entità deve essere "document/merged_text" (targetName dell'output della competenza Unione testo).

  6. Dopo l'esecuzione di tutte le competenze, il documento arricchito è completo. Nell'ultimo passaggio, gli indicizzatori fanno riferimento ai mapping dei campi di output per inviare contenuto arricchito a singoli campi nell'indice di ricerca.

Il set di competenze di esempio seguente crea un "merged_text" campo contenente il testo originale del documento con testo OCRed incorporato al posto delle immagini incorporate. Include anche una competenza Riconoscimento entità che usa "merged_text" come input.

Sintassi del corpo della richiesta

{
  "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"
        }
      ]
    }
  ]
}

Ora che si dispone di un campo merged_text, è possibile eseguirne il mapping come campo ricercabile nella definizione dell'indicizzatore. In questo modo sarà possibile eseguire ricerche su tutti i contenuti dei file, incluso il testo delle immagini.

Scenario: Visualizzare i rettangoli di selezione

Un altro scenario comune è la visualizzazione delle informazioni di layout nei risultati della ricerca. All'interno dei risultati della ricerca, ad esempio, è possibile che si voglia evidenziare la posizione in cui è stata trovata una porzione di testo in un'immagine.

Poiché il passaggio OCR viene eseguito sulle immagini normalizzate, le coordinate del layout si trovano nello spazio delle immagini normalizzato, ma se è necessario visualizzare l'immagine originale, convertire i punti di coordinate nel layout nel sistema di coordinate dell'immagine originale.

L'algoritmo seguente illustra il modello:

/// <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;
}

Scenario: competenze personalizzate per le immagini

Le immagini possono anche essere passate e restituite da competenze personalizzate. Un set di competenze base64 codifica l'immagine passata alla competenza personalizzata. Per usare l'immagine all'interno della competenza personalizzata, impostare "/document/normalized_images/*/data" come input per la competenza personalizzata. All'interno del codice di competenza personalizzato, la stringa viene decodificata in base64 prima di convertirla in un'immagine. Per restituire un'immagine al set di competenze, codificare in base64 l'immagine prima di restituirla al set di competenze.

L'immagine viene restituita come oggetto con le proprietà seguenti.

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

Il repository di esempi python di Ricerca di Azure include un esempio completo implementato in Python di una competenza personalizzata che arricchisce le immagini.

Passaggio di immagini a competenze personalizzate

Per gli scenari in cui è necessaria una competenza personalizzata per lavorare sulle immagini, è possibile passare immagini alla competenza personalizzata e renderla testo o immagini. Il set di competenze seguente proviene da un esempio.

Il set di competenze seguente accetta l'immagine normalizzata (ottenuta durante il cracking del documento) e restituisce sezioni dell'immagine.

Set di competenze di esempio

{
  "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": {}
        }
  ]
}

Esempio di competenza personalizzata

La competenza personalizzata è esterna al set di competenze. In questo caso, si tratta di codice Python che esegue prima il ciclo del batch di record di richiesta nel formato di competenza personalizzato, quindi converte la stringa con codifica base64 in un'immagine.

# 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

Analogamente a restituire un'immagine, restituire una stringa con codifica Base64 all'interno di un oggetto JSON con una $type proprietà di file.

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 
}

Vedi anche