Bildersammlung Python-Skript zum Erstellen von Datensätzen für maschinelles Lernen

Hintergrund

Um mit maschinellem Lernen für ein bestimmtes Problem hochpräzise Ergebnisse zu erzielen, ist es wichtig, wie die Erstellung eines Datensatzes und das Design des Lernenden gestaltet werden. Von diesen ist es für ein erfolgreiches Lernen besonders wichtig, wie viele Daten beim Erstellen eines Datensatzes vorbereitet werden. Das erste, was Sie tun müssen, um die für das Lernen erforderlichen Daten zu sammeln, ist, eine Datenbank zu finden, die die Vorfahren der Welt organisiert und erstellt haben, die Daten, die bereits im Web überlaufen, und die Daten, die sie selbst erstellt haben. Es gibt jedoch nicht immer eine so bequeme Datenbank, dass Sie sie möglicherweise selbst sammeln müssen. Dieses Mal habe ich als einfaches Beispiel für das Lernen ein Skript in Python erstellt, das Bilder von Menschen sammelt und dann nur das Gesicht beschneidet und speichert.

Ausführungsumgebung

Zweck

Das diesmal erstellte Skript soll nach einer Abfrage verwandte Bilder im Web suchen und sammeln, die Gesichtserkennung mit OpenCV durchführen, dann zuschneiden und speichern. Die verwendete Suchmaschine ist die Bildsuche von Bing.

Skript

Der Quellcode dieses Skripts befindet sich unter dem folgenden Link. https://github.com/tokkuman/FaceImageCollection Jede Funktion in diesem Skript wird unten beschrieben.

Import Die importierten Module in dieser Skripterstellung sind wie folgt.

import sys
import os
import commands as cmd
import cv2
import time
import copy
from argparse import ArgumentParser

getHtml Eine Funktion, die das HTML der gesuchten Seite durch Auslösen einer Abfrage abruft. Da die Ausgabe von cmd.getstatus (Status, Ausgabe) als Taple zurückgegeben wird, wird diesmal nur das von wget -O extrahierte HTML zurückgegeben.

def getHtml(query):
    return cmd.getstatusoutput("wget -O - https://www.bing.com/images/search?q=" + query)[1]

extractImageURL Eine Funktion, die HTML- und Bildformate empfängt und nur die Links des angegebenen Formats aus HTML extrahiert.

def extractImageURL(html, suffix):
    url = []
    snum, lnum = 0, 0
    text = html.split('\n')
    for sen in text:
        if sen.find('<div class="item">') >= 0:
            element = sen.split('<div class="item">')
            for num in range(len(element)):
                for suf in suffix:
                    snum = element[num].find("href") + 6
                    lnum = element[num].find(suf) + len(suf)
                    if lnum > 0:
                        url.append(element[num][snum:lnum])
                        break
    return url

saveImg extractImage Eine Funktion, die das gewünschte Bild vorübergehend lokal aus dem per URL extrahierten Link speichert. Erstellen Sie ein anderes Verzeichnis mit dem Namen Original im erstellten Verzeichnis (opbase) und speichern Sie die Bilder darin.

def saveImg(opbase, url):
    dir = opbase + '/Original/'
    if not (os.path.exists(dir)):
        os.mkdir(dir)
    for u in url:
        try:
            os.system('wget -P ' + dir + ' '  + u)
        except:
            continue

