[PYTHON] Sammeln Sie nur Gesichtsbilder einer bestimmten Person mit Web Scraping

Ich habe im April angefangen, maschinelles Lernen zu studieren, und manchmal wünschte ich mir, ich hätte ein Gesichtsbild einer bestimmten Person, also habe ich beschlossen, es durch Web-Scraping zu sammeln. Vielleicht kann ich einen solchen Datensatz finden, wenn ich danach suche, aber ich wollte es trotzdem mit einem Foto des Gesichts meiner Lieblingsperson machen. Mit der openCV-Gesichtserkennung allein werden Teile, die keine Gesichter sind, extrahiert oder sogar Gesichtsbilder von nicht verwandten Personen gesammelt. Daher besteht der Zweck darin, ein Gesichtserkennungssystem hinzuzufügen und nur die Gesichtsbilder einer bestimmten Person zu sammeln.

Vor dem Ausführen des Programms

Vorsichtsmaßnahmen

Web Scraping ist sehr grau. Achten Sie daher darauf, den Server beim Ausführen nicht zu überlasten.

Umgebung / 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

Über das Ausführungsergebnis

Ich werde die Ergebnisse später detailliert schreiben, aber dieses Programm sammelt Gesichtsbilder mithilfe der Gesichtserkennung, aber das Gefühl, mit dem ich experimentiert habe, ist das Gesicht einer bestimmten Person mit fast 100% iger Genauigkeit. Ich habe ein Bild, aber wenn es ein japanisches Gesicht (oder eher ein asiatisches) ist, sinkt die Genauigkeit. Beim Sammeln japanischer Gesichter müssen diese nach der Ausführung manuell sortiert werden.

Wie man das Programm benutzt

Der Programmcode wurde auf github veröffentlicht. Laden Sie ihn daher von dort herunter. Wenn Sie dies tun möchten, weil die Erklärung gut ist, lesen Sie bitte die einfache Prozedur auf github und führen Sie sie aus.

Dieses Mal möchte ich Gesichtsbilder von ** Ai Shinozaki, dem süßesten in Japan ** sammeln

Bibliothek installieren

Dieses Mal werden wir eine Bibliothek namens face_recognize verwenden. Dies erfordert cmake und dlib, wie in der Dokumentation (https://github.com/ageitgey/face_recognition) beschrieben. Sie müssen lediglich die erforderlichen Bibliotheken hinzufügen.

Beschreibung der Hauptfunktionen

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

Diese Funktion erfasst und gibt 10 URLs von Websites zurück, die im Suchwort mithilfe der Google-Suchbibliothek angezeigt werden. Dieses Mal lautet das Suchwort "Ai Shinozaki image" und wird im Variablennamen gespeichert.

DownloadImage Sie können tatsächlich über den von der vorherigen Funktion erhaltenen Link darauf zugreifen und das Bild dort hochladen.

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

Holen Sie sich zuerst alle Bilder, die auf die Website hochgeladen wurden, schneiden Sie das Gesichtsbild aus jedem aus und rufen Sie es ab. Dann definiert die Funktion face_recog, ob die Person die Person für das Gesichtsbild ist oder nicht.

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

Holen Sie sich ein Bild, das das Gesicht der Person zeigt, die Sie zur Gesichtserkennung im Voraus aufnehmen möchten. Dieses Mal werden wir zur Verbesserung der Genauigkeit 5 Bilder aufnehmen, jedes mit dem eingegebenen Gesichtsbild vergleichen und jeweils das Ergebnis zurückgeben.

Und dieses Mal, wenn 2 oder mehr von 5 wahr sind, werde ich das Bild speichern. (Wenn es eine ist, werden verschiedene Personen, die übereinstimmen, gespeichert, und wenn es 5 von 5 ist, erhöht sich die Genauigkeit, aber die Anzahl nimmt ab.) Und auf der Github-Seite ist am Ende auch der Vorgang des Löschens genau des gleichen Bildes enthalten.

Ergebnis

Im Fall von Ai Shinozaki

Hier ist das Ergebnis des Sammelns von Bildern für eine Seite der Google-Suche. キャプチャ.PNG

Wie Sie sehen können, werden die Gesichtsbilder ganz unterschiedlicher Personen gespeichert.

Für Scarlett Johansson

Als nächstes werde ich mit Scarlett Johansson experimentieren, der sexiesten und schönsten in Übersee. キャプチャ2.PNG

Dies ist hervorragend gefüllt mit Scarlett Johansson, Insbesondere waren 342 von 343 Scarlett Johansson. Dies ist wesentlich genauer als bei Ai Shinozaki. Möglicherweise ist die Bibliothek face_recongnize für Gesichter von Ausländern gedacht und nicht zur Identifizierung asiatischer Gesichter geeignet.

Ich würde gerne in Zukunft mit verschiedenen Leuten experimentieren und es versuchen

Recommended Posts

Sammeln Sie nur Gesichtsbilder einer bestimmten Person mit Web Scraping
Festpunktbeobachtung bestimmter Daten im Web durch automatische Ausführung eines Webbrowsers auf dem Server (Ubuntu16.04) (2) -Web Scraping-
Holen Sie sich Qiitas "Gefällt mir" -Liste durch Schaben
Speichern Sie Bilder mit Web Scraping
Bildersammlung mit Web Scraping
Einzeiliges Web-Scraping mit tse
Memorandum of Scraping & Machine Learning [Entwicklungstechnik] von Python (Kapitel 4)
Memorandum of Scraping & Machine Learning [Entwicklungstechnik] von Python (Kapitel 5)
GAN: DCGAN Part1 - Webbilder abkratzen
Nogizaka46 Holen Sie sich Blog-Bilder durch Schaben
Festkomma-Beobachtung bestimmter Daten im Web durch automatische Ausführung des Webbrowsers auf dem Server (Ubuntu16.04) (3) ~ Cron automatische Ausführung ~