Versuchsbeschreibung


Die Detektion verschiedener Zustände eines Systems durch Analyse der austretenden Gase wird in vielen Bereichen angewandt oder gerade getestet, beispielsweise in der Industrie (Produktion, Qualitätskontrolle), Medizin (Erkennung von Anzeichen für Krankheiten), Sicherheit (Arbeitsplatzsicherheit, Polizei) oder beim Umweltmonitoring. In diesem Versuch wird beispielhaft eine Erkennung verschiedener Getränkesorten anhand ihrer VOC-Gasemissionen realisiert. Die Hardware muss nicht teuer sein: Der verwendete Gassensor Bosch BME680 kostet einzeln etwa 10 € und lässt sich auch an leistungsschwachen Mikrocontrollern problemlos betreiben.

Versuchsaufbau

Ziel dieses Versuchs ist die Unterscheidung verschiedener Getränkesorten anhand der von ihnen ausgestoßenen Emissionen an VOC-Gasen. Die Getränkesorten können als leicht im Haushalt zu findende Stellvertreter für beliebige VOC-emittierende Stoffe betrachtet werden. In dem beispielhaft gezeigten Versuchsaufbau wird zwischen Apfelsaft, Cola, Wein und kohlensäurehaltigem Mineralwasser („Sprudel“) unterschieden.

Die Aufnahme der Messdaten erfolgt mithilfe des IoT-Kit Octopus und eines Gassensors der Firma Bosch, zur Auswertung und Klassifizierung werden die Daten an einen Computer übertragen. Die einzelnen Komponenten und ihre Funktionsweise werden im Tab Versuchsaufbau erläutert.

Der Weg bis zum endgültigen Klassifikationsmodell ist ein mehrstufiger, da der Sensor sehr fein justiert werden kann und hochdimensionale Datensätze erzeugt werden. Um effektiv klassifizieren zu können, muss die Dimensionalität zunächst verringert werden. Einzelheiten zu diesem Prozess finden sich im Tab Vorverarbeitung.

Mit den reduzierten Datensätzen wird nun ein lineares Klassifikationsmodell gebildet, welches die vier angegebenen Getränke zuverlässig unterscheiden soll. Anhand der Daten werden die augenscheinlich charakteristischen Unterschiede zwischen den Getränkesorten ermittelt und von da ab zur Klassifikation verwendet. Mehr dazu im Tab Modellbildung.

Mit dem Modell steht nun die wichtigste Komponente des gesamten Systems – das System muss jetzt noch bedienbar gemacht werden. Wie die beigefügten Skripte auszuführen sind und wie mithilfe der „künstlichen Nase“ klassifiziert werden kann, wird im Tab Anwendung erläutert.

Zur Durchführung des Versuchs werden mehrere Komponenten verwendet, die unterschiedliche Aufgaben übernehmen. Diese lassen sich einteilen in eine mobile Einheit und eine stationäre Einheit.

Die mobile Einheit wird zur Aufnahme der Messungen am Einsatzort verwendet. Diese werden dann an die stationäre Einheit weitergeleitet, wo die Klassifikation durchgeführt wird. Die Datenübertragung kann lokal per serieller Schnittstelle geschehen, oder auch über das Internet – was die ganze Anwendung zu einer Cloud-Dienstleistung macht. Das Ergebnis der Klassifikation wird dann wieder an die mobile Einheit zurückgesendet, wo sie auf einem Bildschirm dargestellt wird.

Den Kern der mobilen Einheit bildet das IoT-Kit „Octopus“, eine Arduino-Plattform mit zahlreichen Schnittstellen für Erweiterungen. Der Octopus wurde vom Umwelt-Campus Birkenfeld und der Expertengruppe Internet der Dinge des Nationalen Digital-Gipfels entwickelt. An den Octopus angeschlossen ist per Adafruit-Interface eine LED-Matrixanzeige (zur Anzeige des Klassifikationsergebnisses) sowie ein externer Gassensor Bosch BME680 zur Detektion der Gasemissionen.

Hinweis: Neuere Generationen des Octopus haben einen Bosch BME680 bereits integriert und benötigen deshalb keinen externen mehr.

Der Bosch BME680 Gassensor ist eigentlich ein vielseitiger Multi-Umgebungssensor, denn neben Gaskonzentrationen misst er auch Umgebungstemperatur, Luftdruck und Luftfeuchtigkeit. All diese Faktoren führen zu Querbeeinflussung der VOC-Messungen und stellen deshalb in diesem Kontext sinnvolle zusätzliche Informationen dar.

