Freigeben über


Erste Schritte mit DER KI-Texterkennung (OCR)

Die Texterkennung, auch als optische Zeichenerkennung (OCR) bezeichnet, wird in Windows AI Foundry durch eine Reihe von KI-unterstützten APIs (Künstliche Intelligenz) unterstützt, die Text in Bildern erkennen und extrahieren und in maschinenlesbare Zeichenströme konvertieren können.

Diese APIs können Zeichen, Wörter, Linien und polygonale Textrahmen identifizieren und Konfidenzwerte für jede Übereinstimmung bereitstellen. Sie werden auch ausschließlich von der Hardwarebeschleunigung in Geräten mit einer neuralen Verarbeitungseinheit (Neural Processing Unit, NPU) unterstützt, sodass sie schneller und genauer als die älteren Windows.Media.OcrEngine-APIs im Windows-Plattform-SDK sind.

Api-Details finden Sie unter API-Referenz für die Texterkennung (OCR).For API details, see API ref for Text Recognition (OCR).

Von Bedeutung

Nachfolgend finden Sie eine Liste der Windows AI-Features und der Windows App SDK-Version, in der sie derzeit unterstützt werden.

Version 1.8 Experimental (1.8.0-experimental1) - Object Erase, Phi Silica, LoRA-Feinabstimmung für Phi Silica, Unterhaltungszusammenfassung (Text-Intelligenz)

Private Vorschau – Semantiksuche

Version 1.7.1 (1.7.250401001) – Alle anderen APIs

Diese APIs sind nur auf Windows Insider Preview (WIP)-Geräten funktionsfähig, die das 7. Mai-Update erhalten haben. Am 28.-29. Mai wird ein optionales Update auf Nicht-WIP-Geräten veröffentlicht, gefolgt vom Update vom 10. Juni. Mit diesem Update werden die KI-Modelle bereitgestellt, die für die Funktion der Windows AI-APIs erforderlich sind. Diese Updates erfordern außerdem, dass jede App, die Windows AI-APIs verwendet, dies erst tun kann, wenn der App zur Laufzeit die Paketidentität bereitgestellt wurde.

Was kann ich mit der KI-Texterkennung tun?

Verwenden Sie KI-Texterkennungsfeatures, um Text in einem Bild zu identifizieren und zu erkennen. Sie können auch die Textbegrenzungen und Konfidenzbewertungen für den erkannten Text abrufen.

Erstellen eines ImageBuffers aus einer Datei

In diesem WinUI-Beispiel rufen wir eine LoadImageBufferFromFileAsync Funktion auf, um einen ImageBuffer aus einer Bilddatei abzurufen.

In der LoadImageBufferFromFileAsync-Funktion führen wir die folgenden Schritte aus:

  1. Erstellen Sie ein StorageFile-Objekt aus dem angegebenen Dateipfad.
  2. Öffnen Sie einen Stream in der StorageFile mit OpenAsync.
  3. Erstellen Sie einen BitmapDecoder für den Datenstrom.
  4. Rufen Sie GetSoftwareBitmapAsync für den Bitmap-Decoder auf, um ein SoftwareBitmap-Objekt abzurufen.
  5. Zurückgeben eines Bildpuffers aus CreateBufferAttachedToBitmap.
using Microsoft.Windows.Vision;
using Microsoft.Graphics.Imaging;
using Windows.Graphics.Imaging;
using Windows.Storage;
using Windows.Storage.Streams;

public async Task<ImageBuffer> LoadImageBufferFromFileAsync(string filePath)
{
    StorageFile file = await StorageFile.GetFileFromPathAsync(filePath);
    IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read);
    BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
    SoftwareBitmap bitmap = await decoder.GetSoftwareBitmapAsync();

    if (bitmap == null)
    {
        return null;
    }

    return ImageBuffer.CreateBufferAttachedToBitmap(bitmap);
}
#include <iostream>
#include <sstream>
#include <winrt/Microsoft.Windows.AI.Imaging.h>
#include <winrt/Windows.Graphics.Imaging.h>
#include <winrt/Microsoft.Graphics.Imaging.h>
#include <winrt/Microsoft.UI.Xaml.Controls.h>
#include<winrt/Microsoft.UI.Xaml.Media.h>
#include<winrt/Microsoft.UI.Xaml.Shapes.h>

