[PYTHON] Ne collectez que des images faciales d'une personne spécifique grâce au grattage Web

J'ai commencé à étudier l'apprentissage automatique en avril, et parfois j'aurais aimé avoir une image du visage d'une personne en particulier, alors j'ai décidé de la collecter par web scraping. Peut-être que je peux trouver un tel ensemble de données en recherchant, mais je voulais quand même le faire avec une photo du visage de ma personne préférée. Avec la détection de visage openCV seule, des parties qui ne sont pas des visages sont extraites ou même des images de visage de personnes non apparentées sont collectées, le but est donc d'ajouter un système de reconnaissance faciale et de collecter uniquement les images de visage d'une personne spécifique.

Avant d'exécuter le programme

Remarques

Le scraping Web est très gris, alors faites attention à ne pas surcharger le serveur lorsque vous l'exécutez.

Environnement / version

Winsows10 Anaconda3 Python 3.5.6 cmake 3.17.1 dlib 19.19.0 face-recognition 1.3.0 opencv-python 4.2.0.34

À propos du résultat de l'exécution

J'écrirai les résultats en détail plus tard, mais ce programme collecte des images de visage en utilisant la reconnaissance faciale, mais le sentiment que j'ai expérimenté est le visage d'une personne spécifique avec une précision de presque 100%. J'ai une image, mais si c'est un visage japonais (ou plutôt asiatique), la précision baissera. Lors de la collecte des visages japonais, il est nécessaire de les trier manuellement après exécution.

Comment utiliser le programme

Le code du programme a été publié sur github, veuillez donc le télécharger à partir de là. Si vous voulez le faire parce que l'explication est bonne, veuillez lire et exécuter la procédure simple sur github.

Cette fois, je voudrais collectionner les images du visage de ** Ai Shinozaki, la plus mignonne du Japon **

Installer la bibliothèque

Cette fois, nous utiliserons une bibliothèque appelée face_recognize. Cela nécessite cmake et dlib comme décrit dans la documentation (https://github.com/ageitgey/face_recognition). Tout ce que vous avez à faire est d'ajouter les bibliothèques requises.

Description des principales fonctions

getExternalLinks


def getExternalLinks(page):
    externalLinks = []
    for url in search(name, lang="jp", start=(page-1)*10, stop=10,pause = 2.0):
        externalLinks.append(url)
    return externalLinks

C'est une fonction qui acquiert et renvoie 10 URL de sites qui apparaissent dans le mot de recherche à l'aide de la bibliothèque de recherche Google. Cette fois, le mot recherché est "Ai Shinozaki image" et stocké dans le nom de la variable.

DownloadImage Vous pouvez en fait y accéder à partir du lien obtenu par la fonction précédente et y télécharger l'image.

def DownloadImage(externalLinks):
    for url in externalLinks:
        global num
        header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.3'}
        req = Request(url, headers=header)
        try:
            html = urlopen(req).read()
        except HTTPError as err:
            return None
        bs = BeautifulSoup(html, 'html.parser')
        #get path of image
        downloadList = bs.find_all('img')
        for download in downloadList:
            try:
                #convert relative path to absolute path
                fileUrl = getAbsoluteURL(url, download['src'])
            except:
                continue
            if fileUrl is not None:
                #get all faces in the picture
                face_list = face_detect(fileUrl)
                print(fileUrl)
                if face_list is None:
                    continue
                for face in face_list:
                    #judge face
                    result = face_recog(face)
                    true_num = 0
                    #when the number of True is more than the threshold, write the image in local
                    for i in result:
                        true_num += i*1
                    if true_num >= threshold:
                        try:
                            if ".png " in fileUrl:
                                cv2.imwrite(downloadDirectory+str(num)+".png ", face)
                            else:
                                cv2.imwrite(downloadDirectory+str(num)+".jpg ", face)
                            num += 1
                        except:
                            print("Fail to save")
            time.sleep(1)
    return None

Tout d'abord, téléchargez toutes les images téléchargées sur le site, découpez l'image du visage de chacune d'entre elles et récupérez-la. Ensuite, la fonction face_recog définit si la personne est ou non la personne de l'image du visage.

face_recog

def face_recog(face):

    #load some images that contain target's face
    sample_image = face_recognition.load_image_file("sample_image/<image file>")
    sample_image1 = face_recognition.load_image_file("sample_image/<image file>")
    sample_image2 = face_recognition.load_image_file("sample_image/<image file>")
    sample_image3 = face_recognition.load_image_file("sample_image/<image file>")
    sample_image4 = face_recognition.load_image_file("sample_image/<image file>")

    sample_image = face_recognition.face_encodings(sample_image)[0]
    sample_image1 = face_recognition.face_encodings(sample_image1)[0]
    sample_image2 = face_recognition.face_encodings(sample_image2)[0]
    sample_image3 = face_recognition.face_encodings(sample_image3)[0]
    sample_image4 = face_recognition.face_encodings(sample_image4)[0]

    try:
        unknown_image = face_recognition.face_encodings(face)[0]
    except:
        return [False]
    
    known_faces = [
        sample_image,
        sample_image1,
        sample_image2,
        sample_image3,
        sample_image4
    ]

    results = face_recognition.compare_faces(known_faces, unknown_image)
    return results

Obtenez une image montrant le visage de la personne que vous souhaitez emmener à l'avance pour la reconnaissance faciale. Cette fois, afin d'améliorer la précision, nous allons acquérir 5 images, comparer chacune avec l'image du visage d'entrée et renvoyer le résultat de chacune.

Et cette fois, si 2 ou plus sur 5 sont Vrai, je vais enregistrer l'image. (S'il en est un, différentes personnes qui correspondent seront enregistrées, et si c'est 5 sur 5, la précision sera plus élevée, mais le nombre sera plus petit) Et du côté de github, le processus de suppression de la même image est également inclus à la fin.

résultat

Dans le cas d'Ai Shinozaki

Voici le résultat de la collecte d'images pour une page de recherche Google. キャプチャ.PNG

Comme vous pouvez le voir, les images de visage de personnes très différentes sont enregistrées.

Pour Scarlett Johansson

Ensuite, j'expérimenterai avec Scarlett Johansson, la plus sexy et la plus belle à l'étranger. キャプチャ2.PNG

C'est brillamment rempli de Scarlett Johansson, Plus précisément, 342 sur 343 étaient Scarlett Johansson. C'est considérablement plus précis que lorsque Ai Shinozaki l'était. Peut-être que la bibliothèque face_recongnize est destinée aux visages d'étrangers et ne convient pas pour identifier les visages asiatiques.

J'aimerais expérimenter et essayer avec différentes personnes à l'avenir

Recommended Posts

Ne collectez que des images faciales d'une personne spécifique grâce au grattage Web
Observation en virgule fixe de données spécifiques sur le Web en exécutant automatiquement un navigateur Web sur le serveur (Ubuntu16.04) (2) -Web scraping-
Obtenez la liste "J'aime" de Qiita en grattant
Enregistrez des images avec le web scraping
Collection d'images avec scraping Web
Grattage de bande sur une seule ligne avec du tsé
Mémorandum of scraping & machine learning [technique de développement] par Python (chapitre 4)
Mémorandum of scraping & machine learning [technique de développement] par Python (chapitre 5)
GAN: DCGAN Part1 - Scraping d'images Web
Nogisaka 46 Obtenez des images de blog en grattant
Observation en virgule fixe de données spécifiques sur le Web en exécutant automatiquement le navigateur Web sur le serveur (Ubuntu16.04) (3) ~ Exécution automatique Cron ~