J'ai commencé à étudier l'apprentissage automatique en avril, et parfois j'aurais aimé avoir une image du visage d'une personne en particulier, alors j'ai décidé de la collecter par web scraping. Peut-être que je peux trouver un tel ensemble de données en recherchant, mais je voulais quand même le faire avec une photo du visage de ma personne préférée. Avec la détection de visage openCV seule, des parties qui ne sont pas des visages sont extraites ou même des images de visage de personnes non apparentées sont collectées, le but est donc d'ajouter un système de reconnaissance faciale et de collecter uniquement les images de visage d'une personne spécifique.
Le scraping Web est très gris, alors faites attention à ne pas surcharger le serveur lorsque vous l'exécutez.
Winsows10 Anaconda3 Python 3.5.6 cmake 3.17.1 dlib 19.19.0 face-recognition 1.3.0 opencv-python 4.2.0.34
J'écrirai les résultats en détail plus tard, mais ce programme collecte des images de visage en utilisant la reconnaissance faciale, mais le sentiment que j'ai expérimenté est le visage d'une personne spécifique avec une précision de presque 100%. J'ai une image, mais si c'est un visage japonais (ou plutôt asiatique), la précision baissera. Lors de la collecte des visages japonais, il est nécessaire de les trier manuellement après exécution.
Le code du programme a été publié sur github, veuillez donc le télécharger à partir de là. Si vous voulez le faire parce que l'explication est bonne, veuillez lire et exécuter la procédure simple sur github.
Cette fois, je voudrais collectionner les images du visage de ** Ai Shinozaki, la plus mignonne du Japon **
Cette fois, nous utiliserons une bibliothèque appelée face_recognize. Cela nécessite cmake et dlib comme décrit dans la documentation (https://github.com/ageitgey/face_recognition). Tout ce que vous avez à faire est d'ajouter les bibliothèques requises.
getExternalLinks
def getExternalLinks(page):
externalLinks = []
for url in search(name, lang="jp", start=(page-1)*10, stop=10,pause = 2.0):
externalLinks.append(url)
return externalLinks
C'est une fonction qui acquiert et renvoie 10 URL de sites qui apparaissent dans le mot de recherche à l'aide de la bibliothèque de recherche Google. Cette fois, le mot recherché est "Ai Shinozaki image" et stocké dans le nom de la variable.
DownloadImage Vous pouvez en fait y accéder à partir du lien obtenu par la fonction précédente et y télécharger l'image.
def DownloadImage(externalLinks):
for url in externalLinks:
global num
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.3'}
req = Request(url, headers=header)
try:
html = urlopen(req).read()
except HTTPError as err:
return None
bs = BeautifulSoup(html, 'html.parser')
#get path of image
downloadList = bs.find_all('img')
for download in downloadList:
try:
#convert relative path to absolute path
fileUrl = getAbsoluteURL(url, download['src'])
except:
continue
if fileUrl is not None:
#get all faces in the picture
face_list = face_detect(fileUrl)
print(fileUrl)
if face_list is None:
continue
for face in face_list:
#judge face
result = face_recog(face)
true_num = 0
#when the number of True is more than the threshold, write the image in local
for i in result:
true_num += i*1
if true_num >= threshold:
try:
if ".png " in fileUrl:
cv2.imwrite(downloadDirectory+str(num)+".png ", face)
else:
cv2.imwrite(downloadDirectory+str(num)+".jpg ", face)
num += 1
except:
print("Fail to save")
time.sleep(1)
return None
Tout d'abord, téléchargez toutes les images téléchargées sur le site, découpez l'image du visage de chacune d'entre elles et récupérez-la. Ensuite, la fonction face_recog définit si la personne est ou non la personne de l'image du visage.
face_recog
def face_recog(face):
#load some images that contain target's face
sample_image = face_recognition.load_image_file("sample_image/<image file>")
sample_image1 = face_recognition.load_image_file("sample_image/<image file>")
sample_image2 = face_recognition.load_image_file("sample_image/<image file>")
sample_image3 = face_recognition.load_image_file("sample_image/<image file>")
sample_image4 = face_recognition.load_image_file("sample_image/<image file>")
sample_image = face_recognition.face_encodings(sample_image)[0]
sample_image1 = face_recognition.face_encodings(sample_image1)[0]
sample_image2 = face_recognition.face_encodings(sample_image2)[0]
sample_image3 = face_recognition.face_encodings(sample_image3)[0]
sample_image4 = face_recognition.face_encodings(sample_image4)[0]
try:
unknown_image = face_recognition.face_encodings(face)[0]
except:
return [False]
known_faces = [
sample_image,
sample_image1,
sample_image2,
sample_image3,
sample_image4
]
results = face_recognition.compare_faces(known_faces, unknown_image)
return results
Obtenez une image montrant le visage de la personne que vous souhaitez emmener à l'avance pour la reconnaissance faciale. Cette fois, afin d'améliorer la précision, nous allons acquérir 5 images, comparer chacune avec l'image du visage d'entrée et renvoyer le résultat de chacune.
Et cette fois, si 2 ou plus sur 5 sont Vrai, je vais enregistrer l'image. (S'il en est un, différentes personnes qui correspondent seront enregistrées, et si c'est 5 sur 5, la précision sera plus élevée, mais le nombre sera plus petit) Et du côté de github, le processus de suppression de la même image est également inclus à la fin.
Voici le résultat de la collecte d'images pour une page de recherche Google.
Comme vous pouvez le voir, les images de visage de personnes très différentes sont enregistrées.
Ensuite, j'expérimenterai avec Scarlett Johansson, la plus sexy et la plus belle à l'étranger.
C'est brillamment rempli de Scarlett Johansson, Plus précisément, 342 sur 343 étaient Scarlett Johansson. C'est considérablement plus précis que lorsque Ai Shinozaki l'était. Peut-être que la bibliothèque face_recongnize est destinée aux visages d'étrangers et ne convient pas pour identifier les visages asiatiques.
J'aimerais expérimenter et essayer avec différentes personnes à l'avenir
Recommended Posts