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?
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.
Il y a environ 11 000 feuilles.
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.
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.
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.
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.
...... J'ai le vertige parce qu'il y a trop d'avatars.
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.
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.
[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