Eckart Modrow [email protected] Der SQLsnap-Supermarkt Ein Projekt zur Demonstration der neuen Möglichkeiten für Snap! Status: 6. März 2014 Eckart Modrow SQLsnap-Beispiel „Supermarkt“ Wir stellen uns einen Supermarkt mit verschiedenen Abteilungen vor: einer Scannerkasse (liest Barcodes auf den Produkten, liefert Artikelnummern und Rechnungen) eine Lagerverwaltung mit integrierter Datenbank (erhält Artikelnummern, liefert Preise und bestellt, falls nötig, Produkte von den Lieferanten) eine „intelligente“ Waage für Früchte (erkennt eine Frucht mithilfe einer Kamera, erzeugt Barcodes) eine Werbeabteilung (verantwortlich für Payback, Werbung, Sonderangebote, …) eine Sicherheitsabteilung (verantwortlich für die Bezahlung der Parkgebühren, Kunden mit Hausverbot, …) Die Implementationen der einzelnen Abteilungen laufen auf verschiedenen Computern und kommunizieren mithilfe von Textdateien auf einem Server. Und wir benutzen keine professionellen Verfahren, sondern nur „naive“ Lösungen, die zu Verbesserungen durch die Lernenden herausfordern. 1. Die Scannerkasse Der Schönheit halber nehmen wir ein Bild von einer Scannerkasse als neues Kostüm der Turtle, senden diese an die richtige Position und erzeugen einen Abdruck. Dann stellen wir die Verbindung zu einem geeigneten Server her. Die entsprechenden Anweisungen fassen wir im Block init zusammen. Jetzt brauchen wir Barcodes. Wenn wir keine Ahnung davon haben, erfinden wir welche. Erster Versuch: Wir zeichnen einige schwarze Balken auf die Bühne und versuchen, deren Breiten zu ermitteln. Dann zeichnen wir ein neues Kostüm für die Turtle, einen „Laserpointer“ mit einem roten Fleck vorne. Wir können nun fragen, ob der rote Fleck schwarze Balken berührt. Zusammen mit der Position des Laserpointers erhalten wir die Breiten der Balken. Die sammeln wir in einer Liste widths. -2- Aber zuerst schreiben wir zwei Methoden find next black pixel und find next white pixel. Find next black pixel arbeitet richtig, aber find next white pixel macht das nicht. Warum? Wenn die Spitze der „roten Nase“ des Laserpointers einen schwarzen Balken berührt, hält er an. Aber der Rest der „Nase“ berührt immer noch den weißen Hintergrund. Wir müssen also den Laserpointer ein paar Schritte nach rechts bewegen, bevor wir nach anderen weißen Pixeln fragen. Weiterhin soll der Suchprozess am rechten Bildrand stoppen. Wir erhalten: Es ist einfach, die Breiten aller schwarzen Balken zu erhalten: Wir erzeugen zwei Variable (eine Liste widths und eine Zahl newWidth), messen die x-Positionen des linken und rechten Balkenrandes und packen die Differenz in die Liste. Wegen des Anhaltens am rechten Bildrand ist der letzte Messwert überflüssig und wird gestrichen. -3- Jetzt brauchen wir einen Code, der anzeigt, was die Balken bedeuten. Wir wählen ein Dualsystem mit vier Stellen, ein breiter Balken (width > 35) bedeutet „1“, ein schmaler (width < 25) bedeutet „0“. Wir zeichnen einige Barcodes dieser Art als Kostüme der Bühne und testen das Skript. Um den numerischen Wert unseres Barcodes zu erhalten, wiederholen wir vier Mal: Lies jeweils das letzte Listenelement und rechne es auf die übliche Art um. Dann lösche dieses Element. Falls die Breite nicht im gewählten Bereich ist, melde einen Fehler. Wir senden den Wert des Barcodes an die Lagerverwaltung, um den aktuellen Preis zu erhalten. Dies geschieht, indem wir den Wert in eine Textdatei newCode auf dem Server schreiben. Der gesamte Prozess kann in einem Block zusammengefasst werden. Die Lagerverwaltung muss diese Datei immer wieder lesen und bei Bedarf den richtigen Preis und die Bezeichnung des Artikels liefern, in einer Textdatei namens newPrice. Danach setzt sie newCode wieder auf -1. Die Scannerkasse liest die Datei newPrice immer wieder und erhält irgendwann Preis und Bezeichnung, die zum Barcode gehören. Danach schreibt sie nothing in diese Datei. -4- Übungen: 1. Echte Barcodes nutzen auch die Lücken zwischen den schwarzen Balken: als weiße Balken. Die Breite der weißen Balken hat die gleiche Bedeutung wie die der schwarzen. Ändern Sie das Skript collect all black bar widths zu einem collect all bar widths, das die Breiten aller schwarzen und weißen Balken bestimmt. (Der erste und der letzte Balken sind schwarz.) Wenn vier schwarze Balken benutzt werden: welches ist die größte darstellbare Zahl? 2. Zeichnen Sie einige neue Kostüme für ein Druckersprite, das Barcodes auf die Bühne drucken kann. Zuerst soll der Benutzer nach der darzustellenden Zahl gefragt werden. 3. Suchen Sie Informationen über Ihr nationales Barcodesystem. In Europe werden Sie EANCodes finden. Verändern Sie das Druckersprite zu einem „nationalen Druckersprite“, das diese Codes druckt. 4. Wenn die Lagerverwaltung nicht antwortet, wartet das get new price-Skript bis in alle Ewigkeit. Verändern Sie das Skript zu einer brauchbaren Version. 5. Wenn die Lagerverwaltung richtig arbeitet, erhält die Kasse Antworten der Form <Preis>,<Bezeichnung> Lassen Sie die Kasse Rechnungen für die Kunden produzieren, die Datum und Zeit sowie alle gekauften Produkte mit Preisen und die Gesamtsumme enthalten. Steuern sollen so wie in Ihrem Land üblich angegeben werden. -5- 2. Die Lagerverwaltung Die Lagerverwaltung benutzt eine mySQL-Datenbank auf dem Server. In diesem Fall die snapex_example Datenbank. Dort finden wir drei Tabellen: products(pnr,label,maxstock,minstock,stock) distributors(dnr,name,zipcode,city,street) prices(pnr,dnr,price) Wir müssen antworten, wenn die Scannerkasse nach einem Preis fragt. Deshalb müssen wir dauernd nach Änderungen in der Datei newCode sehen. Aber zuerst drucken wir ein Lagerverwaltungs-Bild auf die Bühne, verbinden uns mit dem Server, wählen die snapex_example Datenbank und erzeugen Variable für alle benutzten Größen: Tabellen und Tabellenspalten. Eine Anfrage zum Finden des aktuellen Preises und der Produktbezeichnung ist einfach. Wir erzeugen den Text der Anfrage, indem wir geeignete Variable im SELECT-Block anordnen. Die Anfrage wird vom exec-SQL-command Block ausgeführt. -6- Die unendliche Schleife ist im Block answer new price gekapselt. Wir sehen dort nach, ob sich die Datei newCode geändert hat. Falls das geschieht, fragen wir den SQLServer nach dem Preis und der Bezeichnung und schreiben diese in die Datei newPrice - falls wir vom Server die richtige Antwort bekommen haben. Wenn dieses Skript in der Lagerverwaltungs-Instanz von SQLsnap läuft, liefert die Scannerkasse die richtige Antwort. Falls Sie Schreibrechte auf dem Server haben1, können Sie die Datenbank auch verwalten. Zuerst müssen Sie den Bestand der Produkte ermitteln. Dazu brauchen Sie deren Code. 1 Falls nicht: installieren Sie mySQL auf dem Computer, auf dem die „Lagerverwaltungs-Instanz” von SQLsnap läuft. Verbinden Sie sich über localhost als Benutzer root. Sie haben dann Schreibrechte. -7- In SQLsnap haben wir derzeit nur Blöcke für select-Kommandos. Deshalb benutzen wir den exec sqlcommand Block direkt für ein Update-Kommando. Wenn der Code ein Produktschlüssel ist, können wir beide Blöcke zu einem Update-Kommando kombinieren: -8- Übungen: 1. Wenn einige Produkte verkauft worden sind, sinkt der Bestand stock unter den Minimalwert minstock. Bestellen Sie neue Produkte, sodass der Maximalbestand maxstock wieder erreicht wird. Suchen Sie den Lieferanten mit dem niedrigsten Preis für dieses Produkt. 2. Der Supermarkt möchte ein „Bio Supermarkt“ werden. Ändern Sie die Lieferanten für alle entsprechenden Produkte und passen Sie die Preise an. 3. Fügen Sie Bioprodukte mit deren Preisen zusätzlich zu den Billigprodukten in die Produkttabelle ein – wenn das möglich ist. 4. Immer Samstagabend wird ein Aktualisierungsvorgang im Lager gestartet, weil sich die Preise der Lieferanten geändert haben könnten. In diesem Fall müssen die Produktpreise angepasst werden. 5. Der Supermarkt funktioniert gut, braucht aber mehr Geld. Erhöhen Sie alle Preise um 10%. 6. Die Lagerverwaltung benötigt Statistiken über die Verkäufe pro Monat und Jahr. Sammeln Sie erforderlichen Daten und stellen Sie die Umsätze in geeigneten Diagrammen dar. 7. Schreiben Sie einen Block für update-Anweisungen für mySQL. Syntax: UPDATE <tablename> SET column = value {,column = value} WHERE <condition>; Beispiel: UPDATE products SET stock = 99 WHERE pnr = 11; 8. Schreiben Sie einen Block für insert-Anweisungen für mySQL. Syntax: INSERT INTO <tablename> (column{,column}) VALUES (value{,value}); Beispiel: INSERT INTO prices (pnr,dnr,price) VALUES (1,2,3.45); 9. Schreiben Sie einen Block für delete-Anweisungen für mySQL. Syntax: DELETE FROM <tablename> WHERE <condition>; Beispiel: DELETE FROM distributors WHERE name = ‘Miller’; -9- 3. Die intelligente Früchtewaage Zuerst versuchen wir einige Kriterien zu finden, mit denen man Früchte unterscheiden kann. Wir zeichnen einen Apfel, eine Orange, eine Aprikose und eine Banane. Die Unterschiede sind offensichtlich: Apfel und Orange sind rund, die Banane ist lang Orange, Aprikose und Banane sind orange-gelb, der Apfel ist (in diesem Fall) grün Die Aprikose ist klein, die anderen sind größer Aber was bedeuten „rund“, „lang“, „gelb“ und „grün“, „groß“??? Wir wissen es, aber der Computer nicht. Wir müssen es ihm beibringen. Unterscheide rund, oval und lang Wir bringen das Objekt in die Bühnenmitte und schicken ein size-measuring-sprite von links nach rechts und von unten nach oben. Wir messen die Größe des Objekts auf diesen Strecken und berechnen das Verhältnis der Ergebnisse. „Runde” Objekte sollten ein Verhältnis nahe bei „1“ haben, „lange“ Objekte andere. Für „ovale“ Objekte sollten wir eigentlich mehrere Messrichtungen benutzen. Aber fürs Erste bedeutet „oval“ für uns „nicht rund und nicht lang“. - 10 - Der measure horizontal size Block liefert eine Liste mit zwei Werten: linke und rechte Grenze. Entsprechend liefert der measure vertical size Block Unter- und Obergrenze des Objekts. Mit diesen Ergebnissen können wir entscheiden, ob ein Objekt rund, lang oder oval ist. Und wir kennen seine Größe. - 11 - Farben von echten Objekten Normale Früchte haben unterschiedliche Farben. Deshalb messen wir die durchschnittliche Farbe, indem wir 10 RGBWerte bestimmen: fünf auf dem horizontalen Schnitt und 5 auf dem vertikalen. (Deshalb mussten wir die Lage des Objekts speichern.) Das ist einfach. Aber unsere RGB-Werte können 256 * 256 * 256 Farben darstellen, also 16.777.218. Das sind etwas zu viele. Wir benötigen ein Verfahren, um die Farbenzahl zu verringern. Wir versuchen es so: Für jeden RGB-Kanal entscheiden wir, ob der Farbwert „hoch oder „niedrig“ ist. Falls er hoch ist, setzen wir ihn auf 255, sonst auf 0. Wir erhalten damit nur zwei mögliche Werte für jeden Kanal, also 2 * 2 * 2 = 8 mögliche Farben. Mit diesem Verfahren probieren wir mal aus, ob wir überhaupt noch etwas Sinnvolles sehen können – oder nicht. Wir ändern die Bühnengröße auf 400 x 400 und laden einige Früchtebilder als Kostüme der Bühne. - 12 - Nun reduzieren wir die Farnanzahl wie beschrieben … .. und finden, dass das reicht. Aber funktioniert es in vertretbarer Zeit? - 13 - Wenn wir das Skript color reduction ausführen, arbeitet es zwar, aber sehr langsam. Deshalb nutzen wir zu Bildbearbeitung die Möglichkeiten zum code mapping von Snap. SQLsnap fügt JavaScript Code zu einigen Blöcken der Paletten hinzu. Wir zeigen diesen Code mithilfe des code of Blocks an: Wenn wir den Code direkt in JavaScript ausführen wollen, benutzen wir den entsprechenden exec JScode of Block. Wenn wir ihn ausführen, erhalten wir das geänderte Bild innerhalb von einigen Sekunden. Wir kapseln den exec JScode of Block mit dem eingebetteten Code in einem neuen reduce colors Block und haben jetzt einen sehr schnellen Befehl zur Bildbearbeitung. Jetzt berechnen wir die mittlere Farbe der Frucht wie angegeben und reduzieren das Ergebnis wieder. Wenn wir das bei einer Orange machen, erhalten wir ein hübsches Gelb. Und unser zweiter Apfel ist natürlich rot. - 14 - Der reduce color Block arbeitet wie beschrieben: er erhält eine Liste mit RGB-Werten und liefert eine Liste mit der reduzierten Farbe. Farbcodes: Aus den reduzierten Farbwerten können wir Farbcodes ableiten: wenn wir 255 als „1“ interpretieren und 0 als „0“ erhalten wir einen dualen Code. Gelb ist „110“ (6) und Rot „100“ (4). - 15 - Jetzt haben wir den vollen Werkzeugkasten zur optischen Früchtebestimmung zusammen: 1. Machen Sie ein Foto einer Frucht. Wählen Sie es als Hintergrundbild der Bühne oder „drucke“ Sie es. (Dann landet es im darüber liegenden „Pentrails“-Bild.) Bilder kann man mit dem Smartphone oder der Laptopkamera machen. Der Hintergrund sollte weiß sein. 2. Reduzieren Sie die Farben des Bildes. 3. Messen Sie Größe und Form der Frucht. 4. Messen Sie die mittlere Farbe der Frucht und reduzieren Sie auch diese. 5. Berechnen Sie den Farbcode der Frucht. Die erhaltenen Daten Form, Größe und Farbcode können als Spalten einer Datenbanktabelle benutzt werden. Wir haben dann je drei unterschiedliche Werte für Größe und Form sowie 8 mögliche Farbcodes. Damit können wir 3 * 3 * 8 = 72 Früchte unterscheiden. - 16 - Aufgaben: 1. Erzeugen Sie eine Datenbanktabelle der folgenden Art für Früchte: PNr label shape size color code 123 red apple round big 4 223 cherry round small 4 456 banana long big 6 … … … … … 2. Fügen Sie die Tabelle zu Ihrer Datenbank hinzu. 3. Ändern Sie die collect data Methode so, dass sie Bezeichnung und Preis der Frucht liefert. Benutzen Sie dafür Datenbankbefehle. 4. Das Farbreduzierungsverfahren ist sehr grob. Erfinden Sie ein besseres. 5. Unser Früchteerkennungsverfahren arbeitet nur gut, wenn die Frucht in der Bühnenmitte platziert und horizontal ausgerichtet ist. Wenn wir ein Sprite mit einem Früchtebild als Kostüm ausstatten, können wir das Sprite in der Mitte zentrieren und ausrichten, bevor wir das Kostüm drucken. Realisieren Sie das Verfahren. 6. Wenn wir einen detaillierteren Farbcode verwenden, können wir mehr Früchte unterscheiden. Wäre das in allen Situationen ein Fortschritt? 7. Es könnte ja sein, dass der Hintergrund der Frucht nicht weiß ist. Können Sie helfen? - 17 - 4. Die Sicherheitsabteilung Unsere Sicherheitsabteilung ist unter anderem für das Parkhaus verantwortlich. Um das Bezahlen der Parkgebühren zu vereinfachen, installiert die Abteilung eine automatische Kennzeichenerkennung. Registrierte Kunden müssen dann nicht mehr vor der Parkhausschranke halten – jedenfalls hoffen wir das. Autokennzeichen enthalten spezielle Zeichensätze, die die Zeichenerkennung durch Computer erleichtern. In Europa haben sie einen schwarzen Rand – und das ist gut für uns. Versuchen wir also, die Zahlen auf dem Kennzeichen zu bestimmen. (Die anderen Zeichen überlassen wir Ihnen.) Glücklicherweise haben wir schon fast alle Werkzeuge für unser Vorhaben realisiert. Sie müssen nur die Leute an der intelligente Früchtewaage fragen! Wir versuchen, eine extrem einfache Methode zur Kennzeichenerkennung zu entwickeln. Das Ergebnis ist sehr empfindlich gegen Änderungen in Lage und Größe der Kennzeichen. Aber diese Nachteile können leicht korrigiert werden, indem ein detailliertes Messverfahren eingesetzt wird. Sehen Sie sich mal die Übungsaufgaben an! - 18 - Verschmutzte Kennzeichen Normalerweise sind Autokennzeichen nicht sauber. Sie tragen Schmutz und manchmal ist ein Teil der Farbe in der Waschanlage verschwunden. Was können wir dagegen tun? Zuerst einmal benötigen wir ein Graustufenbild. Dazu berechnen wir den Mittelwert der drei Farbkanäle für jedes Pixel und tragen das Ergebnis bei allen drei Farben ein. Das Pixel wird dann grau. Wir speichern das Ergebnis im Bild der Bühne. Um die Sache zu beschleunigen, benutzen wir den exec JScode of Block und erhalten das transformierte Bild nach einigen Sekunden. Wir verpacken das Ganze in einem Block change to grayscale. - 19 - Der nächste Schritt ist die Erzeugung eines Schwarz-Weiß-Bildes. Wir wählen einen Schwellwert (in diesem Fall 50), um weiße und schwarze Pixel zu unterscheiden. (Eigentlich sollten wir diesen Prozess gleich bei der Grauwertbestimmung durchführen!) Wir bauen einen change to black and white Block. Das Ergebnis: Lücken schließen Jetzt haben wir zwar ein Schwarz-WeißBild des Autokennzeichens, aber die Zeichen haben Lücken dort, wo der Schmutz war. Diese Lücken sollen mit schwarzer Farbe geschlossen werden. Dazu verdicken wir die Zeichen durch Anfügen einer schwarzen Schicht an alle schwarzen Teile des Bildes. Als Schichtdicke wählen wir „1“. Aber es gibt ein Problem: Wenn wir die veränderten Pixel in das Originalbild schreiben, werden die Änderungen bei den nächsten Schritten des Prozesses wieder gelesen. Wir brauchen also ein zweites Bild für die veränderten Pixel – und wir haben eins: wir lesen von der Bühne und schreiben auf die Pentrails. Wenn wir dann das geänderte Bild wieder auf die Bühne kopieren (copy from pentrails to stage), kann das Verfahren erneut angewandt werden, ohne dass es Kollisionen zwischen Original und Kopie gibt. - 20 - Ergebnis eines Aufrufs von make chars fatter: Nach einigen Aufrufen der Sequenz Erhalten wir: Wir brauchen noch eine Methode make chars thinner, um eine schwarze Schicht abzuschaben – mit demselben Problem wie oben und derselben Lösung (s. nächste Seite). Das Ergebnis nach einem Aufruf ist: - 21 - Wir können zwischen dem Anfügen und dem Abschaben schwarzer Schichten wechseln. Es ist eine Art Handwerkskunst, die beste Kombination aus Wachstums- und Schmelzprozessen zu finden. In jedem Fall ist das Ergebnis viel kompakter als das Schwarz-Weiß-Original. Zeichenerkennung OCR (Optical Character Recognition) benutzt komplexe Methoden, oft mit Neuronalen Netzen, um Zeichen zu erkennen. Wir erfinden hier ein einfacheres Verfahren, das dem der intelligenten Waage ähnelt. Weil alle unsere Zeichen auf dem Nummernschild die gleiche Breite haben, können wir sie leicht identifizieren, wenn wir die Grenzen des Nummernschildes gefunden haben. Bei der intelligenten Waage können Sie sehen, wie das geschieht. - 22 - Um die Sache etwas zu vereinfachen, benutzen wir nur “saubere” Schilder. Wir beginnen, indem wir von links nach rechts vertikale Linien an der Position x suchen, auf denen sich schwarze Pixel befinden. Wenn wir die erste gefunden haben, haben wir auch den Anfang des ersten Zeichens. Danach suchen wir nach der ersten vertikalen Linie ohne schwarze Pixel. Deren x-Position ergibt das Ende des ersten Zeichens. Wir haben ein „Fenster“ mit dem ersten Zeichen darin. Die nächste Linie mit schwarzen Pixeln ergibt die Breite der Lücke zwischen den Zeichen. xpos ist eine globale Variable, in der der Anfang des aktuell betrachteten Zeichens gespeichert wird. Wie der Zeichencode gefunden wird, sehen wir später. - 23 - Wir können ein rotes Rechteck über alle Zeichen bewegen, wenn wir zuerst die Zeichenbreite und die Lücke zwischen den Zeichen bestimmen. Das nächste Skript zeigt, wie das geht. Jetzt versuchen wir so etwas wie OCR. Als Ausgangspunkt nehmen wir die Zeichen mit dem Rechteck rund herum. P1 Wir stellen uns ein “Sensorfeld” aus drei sich kreuzenden Linien vor. An den runden Punkten messen wir die Farben. Wir nummerieren die Punkte wie gezeigt und sehen P2 uns die Resultate in Tabellenform an. (graue Felder: Ergebnis schwer vorherzusagen) P5 char P1 P2 P3 P4 P5 P6 P7 P8 Code(s) 0 00100100 1 01111110 2 01101010 3 01011100 01111100 11010001 4 5 00001100 6 0100100 7 01111010 8 00010100 01010100 00101100 00101110 9 - 24 - 5 P3 P6 P8 P4 P7 Bei den Zeichen „3”, „8“ und „9“ können Fehler auftreten, wenn die Punkte nicht sehr gut justiert sind. Aber das macht nichts, denn wenn wir die Sensoren P2, P3 und P7 etwas verschieben, sodass sie klare Werte liefern, können wir sogar auf die Sensoren P1, P2 und P8 (z. B.) verzichten und haben trotzdem einen brauchbaren Code. char P1 P2 P3 P4 P5 P6 P7 P8 code(s) value(s) 0 10010 18 1 11111 31 2 10101 21 3 11110 30 4 01000 8 5 00110 6 6 00010 2 7 11101 29 8 01010 10 9 10111 23 Ein mögliches Layout für die restlichen Sensoren wäre: Also los! Wir wählen ein Nummernschild mit allen zehn Zeichen als Kostüm für die Bühne. - 25 - Wir müssen die Sensoren an geeigneten Stellen platzieren (hier: (13|50), …), um dort die Farben von der Bühne zu lesen und eine Codenummer aus den Farben, interpretiert als dualer Code, zu bilden. Wenn wir damit fertig sind, transformieren wir den Code mit dem folgenden Skript zum richtigen Zeichen: Wir haben grüne Punkte an den Sensorpositionen gezeichnet und die roten Rechtecke um die gefundenen Zeichen – und das Ergebnis ist wie gewünscht. - 26 - Übungen: 1. In den Beispielen wird nur die horizontale Ausrichtung der Zeichen bestimmt. Suchen Sie auch die vertikale. In den Beispielen werden die Sensorpositionen absolut in Pixeln angegeben („das 13. Pixel von rechts, gemessen vom Rand“, …). Adressieren Sie die Sensoren relative zur Größe des Zeichenrechtecks. 2. Die Zeichenerkennung in den Beispielen ist sehr einfach, aber sehr empfindlich gegen Änderungen in Größe und Position des Nummernschildes. Benutzen Sie mehr Sensoren, um die Zeichen sicherer zu erkennen. 3. Wenn man schmutzige Nummernschilder lesen will, findet man keine scharfen Zeichengrenzen. Als Folge werden einige Sensoren Fehler produzieren. Verbessern Sie die Resultate in solchen Fällen, indem Sie den „nächsten richtigen Code“ eines falschen Codes bestimmen. 4. Zeichenerkennungsprogramme können lernen. Falls das Skript keine erkennbaren Muster findet, sollte es sein Ergebnis anzeigen und nach dem richtigen Zeichen fragen. Speichern Sie die Muster und dazu gehörigen gelernten Zeichen in einer Datenbank-Tabelle. Benutzen Sie Abfragen, um unbekannte Muster zu identifizieren. 5. Benutzen Sie ein Sensorfeld mit mehr Sensoren. Identifizieren Sie damit mehr Zeichen ihres nationalen Zeichensatzes. 6. Die Sicherheitsabteilung benötigt eine Datenbank mit Nummernschildern und Fahrzeugbesitzern sowie deren Staus (Kunde, Betriebsmitglied, unerwünschte Person, externer Parker, …). Können Sie helfen? 7. Die Nummernschilderkennung stellt sich als großer Erfolg der Sicherheitsabteilung heraus. Alle ihre Mitglieder sind sehr stolz darauf und die anderen Betriebsmitglieder bewundern die „Sheriffs“. Die Werbeabteilung möchte nun die Daten der Nummernschildtabelle nutzen, um häufige Kunden als VIP-Kunden zu ehren. Diese erhalten spezielle Parkplätze in der Nähe des Fahrstuhls. Schreiben Sie eine Anfrage, um VIP-Kunden zu finden. 8. Nach einiger Zeit sind die VIP-Parkplätze mit den Autos von Rentnern und Arbeitslosen besetzt. Deshalb erweitert die Werbeabteilung die Kriterien für VIP-Kunden um ein Minimum an Umsatz bei deren Einkäufen. Weil fast alle Kunden Kreditkarten beim Bezahlen benutzen, ist das auch kein Problem. Verbessern Sie die VIP-Kunden-Abfrage entsprechend. 9. Die Werbeabteilung stellt fest, dass es hilfreich wäre, nicht nur den Umsatz eines Kunden zu kennen, sondern auch, was er gekauft hat. Wenn sie die Interessen der Kunden kennt, kann sie diese mit speziellen Angeboten und Sonderpreisen versorgen. Bestimmen Sie die dafür notwendigen zusätzlichen Tabellen und deren Spalten in der Datenbank. Schreiben Sie geeignete Anfragen. - 27 - 10. Die Werbeabteilung möchte wissen, ob ihre Werbemaßnahmen erfolgreich sind. Erreicht sie die Kunden? Versuchen Sie diese Fragen auf der Grundlage der gespeicherten Daten zu beantworten. 11. Auf deutschen Autobahnen wird die LKW-Maut mithilfe von Toll-Collect-Barken bestimmt, die die Kennzeichen der passierenden Fahrzeuge lesen. Sie lesen ALLE Kennzeichen und löschen anschließend die der PKWs. Ist dieses Vorgehen angemessen? Diskutieren Sie die Konsequenzen, falls alle Fahrzeugnummern und deren Positionen gespeichert würden. - 28 - 5. Die Werbeabteilung Die Werbeabteilung ist begeistert über die Möglichkeiten der Zeichenerkennung und möchte diesen Bereich ausweiten: sie möchten wissen, wer sich im Supermarkt befindet. Mit einem Gesichtserkennungsprogramm sollen die Kunden identifiziert werden. Gesichtserkennung Wir versuchen dieses auf einem ähnlichen Weg wie bei der Fruchterkennung. Zuerst zeichnen wir einige Gesichter (ähnlich wie auf Passfotos) und versuchen dann, sie zu erkennen. Paul Peter Mary Wir suchen Gesichter. Deshalb führen wir wieder eine Farbreduzierung durch, aber etwas anders als bei den Früchten. Wir ignorieren den Blau-Kanal der Pixel und reduzieren die Rot- und Grünwerte auf drei Zahlen: 0, 128 und 255. Das Resultat dieser einfachen Transformation ist ziemlich gut: alle Gesichter haben jetzt die gleiche Farbe. - 29 - Hannah Der nächste Schritt besteht darin, alles außer den Gesichtern zu löschen: alle anderen Farben werden auf Weiß gesetzt. Wir ergänzen … … und erhalten … Wir haben jetzt zwar die Gesichter, aber wir benötigen Parameter, um sie zu beschreiben. Dafür benutzen wir Größenverhältnisse ähnlich wie bei den Früchten. Wir messen den Augenabstand und deren Abstand zum Mund, die Nasenlänge im Verhältnis zur Breite des Gesichts, … „Augen“ und „Mund“ sind Löcher im orangenen Gesicht. Zuerst versuchen wir es mit den Augen. Das linke sollte sich über der Mitte und links davon im Passfoto befinden. Dort suchen wir weiße Pixel mit mehreren Schichten weißer Pixel darum herum – so ähnlich wie bei make chars fatter. - 30 - Das rechte Auge wird auf die gleiche Weise identifiziert. Nur die Start-Koordinaten sind unterschiedlich. Genauso geht es mit dem Mund, aber er sollte deutlich größer als ein Auge sein. Und die Nase finden wir als erstes weißes Pixel über dem Mund – wenn es das gibt. Wir messen die Positionen von Augen, Nase und Mund und berechnen die Abstände und Zahlenverhältnisse zwischen ihnen. In find features werden die Ergebnisse zusätzlich grün markiert. - 31 - Ergebnisse: Wenn sich keine richtige Nase auf dem Bild findet, sind die Ergebnisse natürlich falsch. - 32 - Die Ergebnisse fassen wir in einer Datenbanktabelle zusammen. Name noseToEyes mouthToEyes mouthToNose Peter 1.22 0.91 0.74 Paul 1.59 0.59 0.39 Mary 0 1.04 0 0.73 1.00 1.37 Hannah Wenn wir die Datenbank nach einer Person fragen, … … erhalten wir eine Antwort – wenn die Personendaten gespeichert wurden. - 33 - Übungen: 1. Die vier Bilder des Beispiels sind sehr stark vereinfacht. Experimentieren Sie mit echten Bildern. Versuchen Sie diese mit einem Bildverarbeitungsprogramm für die Gesichtserkennung aufzubereiten oder reduzieren Sie den Farbraum geeignet. 2. Geben Sie weitere Parameter zur Gesichtserkennung an. 3. Die Sicherheitsabteilung unseres Supermarkts soll unerwünschte Personen (Diebe, Landstreicher, …) abweisen. Wenn die Gesichtserkennung an den Eingängen „unerwünschte Personen“ registriert, gibt es ein Alarmzeichen im Aufenthaltsbereich der Sicherheitsleute und diese greifen ein. Manchmal bewirkt das lautstarke Proteste der Betroffenen. Deshalb sollen sie etwas unauffälliger abgewiesen werden: die Parkhausschranke öffnet sich nicht, wenn unerwünschte Personen erkannt werden, der Fahrstuhl funktioniert nicht, Türen gehen nicht auf, … Diskutieren Sie die Konsequenzen dieser Entscheidung. 4. Die Werbeabteilung hat auch nette Ideen. Da gibt es z. B. viele Leute im Supermarkt, die entweder nichts oder nur sehr wenig kaufen. Andere kaufen schon, aber nur Billigprodukte oder Sonderangebote. Diese werden jetzt auch als unerwünschte Personen betrachtet, weil sie den VIP-Kunden den Platz wegnehmen. Diskutieren Sie die Konsequenzen dieser Entscheidung. 5. Unerwünschte Personen müssen sich schon eine Weile im Supermarkt aufhalten, bevor sie aufgrund ihres Verhaltens identifiziert werden können. Die Sicherheitsabteilung entwickelt deshalb zusammen mit der Werbeabteilung Profile solcher Leute, damit man sie erkennt, BEVOR sie den Supermarkt das erste Mal betreten. Beschreiben Sie solche Profile und diskutieren Sie die Konsequenzen dieser Entscheidung. 6. Die Werbeabteilung weiß von den Kassen, was die Kunden kaufen. Aber viele sehen sich Produkte an, ohne sie mitzunehmen. Deshalb soll der Weg der Kunden durch den Supermarkt verfolgt werden. Das kann mit „Nummernschildern“ am Einkaufswagen, RFID-Chips an diesen oder mithilfe von Gesichtserkennung geschehen. Jetzt weiß die Werbeabteilung, an welchen Produkten ein Kunde interessiert ist, sie kennt seine unerfüllten Wünsche. Personalisierte Werbung kann ihm direkt auf sein Smartphone geschickt werden oder seine Daten werden an spezialisierte Läden verkauft. Diskutieren Sie die Konsequenzen dieser Entscheidung. 7. Das Supermarkt-Team möchte sich in Zukunft auf die VIP-Kunden konzentrieren. Es erkennt Premiumkunden anhand von entsprechenden Profilen (Automarke, Wohnort, persönliche Daten, die aus der Gesichtserkennung abgeleitet werden, Kaufverhalten in der Vergangenheit, …). Um Ärger mit den Normalkunden zu vermeiden, werden die weiter in den Supermarkt gelassen, aber es passieren denen immer wieder kleine Ärgerlichkeiten (der Fahrstuhl klemmt, … s. Übung 3). Diskutieren Sie die Konsequenzen dieser Entscheidung. - 34 - 8. Gesichtserkennung ist überall verfügbar, wo sich eine Kamera befindet: auf Smartphones, „intelligenten“ Brillen, Laptops, … Weil das Internet auch überall verfügbar ist, können die Bilder mit erreichbaren Datenbanken verglichen werden, z. B. in sozialen Netzwerken. „Erreichbar” müssen die Datenbanken entweder für den Benutzer oder für andere sein, die bei der Übermittlung ebenfalls Zugang zu den Daten haben. Jedenfalls können Personen auf diesem Weg überall in Echtzeit identifiziert werden. Diskutieren Sie die Konsequenzen dieser Entwicklung in unterschiedlichen Kontexten. - 35 -