Blog

Eine Einführung in die Arbeit mit Azure Cognitive Services

Kognitive Tour de Force

Mar 17, 2023

Früher entwickelte man Machine-Learning-getriebene Systeme dadurch, dass man sich im ersten Schritt Informationen über die verschiedenen neuronalen Netzwerke beschaffte und diese danach schrittweise – meist von Hand – umsetzte. Mit den Azure Cognitive Services stellt Microsoft Entwickler:innen ein schlagkräftiges Werkzeug zur Verfügung, das diverse Aufgaben aus dem Bereich der künstlichen Intelligenz automatisiert erledigt.

Schon ob des immensen Funktionsumfangs ist es illusorisch, in einem einzigen Fachartikel eine Komplettdarstellung der Produktfamilie anzustreben. Aus diesem Grund konzentriert sich dieser Artikel darauf, Highlights und besonders interessante Anwendungsfälle unter Windows 10 zu illustrieren.

SIE LIEBEN AZURE?

Entdecken Sie die BASTA! Tracks

Im Interesse der didaktischen Ehrlichkeit sei schon hier zweierlei angemerkt: Erstens gilt, dass die Nutzung von aus der Cloud bezogenen Services in vielen Fällen langfristig teurer ist als das Selbstentwickeln. Es ist also immer empfehlenswert, die an Microsoft überwiesenen Kosten im Blick zu behalten.

Zweitens sei angemerkt, dass Microsoft die Azure Cognitive Services explizit nicht als Mittel zur Promotion der hauseigenen Windows-Plattform nutzt. So gut wie alle hier vorgestellten Operationen lassen sie sich analog auch unter anderen Betriebssystemen benutzen. Für viele APIs stehen auch REST-Interfaces beziehungsweise Python-SDKs zur Verfügung.

Erste Amtshandlung: Einrichtung des Azure-Backends

Aus der Ausrichtung der Cognitive Services als Azure-Cloud-Service folgt, dass im ersten Schritt logischerweise ein Azure-Konto eingerichtet werden muss, das die für die Authentifikation erforderlichen Connection Strings zur Verfügung stellt.

Interessant ist dabei, dass Microsoft bei den Zugriffsaccounts zwei Gruppen unterscheidet. Wem es, wie dem Autor dieser Zeilen, vor allem auf Bequemlichkeit und nicht so sehr auf Kosten ankommt, ist mit einem Account vom Typ „Cognitive Services Multi-service Account“ am besten gedient. Dabei handelt es sich um eine Catch-All-Ressource, die mit einem Zugriffsschlüssel die folgenden AI-Dienstleistungen gleichermaßen ansprechbar macht:

  • Decision: Content Moderator

  • Language: Language, Translator

  • Speech: Speech

  • Vision: Computer Vision, Custom Vision, Face

Weniger schön ist am Cognitive Services Multi-service Account lediglich, dass Microsoft seine Nutzung von der (für Neuanmeldungen) zur Verfügung stehenden kostenlosen Kontingentierung ausnimmt.

Cognitive Services Contributor erforderlich

Beachten Sie, dass die Nutzung der APIs die Cognitive-Services-Contributor-Rolle voraussetzt. Weitere Informationen zur Konfiguration finden sich unter [1] und [2].

Im nächsten Schritt suchen wir im Azure-Backend nach einer Ressource vom Typ Cognitive services multi-service account. Klicken Sie im nächsten Schritt auf den hellblauen Knopf Create Cognitive services multi-service account, um eine neue Ressource zu erzeugen. Die Zuweisung von Ressourcengruppe, Name und Co. erfolgt dabei wie gewohnt.

Im Bereich der Service Tier ist es empfehlenswert, die Option S0 auszuwählen, sie führt zur Anwendung der unter [3] bereitstehenden Preise. Im Allgemeinen gilt dabei, dass 1 000 Anfragen immer rund einen US-Dollar kosten. Die restlichen Einstellungen sind im Allgemeinen weniger relevant, weshalb wir in die Rubrik Review + Create wechseln und danach durch Anklicken des Create-Knopfes das Backend zum Erzeugen des neuen Containers animieren.

