Bilderkennung entmystifiziert

Nichts im maschinellen Lernen regt die Fantasie so an wie die Fähigkeit, Bilder zu erkennen. Das Identifizieren von Bildern muss „Intelligenz“ bedeuten, oder? Lassen Sie uns entmystifizieren.

Die Fähigkeit zu „sehen“, wenn es um Software geht, beginnt mit der Fähigkeit zu klassifizieren. Die Klassifizierung ist ein Mustervergleich mit Daten. Bilder sind Daten in Form von zweidimensionalen Matrizen.

Bei der Bilderkennung werden Daten in einen von vielen Buckets klassifiziert. Dies ist eine nützliche Arbeit: Sie können ein ganzes Bild oder Dinge innerhalb eines Bildes klassifizieren.

Eine der klassischen und sehr nützlichen Anwendungen für die Bildklassifizierung ist die optische Zeichenerkennung (OCR): Übergang von Bildern geschriebener Sprache zu strukturiertem Text .

Dies kann für jedes Alphabet und eine Vielzahl von Schreibstilen durchgeführt werden.

Schritte im Prozess

Wir erstellen Code, um numerische Ziffern in Bildern zu erkennen und zu zeigen, wie dies funktioniert. Dies dauert 3 Schritte:

  1. Sammeln und Organisieren von Daten für die Arbeit (85% des Aufwands)
  2. Erstellen und Testen eines Vorhersagemodells (10% des Aufwands)
  3. Verwenden Sie das Modell, um Bilder zu erkennen (5% des Aufwands)

Die Aufbereitung der Daten ist bei weitem der größte Teil unserer Arbeit. Dies gilt für die meisten datenwissenschaftlichen Arbeiten . Es gibt einen Grund, warum es DATA Science heißt!

Der Aufbau unseres Vorhersagemodells und seine Verwendung bei der Vorhersage von Werten ist alles Mathematik . Wir verwenden Software, um Daten zu durchlaufen, iterativ „Gewichte“ in mathematischen Gleichungen zu fälschen und mit Datenstrukturen zu arbeiten. Die Software ist nicht „intelligent“, sondern arbeitet mit mathematischen Gleichungen, um die enge Wissensarbeit zu erledigen, in diesem Fall: Erkennen von Ziffernbildern.

In der Praxis ist das meiste, was die Leute als „KI“ bezeichnen, nur Software, die Wissensarbeit leistet.

Unser Vorhersagemodell und unsere Daten

Wir werden eines der einfachsten Vorhersagemodelle verwenden: die Regression „k-nächste Nachbarn“ oder „kNN“, die erstmals 1952 von E. Fix, JL Hodges, veröffentlicht wurde.

Eine einfache Erklärung dieses Algorithmus finden Sie hier und ein Video seiner Mathematik hier. Und auch hier für diejenigen, die den Algorithmus von Grund auf neu erstellen möchten.

So funktioniert es: Stellen Sie sich ein Diagramm mit Datenpunkten und Kreisen vor, die k Punkte erfassen, wobei jeder Wert von k anhand Ihrer Daten validiert wird.

Der Validierungsfehler für k in Ihren Daten hat ein Minimum, das bestimmt werden kann.

Mit dem 'besten' Wert für k können Sie andere Punkte mit einem gewissen Maß an Genauigkeit klassifizieren.

Wir werden den kNN-Algorithmus von scikit learn verwenden, um zu vermeiden, dass die Mathematik selbst erstellt wird. Praktischerweise liefert uns diese Bibliothek auch unsere Bilddaten.

Lass uns anfangen.

Der Code ist da. Wir verwenden das iPython-Notebook, mit dem Sie produktiv an datenwissenschaftlichen Projekten arbeiten können. Die Codesyntax lautet Python und unser Beispiel stammt von sk-learn.

Importieren Sie zunächst die erforderlichen Bibliotheken:

Als nächstes organisieren wir unsere Daten:

training images: 1527, test images: 269

Sie können den Bruch manipulieren und haben mehr oder weniger Testdaten. Wir werden in Kürze sehen, wie sich dies auf die Genauigkeit unseres Modells auswirkt.

Inzwischen fragen Sie sich wahrscheinlich: Wie sind die Ziffernbilder organisiert? Sie sind Anordnungen von Werten, eine für jedes Pixel in einem 8x8-Bild. Lassen Sie uns einen untersuchen.