using namespace winrt;
using namespace Microsoft::UI::Xaml;
using namespace Microsoft::Windows::AI;
using namespace Microsoft::Windows::AI::Imaging;
using namespace winrt::Microsoft::UI::Xaml::Controls;
using namespace winrt::Microsoft::UI::Xaml::Media;


winrt::Windows::Foundation::IAsyncOperation<winrt::hstring> 
    MainWindow::RecognizeTextFromSoftwareBitmap(
        Windows::Graphics::Imaging::SoftwareBitmap const& bitmap)
{
    winrt::Microsoft::Windows::AI::Imaging::TextRecognizer textRecognizer = 
        EnsureModelIsReady().get();
    Microsoft::Graphics::Imaging::ImageBuffer imageBuffer = 
        Microsoft::Graphics::Imaging::ImageBuffer::CreateForSoftwareBitmap(bitmap);
    RecognizedText recognizedText = 
        textRecognizer.RecognizeTextFromImage(imageBuffer);
    std::wstringstream stringStream;
    for (const auto& line : recognizedText.Lines())
    {
        stringStream << line.Text().c_str() << std::endl;
    }
    co_return winrt::hstring{ stringStream.str()};
}

Erkennen von Text in einem Bitmapbild

Das folgende Beispiel zeigt, wie Text in einem SoftwareBitmap-Objekt als einzelner Zeichenfolgenwert erkannt wird:

  1. Erstellen Sie ein TextRecognizer-Objekt über einen Aufruf der EnsureModelIsReady Funktion, was bestätigt, dass im System ein Sprachmodell vorhanden ist.
  2. Mit der im vorherigen Codeausschnitt abgerufenen Bitmap rufen wir die RecognizeTextFromSoftwareBitmap Funktion auf.
  3. Rufen Sie CreateBufferAttachedToBitmap in der Bilddatei auf, um ein ImageBuffer-Objekt abzurufen.
  4. Rufen Sie "RecognizeTextFromImage " auf, um den erkannten Text aus dem ImageBuffer abzurufen.
  5. Erstellen Sie ein wstringstream-Objekt, und laden Sie es mit dem erkannten Text.
  6. Gibt die Zeichenfolge zurück.

Hinweis

Die Funktion EnsureModelIsReady wird verwendet, um den Bereitschaftsstatus des Texterkennungsmodells zu überprüfen (und bei Bedarf zu installieren).

using Microsoft.Windows.Vision;
using Microsoft.Windows.AI;
using Microsoft.Graphics.Imaging;
using Windows.Graphics.Imaging;
using Windows.Storage;
using Windows.Storage.Streams;

public async Task<string> RecognizeTextFromSoftwareBitmap(SoftwareBitmap bitmap)
{
    TextRecognizer textRecognizer = await EnsureModelIsReady();
    ImageBuffer imageBuffer = ImageBuffer.CreateBufferAttachedToBitmap(bitmap);
    RecognizedText recognizedText = textRecognizer.RecognizeTextFromImage(imageBuffer);
    StringBuilder stringBuilder = new StringBuilder();

    foreach (var line in recognizedText.Lines)
    {
        stringBuilder.AppendLine(line.Text);
    }

    return stringBuilder.ToString();
}

public async Task<TextRecognizer> EnsureModelIsReady()
{
    if (TextRecognizer.GetReadyState() == AIFeatureReadyState.EnsureNeeded)
    {
        var loadResult = await TextRecognizer.EnsureReadyAsync();
        if (loadResult.Status != PackageDeploymentStatus.CompletedSuccess)
        {
            throw new Exception(loadResult.ExtendedError().Message);
        }
    }

    return await TextRecognizer.CreateAsync();
}
winrt::Windows::Foundation::IAsyncOperation<winrt::Microsoft::Windows::AI::Imaging::TextRecognizer> MainWindow::EnsureModelIsReady()
{
    if (winrt::Microsoft::Windows::AI::Imaging::TextRecognizer::GetReadyState() == AIFeatureReadyState::NotReady)
    {
        auto loadResult = TextRecognizer::EnsureReadyAsync().get();
           
        if (loadResult.Status() != AIFeatureReadyResultState::Success)
        {
            throw winrt::hresult_error(loadResult.ExtendedError());
        }
    }

    return winrt::Microsoft::Windows::AI::Imaging::TextRecognizer::CreateAsync();
}

