[PYTHON] Als ich den BOOTH-Daumen kratzte und das Gesicht mit OpenCV erkannte, war die Genauigkeit zu gut und ich hatte Angst

BOOTH ist bekannt für den Verkauf vieler Verkaufsavatare. Ab dem 9. Dezember 2019 das "3D-Modell" -Tag Es gibt 11.527 Modelle. Dies bedeutet natürlich nicht die Anzahl der Avatare, da es viele Materialien enthält, die nicht mit Avataren zusammenhängen. Die von KingYoSun veröffentlichte VRC-Modelldatenbank enthält etwa 1.600 Modelle. Ist registriert, aber ich denke, dies ist derzeit am besten geeignet.

Ist es möglich, dies vom Miniaturbild zu unterscheiden? Es scheint, dass dies durch Erkennen des Gesichts erreicht werden kann, aber ist es möglich, nur das Gesicht als eigenständiges Bild zu erfassen?

Schaben

Deshalb werde ich zuerst kratzen. Wie erwartet ist es derjenige, der den Code einfügt, der beim Kopieren und Einfügen funktioniert, sodass nur die URL ausgeblendet wird.

import urllib.request as ur
from bs4 import BeautifulSoup
import requests

images = []

def img_save(img_url,title):
    url = img_url
    file_name = str(len(images)) + ".jpg "
    labeled_name = str(len(images)) + "___" + title + ".jpg "
    response = requests.get(url)
    image = response.content
    #Dies ist nur eine Seriennummer
    with open("data/" + file_name, "wb") as o:
        o.write(image)
    #Dieser hat einen Titel
    with open("labeled_data/" + labeled_name, "wb") as o:
        o.write(image)

def img_search(url_data):
    url = url_data
    html = ur.urlopen(url)
    soup = BeautifulSoup(html, "html.parser")
    title = str(soup.title.text)
    char_list = ["/","'",'"',"*","|","<",">","?","\\"," - BOOTH"]
    for c in char_list:
        title = title.replace(c,"")
    print(title)
    for s in soup.find_all("img"):
        if str(s).find("market") > 0:
            img_url = s.get("src")
            if img_url is not None:
                print(img_url)
                images.append(img_url)
                img_save(img_url,title)
                break

def page_access(page_number):
    url = page_number
    html = ur.urlopen(url)
    soup = BeautifulSoup(html, "html.parser")
    for s in soup.find_all("a"):
        if str(s).find("item-card__title-anchor") > 0:
            print (s.get("href"))
            url = s.get("href")
            img_search(url)

for i in range(1,240):
    url = "***Ich kann es nicht sagen***" + str(i)
    page_access(url)

Das auf diese Weise erhaltene Ergebnis ist wie folgt.

image.png

Es gibt ungefähr 11.000 Blätter.

Gesichtserkennung

Die Gesichtserkennung wird mithilfe der OpenCV-Bibliothek durchgeführt.

import cv2

sample = 11000

for i in range(sample):
    file_name = 'data/' + str(i+1) + '.jpg'
    img = cv2.imread(file_name)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
    faces = cascade.detectMultiScale(img_gray,minSize=(100, 100))
    color = (0, 0, 0)
    print(faces)
    if len(faces) > 0:
        for rect in faces:
            cv2.rectangle(img, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=10)
        output_path = "face_detect/" + str(i+1) + ".jpg "
        cv2.imwrite(output_path, img)

Das Gesichtserkennungsmodell muss separat DLed und lokal angeordnet werden. Es ist "haarcascade_frontalface_default.xml" im obigen Code. Sie können es von OpenCV github herunterladen.

Das Ergebnis ist unten.

image.png

Die Genauigkeit ist überhaupt nicht gut! Ich habe mein Gesicht vermisst oder im Gegenteil, ich habe etwas anderes falsch verstanden.

Anime Gesicht nur Modell

Dies liegt daran, dass das Gesichtserkennungsmodell ein lebendes Gesicht annimmt. Als ich danach suchte, gab es eine Person, die [Modell für die Anime-Gesichtserkennung] erstellt hat (https://github.com/nagadomi/lbpcascade_animeface). Gott? Also werde ich es noch einmal versuchen.

import cv2

sample = 11000

for i in range(sample):
    file_name = 'data/' + str(i+1) + '.jpg'
    img = cv2.imread(file_name)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    cascade = cv2.CascadeClassifier("lbpcascade_animeface.xml") #Hier ändert sich
    faces = cascade.detectMultiScale(img_gray,minSize=(100, 100))
    color = (0, 0, 0)
    print(faces)
    if len(faces) > 0:
        for rect in faces:
            cv2.rectangle(img, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), color, thickness=10)
    output_path = "face_detect/real" + str(i+1) + ".jpg "
    cv2.imwrite(output_path, img)

