iX 10/2017
S. 144
Praxis
Künstliche Intelligenz
Aufmacherbild

Python-Tutorial, Teil 3: Neuronale Netze anwenden

Ich sehe was, …

Neuronale Netze zur Bilderkennung zu entwickeln, ist eine Herausforderung. Bereits vorhandene neuronale Netze in eigenen Anwendungen mit Python und TensorFlow zu nutzen und damit überraschende Ergebnisse zu erzielen hingegen, ist relativ einfach.

Als vor einigen Jahren die Studentin Fei-Fei Li mit Programmen zur Bilderkennung anfing, hatten diese Anwendungen einen stark geometrieorientierten Ansatz. Ihre Software suchte in Bildern abstrakte, geometrische Figuren und versuchte, aus diesen zu schließen, was auf dem Bild zu sehen ist. Etwas vereinfacht: Ein Kreis, ein Oval, zwei Dreiecke und eine quaderähnliche Form – das könnte eine Katze sein (siehe Abbildung 1).

Eine Katze über geometrische Figuren zu erkennen, ist nicht auf allen Bildern möglich (Abb. 1).

Wenn das zu erkennende Objekt eine andere Position einnimmt oder nur teilweise sichtbar ist, erweist sich ein solches Vorgehen als schwieriges Unterfangen. Heute ist Fei-Fei Li als Professorin die Leiterin des Bereichs Bilderkennung in Stanford, und die verwendeten Methoden haben sich von der Geometrie weg in Richtung maschinelles Lernen verschoben.

Mit Millionen von Bildern wie Kinder lernen

Der heutige Ansatz orientiert sich mehr daran, wie ein Mensch lernt, Objekte in Bildern zu erkennen. Als Kind sieht er etwas, deutet darauf und bekommt von den Eltern oder im Kindergarten erklärt, dass es sich hierbei um eine Katze handelt. Diese Situation wiederholt sich bei jedem Menschen bewusst oder unbewusst tausendfach in seinem Leben.

Will man diesen Prozess in einem Computer nachstellen, so folgerte Fei-Fei Li, benötigt man als Erstes sehr viele Bilder, deren Inhalt bekannt ist. Mit weltweit über 10 000 Unterstützern erstellte sie mit ihrem Team die freie Bilddatenbank ImageNet, die jeder für eigene Versuche mit der Bilderkennung verwenden kann. (Zu Quellen im Web siehe „Alle Links“ am Ende des Artikels.) ImageNet besteht aus über 14 Millionen Bildern, die in mehr als 21 000 Kategorien eingeteilt sind. Darunter findet man 26 000 Katzenbilder.

Diese Daten bilden die Basis für die sogenannte „Weltmeisterschaft der Bilderkennung“ – ImageNet Large Scale Visual Recognition Challenge (ILSVRC), die jedes Jahr stattfindet. Gewonnen haben in den letzten Jahren Programme, die auf neuronalen Netzen vom Typ Convolutional Neural Network, kurz ConvNets, beruhen (siehe den zweiten Teil des Tutorials [2]).

Diese im Wettbewerb teilnehmenden Netze – beispielsweise VGGNet oder Inception – kann sich jeder aus dem Internet herunterladen und selbst verwenden. Weitere findet man in verschiedenen Sammlungen unter dem Oberbegriff „Model Zoo“.

Ein neuronales Netz zur Bilderkennung – wie hier Inception – besteht aus vielen Berechnungsebenen (Abb. 2). Quelle: Google Research Blog

Ein gängiges Netz zum Erkennen von Objekten wie Inception kann aus 24 Ebenen, 140 Millionen Parametern und 15 Milliarden Verbindungen bestehen (siehe Abbildung 2). Ein solches Netz zu trainieren, dauert mindestens einige Tage – sofern man überhaupt eine ausreichende Rechnerleistung und genug Trainingsdaten zur Verfügung hat. Für die Anwendung dieses Netzes hingegen reicht ein gängiges Smartphone.

Beispielprogramm für eigene Tests nutzen

Listing 1: Ausschnitt aus classify_image.py von TensorFlow

import tensorflow as tf
..
DATA_URL = 'http://download.tensorflow.org/models/image/imagenet/ inception-2015-12-05.tgz' 
...

def create_graph():
  with tf.gfile.FastGFile(os.path.join(
      FLAGS.model_dir, 'classify_image_graph_def.pb'), 'rb') as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())
    _ = tf.import_graph_def(graph_def, name='')

def run_inference_on_image(image):
  if not tf.gfile.Exists(image):
    tf.logging.fatal('File does not exist %s', image)
  image_data = tf.gfile.FastGFile(image, 'rb').read()
  create_graph()

  with tf.Session() as sess:
    softmax_tensor = sess.graph.get_tensor_by_name('softmax:0')
    predictions = sess.run(softmax_tensor,
                           {'DecodeJpeg/contents:0': image_data})
    predictions = np.squeeze(predictions)

    # Creates node ID --> English string lookup.
    node_lookup = NodeLookup()

    top_k = predictions.argsort()[-FLAGS.num_top_predictions:][::-1]
    for node_id in top_k:
      human_string = node_lookup.id_to_string(node_id)
      score = predictions[node_id]
      print('%s (score = %.5f)' % (human_string, score))
...

Ein Beispielprogramm zum Erkennen von Bildern mit Python findet man auf GitHub im TensorFlow Repository unter models/tutorials/image/imagenet. Mit dem Python-Programm classify_image.py (Listing 1) kann man gleich eigene Tests durchführen oder nachvollziehen, wie eine solche Software aussehen kann. Die Anwendung lädt zuerst eine trainierte Version des neuronalen Netzes Inception aus dem Internet. Ungefähr 200 MByte sollten auf der Festplatte dafür frei sein. Dieses Netz hat aus den ImageNet-Daten von 2012 gelernt.