Abrufen von Wortgrenzen und Konfidenz

Hier zeigen wir, wie Sie das BoundingBox-Element jedes Worts in einem SoftwareBitmap-Objekt als Eine Auflistung von farbcodierten Polygonen in einem Grid-Element visualisieren.

Hinweis

In diesem Beispiel wird davon ausgegangen, dass bereits ein TextRecognizer-Objekt erstellt und an die Funktion übergeben wurde.

using Microsoft.Windows.Vision;
using Microsoft.Graphics.Imaging;
using Windows.Graphics.Imaging;
using Windows.Storage;
using Windows.Storage.Streams;

public void VisualizeWordBoundariesOnGrid(
    SoftwareBitmap bitmap,
    Grid grid,
    TextRecognizer textRecognizer)
{
    ImageBuffer imageBuffer = ImageBuffer.CreateBufferAttachedToBitmap(bitmap);
    RecognizedText result = textRecognizer.RecognizeTextFromImage(imageBuffer);

    SolidColorBrush greenBrush = new SolidColorBrush(Microsoft.UI.Colors.Green);
    SolidColorBrush yellowBrush = new SolidColorBrush(Microsoft.UI.Colors.Yellow);
    SolidColorBrush redBrush = new SolidColorBrush(Microsoft.UI.Colors.Red);

    foreach (var line in result.Lines)
    {
        foreach (var word in line.Words)
        {
            PointCollection points = new PointCollection();
            var bounds = word.BoundingBox;
            points.Add(bounds.TopLeft);
            points.Add(bounds.TopRight);
            points.Add(bounds.BottomRight);
            points.Add(bounds.BottomLeft);

            Polygon polygon = new Polygon();
            polygon.Points = points;
            polygon.StrokeThickness = 2;

            if (word.Confidence < 0.33)
            {
                polygon.Stroke = redBrush;
            }
            else if (word.Confidence < 0.67)
            {
                polygon.Stroke = yellowBrush;
            }
            else
            {
                polygon.Stroke = greenBrush;
            }

            grid.Children.Add(polygon);
        }
    }
}
void MainWindow::VisualizeWordBoundariesOnGrid(
    Windows::Graphics::Imaging::SoftwareBitmap const& bitmap,
    Grid const& grid,
    TextRecognizer const& textRecognizer)
{
    Microsoft::Graphics::Imaging::ImageBuffer imageBuffer = 
        Microsoft::Graphics::Imaging::ImageBuffer::CreateForSoftwareBitmap(bitmap);

    RecognizedText result = textRecognizer.RecognizeTextFromImage(imageBuffer);

    auto greenBrush = SolidColorBrush(winrt::Microsoft::UI::Colors::Green());
    auto yellowBrush = SolidColorBrush(winrt::Microsoft::UI::Colors::Yellow());
    auto redBrush = SolidColorBrush(winrt::Microsoft::UI::Colors::Red());
    for (const auto& line : result.Lines())
    {
        for (const auto& word : line.Words())
        {
            PointCollection points;
            const auto& bounds = word.BoundingBox();
            points.Append(bounds.TopLeft);
            points.Append(bounds.TopRight);
            points.Append(bounds.BottomRight);
            points.Append(bounds.BottomLeft);

            winrt::Microsoft::UI::Xaml::Shapes::Polygon polygon{};
            polygon.Points(points);
            polygon.StrokeThickness(2);
            if (word.MatchConfidence() < 0.33)
            {
                polygon.Stroke(redBrush);
            }
            else if (word.MatchConfidence() < 0.67)
            {
                polygon.Stroke(yellowBrush);
            }
            else
            {
                polygon.Stroke(greenBrush);
            }

            grid.Children().Append(polygon);
        }
    }
}

Verantwortungsvolle KI

Wir haben eine Kombination der folgenden Schritte verwendet, um sicherzustellen, dass diese Imageerstellungs-APIs vertrauenswürdig, sicher und verantwortungsbewusst erstellt sind. Es wird empfohlen, die bewährten Methoden zu überprüfen, die bei der Implementierung von KI-Features in Ihrer App in der verantwortungsvollen generativen KI-Entwicklung unter Windows beschrieben sind.

Siehe auch