windows8.1 Anaconda(python2.7)
J'ai écrit le code pour décider à partir de l'image s'il s'agit de Maki Horikita. Collectez des dossiers d'images de visage, numérisez-les et formez-les avec scicit-learn.
Structure des dossiers
|---face_category
|---horikita_face(Dossier d'images du visage de Maki Horikita 200 pièces)
|---joyu_face(200 dossiers d'images de visage autres que Maki Horikita)
|---horikita_siken(20 dossiers d'images de Maki Horikita à tester)
|---face_rec2.py(horikita_Extraire le visage de l'image siken)
|---LinearSVC.py(Traitement principal)
|---haarcascade_frontalface_alt.xml(Fichier en cascade)
face_rec2.py
#-*- coding:utf-8 -*-
def picture_face(before_image, num):
import cv2
import os
import sys
cascade_path = "haarcascade_frontalface_alt.xml"
#Lecture de fichiers
image_file = cv2.imread('C:/Users/nobu/Desktop/my_programs/face_category/horikita_siken/%s' % before_image)
#Conversion de l'échelle de gris
image_gray = cv2.cvtColor(image_file, cv2.COLOR_BGR2GRAY)
#Acquérir la quantité de caractéristiques du classificateur en cascade
cascade = cv2.CascadeClassifier(cascade_path)
#Exécution de la reconnaissance d'objets (reconnaissance faciale)
facerect = cascade.detectMultiScale(image_gray, scaleFactor=1.2, minNeighbors=2, minSize=(10, 10))
if facerect == None:
sys.exit()
for rect in facerect:
#Découpez seulement le visage et enregistrez
x = rect[0]
y = rect[1]
width = rect[2]
height = rect[3]
dst = image_file[y:y+height, x:x+width]
resize_image = cv2.resize(dst,(256,256))
new_image_path = 'C:/Users/nobu/Desktop/my_programs/face_category/' + str(num) + '_face.jpg'
print new_image_path
cv2.imwrite(new_image_path, resize_image)
LinearSVC.py
# -*- coding:utf-8 -*-
from sklearn.svm import LinearSVC
from PIL import Image
import os
import glob
import numpy as np
import face_rec2
current_dir = os.getcwd()
#Données d'entraînement
#Convertir l'image de Maki Horikita en valeur numérique
horikita_list = glob.glob(current_dir + "\\horikita_face\\*")
horikita_dim2 = []
for image in horikita_list:
#Exclusion des fichiers système
if image == current_dir + "\\horikita_face\\Thumbs.db":
continue
else:
x = np.array([])
horikita_dim3 = np.array(Image.open(image).convert('L'))
#scikit-Il semble que l'apprentissage ne puisse pas gérer plus de 3 dimensions, alors convertissez-le en 2 dimensions
for i in xrange(256):
x = np.r_[x,horikita_dim3[i]]
horikita_dim2.append(x)
data_training1 = horikita_dim2
#Convertir des images autres que Maki Horikita en valeurs numériques
joyu_list = glob.glob(current_dir + "\\joyu_face\\*")
joyu_dim2 = []
for image in joyu_list:
#Exclusion des fichiers système
if image == current_dir + "\\joyu_face\\Thumbs.db":
continue
else:
x = np.array([])
joyu_dim3 = np.array(Image.open(image).convert('L'))
#scikit-Il semble que l'apprentissage ne puisse pas gérer plus de 3 dimensions, alors convertissez-le en 2 dimensions
for i in xrange(256):
x = np.r_[x,joyu_dim3[i]]
joyu_dim2.append(x)
data_training2 = joyu_dim2
data_training = np.r_[data_training1, data_training2]
#Réglage de l'étiquette
label_training = []
for i in xrange(400):
if i < 200:
label_training.append(1)
else:
label_training.append(0)
#Apprentissage
estimator = LinearSVC(C=0.5)
estimator.fit(data_training, label_training)
j = 0
#Données de test
for i in xrange(1,21):
face_rec2.picture_face(str(i) + '.jpg', i)
horikita_siken = np.array([])
try:
horikita = np.array(Image.open('C:/Users/nobu/Desktop/my_programs/face_category/' + str(i) + '_face.jpg').convert('L'))
for j in xrange(256):
horikita_siken = np.r_[horikita_siken,horikita[j]]
data_test = horikita_siken
#Je vais prédire
label_prediction = estimator.predict(data_test)
if label_prediction == 1:
print "----------------------------------------------"
print str(i) + ".jpg est Maki Horikita"
print "----------------------------------------------"
else:
print "----------------------------------------------"
print str(i) + ".jpg n'est pas Maki Horikita"
print "----------------------------------------------"
except:
print "----------------------------------------------"
print str(i) + ".jpg n'a pas pu être traité"
print "----------------------------------------------"
continue
Échec ...: fatigué: J'ai testé avec 20 dossiers d'images de visage de Maki Horikita pour les tests, mais pour une raison quelconque Je reçois une sortie disant "Ce n'est pas Maki Horikita". J'aimerais savoir s'il y a des solutions ou des améliorations.
SVM pour essayer l'apprentissage automatique avec scikit-learn Effectuer la reconnaissance faciale avec OpenCV, couper et enregistrer uniquement la partie faciale [Python]
Recommended Posts