Nach dem erfolgreichen Durchlaufen des Generationsprozesses wechseln Sie im Backend in die Eigenschaften des Services, und öffnen danach die Rubrik Resource Management | Keys and Endpoint. Das Backend blendet dort den in Abbildung 1 gezeigten Dialog ein, der das Herunterladen beziehungsweise Sichtbarmachen der verschiedenen kryptographischen Schlüssel ermöglicht.

hanna_cognitive_1.tif_fmt1.jpgAbb. 1: Diese Schlüssel authentifizieren AI-Applikationen im Backend

Beachten Sie, dass das in Besitz nehmen dieser Strings dem neuen Eigentümer das Ausführen beliebiger Berechnungen zu Ihren Kosten verursacht. Wer sie in einen End-User-Facing-Dienst verpackt, begeht eine Original Sin.

Das vernünftige Managen derartiger Credentials ist allerdings ein Thema der fortgeschrittenen Kryptographie, mit dem wir uns in diesem Artikel nur insofern weiter auseinandersetzen werden, als Sie der Autor vor dem Nutzen einer Stringkonstante in einem Assembly nochmals explizit warnt. In diesem Zusammenhang sei allerdings noch auf [4] verwiesen, wo Microsoft einige (lesenswerte) Zusatzhinweise zu dieser Thematik untergebracht hat.

ZUM NEWSLETTER

Regelmäßig News zur Konferenz und der .NET-Community

Ein erstes Testprojekt verarbeitet Bilder

Wie in der Einleitung festgestellt gilt, dass der Großteil der im Rahmen der Azure Cognitive Services zur Verfügung gestellten Dienste im Hintergrund über ein REST API realisiert wird: Wer ausreichend Geduld mitbringt, kann die Dienste also mit einem beliebigen System ansprechen, sofern dieses zum Absetzen von HTTP-Anfragen befähigt ist.

Das manuelle Implementieren von REST APIs ist allerdings eine erfahrungsgemäß wenig dankbare Aktivität, weshalb Microsoft je nach Popularität des jeweiligen Diensts mehr oder weniger umfangreiche SDKs für verschiedene Zielsysteme zur Verfügung stellt. Im Interesse der Bequemlichkeit wird der Autor in den folgenden Schritten auf Visual Studio 2022 setzen. Unser erstes Projekt entsteht auf Basis der Vorlage Leere App (Universelle Windows-App). Als Projektname sei der String SUSCogni1 vergeben, im Bereich der Zielversionen von Windows erweist sich das Cognitive Services API als vergleichsweise wenig anspruchsvoll.

Nach dem erfolgreichen Durchlaufen des Projektgenerators ist es empfehlenswert, die NuGet-Paketliste zu öffnen: Die Auslieferung der für die Cognitive Services benötigten Komponenten erledigt Microsoft direkt über den in .NET integrierten Paketmanager.

Im nächsten Schritt geben wir den Suchstring Microsoft.Azure.CognitiveServices.Vision.ComputerVision ein und entscheiden uns für die Installation der aktuellsten stabilen Version. Zum Zeitpunkt der Drucklegung bekommen wir die Version 7.0.1 ins Projekt integriert.

Wir werden hier einen ersten Versuch mit dem Bildanalyse-API durchführen: Die Vorgehensweise mit der Installation eines NuGet-Pakets gilt allerdings analog für verschiedene andere Systeme. Anschließend ist es empfehlenswert, einige lokale Variablen mit den für die Authentifikation notwendigen Credentials anzulegen. Die Nutzung der beiden, nach dem folgenden Schema benannten Members hat sich im Bereich des Azure-Codes fast schon als Standard etabliert:

