Ich habe viel über Computer Vision und maschinelle Lernprojekte geschrieben, wie zum Beispiel
Objekterkennungssysteme und
Gesichtserkennungsprojekte . Ich habe auch eine Open-Source-Python-
Gesichtserkennungsbibliothek , die es irgendwie in die
Top 10 der beliebtesten Bibliotheken für maschinelles Lernen auf Github geschafft hat . All dies hat Neulinge in Python und Machine Vision dazu gebracht, mir
viele Fragen zu stellen.

Aus Erfahrung gibt es ein spezifisches technisches Problem, das die Menschen am häufigsten verwirrt. Nein, dies ist keine schwierige theoretische Frage oder ein Problem mit teuren GPUs. Tatsache ist, dass fast jeder Bilder rotiert in den Speicher lädt, ohne es zu wissen. Und Computer erkennen Objekte nicht
sehr gut oder erkennen Gesichter in gedrehten Bildern nicht.
Wie Digitalkameras Bilder automatisch drehen
Wenn Sie ein Bild aufnehmen, registriert die Kamera die Position des Telefons, sodass in einem anderen Programm das Bild in der richtigen Ausrichtung angezeigt wird:

Die Kamera dreht die Pixeldaten in der Datei jedoch nicht. Da Bildsensoren in Digitalkameras zeilenweise als kontinuierlicher Strom von Pixelinformationen gelesen werden, ist es für die Kamera einfacher, Pixeldaten unabhängig von der tatsächlichen Position des Telefons immer in derselben Reihenfolge zu speichern.

Dies ist das Anliegen des Programms für die Anzeige - drehen Sie das Bild korrekt, bevor Sie es auf dem Bildschirm anzeigen. Neben den Daten des Bildes selbst speichert die Kamera auch Metadaten - Objektiveinstellungen, Standortdaten und natürlich den Drehwinkel der Kamera. Der Betrachter sollte diese Informationen verwenden, um korrekt anzuzeigen.
Das am häufigsten verwendete Bildmetadatenformat heißt
EXIF (kurz für Exchangeable Image File Format). EXIF-Metadaten sind in jede JPEG-Datei eingebettet. Sie können sie nicht auf dem Bildschirm sehen, aber sie werden von jedem Programm gelesen, das weiß, wo sie suchen müssen.
Hier sind die EXIF-Metadaten im JPEG-Bild unserer Gans aus dem
exiftool- Tool:

Siehe das Element 'Orientierung'? Er sagt dem Betrachter, dass das Bild vor der Anzeige auf dem Bildschirm um 90 Grad im Uhrzeigersinn gedreht werden sollte. Wenn das Programm dies vergisst, ist das Bild auf der Seite!

Warum werden dadurch so viele Bildverarbeitungsanwendungen in Python zerstört?
EXIF-Metadaten waren ursprünglich nicht Teil des JPEG-Formats. Sie wurden viel später eingeführt und liehen sich die Idee aus dem TIFF-Format aus. Aus Gründen der Abwärtskompatibilität sind diese Metadaten optional, und einige Programme machen sich nicht die Mühe, sie zu analysieren.
Die meisten Python-Bildbibliotheken wie Numpy, Scipy, TensorFlow, Keras usw. betrachten sich als
wissenschaftliche Werkzeuge für ernsthafte Personen , die mit gemeinsam genutzten Datensätzen arbeiten. Sie kümmern sich nicht um Probleme auf
Verbraucherebene wie die automatische Bildrotation, obwohl dies für fast alle Fotos auf der Welt erforderlich ist, die mit modernen Kameras aufgenommen wurden.
Dies bedeutet, dass Sie bei der Verarbeitung eines Bildes mit fast jeder Python-Bibliothek die ursprünglichen Bilddaten ohne Drehung erhalten. Und raten Sie mal, was passiert, wenn Sie versuchen, ein Foto auf Ihrer Seite oder verkehrt herum in das Gesichts- oder Objekterkennungsmodell hochzuladen? Der Detektor wird nicht ausgelöst, weil Sie ihm schlechte Daten gegeben haben.
Sie mögen denken, dass Probleme nur in den Programmen von Anfängern und Studenten auftreten, aber das ist nicht so! Selbst die
Demoversion von Googles Flaggschiff-Vision-API verarbeitet die EXIF-Ausrichtung nicht richtig:
Demo Die Google Vision API kann keine hochformatigen Bilder von einem Standard-Mobiltelefon drehenObwohl Google Vision einige Tiere auf seiner Seite erkennt, kennzeichnet es sie mit der allgemeinen Bezeichnung "Tier", da Bildverarbeitungsmodelle eine Gans auf ihrer Seite viel schwieriger erkennen als eine vertikale Gans. Hier ist das Ergebnis, wenn Sie das Bild korrekt drehen, bevor Sie es an das Modell senden:

Mit der richtigen Ausrichtung erkennt Google Vögel mit einer spezifischeren Gänsehaut und einem höheren Vertrauensindikator. Viel besser!
Dies ist ein sehr offensichtliches Problem, wenn Sie
deutlich sehen, dass sich das Bild wie in dieser Demo
auf der Seite befindet. Aber hier wird alles heimtückisch - normalerweise sieht man es nicht! Alle normalen Programme auf Ihrem Computer zeigen das Bild in der richtigen Ausrichtung an und nicht so, wie es tatsächlich auf der Festplatte gespeichert ist. Wenn Sie versuchen, ein Bild anzuzeigen, um festzustellen, warum Ihr Modell nicht funktioniert, wird es daher korrekt angezeigt und Sie werden nicht verstehen, warum das Modell nicht funktioniert!
Der Finder auf dem Mac zeigt Fotos immer korrekt aus EXIF gedreht an. Es ist nicht zu erkennen, dass das Bild tatsächlich auf der Seite gespeichert istDies führt unweigerlich zu vielen offenen Tickets bei Github: Die Leute beschweren sich, dass Open-Source-Projekte kaputt sind und die Modelle nicht sehr genau sind. Das Problem ist jedoch viel einfacher: Sie führen nur gedrehte oder invertierte Fotos zum Eingang!
Korrektur
Die Lösung besteht darin, dass Sie jedes Mal, wenn Sie Bilder in Python-Programme laden, die EXIF-Orientierungsmetadaten überprüfen und die Bilder bei Bedarf drehen sollten. Es ist ziemlich einfach, aber im Internet ist es überraschend schwierig, Codebeispiele zu finden, die es für alle Orientierungen richtig machen.
Hier ist der Code zum Laden eines Bildes in ein Numpy-Array mit der richtigen Ausrichtung:
import PIL.Image import PIL.ImageOps import numpy as np def exif_transpose(img): if not img: return img exif_orientation_tag = 274
Von hier aus können Sie ein Array von Bilddaten in jede Standard-Python-Bildverarbeitungsbibliothek übertragen, die ein Eingabearray erwartet: z. B. Keras oder TensorFlow.
Da das Problem allgegenwärtig ist, habe ich diese Funktion als Pip-Bibliothek mit dem Namen
image_to_numpy veröffentlicht . Sie können es wie folgt installieren:
pip3 installiere image_to_numpy
Es funktioniert mit jedem Python-Programm und behebt das Laden von Bildern, zum Beispiel:
import matplotlib.pyplot as plt import image_to_numpy
Weitere Informationen finden Sie in der
Readme-Datei .
Genieße es!