[PYTHON] Le meilleur outil pour protéger votre vie privée des photos ...!

introduction

Il va sans dire que le monde dans lequel les informations sont échangées ces jours-ci et la vie privée des personnes sont considérés comme importants. En raison de cette époque, nous avons besoin de quelque chose qui protège notre vie privée ... Je le pensais, j'y ai pensé.

** Dois-je pouvoir regarder les photos ...? **

Alors je l'ai fait.

(Honnêtement, je l'ai fait sans réfléchir.)

Pour mettre une ligne de mire

J'ai réalisé que pour avoir un coup d'œil, il fallait d'abord reconnaître ses yeux et son visage. Par conséquent, j'ai décidé d'utiliser une bibliothèque qui reconnaît les visages et une bibliothèque qui reconnaît les yeux dans les données OpenCV. Je ne suis pas sûr des détails, mais d'une manière ou d'une autre, seul le code de reconnaissance du visage est tombé, alors j'ai joué un peu avec et le programme de reconnaissance des yeux était terminé. (La bibliothèque qui est descendue est [à partir d'ici](https://qiita.com/GoshBird/items/c0c241d08087c70aa394#%E7%94%BB%E5%83%8F%E3%82%92%E8%AA%AD% E3% 82% 80) Veuillez voir.)

Voici une photo créée en l'utilisant. Le visage est tracé comme un carré et les yeux sont tracés comme un cercle. EJ4zPDIUEAAZevu.jpeg On dirait qu'un enfant fait un grand trou avec un stylo rouge dans le trou de l'image. Cependant, il y a un problème avec cette image, et vous pouvez voir qu'elle reconnaît le nez, la bouche et même la double mâchoire comme des yeux. Cela ne peut pas protéger la vie privée ...!

J'ai donc pensé aux traits du visage. Probablement, si le cerveau n'est pas très gros, les yeux devraient être au-dessus de la moitié du visage. Par conséquent, j'ai décidé de ne faire que les points qui sont plus de la moitié au-dessus du carré du visage reconnu comme des yeux.

Ce faisant, j'ai pu écrire la relation entre le visage et les yeux, donc la taille du carré de la ligne de visée est conforme au carré du visage en largeur, et la verticale est le sommet de tous les endroits reconnus comme yeux J'ai essayé d'adopter la partie et la partie inférieure.

programme

Le programme écrit avec ceci est le programme ci-dessous.

Wanted_photo.ipynb


import cv2
import matplotlib.pyplot as plt

image_name = input("File Name?")

src=cv2.imread(image_name)
image_gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY) #Échelle de gris
color=(0,0,255) #Mec Kakomu(rouge)
color_c=(255,0,0) #Celui qui frappe(point,Bleu)
cascade = cv2.CascadeClassifier("haarcascade_frontalface_alt2.xml") #Importation des données d'entraînement
# eye_right = cv2.CascadeClassifier("haarcascade_righteye_2splits.xml")#Données de l'œil droit
# eye_left = cv2.CascadeClassifier("haarcascade_lefteye_2splits.xml")#Données de l'œil gauche
eyecascade = cv2.CascadeClassifier("haarcascade_eye.xml")#Données oculaires

#Un sort à gérer
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(50,50))
# reyerect = eye_right.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(30,30))
# leyerect = eye_left.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(30,30))
eyerect = eyecascade.detectMultiScale(image_gray, scaleFactor=1.1, minNeighbors=1, minSize=(30,30))

max_width = 0
upper_heigh = 99999
lower_heigh = 0
max_rect = [0,0,0,0]

        
if len(facerect) > 0:#Celui qui décide de la largeur
    for rect in facerect:
        #print(rect[0:4])
        if rect[2] > max_width:
            max_width = rect[2] - rect[0]
            max_rect = rect[0:4]
            
if len(eyerect) > 0:#Celui qui décide de la largeur verticale
    for rect in eyerect:
        #print(rect[0:4])
        if max_rect[0] < rect[0] and max_rect[0] + max_rect[2] > rect[0] + rect[2] and max_rect[1] < rect[1] and max_rect[1] + max_rect[3] /2 > rect[1] + rect[3]/2:
            if upper_heigh >rect[1]:
                upper_heigh = rect[1]
            elif lower_heigh < rect[1] + rect[3]:
                lower_heigh = rect[1] + rect[3]
                
rect[0:4] = [max_rect[0],upper_heigh,max_rect[2],lower_heigh - upper_heigh]#Le gars qui pose ses yeux
cv2.rectangle(src,tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]),(0,0,0),thickness = -10)
print(rect[0:4])
        
cv2.imwrite(image_name+"_result_eye.jpg ",src)#Celui à sauver
cv2.destroyAllWindows() #Sentiment de mémoire ouverte

Il y a quelques traces d'essais et d'erreurs, mais ne vous inquiétez pas!

résultat

Donc, quand j'ai traité la photo précédente, ça ressemblait à ça. dandaIMGL5054_TP_V.jpg_result_eye.jpg Bonnes vibrations! IVOL_STUDIO_005_TP_V4.jpg_result_eye.jpg Le meilleur!

Ainsi, j'ai pu protéger la vie privée du monde.

Problèmes avec ce programme

Cela dit, en fait, c'est une spécification qu'une seule personne peut protéger la vie privée par photo, donc je pense que c'est pratique uniquement sur le blog d'un célèbre blogueur (et la première photo de face). .. C'est triste! (J'ai vérifié tous les visages, et s'il n'y a pas d'yeux applicables, j'ai l'impression de pouvoir le faire avec le visage suivant sans le regarder ...) De plus, le taux de réponse correcte était d'environ 70% comme je l'ai confirmé. Il peut y avoir place à l'amélioration en termes de précision ...

Ou plutôt, je pense que je devrais utiliser une autre bibliothèque sans utiliser OpenCV ...

Donc, si vous en avez envie à nouveau, je protégerai la vie privée d'un grand nombre de personnes!

(Merci d'avoir joué jusqu'à la fin.)

Recommended Posts

Le meilleur outil pour protéger votre vie privée des photos ...!
Exécutez la matrice sur le terminal de votre patron!
Comment faire fonctionner Linux depuis la console
Comment accéder à la banque de données de l'extérieur
3 meilleures façons d'utiliser la commande less
Envoyez des notifications sur votre smartphone à partir de la ligne de commande ou du script Linux. (Introduction d'un outil appelé ntfy)
J'ai créé un outil pour générer du Markdown à partir du fichier JSON Scrapbox exporté
Modifiez le point décimal de la journalisation de, à.
Comment faire fonctionner Linux depuis l'extérieur Procédure
POST des images depuis ESP32-CAM (MicroPython) vers le serveur
Comment mesurer la vitesse de la ligne depuis le terminal
[Python] Faites de votre mieux pour accélérer SQL Alchemy
Déplacez votre main pour comprendre la distribution du chi carré
De l'introduction de pyethapp à l'exécution du contrat
Histoire de passer de Pipenv à la poésie
[Pour les débutants] Analyse du langage à l'aide de l'outil de traitement du langage naturel "GiNZA" (de l'analyse morphologique à la vectorisation)