Für die Messung der VOC-Gase wird ein im Inneren des Sensors befindlicher elektrischer Leiter den Gasemissionen ausgesetzt und dann durch Stromdurchfluss auf bis zu 400 °C aufgeheizt. Unterschiedliche VOC-Gase beeinflussen dabei den elektrischen Widerstand des Leiters unterschiedlich, weisen gewisse Charakteristiken auf. Dieser Widerstand wird gemessen und zur Klassifikation genutzt.

Es ist wichtig zu realisieren, dass der Sensor nicht direkt Daten zur chemischen Zusammensetzung oder der Konzentrationen von Gasen liefert, sondern diese Rückschlüsse erst durch weitere Beobachtung des Verhaltens des elektrischen Widerstands bei Veränderung des äußeren Systems gezogen werden können. Da für das vorliegende Experiment das Wissen um genaue chemische Zusammensetzungen nicht relevant ist, wird in die Richtung auch nicht weiter geforscht. Stattdessen werden die Gemeinsamkeiten und Unterschiede der vier Getränkeklassen in Bezug auf diesen elektrischen Widerstand betrachtet.

Im Rahmen dieses Versuchs werden zunächst wiederholt die Widerstände für alle Getränkeklassen gemessen, während der Sensor langsam von 30 °C bis hoch zu 400 °C aufheizt. Nach Schritten von jeweils 1 °C wird der Messwert abgefragt, dies ergibt 371 Werte bzw. Features pro Messung. Ziel dieser langen Messreihen ist, diejenigen Temperaturstufen zu finden, bei deren Kombination sich die beste Unterscheidbarkeit der vier Klassen ergibt, dies geschieht dann in der Vorverarbeitung.

Zusätzlich zur reinen Messung des Stoffes (Getränks) findet vor jeder solchen Stoffmessung noch eine technisch gleich ablaufende Messung der Umgebungsluft statt. Diese wird mit der Stoffmessung verrechnet und dient als Kalibrierung, um Veränderungen der Sensorausgabe durch Faktoren wie Betriebsdauer oder Querempfindlichkeiten herauszufiltern. Die Verrechnung findet nach der Formel \(Resultat(t)=\frac{Getränk(t)-Umgebung(t)}{Umgebung(t)},\) \(t = 30^{\circ}\text{C} \ldots 400^{\circ}\text{C}\) statt. Der Ergebnisvektor Resultat, der für jede Messung entsteht, wird zur weiteren Verwendung in der Vorverarbeitung und Modellbildung herangezogen.

Die Vorverarbeitung der Daten besteht im Wesentlichen aus einem Prozess zur Merkmalsauswahl (engl. „Feature Selection“). Das Ziel ist, aus dem 371 zur Verfügung stehenden Temperaturstufen nur so viele zu bestimmen, wie sinnvoll sind, um die Qualität unserer Anwendung zu verbessern. Eine solche Vorverarbeitung verbessert die Anwendung aus folgenden Gründen:

  • Da es sich bei den Daten um kontinuierliche Daten handelt, besteht zwischen benachbarten Temperaturstufen eine sehr hohe Kolleration. Zwischen 300 °C und 301 °C beispielsweise sind die Daten quasi identisch, mehr Features bringen keinen Informationsgewinn.
  • Doch: Je mehr Features ins Modell einfließen, desto mehr Trainingsdaten werden benötigt, um die Zusammenhänge zu lernen, denn umso schwieriger ist die Generalisierung (siehe Kapitel VC-Theorie im Versuch „Schallbasierte Ortung“)
  • Und nicht zuletzt: Je weniger Temperaturen das Modell benötigt, desto weniger müssen auch gemessen werden, was die Zeit in der praktischen Anwendung für eine Messung extrem beschleunigt.

Um eine Kombination an Temperaturstufen zu finden, die gute Separierbarkeit gewährleistet, werden in diesem Versuch die Feature-Selection-Methoden Exhaustive Search und Forward Sequential Search beide verwendet und die Ergebnisse gegenübergestellt. Hierbei handelt es sich um sog. Wrapper-Methoden, d. h. der fertige Lernalgorithmus (Multiclass-SVM, siehe Abschnitt Modellbildung) wird mit Teilmengen der ursprünglichen 371-dimensionalen Feature-Menge trainiert, und es wird eine Kombination gesucht, bei welcher ein SVM-Modell resultiert, das möglichst gut klassifiziert.

Exhaustive Search verfolgt dabei den theoretisch idealen, praktisch NP-harten Ansatz, alle \(2^n\)  (mit n Anzahl der Features) möglichen Kombinationen auszuprobieren und die optimale Kombination zu liefern. Ist die Anzahl der Features fix (hier 371), so lässt sich die benötigte Rechenzeit ausrechnen. Für den Praxisversuch wurde die Möglichkeit implementiert, die Anzahl der zu wählenden Features auf ein Maximum \(m\) zu begrenzen, was die Kombinationen beschränkt auf \(\begin{pmatrix}n \\\ m \end{pmatrix}\).