Ausführungsergebnis.

image.png

Die Genauigkeit ist zu hoch!

Trimmen Sie basierend auf diesem Erkennungsergebnis.

import cv2

sample = 11000
count = 1

for i in range(sample):
    file_name = 'data/' + str(i+1) + '.jpg'
    img = cv2.imread(file_name)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    classifier = cv2.CascadeClassifier("lbpcascade_animeface.xml")
    faces = classifier.detectMultiScale(img_gray, minSize=(100, 100))
    print(faces)
    if len(faces) > 0:
        for x,y,w,h in faces:
            face_image = img[y:y+h, x:x+w]
            output_path = 'face_trim/' + str(count) + '.jpg'
            cv2.imwrite(output_path,face_image)
            count += 1

Ausführungsergebnis.

image.png

...... Mir ist schwindelig, weil es zu viele Avatare gibt.

Zukunftsaussichten

Da ich viele Gesichtssymbole habe, konnte ich nur Geisterbilder machen, wenn ich die Methode, die ich neulich gemacht habe verwendet habe, daher verwende ich keine Methoden wie GAN. Es scheint, dass ein interessantes Bild nicht herauskommen wird. Wird studieren.

image.png

Es wurden ungefähr 3.000 Bilder generiert, aber der eigentliche Avatar ist, weil eine Samune mehrere Gesichter hat und eine gute Anzahl spezieller Kleidung (dh Samune hat Gesichter) verkauft wird. Es sollte weniger geben. Etwa die Hälfte, etwa 1.600 Punkte, die zu Beginn erwähnt wurden, scheinen eine vernünftige Zahl zu sein. Ich dachte, es wäre interessant, es mit der Charaktererkennung zu kombinieren (Samune hat viele Verkaufsbeschwerden), aber ich würde es gerne zu einer zukünftigen Ausgabe machen.

Es wäre auch interessant, einen Webdienst zu erstellen, der nur Gesichter nach dem Zufallsprinzip anzeigt und die Suche nach Avataren mit Ihren Lieblingsgesichtern aus einer großen Anzahl von Verkaufsavataren vereinfacht.

Artikel, die gepflegt wurden

[Erklärung für Anfänger] openCV-Gesichtserkennungsmechanismus und -praxis (detectMultiScale) Anime-Gesichtserkennung mit OpenCV

Recommended Posts

Als ich den BOOTH-Daumen kratzte und das Gesicht mit OpenCV erkannte, war die Genauigkeit zu gut und ich hatte Angst
Ich möchte die Position meines Gesichts mit OpenCV überprüfen!
Was ich getan habe, als ich den Feature-Punkt mit dem optischen Fluss von opencv nicht finden konnte und als ich ihn verloren habe
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ein Memo, wenn mit Python + OpenCV schnell ein Gesicht erkannt wird
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
Ich habe die numerische Berechnung von Python durch Rust ersetzt und die Geschwindigkeit verglichen
Ich habe den Akkord des Songs mit word2vec vektorisiert und mit t-SNE visualisiert
Lesen Sie das Diagrammbild mit OpenCV und ermitteln Sie die Koordinaten des Endpunkts des Diagramms
Erhalten und schätzen Sie die Form des Kopfes mit Dlib und OpenCV mit Python
Ich habe die Geschwindigkeit der Listeneinschlussnotation für und während mit Python2.7 gemessen.
Versuchen Sie, den Hintergrund und das sich bewegende Objekt des Videos mit OpenCV zu trennen
Ich habe versucht, die Genauigkeit der japanischen BERT- und der japanischen Distil-BERT-Satzklassifizierung mit PyTorch & Einführung der BERT-Technik zur Verbesserung der Genauigkeit zu vergleichen
Das Ergebnis war besser, als die Trainingsdaten des Mini-Batches als Hybrid aus fest und zufällig mit einem neuronalen Netzwerk erstellt wurden.