[PYTHON] Jugement de l'image rétroéclairée avec OpenCV

introduction

Bonjour, je m'appelle Kano. Je suis en charge du support client pour un service de vente au détail appelé Insight for Retail chez ABEJA.

Récemment, je vis une vie végétalienne sous l'influence d'un documentaire intitulé Game Changer que j'ai vu sur Netflix. Cependant, je mange parfois des ramen Jiro, famille et Kotteri, donc je ne peux pas perdre de poids.

Je ne suis pas ingénieur, mais je ferai de mon mieux pour écrire. Ceci est l'article sur le 13ème jour du Calendrier de l'Avent ABEJA 2019.

Déclencheur

Chez ABEJA, je sens que les ingénieurs aiment vraiment faire des choses.

Bien sûr, le travail l'est aussi, mais il y a aussi des choses qui ne sont pas liées au travail. Par exemple, stock AI ou culture de shiitake à l'aide d'appareils IoT.

En rejoignant ABEJA en 2018 et en travaillant avec eux tous les jours, je suis devenu de plus en plus désireux de faire quelque chose.

En outre, ABEJA valorise technopreneurship, et l'idée que même les membres des entreprises peuvent innover en utilisant la technologie imprègne. Il y avait aussi que c'était fait.

Rôle de support client pour un service appelé Insight for Retail

D'ailleurs, si j'explique le service appelé Insight for Retail dont je suis en charge très grossièrement,

・ Installez des appareils IoT tels que des caméras dans les magasins de détail pour acquérir des données ・ L'IA analyse les données acquises ・ Agrégez les données analysées et visualisez-les de manière simple à comprendre ・ Et réalisez une gestion de magasin basée sur les données

C'est.

Par conséquent, lors de l'introduction du service, l'installation d'appareils IoT dans le magasin a toujours lieu, mais les travaux de construction sont également inclus dans le rôle du support client. En d'autres termes, l'une des missions importantes du support client d'Insight for Retail est de «fournir à l'IA des données propres adaptées à l'analyse à partir d'appareils IoT».

