Maschinelle Bilderkennung mit Elasticsearch

17. Januar 2017
Bildersuche
Google hat schon lange erkannt, dass es sinnvoll ist, ähnliche Bilder mit einem selbst hochgeladenen Bild suchen zu lassen. Es wird im Hintergrund erkannt, in welchen Themengebiet das hochgeladene Bild sich eingrenzen lässt. Eine automatische Verschlagwortung ist somit möglich. Wäre es nicht toll, wenn Sie eine Bildersuche mit keinen Lizenzkosten und wenig Aufwand, in ihren eigenen entwickelten Applikationen integrieren könnten?
 
Ich habe gute Nachrichten. Mit Elasticsearch und einem Plugin ist maschinelle Bilderkennung mit wenigen Schritten möglich. 
 
Das Ziel des Blogbeitrages ist es eine Umgebung aufzubauen, wobei eine Bilderkennung und Bildersuche für Testzwecke möglich ist.

Wo wird eine Bilderkennung eingesetzt?

Eine maschinelle Bilderkennung wird immer dann eingesetzt, wenn unbekannte Objekte identifiziert werden müssen und darauf eine Reaktion erforderlich ist. Der Faktor „Mensch“ wird dabei nicht miteinbezogen. Solche Bilderkennungsverfahren werden schon einige Jahre in der Industrie eingesetzt, um beispielsweise bestimmte Bauteile zu identifizieren. Moderne Sortierungsanlagen benutzen High-Speed Kameras, um eine schnelle Erkennung zu gewährleisten. In der Automobilindustrie forscht man aktuell über autonomes Fahren, wobei sich ein Auto ohne Fahrer im Straßenverkehr bewegen kann. Hier spielt das Erfassen der Straßenschilder eine wichtige Rolle.
 
Auch im Bereich der biometrischen Daten (Gesicht, Retina, Fingerabdruck) lässt sich eine eindeutige Person identifizieren und ersetzt beispielsweise Sicherheitsabfragen von Passwörtern.
 
Weiterhin wird häufig eine Bilderkennung eingesetzt, um digitale Fotos automatisch zu verschlagworten (taggen). Das kann sinnvoll sein, wenn wichtige Metadaten fehlen, um das Bild suchbar zu machen. Beispielsweise ein Strandfoto des letzten Urlaubs mit den Namen „Img_1604“, kann nun auch mit dem Stichwort „Urlaub“ oder „Strand“ gefunden werden.      

Was ist Elasticsearch?

Elasticsearch ist eine java-basierende Open Source Suchmaschine, die Daten in JSON-Format speichert. Die kleinste Einheit ist hier das sogenannte „Dokument“. Ein Beispiel für eine Bilddatei ist:
 
{ 
     "my_img": "9j/4AAQSKZ … DvhdaVKlSYiPkZ//Z",
     "name":"Schaschlik",
     "topic":"Essen"
}         
 
Jedes Dokument muss indexiert werden, um in der Suche zu Verfügung zu stehen. Auch die Suchanfragen selbst werden mit JSON-Dokumente gesendet.

Wie funktioniert die Bilderkennung?

Für die Bilderkennung in diesem Blogbeitrag wird ein Image Plugin für Elasticsearch verwendet. Der gesamte Quellcode kann bei GitHub heruntergeladen werden. [1]    Das „Gehirn“ ist hier LIRE (Lucene Image Retrieval), das Algorithmen zu Verfügung stellt, welche die Ähnlichkeiten zwischen verschiedenen Bildern berechnet. Hauptsächlich werden dabei die Farbinformationen genutzt.

Das Plugin funktioniert aktuell nur mit Elasticsearch v1.3.2. Um auch für neueren Versionen das Plugin zur Verfügung zu stellen, könnte es bei Bedarf manuell angepasst werden.
 
Der Kerngedanke, um Bilder zu vergleichen und zu erkennen, ist die Kodierung der Bilder in eine Zeichenkette mit dem Verfahren „Base64“ . Diese generierte Zeichenkette wird im Anschluss auf Ähnlichkeit untersucht.
 

Was ist Base64?

Base64[2] ist ein oft verwendetes Verfahren zur Kodierung von Texten, Bildern, Zip-Dateien usw. Dieses   wird auch verwendet, um Email-Anhänge verschicken zu können. Der binäre Informationsstrom der Quelle, der aus „0“ und „1“ besteht, wird aufgeteilt in 6 Bit Blöcke (Zahl zwischen 0-63) und mithilfe einer ASCII-Tabelle übersetzt. Im folgenden Beispiel wurde ein Logo in Base64 kodiert:
 
