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?
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.
Es gibt ungefähr 11.000 Blätter.
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.
Die Genauigkeit ist überhaupt nicht gut! Ich habe mein Gesicht vermisst oder im Gegenteil, ich habe etwas anderes falsch verstanden.
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.
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.
...... Mir ist schwindelig, weil es zu viele Avatare gibt.
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.
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.
[Erklärung für Anfänger] openCV-Gesichtserkennungsmechanismus und -praxis (detectMultiScale) Anime-Gesichtserkennung mit OpenCV
Recommended Posts