[PYTHON] Gesichtserkennung durch Sammeln von Bildern von Angers.

Wenn Sie Vtuber oder Nijisanji nicht kennen, werden Sie nicht hierher kommen, aber Ich wollte maschinelles Lernen machen, um "Sanbaka" zu identifizieren, also lud ich zuerst Angers 'Bild herunter und erkannte das Gesicht. Es gibt verschiedene Referenzseiten, die jedoch auf den folgenden Seiten basieren.

https://qiita.com/Tatsuro64/items/95b0ce48b6bb155bfe29

Programm: pytyon3.7 Umgebung: ubuntu18.04 Verwendete Bibliothek: BeautifulSoup (Scraping), opencv (Gesichtserkennung), urllib (Bilddownload)

Die Hauptverarbeitung des Codes ist wie folgt.

if __name__ == '__main__':

    downloads = ImageDownloader('Angers Katrina').go()
    for i, d in enumerate(downloads):
        FaceDetector(d).cutout_faces('image/faces/faces_{}.jpg'.format(i + 1))

DL mit dem Downloader und erkenne das Gesicht in der Liste, das war's.

Der Downloader ist unten.

class ImageDownloader(object):
    def __init__(self, keyword):
        session = requests.session()
        session.headers.update(
            {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:10.0) \
             Gecko/20100101 Firefox/10.0'})
        params = urllib.parse.urlencode(
            {'q': keyword, 'tbm': 'isch', 'ijn': '1'})
        query = "https://www.google.co.jp/search" + '?' + params
        self._bs = BeautifulSoup(session.get(query).text, 'html.parser')

    def go(self):
        downloads = []
        for img in self._bs.find_all('img'):
            try:
                url = img['data-iurl']
                downloads.append('image/image_{}.jpg'.format(len(downloads) + 1))
                urllib.request.urlretrieve(url, downloads[-1])
            except KeyError:
                print('failed to get url : {}'.format(img))
        return downloads

■ Konstruktor Ich stelle eine Abfrage an Google (Stichwort: Angers) und stelle die Suchergebnisseite (diesmal nur die erste Seite) in die Scraping-Bibliothek (Beautiful Soup).

■ go-Methode Durchsuchen Sie alle img-Tags und der Link wird im Attribut ['data-iurl'] gespeichert. Laden Sie ihn daher mit dem urllib-Modul herunter. Sie finden darin Tags, die nicht das Attribut ['data-iurl'] haben, wahrscheinlich anders als das Suchbild. Daher wird die KeyError-Ausnahme abgefangen und durchgeschliffen.

Der Gesichtsschneider ist wie folgt.

class FaceDetector(object):

    #Geschultes Modell
    FACE_CASCADE = '/home/websoler/anaconda3/lib/python3.7/site-packages/cv2/data/lbpcascade_animeface.xml'

    def __init__(self, fname):
        self._img = cv2.imread(fname)

    def cutout_faces(self, fname):
        gray = cv2.cvtColor(self._img, cv2.COLOR_BGR2GRAY)
        classifier = cv2.CascadeClassifier(FaceDetector.FACE_CASCADE)
        faces = classifier.detectMultiScale(gray, scaleFactor=1.2, minSize=(30, 30))
        if len(faces):
            for (x, y, w, h) in faces:
                region = self._img[y:y + h, x:x + w]
                region_resized = cv2.resize(region, (128, 128))
                cv2.imwrite(fname, region_resized)
                break  #TODO Vorerst nur der erste Fall.

■ Konstruktor Ich habe opencv die übergebene Datei gelesen.

■ Methode cut_faces Wenn das Gesicht erkannt wird, schneide ich es aus, verkleinere es auf 128 x 128 und speichere es als Datei.

Das Lernmodell ist nicht das von OpenCV bereitgestellte Standardmodell, sondern verwendet lbpcascade_animeface.xml, das auf Anime-Gesichter spezialisiert ist. Es hat nicht funktioniert, als ich es lokal abgelegt habe, also habe ich es direkt in den Pfad der Python-Bibliothek eingefügt. In meiner Umgebung war Anakonda darin, bevor ich es wusste, also darunter.

Das Anime-Modell ist DL aus dem Folgenden. https://github.com/nagadomi/lbpcascade_animeface

Ich habe minSize angegeben, da die False-Positive-Rate umso höher ist, je kleiner die Fläche ist. Irgendwie werden Angers Ärmel und Finger "Gesichter" genannt.

Nächstes Mal werde ich das TF Records-Format für maschinelles Lernen und TensorFlow vorbereiten.

Der gesamte Code ist unten.


from bs4 import BeautifulSoup
import cv2
import os
import requests
import shutil
import urllib


#Umweltvereinbarung
shutil.rmtree('image')
os.mkdir('image')
os.mkdir('image/faces')


class ImageDownloader(object):
    def __init__(self, keyword):
        session = requests.session()
        session.headers.update(
            {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:10.0) \
             Gecko/20100101 Firefox/10.0'})
        params = urllib.parse.urlencode(
            {'q': keyword, 'tbm': 'isch', 'ijn': '1'})
        query = "https://www.google.co.jp/search" + '?' + params
        self._bs = BeautifulSoup(session.get(query).text, 'html.parser')

    def go(self):
        downloads = []
        for img in self._bs.find_all('img'):
            try:
                url = img['data-iurl']
                downloads.append('image/image_{}.jpg'.format(len(downloads) + 1))
                urllib.request.urlretrieve(url, downloads[-1])
            except KeyError:
                print('failed to get url : {}'.format(img))
        return downloads


class FaceDetector(object):

    #Geschultes Modell
    FACE_CASCADE = '/home/websoler/anaconda3/lib/python3.7/site-packages/cv2/data/lbpcascade_animeface.xml'

    def __init__(self, fname):
        self._img = cv2.imread(fname)

    def cutout_faces(self, fname):
        gray = cv2.cvtColor(self._img, cv2.COLOR_BGR2GRAY)
        classifier = cv2.CascadeClassifier(FaceDetector.FACE_CASCADE)
        faces = classifier.detectMultiScale(gray, scaleFactor=1.2, minSize=(30, 30))
        if len(faces):
            for (x, y, w, h) in faces:
                region = self._img[y:y + h, x:x + w]
                region_resized = cv2.resize(region, (128, 128))
                cv2.imwrite(fname, region_resized)
                break  #TODO Vorerst nur der erste Fall.

if __name__ == '__main__':

    downloads = ImageDownloader('Angers Katrina').go()
    for i, d in enumerate(downloads):
        FaceDetector(d).cutout_faces('image/faces/faces_{}.jpg'.format(i + 1))

Recommended Posts

Gesichtserkennung durch Sammeln von Bildern von Angers.
Schritt-für-Schritt-Approximation von Bildern mit niedrigem Rang durch HOSVD
Niedrigrangige Approximation des Bildes durch Tucker-Zerlegung
[Python] Gesichtserkennung durch OpenCV (Haar Cascade)
Klassifizierung von Gitarrenbildern durch maschinelles Lernen Teil 1
Kategorisieren Sie Gesichtsbilder von Anime-Charakteren mit Chainer
Niedrigrangige Approximation von Bildern durch HOSVD und HOOI
Klassifizierung von Gitarrenbildern durch maschinelles Lernen Teil 2
Optischer Fluss, das von OpenCV aufgenommene dynamische Bild
Abnormalitätserkennung von Zeitreihendaten durch LSTM (Keras)
Ich verglich die Identität der Bilder nach Hu Moment
Nachweis von ArUco-Markern
Verbessern Sie schnell die Erkennungsgenauigkeit, indem Sie Parameter mit openCV-Gesichtserkennung angeben