Bild:
 
 
 
Base64 Kodierung:


Dieses kodierte Bild kann nun mit anderen kodierten Bildern mithilfe eines Ähnlichkeitsalgorithmus verglichen werden, um optisch ähnliche Abbildungen zu finden 
 

Installation Guide einer Bildersuche

Im Folgenden wird erklärt, wie man das notwendige Plugin installiert, wie ein mögliches Mapping aussehen kann und wie man eine Bildersuche durchführen kann. Außerdem wird gezeigt, wie man automatisch ein Bild in ein bestimmtes Themengebiet einordnen kann. Diese Anleitung bezieht sich teilweise auf die Readme des Git-Projekts des Plugins[3].  
 

1. Installation Image Plugin

Für die Installation des Plugins kann eine cmd (Windows-Konsole) verwendet werden. Einfach zu dem Elasticsearch-Ordner navigieren und folgenden Befehl ausführen:
bin/plugin -install com.github.kzwang/elasticsearch-image/1.2.0.

2. Starten Elasticsearch

Nach der Installation des Plugins, muss die Elasticsearch gestartet werden. Dies kann mit dem Batch-File im /bin Ordner getan werden.
 

3. Erstellen eines Bilder-Index

Es ist zwingend erforderlich ein Bilder-Index zu erstellen, der Informationen der Fotos speichern kann. Dieser kann über die Rest-Api der Suchmaschine erstellt werden:
 
curl -XPUT 'http://localhost:9200/testimageindex/' -d '{
    "settings" : {
        "index" : {
            "number_of_shards" : 5, 
            "number_of_replicas" : 1 
        }
    }
}'
 
Auf die Erklärung der verschiedenen Parameter wird an dieser Stelle verzichtet. Interessierte können weitere Informationen in der Readme von Elasticsearch nachlesen[4].
 
Um die Rest-Endpunkte einfacher ansprechen zu können, eignen sich Plugins wie „Postman“ für Chrome besonders gut[5]. 
 

4. Erstellen des Mappings

Es ist zusätzlich notwendig dem Index ein geeignetes Mapping zu vergeben. Hier wird ein Typ „Test“ definiert, der Eigenschaften eines beliebigen Bildes enthält. Hauptsächlich ist es hier wichtig den Ähnlichkeitsalgorithmus festzulegen („feature“).  
 
curl -XPUT 'localhost:9200/testimageindex/test/_mapping' -d '{
    "test": {
        "properties": {
            "my_img": {
                "type": "image",
                "feature": {
                    "CEDD": {
                        "hash": "BIT_SAMPLING"
                },
                "metadata": {
                    "jpeg.image_width": {
                        "type": "string",
                        "store": "yes"
                    },
                    "jpeg.image_height": {
                        "type": "string",
                        "store": "yes"
                    }
                }
            }
        }
    }
}'
 
Für dieses Bespiel wird der CEDD (Color and Edge Directivity Descriptor) als Algorithmus verwendet, um die Ähnlichkeit zwischen 2 Bildern zu berechnen. Grundlegend werden hier die Farben und Texturen in Histogramme gespeichert und miteinander verglichen. Das Plugin unterstützt jedoch noch einige Features mehr, wie zum Beispiel „FCTH (Fuzzy Color and Texture Histogram)“[6]  oder „JCD (Joint Composite Descriptor)“[7] . Diese sollen hier aber unberücksichtigt bleiben. Für dieses Beispiel wurde der CEDD-Algorithmus verwendet, weil dieser für eine ressourcenarme Berechnung bekannt ist und auch bei großen Bild-Datenbanken ein schnelles Ergebnis liefert. Die Übersicht über weitere unterstützte Ähnlichkeitsalgorithmen für das verwendete Plugin, finden Sie unter https://github.com/kzwang/elasticsearch-image.

5. Indexierung von Beispielbildern

Folgende Anweisung ist ein Beispiel für die Indexierung eines Bildes:
curl -XPOST 'localhost:9200/testimageindex/test' -d '{
     "my_img": "<Base64 kodiertes Bild>",
     "name": "<Name des Bildes>",
     "topic": "<Name des Themengebietes>" 
}
 
Konkretes Beispiel:
curl -XPOST 'localhost:9200/testimageindex/test' -d '{
    "my_img": "9j/4AAQSKZ … DvhdaVKlSYiPkZ//Z",
    "name": "Schaschlik",
    "topic": "Essen" 
}
 