Forward Sequential Search ist hingegen ein Greedy-Algorithmus, der zunächst die eine Temperatur sucht, welche für sich allein genommen die beste Separabilität erzeugt. Davon ausgehend wird dann eine zweite Temperatur gesucht, welche in Kombination mit der ersten die Separabilität möglichst gut verbessert. So geht es weiter, bis keine weitere Verbesserung erreicht wird.

Die Vorteile von Forward Sequential Search liegen in der höheren Geschwindigkeit gegenüber Exhaustive Search und in der zusätzlichen Information, welche Features am „wichtigsten“ sind, d. h. den größten Gewinn in der Separabilität erzeugt haben. Der Nachteil ist, dass Forward Sequential nur bestimmte Pfade betrachtet und deshalb nicht notwendigerweise zum idealen Ergebnis gelangt.

Ist der jeweils verwendete Algorithmus zu einem Ergebnis gekommen, so werden die vorhandenen Datensätze nach den resultierten Features gefiltert und mit dem Ergebnis das Klassifikationsmodell erstellt.

Downloads

Durch manuelle Visualisierung der Datenverteilung bei zwei weit auseinanderliegenden Temperaturen lässt sich feststellen, dass die Daten eine lineare Separierung zu ermöglichen scheinen. Anders ausgedrückt: Die Daten der einzelnen Getränke sammeln sich in charakteristischen Bereichen, welche von den angrenzenden Bereichen durch Trenngeraden abgegrenzt werden können. Auf Grundlage dieser Beobachtung wurde ein Klassifikationsalgorithmus gewählt, dessen Suchraum (also die Menge der in Betracht gezogenen Hypothesen) derart eingeschränkt ist, dass er solche linearen Schranken sucht.

 

Die beobachtete „stapelhafte“ Übereinanderlegung der Getränkedaten führte zur Wahl eines ordinalen Multiclass-SVM-Modells.

Eine SVM („Support Vector Machine“) ist ein mathematisches Verfahren zur Mustererkennung, welches im Bereich des Machine Learning oft zum Zweck der Klassifikation verwendet wird. Gegeben ein Problem mit zwei Klassen, sucht die SVM eine optimale lineare Trennebene zwischen den beiden „Parteien“ anhand von Trainingsdaten. Um zu dieser Trennebene zu kommen, löst die SVM ein spezifisches konvexes Optimierungsproblem. Ist die Trennebene gefunden, ordnet die SVM alle künftig eintreffenden Datenpunkte anhand ihrer Lage in Bezug auf die Trennebene einer der beiden Klassen zu. Kompliziertere Varianten der SVM ermöglichen auch den Einsatz bei nicht linear trennbaren Problemen.

Da das hier vorliegende Problem allerdings vier Klassen umschließt und nicht nur zwei, werden mehrere SVMs (und damit mehrere Trennebenen) benötigt, um zwischen allen Klassen zu unterscheiden, deshalb „Multiclass-SVM“. Die Art und Weise, wie die SVMs miteinander zusammenarbeiten – und dadurch auch, wie viele benötigt werden – steckt in dem Wort „ordinal“. Neben ordinalen Modellen gibt es durchaus noch eine Reihe anderer Modelle – das ordinale Modell eignet sich, wenn sich die Cluster wie dargestellt „übereinander stapeln“. Oder anders ausgedrückt: Wenn sich auf der Menge der Klassen eine totale Ordnung bezüglich der Lage der Trainingsdaten erkennen lässt.

Die folgende Abbildung zeigt das fertige Modell: In der Vorverarbeitung wurden die Temperaturstufen 313 °C und 400 °C als die beiden relevantesten identifiziert, mehr Stufen machen die Separabilität der Trainigsdaten nicht besser. (Kein Wunder, die Trennung ist fast ideal.) Ein ordinales Multiclass-SVM-Modell führt bei \(n\) Klassen zu \(n – 1\) SVMs, in diesem Fall also drei SVMs und daher drei Trennebenen (Hyperplanes).

Wenn zukünftig weitere Messungen durchgeführt und mithilfe dieses Modells klassifiziert werden sollen (wie im Tab Anwendung) beschrieben, müssen nun lediglich noch diese zwei Temperaturen gemessen werden, statt alle 371. Der Vorgang wird zwar nur in Maßen beschleunigt (siehe Tab Anwendung für Erklärung), aber das Modell ganz erheblich mit einem sinnvollen Bias gestützt.

Downloads

