Der SQLsnap-Supermarkt

Werbung
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 -
Herunterladen