In vielen Programmiersprachen wie z.B. Java, C#, JavaScript gibt es Bibliotheken, die eine Umwandlung von Bildformaten in Base64 String ermöglichen. Man kann somit ein Programm entwickeln, das automatisch Bilder aus einer Quelle in die Elasticsearch indexiert. Für das kleine Beispiel in diesem Blog wird jedoch ein einfacher Online-Base64-Konverter  verwendet. Um das prinzipielle Vorgehen deutlich zu machen, sollen hier wenige Fotos genügen. Folgende Bilder, mit den manuell zugeordneten Themengebieten, wurden einzeln indexiert:
 
Essen:
Hamburger / Schaschlik
 
Sushi / Lachs
 
Strand:
 
 
 
Vogel:
 
 

6. Suche nach ähnlichen Bildern

Hat man nun genügend Informationen in der Elasticsearch gespeichert, kann man ein beliebiges Bild auswählen und eine Suche nach ähnliches Bildern ausführen. Hierfür muss wieder der Rest-Endpunkt angesprochen werden:
 
curl -XPOST 'localhost:9200/testimageindex/test/_search' -d '{
    "query": {
        "image": {
            "my_img": {
                "feature": "CEDD",
                "image": "<Base64 kodiertes Bild>",
                "hash": "BIT_SAMPLING",
                "boost": 10.0,
                "limit": 5
            }
        }
    }
}
 
Sucht man beispielsweise mit folgendem Bild:
 
 
werden ähnliche Bilder im folgenden Ranking angezeigt:
 
1) Schaschlik
2) Sushi
3) Hamburger
4) Lachs
5) Strand mit Palmen
 
 
Analog können auch Fotos mit Stränden und Vögel gesucht werden.
 

7. Automatisches Erkennen des Themengebietes

Im Anschluss kann man ein Algorithmus entwickeln, der anhand der gefunden Treffer automatisch das Themengebiet des Bildes einordnet. Hier können einfach die Reihenfolge der Treffer, oder die Relevanz der Ergebnisse, die mit dem „Score“ von der Elasticsearch bewertet wird, miteinfließen. Eine sehr einfache Logik wäre zum Beispiel, die ersten fünf Ergebnisse des Rankings auszuwerten. 
 
Für das Beispiel aus Punkt 6 (Suche nach ähnlichen Bildern):
1) Essen
2) Essen
3) Essen
4) Essen
5) Strand
 
Hier gibt es eine Überzahl des Themengebietes „Essen“, somit ist auch das Bild mit dem man sucht vom Themengebiet „Essen“.
 
Hinweis: optisch ähnliche Bilder wie „Vogel am Himmel“ und „Flugzeug am Himmel“, die sehr ähnliche Farbinformationen enthalten, können nur schwer unterschieden werden. Es kann durchaus vorkommen, dass bei indexierten Fotos von Vögel und Flugzeugen, ein Flugzeug mit dem Themengebiet „Vogel“ eingeordnet wird.
 

Fazit

Elasticsearch und das verwendete Plugin eignen sich sehr gut für eine Bildersuche bei kleinen Datenbeständen. Mit relativ wenig Aufwand und ohne Lizenzkosten lassen sich tolle Ergebnisse im Bereich der Bilderkennung erzielen.  Verschiedene Themengebiete, die sehr unterschiedliche Farbinformationen enthalten, können besonders gut identifiziert werden. Auf viele Bilder mit sehr großen Auflösungen sollte man jedoch verzichten, weil die Berechnung von ähnlichen Bildern bei knappen Ressourcen länger dauern könnte. Es ist zu empfehlen, nur komprimierte Bilder zu indexieren. Wie gut die Performance der Algorithmen, im Zusammenspiel mit der Elasticsearch, bei riesigen Datenmengen sind, wurde jedoch nicht untersucht. Der dahinterliegende Ähnlichkeitsalgorithmus „CEDD“, der in diesen Beitrag verwendet wurde, ist jedoch für größere Bild-Datenbanken entwickelt worden. Die enthaltende Java Bibliothek „LIRE (Lucene Image Retrieval)“ des Plugins wirbt damit, dass eine Größe von Millionen von Bildern möglich ist . 
 
Alle, die lieber die java-basierende Open Source Suchmaschine „Solr“ verwenden möchten, um ähnliche Bilder zu suchen, können sich unter folgendem Link informieren: https://bitbucket.org/dermotte/liresolr 
 
Quelle der verwendeten Bilder: https://www.pexels.com/
 
Referenzen:
 
 
 
 

Neuen Kommentar schreiben