Teil 2 Phone-Gestik erkennen: Künstliche Intelligenz für Alle!

Von Philipp Wintersberger (Gastblogger) Autor Feed 1. March 2013 17:50

Willkommen beim zweiten Teil der Blog-Reihe „Phone Gestik erkennen: künstliche Intelligenz für Alle!“. Nachem ich bereits einen kleinen Einblick (siehe Teil 1) in das Thema Gestenerkennung gegeben habe, folgt nun die Theorie. In Teil 1 haben wir künstliche Intelligenz bereits folgend definiert: Als die Fähigkeit, neue und bisher unbekannte Herausforderungen erfolgreich zu meistern.

Die hier vorgestellte Technik, auch „Klassifizierung“ genannt, wird in verschiedensten Bereichen der KI verwendet (zB. Bioinformatik, Spracherkennung, Aktivitäts- und Gestenerkennung, …) um auf Basis von gelernten Mustern oder Merkmalen neuen Input richtig zuzuordnen.

Eigentlich hätte ich mir ja gerne ein anderes Beispiel überlegt als jenes, das mir selbst auf der Universität zu diesem Thema vorgetragen wurde. Recherchen dazu ergaben jedoch, dass dies praktisch DAS Musterbeispiel schlechthin ist – und daher werde auch ich mich in diesem Blog daran halten. Hierbei geht es um folgendes Problem: Ein Förderband in einer Fischfabrik befördert den täglichen Fang zur Produktion, dabei muss ein intelligentes System die beiden Fischarten (Lachs und Barsch) selbstständig voneinander unterscheiden und in verschiedenen Kisten ablegen. Dies soll nur mithilfe eines Computersystems geschehen, welches Zugriff auf eine Kamera hat die das Förderband von oben filmt.

Wie geschieht dies? Zuerst müssen wir uns überlegen, wie wir selbst diese Aufgabe übernehmen würden - wir müssen Eigenschaften definieren, die uns ermöglichen, einen Lachs von einem Barsch zu unterscheiden. Es gäbe hierbei eine große Zahl an Möglichkeiten wie zb. Länge, Gewicht, Farbe, die Anzahl der Zacken auf den Flossen, etc. . Da wir mit unserer Kamera aber nur bestimmte Merkmale „sehen“ können, entscheiden wir uns für folgende 2 Eigenschaften - Länge und Helligkeit

Um diese überhaupt auslesen zu können, ist mitunter diverses Pre-Processing der Eingangsdaten von Nöten (zB. Das Entfernen des Hintergrundes aus dem Bild, …). Die hier ausgewählten Attribute (je nach Aufgabenstellung können einige wenige oder auch viele notwendig sein) werden in einem so genannten Feature-Vector zusammengefasst:

Fish = vector[length, lightness]

Jeder in unserem System vorkommende Fisch wird (ausschließlich) über diesen Vektor beschrieben - alle anderen möglichen Unterscheidungsmerkmale haben wir hiermit bereits ausgeschlossen. Jeder Fisch wird somit zu einem Punkt in einem n-dimensionalen „Feature Space“, wobei „n“ genau der Zahl an Eigenschaften entspricht die wir für unsere Unterscheidung gewählt haben. Nun fügen wir in diesen Feature-Space eine beliebige Zahl an Punkten (Trainingsdaten) ein für diese wir die richtige Klasse bereits kennen (Training). Wir erhalten folgenden Feature-Space:

Aufgabe unseres Systems ist es nun für einen beliebig gewählten weiteren Punkt feststellen zu können welcher Klasse er angehört (Lachs oder Barsch). Dafür wollen wir uns nun einen Algorithmus überlegen - einen so genannten Klassifizierer (Classifier).

Als Beispiel wäre es möglich, einfach eine Grenze zwischen den Klassen zu ziehen und neu auftretende Punkte anhand dieser Grenze einzuteilen (Decision Boundary):

