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.
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.
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)
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.
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.
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