Die zum Versuch gehörenden Skripte zeigen die verschiedenen Schritte des Versuchs (Vorverarbeitung, Modellbildung) anhand eines Beispieldatensatzes. Dieser Beispieldatensatz besteht aus vier Klassen (Apfelsaft, Cola, Wein und kohlensäurehaltiges Mineralwasser aka Sprudel) à 20 Messungen. Jede Messung besteht aus einem 371-dimensionalen Vektor, mit den nach der Formel im Tab Versuchsaufbau verrechneten Sensorwerten zu dem Temperaturen 30 °C bis 400 °C. Die Temperaturen wurden aufsteigend gemessen, jede Temperatur wurde dabei so lange gehalten, bis der vom Sensor aufgenommene Wert stabil war.

Das Skript plotTwoDimensional.m ermöglicht, zwei beliebige Temperaturen auszuwählen und sich den Datensatz gefiltert nach diesen Temperaturen anzeigen zu lassen. So lässt sich intuitiv beurteilen, welche Temperaturkombinationen für eine lineare Trennung geeignet sein könnten.

Das Skript featureSelection.m führt anhand des Datensatzes die Feature Selection durch wie im Tab Vorverarbeitung beschrieben, der Algorithmus (Exhaustive Search oder Forward Sequential Search) kann durch Setzen der Variablen im Optionsblock geändert werden.

Das Skript SVMtraining.m trainiert anhand des Datensatzes und der gewählten Features die Multiclass-SVM wie beschrieben im Tab Modellbildung. Nach Bestimmung der Trennebenen werden diese in einer zweidimensionalen (bei zwei Features) bzw. dreidimensionalen (bei drei oder mehr Features) Darstellung angezeigt.

Und letztlich kann die Nase live verwendet werden, um mit dem trainierten Modell weitere Datensätze zu klassifizieren.

An den Octopus muss der Bosch BME680 entweder bereits aufgelötet (wie bei neueren Modellen üblich) oder extern über den I2C-Port angeschlossen sein. Des Weiteren sollte ein Adafruit Rotary Encoder an dem dafür vorgesehenen Platz in der Mitte des Boards angebracht werden, und ein CharliePlex FeatherWing-Display sollte auf dem Octopus zur Anzeige aufgesteckt sein.

Sind diese Voraussetzungen erfüllt, wird der Arduino-Sketch BoardSoftware auf den Octopus geladen, das Skript classifyNewSamples.m geöffnet, der korrekte COM-Port im Optionsblock eingestellt und das Skript dann gestartet. Das Skript fordert dann zum optionalen Eingeben eines Dateinamens auf, um die Messungen zu speichern. Der rechte NeoPixel des Octopus blinkt nun blau. Als letzte Vorbereitungsmaßnahme wird mit einem Druck auf den Rotary Switch der Octopus in Bereitschaft versetzt.

Auch jede Einzelmessung teilt sich auf in eine Umgebungsmessung (an der Luft) und eine anschließende Stoffmessung, wobei jeder Messung zunächst eine „Cooldown-Phase“ vorangeht, in welcher der Sensor sich auf die Ausgangstemperatur zurücksetzt. Zunächst sollte der Sensor also explizit nicht dem Stoff ausgesetzt sein, weil automatisch mit der ersten Umgebungsmessung begonnen wird. Nach Abschluss der Umgebungsmessungsphase folgt die Stoffmessungsphase, in welcher der Sensor über ein mit dem Getränk gefülltes Glas gehalten wird. Die aktuelle Phase wird durch die Farbe der auf dem Octopus befindlichen NeoPixel dargestellt:

LED links LED rechts Phase was ist zu tun
pink grün Cooldown Umgebung Sensor von Getränk wegnehmen
rot grün Messung Umgebung weiterhin Sensor an der Freiluft belassen
weiß grün Cooldown Stoff jetzt Sensor über Getränk platzieren
grün grün Messung Stoff weiterhin Sensor über Getränk belassen

 

Wenn der gesamte Messdurchlauf mit Umgebungs- und Stoffmessung durchlaufen wurde, wird die Messung am Computerbildschirm in einem Plot dargestellt. Das erkannte Getränk erscheint als Schriftzug auf dem FeatherWing-Display.

Downloads

Dieser Versuch demonstriert, dass die Unterscheidung von VOC-Gasen durch Maschinelles Lernen prinzipiell möglich ist. Mittels einer bekannten Lernstichprobe lassen sich signifikante Merkmale finden, sodass sich das Problem auf deren Betrachtung reduzieren lässt. Der in diesem Versuch verwendete Lernalgorithmus wurde im Hinblick auf die Datenlage gewählt, in anderen Anwendungsfällen können durchaus andere Algorithmen sinnvoller sein. Die Verteilung der Anwendung in eine mobile und eine stationäre Einheit ermöglicht auch die Zentralisierung rechenintensiver Aufgaben auf Cloud-Plattformen, dazu ist neben der Sensorik ein geeigneter IoT-Kommunikationskanal (MQTT o. ä.) erforderlich.