Hier sehen wir zwei mögliche Decision Boundaries. Das Bild links zeigt eine lineare Grenze (Bsp. 1), das Bild rechts (Bsp. 2) eine sehr komplexe. In Beiden Fällen fällt auf: Nicht jeder neue Punkt kann richtig erkannt werden – in Bsp. 1 erkennt man dies schon anhand der Trainingsdaten (blaue Punkte auf der „falschen“ Seite der Grenze), in Beispiel 2 hingegen passt die Grenze zwar schön über unsere Trainingsdaten, man erkennt jedoch schon mit bloßem Auge, dass nicht jeder neu auftauchende Fisch rechts der Grenze zwingend ein Lachs sein muss. In diesem Falle spricht man von der sogenannten „Überfütterung“ (=Overfitting) - unser Modell ist zu sehr auf unsere Testfälle getrimmt. In Summe ist es wohl kaum genauer, aber mit Sicherheit viel langsamer als Beispiel 1 (steigende Komplexität führt zu Performanceverlust).

Um die Qualität (Güte) unseres Modells zu testen, müssen wir nun weitere Punkte vom System erkennen lassen und prüfen, ob sie richtig erkannt wurden. Eine korrekte Klassifizierung von 100% ist im Normalfall nicht möglich (Und wenn doch, dann hätte man für die Lösung des Problems vermutlich gar keine Klassifizierung gebraucht).

Ein Klassifizierer ist also ein Programm, welches im Wesentlichen folgende zwei Funktionen anbietet:

  • Trainingsbeispiel in Feature-Space einfügen (Feature-Vector + richtige Klasse)
  • Neuen Feature-Vector klassifizieren (gibt wenn möglich die richtige Klasse zurück)
  • Ein Klassifizierer muss somit per Definition schon einmal trainiert werden, bevor er überhaupt neue Werte erkennen kann. Bekannte Klassifizierungsalgorithmen sind:

  • Decision Trees
  • Naive Bayes Classifier
  • Support Vector Machine (SVM)
  • Neural Networks
  • Hidden Markov Model (HMM)
  • K-Nearest Neighbour (KNN)
  • In Summe ergibt sich folgender Zyklus (Classification Design Cycle):

  • Data Collection: Welche möglichen Daten stehen überhaupt zur Verfügung?
  • Feature Choice: Welche sinnvollen Eigenschaften lassen sich aus den Daten gewinnen? Hierbei gilt: weniger ist mehr; jede neue Eigenschaft erhöht die Komplexität um eine weitere Dimension.
  • Model Choice: Für welchen Klassifizierungsalgorithmus entscheide ich mich?
  • Training: Einspielen von vordefinierten Trainingsbeispielen
  • Evaluation: Messen der Güte des Modells anhand weiterer Beispiele
  • Dieser Zyklus sollte mitunter mehrmals durchlaufen werden, bis man die für den Anwendungsfall perfekte Kombination aus Features, Algorithmus usw. gefunden hat – Klassifizierung ist somit weniger ein klassisches Programmierproblem als eines, das Kreativität (in Bezug auf Feature Wahl und Gewichtung) und hohe Frustrationstoleranz (selbst aus einem „schlechten“ Durchlauf lassen sich durchaus wichtige Informationen gewinnen) verlangt!

    Im nächsten Beitrag zu dieser Serie werden wir uns mit der Implementierung und Verwendung eines KNN-Classifiers beschäftigen!

    Add comment

      Country flag

    biuquote
    • Comment
    • Preview
    Loading

    Datenschutzhinweis: Sie stimmen durch "Kommentar speichern" der Speicherung Ihrer Angaben durch Microsoft Österreich für die Beantwortung der Anfrage zu. Sie erhalten dadurch keine unerwünschten Werbezusendungen. Ihre Emailadresse wird auf Ihren Wunsch dazu verwendet Sie über neue Kommentare zu informieren.

    Microsoft respektiert den Datenschutz. Datenschutz & Cookies

    Aktuelle Downloads

    Azure Free Trial
     
    Visual Studio Downloads
     
    Windows Azure Free Trial

     
      Developer Events
    Instagram
    CodeFest.at on Facebook

    Datenschutz & Cookies · Nutzungsbedingungen · Impressum · Markenzeichen
    © 2013 Microsoft. Alle Rechte vorbehalten · BlogEngine.NET 2.7.0.0 · Diese Website wird für Microsoft von atwork gehostet.
    powered by atwork