(Bien que cela ne soit pas lié à cet article, le support client effectue également des recherches et vérifie les nouveaux appareils IoT. Bien sûr, il gère également les demandes de renseignements et les annonces de publication, qui constituent la partie principale du support client, donc les entreprises SaaS ordinaires Je pense que la gamme de défense est large par rapport au support client de. Je voudrais présenter ce domaine s'il y a une opportunité.)

Je veux détecter le contre-jour

D'ailleurs, lorsque je gère les données acquises quotidiennement par les appareils IoT en tant que support client, je me rends compte qu'il est vraiment difficile d'acquérir des données dans l'espace réel. Par exemple, rétroéclairé.

Ci-dessous, une photo de quand j'ai escaladé le mont Fuji avec un ami cet été. Le contre-jour de la lumière à venir est incroyable.

L'un des services d'Insight for Retail est que l'IA estime l'âge, le sexe et le répéteur en fonction de l'image du visage du visiteur, mais avec une image de visage aussi noire, quelle que soit la qualité du modèle d'IA. Ce n'est pas exact.

Il est rare qu'un tel rétro-éclairage se produise dans un magasin réel, mais le phénomène selon lequel le visage devient sombre en raison du contre-jour se produit parfois. De plus, le rétroéclairage peut ou non sortir selon l'heure, il est donc difficile de le détecter au moment de l'installation.

Par conséquent, j'ai décidé de penser que créer un mécanisme pour automatiser la détection du contre-jour serait utile pour le travail, la programmation d'étude et même l'étude du traitement d'image.

Quel est l'état du rétroéclairage?

Quel est l'état du rétroéclairage en premier lieu? Pour voir cela, essayez de dessiner un histogramme de l'image rétroéclairée et de l'image non rétroéclairée.

Pour l'explication de l'histogramme, voir Tutoriel OpenCV C'est facile, mais en gros, cela montre la distribution de la valeur de pixel de chaque pixel de l'image. La valeur du pixel est grande lorsqu'elle est claire et petite lorsqu'elle est sombre, vous pouvez donc voir la répartition de la lumière et de l'obscurité dans l'image en regardant l'histogramme.

(Je l'ai écrit brièvement, mais il y avait diverses choses comme lire un livre de traitement d'image pour arriver ici, et demander à un ingénieur de me dire qu'il existe une bibliothèque de traitement d'image / CV pratique appelée OpenCV.)

Le code qui dessine l'histogramme est ci-dessous.


import cv2
import numpy as np
from matplotlib import pyplot as plt

#Entrée standard
filename = input()

#Charger l'image
img = cv2.imread(filename)

#Dessinez un histogramme de l'image
plt.hist(img.ravel(),256,[0,256]); plt.show()

Tout d'abord, un histogramme de l'image rétroéclairée. L'image est un visage recadré faisant partie de la photo du mont Fuji. Puisque la face de l'image rétroéclairée devient sombre, elle est polarisée vers la valeur de pixel la plus petite.

Vient ensuite un histogramme de l'image non rétroéclairée. Je suis il y a 7 ans. Par rapport à l'image rétroéclairée, cette image a des valeurs de pixels uniformément réparties.

Par conséquent, j'ai émis l'hypothèse que si la valeur médiane ou moyenne des valeurs de pixel de l'image est inférieure à une certaine valeur, elle peut être considérée comme un contre-jour.

Il y a aussi un rétro-éclairage qui illumine le visage

Cependant, lorsque j'ai recherché des images rétro-éclairées sur le Web, j'ai constaté qu'il y avait un tel cas. (Je n'avais pas une bonne image sous la main, alors je l'ai achetée chez PIXTA.)

Au contraire, cette image rétroéclairée rend le visage trop lumineux, ce qui semble affecter la précision du jugement.

L'histogramme ressemble à ceci:

Cette fois, la valeur du pixel est biaisée vers la plus grande. Il semble que la stratégie de juger par la quantité de la valeur moyenne des valeurs de pixel mentionnée précédemment est impossible. Que fais-tu maintenant?

Jetons un nouveau coup d'œil à l'histogramme de chaque image.

En regardant cela, les images rétro-éclairées dans les deux cas ont une distribution biaisée des valeurs de pixels par rapport aux images non rétro-éclairées. Alors, j'ai pensé que le contre-jour pouvait être jugé par ce biais. Plus précisément, il semble bon de calculer l'écart type des valeurs de pixels de l'image (une valeur qui indique le degré de diffusion des données).

Jugement du rétroéclairage basé sur l'écart type de la valeur de pixel de l'image

Calculons donc l'écart type de la valeur de pixel de l'image en utilisant OpenCV.

Cliquez-ici pour le code. OpenCV est très pratique car vous pouvez écrire de tels calculs avec seulement quelques lignes de code.


from imutils import paths
import argparse
import cv2
import os
import numpy as np

#Entrée standard
filename = input()

#Chargez l'image.
img = cv2.imread(filename)

#Faites l'échelle de gris de l'image.
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#Calculez l'écart type.
mean, stddev = cv2.meanStdDev(gray)
print('stddev',stddev)

Les résultats sont les suivants.

Tout d'abord, à partir d'une image qui n'est pas rétroéclairée. L'écart type ici était 55,6 </ font>.

Contre-jour qui rend le prochain visage sombre. L'écart type était 32,0 </ font>.

Contre-jour qui fait un visage lumineux à la fin. L'écart type était 36,7 </ font>.

Résumé, ・ Image non rétroéclairée: l'écart type est 55,6 </ font> ・ Image rétroéclairée (face sombre): l'écart type est 32,0 </ font> ・ Image rétroéclairée (visage clair): l'écart type est 36,7 </ font>

Ainsi, il semble qu'il puisse être jugé en fixant un seuil autour de 40-50 et "une image dont l'écart type est inférieur au seuil est rétroéclairée". Pour l'appliquer à l'environnement de production, il reste encore de nombreux problèmes tels que la découpe uniquement du visage de l'image en plus d'ajuster le seuil, mais c'est une question de temps.

Impressions que j'ai essayées

Jusqu'à présent, quand je pensais étudier la programmation, je devais acheter un livre technique et le lire dès la première page, et j'étais frustré par environ 10 pages, mais comme cette fois. Quand je l'ai fait avec un thème, c'était facile à apprendre, et surtout, j'ai senti que ce serait amusant de travailler dessus, y compris les essais et erreurs. Cela signifie que la programmation est pratiquée et Nambo.

De plus, les ingénieurs d'ABEJA me disent gentiment qu'il y a des choses que je ne comprends pas, alors j'ai ressenti une fois de plus que c'était un très bon environnement pour les membres de l'entreprise pour acquérir de la technologie. Merci beaucoup. Je vais continuer à étudier en choisissant un thème.

Recommended Posts