[PYTHON] Quand j'ai gratté le pouce de BOOTH et détecté le visage avec OpenCV, la précision était trop bonne et j'avais peur

BOOTH est connu pour vendre de nombreux avatars de vente. Depuis le 12/09/2019, le tag "3D model" Il existe 11527 modèles. Bien sûr, cela ne signifie pas le nombre d'avatars car il contient beaucoup de matériaux qui ne sont pas liés aux avatars. Base de données des modèles VRC publiée par KingYoSun contient environ 1 600 modèles. Est enregistré, mais je pense que c'est le plus approprié à l'heure actuelle.

Est-il possible de le distinguer de l'image miniature? Il semble que cela puisse être fait en reconnaissant le visage, mais est-il possible d'acquérir uniquement le visage en tant qu'image indépendante?

Grattage

C'est pourquoi je vais d'abord gratter. Comme prévu, c'est celui qui met le code qui fonctionne avec le copier-coller, donc seule l'URL est masquée.

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
    #Ceci est juste un numéro de série
    with open("data/" + file_name, "wb") as o:
        o.write(image)
    #Celui-ci a un titre
    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 = "***Je ne peux pas le mettre***" + str(i)
    page_access(url)

Le résultat obtenu de cette manière est le suivant.

image.png

Il y a environ 11 000 feuilles.

Détection facial

La détection de visage est effectuée à l'aide de la bibliothèque OpenCV.

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)

Le modèle de détection de visage doit être DLed séparément et disposé localement. Il s'agit de haarcascade_frontalface_default.xml dans le code ci-dessus. Vous pouvez le télécharger depuis OpenCV github.

Le résultat est ci-dessous.

image.png

La précision n'est pas du tout bonne! J'ai raté mon visage, ou au contraire, j'ai mal compris quelque chose de différent.

Modèle de visage uniquement d'anime

En effet, le modèle de détection de visage suppose un visage vivant. Quand je l'ai cherché, il y avait une personne qui a créé Model for Anime Face Detection. Dieu? Je vais donc réessayer.

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") #Ici change
    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)

Résultat de l'exécution.

image.png

La précision est trop élevée!

Coupez en fonction de ce résultat de détection.

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

Résultat de l'exécution.

image.png

...... J'ai le vertige parce qu'il y a trop d'avatars.

Perspectives d'avenir

Depuis que j'ai beaucoup d'icônes de visage, je ne pouvais faire des fantômes que lorsque j'utilisais la méthode que j'ai utilisée l'autre jour, donc je n'utilise pas de méthodes telles que GAN. Il semble qu'une image intéressante ne sortira pas. Étudiera.

image.png

Environ 3000 images ont été générées, mais l'avatar réel est dû au fait qu'un samune a plusieurs visages et qu'un bon nombre de vêtements spéciaux (c'est-à-dire que samune a des visages) sont vendus. Il devrait y en avoir moins. Environ la moitié, environ 1 600 points mentionnés au début semble être un nombre raisonnable. Je pensais qu'il serait intéressant de le combiner avec la reconnaissance de caractères (Samune a beaucoup de plaintes de vente), mais j'aimerais en faire un prochain numéro.

De plus, il serait intéressant de créer un service Web qui n'affiche que les visages au hasard et facilite la recherche d'avatars avec vos visages préférés à partir d'un grand nombre d'avatars de vente.

Articles pris en charge

[Explication pour les débutants] Mécanisme et pratique de détection de visage openCV (detectMultiScale) Détection de visage d'anime avec OpenCV

Recommended Posts

Quand j'ai gratté le pouce de BOOTH et détecté le visage avec OpenCV, la précision était trop bonne et j'avais peur
Je veux vérifier la position de mon visage avec OpenCV!
Ce que j'ai fait quand je ne pouvais pas trouver le point caractéristique avec le flux optique d'opencv et quand je l'ai perdu
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
Un mémo lorsque le visage est détecté avec Python + OpenCV rapidement
J'ai essayé la reconnaissance faciale avec OpenCV
J'ai remplacé le calcul numérique de Python par Rust et comparé la vitesse
J'ai vectorisé l'accord de la chanson avec word2vec et je l'ai visualisé avec t-SNE
Lisez l'image du graphique avec OpenCV et obtenez les coordonnées du point final du graphique
Obtenez et estimez la forme de la tête en utilisant Dlib et OpenCV avec python
J'ai mesuré la vitesse de la notation d'inclusion de liste, pendant et pendant avec python2.7.
Essayez de séparer l'arrière-plan et l'objet en mouvement de la vidéo avec OpenCV
J'ai essayé de comparer la précision de la classification des phrases BERT japonaises et japonaises Distil BERT avec PyTorch et introduction de la technique d'amélioration de la précision BERT
Le résultat était meilleur lorsque les données d'apprentissage du mini-lot ont été faites un hybride de fixe et aléatoire avec un réseau de neurones.