public sealed partial class MainPage : Page {
  static string subscriptionKey = "df. . .";
  static string endpoint = "https://susexperiment.cognitiveservices.azure.com/";

Ob Sie im Feld subscriptionKey den Wert von Key1 oder von Key2 eingeben, bleibt dabei Ihnen überlassen. Den korrekten Endpoint URL finden Sie ebenfalls im Azure-Backend (Abb. 1).

Die .NET SDKs erledigen die eigentliche Kommunikation zwischen Applikation und lokalem Code normalerweise durch eine Abstraktionsklasse, die im Allgemeinen als <Service>-Client bezeichnet wird.

Wer wie wir hier mit einem UWP-Projektskelett arbeitet, sollte diese im ersten Schritt als Membervariable der Mainpage oder einer anderen Klasse anlegen:

public sealed partial class MainPage : Page {
  ComputerVisionClient myClient;

Die eigentliche Initialisierung unter Nutzung der beiden Credential-Variablen ist dann keine Raketenphysik:

public MainPage() {
  this.InitializeComponent();
  myClient =   new ComputerVisionClient(new ApiKeyServiceClientCredentials(subscriptionKey))  { Endpoint = endpoint };
}

Die Entscheidung, auf ein UWP-Projektskelett zu setzen, setzt hier ein wenig Umgreifen voraus. UWP-Applikationen dürfen von Haus aus ja nicht mit dem kompletten Dateisystem der Host-Workstation interagieren. Als Workaround bietet sich die Nutzung eines File Picker an, zu dessen Aktivierung wir im ersten Schritt in der MainPage.xaml einen neuen Button einschreiben müssen.

Die eigentliche Realisierung erfolgt dann fast schon analog zum Common-Dialog. Durch das Async-Setzen des Klick-Handlers ist sichergestellt, dass wir die Ergebnisse des Aufrufs von PickSingleFileAsync direkt in der Methode abernten können (Listing 1).

Listing 1

private async void CmdStartPicker_Click(object sender, RoutedEventArgs e) {
  var picker = new Windows.Storage.Pickers.FileOpenPicker();
  picker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;
  picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
  picker.FileTypeFilter.Add(".jpg");
  picker.FileTypeFilter.Add(".jpeg");
  Windows.Storage.StorageFile file = await picker.PickSingleFileAsync();

Sofern sich der Benutzer erfolgreich für eine Datei entschieden hat, bekommen wir diese in Form eines StorageFile-Objekts zurückgeliefert. Dieses übergeben wir danach an die Methode analyzeFile, in der wir im nächsten Schritt die eigentliche Interaktion mit den Cognitive Services unterbringen werden:

  if (file != null) {
    analyzeFile(file);
  }
}

Der Kopf von analyzeFile beginnt mit der Festlegung der zu analysierenden Features. In der Welt des Machine Learnings, Microsoft übernimmt diese Begriffe in Azure, ist ein Feature dabei eine Gruppe von Attributen, die ein ML-Algorithmus aus angelieferten Informationen zu extrahieren hat (Listing 2).

Listing 2

private async void analyzeFile(Windows.Storage.StorageFile _aFile) {
  List<VisualFeatureTypes?> features = new List<VisualFeatureTypes?>() {
    VisualFeatureTypes.Categories,
    VisualFeatureTypes.Description,
    VisualFeatureTypes.Objects
  };

Microsoft erlaubt Entwickler:innen das Deselektieren nicht benötigter Features, um Rechenleistung einzusparen und geringere Kosten zu verursachen. Für unser eher kleines Beispiel wollen wir uns auf die gezeigten drei Features beschränken. Wer mehr Funktionen nutzen möchte, übergibt einfach mehr der in VisualFeatureTypes angelegten Felder.

Die von Microsoft vorgegebenen ML-Beispiele arbeiten meistens mit im Internet frei ansprechbaren Bildern. Da wir hier allerdings ein im Dateisystem befindliches Bild verarbeiten, müssen wir dieses in ersten Schritt in einen Readable Stream umwandeln:

  var aStream = await _aFile.OpenStreamForReadAsync();
  using (Stream analyzeImageStream = aStream)
  {
    StringWriter myW = new StringWriter();
    Console.SetOut(myW);

Die von den Azure Cognitive Services zurückgegebenen Analyseergebnisse präsentabel zu machen, ist in vielen Fällen eine Wissenschaft für sich. Microsoft bietet in den Codebeispielen allerdings umfangreichen Analysecode an, der (leider) immer auf die Methode Console.WriteLine zurückgreift, um die Analyseergebnisse nach außen zu tragen.

Ein eleganter Weg, um das Abernten der in die Konsole ausgegebenen Strings zu ermöglichen, ist die Nutzung der Methode SetOut. Sie erlaubt, wie hier gezeigt, das Übergeben eines beliebigen StringWriter, der dann die diversen an Write und WriteLine übergebenen Strings aufnimmt und für die spätere Weiterverarbeitung vorhalten kann.

Im nächsten Schritt folgt bei uns jedenfalls ein Aufruf der Methode AnalyzeImageInStreamAsync, die sich um die Übertragung des Bildes in Richtung des Azure-Backends und um das Abernten der ML-Ergebnisse kümmert:

    ImageAnalysis results = await myClient.AnalyzeImageInStreamAsync(analyzeImageStream, visualFeatures: features);

Microsoft zeigt sich im Bereich der Anforderungen an die übertragenen Bilder (Abb. 2) vergleichsweise kompromissbereit.

hanna_cognitive_2.tif_fmt1.jpgAbb. 2: Microsofts AI-Dienste sind im Bereich der Eingabedaten flexibel

Wichtig ist in diesem Zusammenhang, dass die Abarbeitung der AI-Prozesse je nach Belastung die eine oder andere Sekunde in Anspruch nimmt. Beginnen wir danach mit der Auswertung der im Description-Feld angelieferten Ergebnisse (Listing 3).

Listing 3

    if (null != results.Description && null != results.Description.Captions)
    {
      Console.WriteLine("Summary:");
      foreach (var caption in results.Description.Captions)
      {
        Console.WriteLine($"{caption.Text} with confidence {caption.Confidence}");
      }
      Console.WriteLine();
    }

Unter Description versteht Microsoft dabei textuelle Informationen, die den Inhalt des hochgeladenen Bildes mehr oder weniger genau zu beschreiben versuchen. Da ML-Algorithmen so gut wie immer nur Prognosen treffen, liefert Microsoft in caption.Confidence außerdem noch immer einen numerischen Wert zurück, der über die Sicherheit des Zutreffens der jeweiligen Prognose informiert.

Im nächsten Schritt werten wir außerdem noch die Ergebnisse der Objektanalyse aus. Dabei handelt es sich um einen ML-Algorithmus, der das Bild als Ganzes ansieht und versucht, zu bestimmen, welche Regionen des jeweiligen Bildes von welchem Objekt berührt werden (Listing 4).

Listing 4

    if (null != results.Objects)
    {
      Console.WriteLine("Objects:");
      foreach (var obj in results.Objects)
      {
        Console.WriteLine($"{obj.ObjectProperty} with confidence {obj.Confidence} at location {obj.Rectangle.X}, " + $"{obj.Rectangle.X + obj.Rectangle.W}, {obj.Rectangle.Y}, {obj.Rectangle.Y + obj.Rectangle.H}");
      }
      Console.WriteLine();
    }
 
    TxtOut.Text = myW.ToString();
  }
}

Für die Ausgabe der von den Azure Cognitive Services errechneten Ergebnissen fügt der Autor in der Datei MainPage.xaml noch eine Textbox hinzu, die die im StringWriter-Objekt angelieferten Informationen auf den Bildschirm bringt. Mit zwei auf der Intertabac in Dortmund geschossenen Bildern präsentiert sich das Programm dann wie in Abbildung 3 und 4 gezeigt.

hanna_cognitive_3.tif_fmt1.jpgAbb. 3: Sowohl die Landewyck-Managerin …
hanna_cognitive_4.tif_fmt1.jpg
Abb. 4: … als auch die Zigarrenkiste werden problemlos erkannt

 

Sprachverarbeitung

Die Cognitive Services sind nicht auf die Analyse von Bitmaps und anderen Bildmaterialien beschränkt. Spätestens seitdem Microsoft das hinter Dragon stehenden Unternehmen Nuance aufgekauft hat, ist klar, dass man auch im Bereich von Sprachsamples Aktivitäten plant.

Zum Zeitpunkt der Drucklegung sind diese teilweise noch nicht für die Allgemeinheit freigegeben. Wer beispielsweise die Sprechererkennung der Cognitive Services nutzen möchte, muss Microsoft noch explizit um Freischaltung des Accounts ersuchen.

Als nächste Aufgabe wollen wir uns deshalb der Sprachsynthese zuwenden. Microsoft versteht darunter das Anliefern eines Texts an die Cognitive Services, die daraufhin eine wiedergebbare Tondatei liefern. Analog zu Dragon unterstützt Microsoft auch das Umwandeln von Sprache in Text. Das ist allerdings eine Aufgabe, der wir uns jetzt nicht zuwenden wollen.

Für die eigentliche Nutzung wollen wir ein weiteres Beispiel erzeugen, das abermals auf Basis der Vorlage Leere App (Universelle Windows-App) entsteht. Der Projektname lautet nun aber SUSCogni2. Anschließend öffnen wir die NuGet-Paketverwaltung, in der wir nun aber nach dem Paket Microsoft.CognitiveServices.Speech suchen. Installieren Sie es in einer aktuellen Version, und wechseln Sie danach in die Codedatei. Da das Windows-Betriebssystem selbst auch eine (funktionsreduzierte) TTS-Implementierung mitbringt, ist es an dieser Stelle ratsam, über eine Using-Deklaration die Nutzung der Azure Cognitive Services dateiweit vorzuschreiben:

using Microsoft.CognitiveServices.Speech;

Im nächsten Schritt ist man versucht, nach folgendem Schema die von weiter oben bekannten Credentials abermals als Membervariable in der Page anzulegen:

public sealed partial class MainPage : Page {
  static string subscriptionKey = "d. . .";
  static string endpoint = "https://susexperiment.cognitiveservices.azure.com/";
  SpeechSynthesizer mySynth;

Wer diese Anweisungen befolgt, ist allerdings auf der falschen Fährte. Ärgerlicherweise gibt es im Speech SDK mit der Methode FromEndpoint sogar eine Funktion, die das Vorhandensein einer Authentifizierungsmöglichkeit auf Basis von Endpoint und SubscriptionKey andeutet:

public MainPage() {
  this.InitializeComponent();
  var speechConfig = SpeechConfig.FromEndpoint(new Uri(endpoint), subscriptionKey);
  mySynth = new SpeechSynthesizer(speechConfig);

Das Nutzen dieses Codes führt zwar zu einem kompilierbaren Programm, zur Laufzeit wird der Azure-Server die Anfragen allerdings durch die Bank mit dem Fehlercode 404 ablehnen.

Eine funktionsfähige Implementierung erhalten Sie nur, wenn Sie nach folgendem Schema erstens einen Subscription Key und zweitens die Locale, in der Ihre Ressource angemeldet ist, übergeben:

public MainPage() {
  this.InitializeComponent();
  var speechConfig = SpeechConfig.FromSubscription(subscriptionKey, "eastus");

Im nächsten Schritt werden wir in die XAML-Datei wechseln, wo wir eine Listbox mit dem Namen LstVoices anlegen. Danach benötigen wir eine Methode, die eine Liste aller bei den Cognitive Services bekannten Sprachmodelle beantragt. Eine einfache Implementierung, die Sie direkt aus dem Konstruktor der Page aufrufen können, sieht aus wie in Listing 5.

Listing 5

async void voiceFindWorker() { 
  var myVoices = await mySynth.GetVoicesAsync();
  foreach (VoiceInfo aV in myVoices.Voices) {
    LstVoices.Items.Add(aV.Name + " " + aV.LocalName);
  }
  
}

Das von GetVoicesAsync zurückgegebene VoiceInfo-Objekt ist in Bezug auf die angelieferten Informationen eher umfangreich. Für einen ersten Versuch beschränken wir uns daher darauf, die Ergebniswerte Name und LocalName zurückzugeben. Lohn der Programmausführung ist dann das in Abbildung 5 gezeigte Ergebnis.

hanna_cognitive_5.tif_fmt1.jpgAbb. 5: In der Stimmen-Listbox wimmelt es

Im nächsten Schritt wollen wir dafür sorgen, dass unser Programm den gerade eingegebenen Text in der Sprache ausgibt, die der Benutzer in der Listbox auswählt.

Hierzu müssen wir in Schritt eins nach folgendem Schema eine Anpassung des Aufenthaltsorts der SpeechConfig-Variablen durchführen:

public sealed partial class MainPage : Page {
  . . .
  SpeechConfig mySpeechConfig;

Das API-Design des Speech API unterscheidet sich insofern vom bisher vorgestellten, als die Synthesizer-Instanz hier nicht nur die Credentials, sondern auch die jeweils zu verwendende Sprache enthält. Eine Änderung der Sprache setzt also ein Verwerfen des Synthesizer-Objekts voraus, das danach aus der SpeechConfig-Variablen neu ins Leben gerufen werden muss.

Für das eigentliche Bevölkern der SpeechConfig-Variablen benötigen wir dann lediglich den Wert von Name. Diesen speichern wir wie folgt in der Listbox:

foreach (VoiceInfo aV in myVoices.Voices)
{
  LstVoices.Items.Add(aV.Name);
}

Im nächsten Schritt können wir auch schon das eigentliche Sprechen befehligen (Listing 6).

Listing 6

private void TxtTalk_Click(object sender, RoutedEventArgs e)
{
  mySpeechConfig.SpeechSynthesisVoiceName = LstVoices.SelectedItem.ToString();
  mySynth = new SpeechSynthesizer(mySpeechConfig);
  mySynth.SpeakTextAsync(TxtWhat.Text);
}

Im Interesse der Bequemlichkeit schreibt der Autor im ersten Schritt den in der Listbox gewählten Wert in das Attribut SpeechSynthesisVoiceName, um daraufhin einen neuen SpeechSynthesizer zu erzeugen. Der Aufruf der Methode SpeakTextAsync animiert diesen dann zum Sprechen. Die Ausgabe erfolgt bei einem nicht parametrierten Aufruf direkt über das jeweilige Standardaudioausgabegerät des Hostcomputers.

An dieser Stelle ist unser Programm zur Ausführung bereit. Geben Sie einen beliebigen Text in die Textbox ein und aktivieren Sie den Knopf, um sich an der Sprachausgabe zu erfreuen. Wer einen deutschen Text eingeben möchte und beispielsweise eine englische oder französische Sprache wählt, stellt sofort fest, dass Microsoft die Intonierung umfangreich an die jeweiligen Akzente und Landessprachen angepasst hat.

Was wurde aus der Emotionserkennung?

Normalerweise ist es nur schwer vorstellbar, einen Cognitive-Services-Artikel zu verfassen, der die Emotionserkennung anhand von Gesichtsbildern nicht nutzt. Das ist allerdings gar nicht mehr möglich: Microsoft entschied im Juli 2022 nämlich, die diesbezüglichen Funktionen für neu erzeugte Azure-Cognitive-Services-Anmeldungen nicht mehr freizuschalten und sie vorhandenen Nutzern im Laufe von 2023 wegzunehmen.

Hintergrund dieser Entscheidung ist, so Microsoft, dass die Emotionserkennung nicht besonders zuverlässig funktioniert. Das ist übrigens eine Erkenntnis, die der (im Allgemeinen konservativ eingestellte) Autor aus seiner persönlichen Lebenserfahrung bestätigen kann. Gesichtsregungen bzw. die muskulären Bewegungen des Gesichts mögen zwar bei allen Personen identisch sein. Die Bedeutung oder dahinterstehende Emotionen sind allerdings auch vor dem Hintergrund von zum Beispiel Gesundheitszustand und der kulturellen Erziehung zu bewerten.

ZUM NEWSLETTER

Regelmäßig News zur Konferenz und der .NET-Community

Lokales Hosting der AI

Microsoft sieht die AI-Funktionen, wie in der Einleitung des Artikels festgestellt, naturgemäß auch als Mittel zum Erwirtschaften einer Recurring Revenue. Da das Übertragen von höchstpersönlichen Lebensdaten in Zeiten von GDPR und Co. allerdings ein rechtlich durchaus schwieriges Thema ist, bietet Microsoft seit einiger Zeit auch die Möglichkeit an, die Inferenz on Premise durchzuführen.

Schon in der Einleitung sei allerdings darauf hingewiesen, dass es sich dabei um kein Mittel zur Kostenreduktion handelt: Eine lokal durchgeführte Inferenz wird von Microsoft genauso verrechnet, wie wenn die Inferenz unter Nutzung des Azure-Cloud-Backends und der dort befindlichen Rechenressourcen erfolgen würde.

Als Werkzeug der Wahl hat sich Microsoft dabei für Docker-Container entschieden: Das lokale Hosting der Intelligenz erfolgt also durch Ausführung von Docker-Containern. Microsoft empfiehlt dabei die Nutzung von Azure Kubernetes oder Docker Compose, geht aber auch auf andere Laufzeitumgebungen ein.

Wichtig ist in diesem Zusammenhang außerdem, dass ein einmal aktivierter Container (normalerweise) permanent nach Hause telefoniert. Microsoft macht das in den FAQs (Abb. 6) an mehreren Stellen explizit klar.

hanna_cognitive_6.tif_fmt1.jpg
Abb. 6: Ein On-Premise-Container muss permanent Informationen an den Zentralserver liefern

Davon ausgenommen sind nur Großunternehmen, die mit Microsoft einen explizit anderslautenden Vertrag abschließen. In diesem Fall kann auch ein komplett offline arbeitender Container zur Verfügung gestellt werden. Das ist allerdings teuer, Microsoft berechnet ihn nämlich wie eine fix provisionierte Instanz.

An dieser Stelle sollte noch erwähnt werden, dass Microsoft nicht alle in den Cognitive Services zur Verfügung stehenden Dienste auch als Docker-Container anbietet. Zum Zeitpunkt der Drucklegung werden vor allem die folgenden Dienste angeboten:

  • Anomaly Detector

  • Computer Vision

  • Face

  • Form Recognizer

  • Language Understanding (LUIS)

  • Speech Service API

  • Language Service – Sentiment Analysis

  • Language Service – Text Analytics for Health

  • Language Service – Language Detection

  • Language Service – Key Phrase Extraction

Fazit und Ausblick

Die Nutzung der Cognitive Services ermöglicht Entwickler:innen das schnelle und unbürokratische Realisieren verschiedener Aufgaben der AI, die ansonsten sehr zeitintensiv sein können. Insbesondere das erfolgreiche Parametrieren eines AI-Modells ist eine Aufgabe, die man erfahrungsgemäß nur allzu leicht unterschätzt. In diesem Sinne: Gut AI!

Ihr aktueller Zugang zur .NET- und Microsoft-Welt.
Der BASTA! Newsletter:

Behind the Tracks

.NET Framework & C#
Visual Studio, .NET, Git, C# & mehr

Agile & DevOps
Agile Methoden, wie Scrum oder Kanban und Tools wie Visual Studio, Azure DevOps usw.

Web Development
Alle Wege führen ins Web

Data Access & Storage
Alles rund um´s Thema Data

JavaScript
Leichtegewichtig entwickeln

UI Technology
Alles rund um UI- und UX-Aspekte

Microservices & APIs
Services, die sich über APIs via REST und JavaScript nutzen lassen

Security
Tools und Methoden für sicherere Applikationen

Cloud & Azure
Cloud-basierte & Native Apps