# one-dimension[ 0. 1. 13. 16. 15. 5. 0. 0. 0. 4. 16. 7. 14. 12. 0. 0. 0. 3. 12. 2. 11. 10. 0. 0. 0. 0. 0. 0. 14. 8. 0. 0. 0. 0. 0. 3. 16. 4. 0. 0. 0. 0. 1. 11. 13. 0. 0. 0. 0. 0. 9. 16. 14. 16. 7. 0. 0. 1. 16. 16. 15. 12. 5. 0.]
# two-dimensions[[ 0. 1. 13. 16. 15. 5. 0. 0.] [ 0. 4. 16. 7. 14. 12. 0. 0.] [ 0. 3. 12. 2. 11. 10. 0. 0.] [ 0. 0. 0. 0. 14. 8. 0. 0.] [ 0. 0. 0. 3. 16. 4. 0. 0.] [ 0. 0. 1. 11. 13. 0. 0. 0.] [ 0. 0. 9. 16. 14. 16. 7. 0.] [ 0. 1. 16. 16. 15. 12. 5. 0.]]

Dieselben Bilddaten werden als flaches (eindimensionales) Array und erneut als 8x8-Array in einem Array (zweidimensional) angezeigt. Stellen Sie sich jede Bildzeile als Array mit 8 Pixeln vor. Es gibt 8 Zeilen. Wir könnten die Graustufen (die Werte) ignorieren und mit Nullen und Einsen arbeiten, was die Mathematik ein wenig vereinfachen würde.

Wir können dies "zeichnen", um dieses Array in seiner "pixeligen" Form zu sehen.

Welche Ziffer ist das? Fragen wir unser Modell, aber zuerst müssen wir es bauen.

KNN score: 0.951852

Gegenüber unseren Testdaten hatte unser Modell des nächsten Nachbarn eine Genauigkeit von 95%, nicht schlecht. Gehen Sie zurück und ändern Sie den 'Bruch'-Wert, um zu sehen, wie sich dies auf die Punktzahl auswirkt.

array([2])

Das Modell sagt voraus, dass das oben gezeigte Array eine ' 2 ' ist, was korrekt aussieht.

Versuchen wir noch ein paar, denken Sie daran, dass dies Ziffern aus unseren Testdaten sind . Wir haben diese Bilder nicht zum Erstellen unseres Modells verwendet (sehr wichtig).

Nicht schlecht.

Wir können eine fiktive Ziffer erstellen und sehen, was unser Modell darüber denkt.

Wenn wir eine Sammlung unsinniger Ziffernbilder hätten, könnten wir diese mit einem nicht numerischen Etikett zu unserem Training hinzufügen - nur eine weitere Klassifizierung.

Wie funktioniert die Bilderkennung?

  • Bilddaten sind organisiert : sowohl Training als auch Test mit Beschriftungen (X, y)

Trainingsdaten werden von Testdaten getrennt gehalten, was auch bedeutet, dass wir Duplikate (oder nahezu Duplikate) zwischen ihnen entfernen.

  • Ein Modell wird unter Verwendung eines von mehreren mathematischen Modellen (kNN, logistische Regression, Faltungs-Neuronales Netzwerk usw.) erstellt.

Welche Art von Modell Sie wählen, hängt von Ihren Daten und der Art und Komplexität der Klassifizierungsarbeit ab.

  • Neue Daten werden in das Modell eingefügt , um eine Vorhersage zu generieren

Das leuchtet schnell: das Ergebnis einer einzigen mathematischen Berechnung.

Wenn Sie eine Sammlung von Bildern mit und ohne Katzen haben, können Sie ein Modell erstellen, um zu klassifizieren, ob ein Bild eine Katze enthält. Beachten Sie, dass Sie Trainingsbilder benötigen, die keine Katzen enthalten, damit dies funktioniert.

Natürlich können Sie mehrere Modelle auf ein Bild anwenden und verschiedene Dinge identifizieren.

Große Datenmengen

A significant challenge in all of this is the size of each image since 8x8 is not a reasonable image size for anything but small digits, it’s not uncommon to be dealing with 500x500 pixel images, or larger. That’s 250,000 pixels per image, so 10,000 images of training means doing math on 2.5Billion values to build a model. And the math isn’t just addition or multiplication: we’re multiplying matrices, multiplying by floating-point weights, calculating derivatives. This is why processing power (and memory) is key in certain machine learning applications.

There are strategies to deal with this image size problem:

  • use hardware graphic processor units (GPUs) to speed up the math
  • reduce images to smaller dimensions, without losing clarity
  • reduce colors to gray-scale and gradients (you can still see the cat)
  • look at sections of an image to find what you’re looking for

The good news is once a model is built, no matter how laborious that was, the prediction is fast. Image processing is used in applications ranging from facial recognition to OCR to self-driving cars.

Now you understand the basics of how this works.