cropFace Eine Funktion, die nur das Gesicht aus dem gespeicherten Bild extrahiert, zuschneidet und speichert. Die Gesichtserkennung verwendet ein trainiertes Modell (Haarkaskade) des Haar-Klassifikators in OpenCV. In diesem Skript können vier Arten von Methoden verwendet werden, vorausgesetzt, nur das Gesicht von vorne wird extrahiert. Für die Genauigkeit des Modells habe ich auf den folgenden Link verwiesen (http://stackoverflow.com/questions/4440283/how-to-choose-the-cascade-file-for-face-detection). Erstellen Sie für das Bild nach dem Zuschneiden ein Zuschneideverzeichnis in opbase und speichern Sie es darin.

def cropFace(opbase, path, imsize, method):
    dir = opbase + '/Crop/'
    if not (os.path.exists(dir)):
        os.mkdir(dir)
    for p in path:
        img = cv2.imread(opbase + '/Original/' + p)
        gImg = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
        if method == 1:
            face_cascade = cv2.CascadeClassifier('haarcascade/haarcascade_frontalface_default.xml')
        elif method == 2:
            face_cascade = cv2.CascadeClassifier('haarcascade/haarcascade_frontalface_alt.xml')
        elif method == 3:
            face_cascade = cv2.CascadeClassifier('haarcascade/haarcascade_frontalface_alt2.xml')
        else:
            face_cascade = cv2.CascadeClassifier('haarcascade/haarcascade_frontalface_alt_tree.xml')
        faces = face_cascade.detectMultiScale(gImg, 1.3, 5)
        for num in range(len(faces)):
            cropImg = copy.deepcopy(img[faces[num][1]:faces[num][1]+faces[num][3], faces[num][0]:faces[num][0]+faces[num][2]])
            resizeImg = cv2.resize(cropImg, (imsize, imsize))
            filename = dir + p[:-4] + '_' + str(num + 1) + '.tif'
            cv2.imwrite(filename, resizeImg)

main Die Hauptfunktion dieses Skripts. Mit Parser mit den folgenden Optionen ausführen.

Außerdem wird das Ausgabeverzeichnis dieses Skripts mit dem angegebenen Abfragenamen erstellt.

if __name__ == "__main__":
    ap = ArgumentParser(description='ImageCollenction.py')
    ap.add_argument('--query', '-q', nargs='*', default='hoge', help='Specify Query of Image Collection ')
    ap.add_argument('--suffix', '-s', nargs='*', default='jpg', help='Specify Image Suffix')
    ap.add_argument('--imsize', '-i', type=int, default=100, help='Specify Image Size of Crop Face Image')
    ap.add_argument('--method', '-m', type=int, default=1, help='Specify Method Flag (1 : Haarcascades Frontalface Default, 2 : Haarcascades Frontalface Alt1, 3 : Haarcascades Frontalface Alt2, Without : Haarcascades Frontalface Alt Tree)')
    args = ap.parse_args()

    t = time.ctime().split(' ')
    if t.count('') == 1:
        t.pop(t.index(''))
    # Path Separator
    psep = '/'
    for q in args.query:
        opbase = q
        # Delite File Sepaeator   
        if (opbase[len(opbase) - 1] == psep):
            opbase = opbase[:len(opbase) - 1]
        # Add Current Directory (Exept for Absolute Path)
        if not (opbase[0] == psep):
            if (opbase.find('./') == -1):
                opbase = './' + opbase
        # Create Opbase
        opbase = opbase + '_' + t[1] + t[2] + t[0] + '_' + t[4] + '_' + t[3].split(':')[0] + t[3].split(':')[1] + t[3].split(':')[2]
        if not (os.path.exists(opbase)):
            os.mkdir(opbase)
            print 'Output Directory not exist! Create...'
        print 'Output Directory:', opbase

        html = getHtml(q)
        url = extractImageURL(html, args.suffix)
        saveImg(opbase, url)
        cropFace(opbase, os.listdir(opbase + '/Original'), args.imsize, args.method)

Ergebnis

Um zu experimentieren, wie viel Lärm gemischt wird, zeige ich diesmal das Ergebnis, das durch das Werfen der Abfragen "Gacky" und "Becky" als persönliches Hobby erzielt wurde.

result.001.jpeg

Es muss gesagt werden, dass es Gacky auf der Welt war, und obwohl es einige Monstergeräusche enthielt, war es im Allgemeinen Gacky. Andererseits ist Becky auch zu jemandem gekommen, der außer Becky Becky zu sein scheint. In Bezug auf die Spezifikationen ist es unvermeidlich, dass eine Abfrage mit höherer Allgemeinheit mehr Rauschen enthält, aber es kann gesagt werden, dass es Raum für Verbesserungen gibt. Darüber hinaus ist der wichtigste Punkt zur Verbesserung die Anzahl der Bilder, die gesammelt werden können, und da die Anzahl der Bilder pro Abfrage überwiegend gering ist, kann gesagt werden, dass es insgesamt immer noch Probleme gibt.

Erwägung

In der Welt ist es üblich, die benutzerdefinierte Google-Such-API oder die Bing-Such-API für die Bildersammlung zu verwenden, und die Genauigkeit und Anzahl der Sammlungen ist überwältigend hoch. Diesmal bestand die Herausforderung darin, wie weit ich versuchen konnte, ohne diese APIs zu verwenden, aber ich möchte die Methode auch mit APIs ausprobieren. Da auch die Methode zur Analyse von HTML untersucht wurde, ist es wahrscheinlich, dass ein Problem mit der Extraktionsmethode aufgetreten ist. Sie können Beautiful Soup verwenden, das Sie oft als praktisches Modul betrachten. Darüber hinaus macht Gacky große Fortschritte mit dem Liebestanz (obwohl er ursprünglich ein Engel war, also flog er), während Becky von der Klippe neu gestartet ist, was sich vermutlich in diesem Ergebnis widerspiegelt. Bitte geben Sie Ihr Bestes mit Ainoris MC.

Recommended Posts

Bildersammlung Python-Skript zum Erstellen von Datensätzen für maschinelles Lernen
<Für Anfänger> Python-Bibliothek <Für maschinelles Lernen>
[Empfohlenes Tagging für maschinelles Lernen # 4] Skript für maschinelles Lernen ...?
Verstärken Sie Bilder für maschinelles Lernen mit Python
Warum Python für maschinelles Lernen ausgewählt wird
[Shakyo] Begegnung mit Python zum maschinellen Lernen
[Python] Webanwendungsdesign für maschinelles Lernen
Eine Einführung in Python für maschinelles Lernen
Erstellen einer Entwicklungsumgebung für maschinelles Lernen
[Python] Sammeln Sie Bilder mit Icrawler für maschinelles Lernen [1000 Blatt]
Erstellen Sie mit Python eine interaktive Umgebung für maschinelles Lernen
[Empfohlenes Tagging beim maschinellen Lernen # 2] Erweiterung des Scraping-Skripts
[Empfohlenes Tagging beim maschinellen Lernen # 2.5] Änderung des Scraping-Skripts
Python-Lernnotiz für maschinelles Lernen von Chainer aus Kapitel 2
Python-Lernnotiz für maschinelles Lernen von Chainer Kapitel 1 und 2
Vorbereitung zum Starten von "Python Machine Learning Programming" (für macOS)
[Python] Ich habe einen Klassifikator für Iris erstellt [Maschinelles Lernen]
Konstruktionsnotiz für eine maschinelle Lernumgebung von Python
Datensatz für maschinelles Lernen
Lernablauf für Python-Anfänger
Python-Lernplan für KI-Lernen
Maschinelles Lernen mit Python! Vorbereitung
Python Machine Learning Programming> Schlüsselwörter
Bildverarbeitungssammlung in Python
Bedeutung von Datensätzen für maschinelles Lernen
Checkios Empfehlung zum Erlernen von Python
Beginnend mit maschinellem Python-Lernen
Erstellen Sie eine Umgebung für maschinelles Lernen mit Python unter MacOSX
Die Verwendung von icrawler zum Sammeln von Daten zum maschinellen Lernen wurde vereinfacht
Wie nutzt man maschinelles Lernen für die Arbeit? 03_Python-Codierungsverfahren
Python-Lernnotiz für maschinelles Lernen von Chainer Kapitel 7 Regressionsanalyse
Kurs für maschinelles Lernen an der Tsukuba-Universität: Lernen Sie sklearn, während Sie das Python-Skript zu einem Teil der Aufgabe machen (17).
Kurs für maschinelles Lernen an der Tsukuba-Universität: Lernen Sie sklearn, während Sie das Python-Skript zu einem Teil der Aufgabe machen (5).
Kurs für maschinelles Lernen an der Tsukuba-Universität: Lernen Sie sklearn, während Sie das Python-Skript zu einem Teil der Aufgabe machen (16).
Kurs für maschinelles Lernen an der Tsukuba University: Lernen Sie sklearn, während Sie das Python-Skript zu einem Teil der Aufgabe machen (10).
Kurs für maschinelles Lernen an der Tsukuba-Universität: Lernen Sie sklearn, während Sie das Python-Skript zu einem Teil der Aufgabe machen (2).
Kurs für maschinelles Lernen an der Tsukuba-Universität: Lernen Sie sklearn, während Sie das Python-Skript zu einem Teil der Aufgabe machen (13).
Kurs für maschinelles Lernen an der Tsukuba-Universität: Lernen Sie sklearn, während Sie das Python-Skript zu einem Teil der Aufgabe machen (9).
Kurs für maschinelles Lernen an der Tsukuba-Universität: Lernen Sie sklearn, während Sie das Python-Skript zu einem Teil der Aufgabe machen (4).
Kurs für maschinelles Lernen an der Tsukuba-Universität: Lernen Sie sklearn, während Sie das Python-Skript in die Aufgabe aufnehmen (12).
Kurs für maschinelles Lernen an der Tsukuba-Universität: Lernen Sie sklearn, während Sie das Python-Skript zu einem Teil der Aufgabe machen (1)
Kurs für maschinelles Lernen an der Tsukuba-Universität: Lernen Sie sklearn, während Sie das Python-Skript zu einem Teil der Aufgabe machen (11).
Kurs für maschinelles Lernen an der Tsukuba-Universität: Lernen Sie sklearn, während Sie das Python-Skript zu einem Teil der Aufgabe machen (3).
Kurs für maschinelles Lernen an der Tsukuba-Universität: Lernen Sie sklearn, während Sie das Python-Skript zu einem Teil der Aufgabe machen (14).
Kurs für maschinelles Lernen an der Tsukuba-Universität: Lernen Sie sklearn, während Sie das Python-Skript zu einem Teil der Aufgabe machen (6).
Kurs für maschinelles Lernen an der Tsukuba-Universität: Lernen Sie sklearn, während Sie das Python-Skript zu einem Teil der Aufgabe machen (15).
[Python Machine Learning] Empfehlung zur Verwendung von Spyder für Anfänger (Stand August 2020)
Python-Skript für die ldapsearch base64-Dekodierung
Wie wäre es mit Anaconda zum Erstellen einer maschinellen Lernumgebung mit Python?
Python-Lernnotiz für maschinelles Lernen von Chainer Kapitel 8 Einführung in Numpy
Erstellen einer Windows 7-Umgebung für eine Einführung in das maschinelle Lernen mit Python
Web-Lehrmaterialien zum Erlernen von Python
Python-Lernnotiz für maschinelles Lernen von Chainer Kapitel 10 Einführung in Cupy
Maschinelles Lernen mit Python (1) Gesamtklassifizierung
Zusammenfassung des maschinellen Lernens von Python-Anfängern
Persönliche Notizen für die Python-Bildverarbeitung
Empfohlenes Container-Image für Python-Anwendungen
AWS Layer Creation Script für Python
Python: Vorverarbeitung beim maschinellen Lernen: Übersicht