La raison muette de votre application de vision de l’ordinateur de fantaisie ne fonctionne pas: orientation exif | par Adam Geitgey

 La raison muette de votre application de vision de l’ordinateur de fantaisie ne fonctionne pas: orientation exif | par Adam Geitgey


Remarquez l’élément de données «Orientation». Cela indique au programme d’image de la visionneuse que l’image doit être tournée de 90 degrés dans le sens des aiguilles d’une montre avant d’être affichée à l’écran. Si le programme oublie de le faire, l’image sera latérale!

Pourquoi cela brise-t-il tant d’applications de vision par ordinateur Python?

Les métadonnées EXIF ​​ne sont pas une partie native du format de fichier JPEG. C’était une réflexion après coup prise dans le format du fichier TIFF et cloué sur le format de fichier JPEG beaucoup plus tard. Cela a maintenu la compatibilité en arrière avec les anciens téléspectateurs d’images, mais cela signifiait que certains programmes ne se souciaient jamais d’analyser les données EXIF.

La plupart des bibliothèques Python pour travailler avec des données d’image comme Numpy, Scipy, TensorFlow, Keras, etc. Outils scientifiques pour les personnes sérieuses qui travaillent avec des tableaux génériques de données. Ils ne se préoccupent pas de Problèmes au niveau des consommateurs Comme la rotation automatique de l’image – même si fondamentalement toutes les images du monde capturées avec une caméra moderne en ont besoin.

Cela signifie que lorsque vous chargez une image avec presque toutes les bibliothèques Python, vous obtenez les données d’image originales et non utilisées. Et devinez ce qui se passe lorsque vous essayez de nourrir une image latérale ou à l’envers dans un modèle de détection de visage ou de détection d’objet? Le détecteur échoue parce que vous lui avez donné de mauvaises données.

Vous pourriez penser que ce problème se limite aux scripts Python écrits par les débutants et les étudiants, mais ce n’est pas le cas! Même Demo API Vision phare de Google Ne gère pas correctement l’orientation EXIF:

La démo API de Google Vision ne fait pas pivoter une image orientée portrait capturée avec un téléphone portable standard.

Et tandis que Google Vision parvient toujours à détecter certains des animaux de l’image latérale, il les détecte avec une étiquette «animale» non spécifique. En effet, il est beaucoup plus difficile pour un modèle de détecter une oie latérale qu’une oie droite. Voici ce que Google Vision détecte si l’image est correctement tournée avant d’être introduite dans le modèle:

Avec l’orientation d’image correcte, Google détecte les oiseaux avec l’étiquette «oie» plus spécifique et un score de confiance plus élevé. Beaucoup mieux!

C’est un problème super évident si vous peut voir que l’image est latérale comme dans cette démo. Mais c’est là que les choses deviennent insidieuses – normalement vous ne pouvez pas le voir! Chaque programme normal sur votre ordinateur affichera l’image uniquement sous sa forme correctement tournée au lieu de la façon dont il est réellement stocké latéralement sur le disque. Donc, lorsque vous essayez de voir l’image pour voir pourquoi votre modèle ne fonctionne pas, il sera affiché de la bonne façon et vous ne saurez pas pourquoi votre modèle ne fonctionne pas!

Finder sur un Mac affiche toujours des images avec une rotation exif appliquée. Il n’y a aucun moyen de voir que les données d’image sont en fait latérales dans le fichier.

Cela conduit inévitablement à publier des problèmes sur GitHub se plaignant que les projets open source qu’ils utilisent sont cassés ou que les modèles ne sont pas très précis. Mais le problème est tellement plus simple – ils se nourrissent d’images latérales et / ou à l’envers!

Résoudre le problème

La solution est que chaque fois que vous chargez des images dans vos programmes Python, vous devez les vérifier pour les métadonnées d’orientation EXIF ​​et faire pivoter les images si nécessaire. C’est assez simple à faire, mais étonnamment difficile à trouver des exemples de code en ligne qui le fait correctement pour toutes les orientations.

Voici du code pour charger n’importe quelle image dans un tableau Numpy avec la rotation correcte appliquée:

À partir de là, vous pouvez transmettre le tableau de données d’image à n’importe quelle bibliothèque Python ML standard qui attend des tableaux de données d’image, comme Keras ou TensorFlow.

Depuis que cela se présente si souvent, j’ai publié cette fonction comme une bibliothèque sur PIP appelée image_to_numpy. Vous pouvez l’installer comme ceci:

pip3 install image_to_numpy

Vous pouvez l’utiliser dans n’importe quel programme Python pour charger correctement une image, comme ceci:

import matplotlib.pyplot as plt
import image_to_numpy
# Load your image file
img = image_to_numpy.load_image_file("my_file.jpg")
# Show it on the screen (or whatever you want to do)
plt.imshow(img)
plt.show()

Découvrez le Fichier ReadMe pour plus de détails.

Amusez-vous!



Source link

Related post

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *