Maison > Article > développement back-end > Apprenez à implémenter une reconnaissance faciale simple à l'aide de Python
Avant-propos
Laissez mon ordinateur me connaître Ce n'est que lorsque mon ordinateur me connaît qu'il peut mériter d'être appelé. moi. mon ordinateur!
Aujourd'hui, nous utilisons Python pour implémenter une technologie simple de reconnaissance faciale !
En Python, il existe de nombreuses façons d'obtenir une reconnaissance faciale simple. Selon les caractéristiques du langage Python Glue, nous pouvons atteindre cet objectif rapidement et avec précision en appelant le package. Celui présenté ici est celui avec une plus grande précision.
(Recommandation d'apprentissage gratuite : tutoriel vidéo python)
1. Tout d'abord
Trions les étapes nécessaires pour obtenir la reconnaissance faciale :
Le processus est à peu près comme ceci. Avant cela, le visage doit être. identifié en premier. Trouvez-le avec précision, c'est-à-dire un classificateur qui peut distinguer avec précision les visages. Ici, nous pouvons utiliser des classificateurs déjà formés en ligne et la précision de la classification est relativement élevée.
ps : La source du trésor du blogueur a été placée dans le lien ci-dessous~
Recommandé : projet GitHub
https://github.com/opencv/opencv/tree / master/data/haarcascades
Puisque python est utilisé, l'utilisation de packages est naturellement indispensable Avant de regarder le code, listons les packages nécessaires à l'ensemble du projet :
· CV2 (Opencv) : Reconnaissance d'image, appel de caméra
· os : Opération sur les fichiers
· numpy : NumPy (Python numérique) est une bibliothèque d'extension du langage Python qui prend en charge un grand nombre d'opérations sur les tableaux dimensionnels et les matrices. De plus, elle fournit également un grand nombre de bibliothèques de fonctions mathématiques pour les opérations sur les tableaux
· PIL : Python Imaging Library , la bibliothèque standard de facto pour le traitement d'images sur la plateforme Python
2. Suivant
Obtenir
#-----获取人脸样本----- import cv2 #调用笔记本内置摄像头,参数为0,如果有其他的摄像头可以调整参数为1,2 cap = cv2.VideoCapture(0) #调用人脸分类器,要根据实际路径调整3 face_detector = cv2.CascadeClassifier(r'X:/Users/73950/Desktop/FaceRec/haarcascade_frontalface_default.xml') #待更改 #为即将录入的脸标记一个id face_id = input('\n User data input,Look at the camera and wait ...') #sampleNum用来计数样本数目 count = 0 while True: #从摄像头读取图片 success,img = cap.read() #转为灰度图片,减少程序符合,提高识别度 if success is True: gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) else: break #检测人脸,将每一帧摄像头记录的数据带入OpenCv中,让Classifier判断人脸 #其中gray为要检测的灰度图像,1.3为每次图像尺寸减小的比例,5为minNeighbors faces = face_detector.detectMultiScale(gray, 1.3, 5) #框选人脸,for循环保证一个能检测的实时动态视频流 for (x, y, w, h) in faces: #xy为左上角的坐标,w为宽,h为高,用rectangle为人脸标记画框 cv2.rectangle(img, (x, y), (x+w, y+w), (255, 0, 0)) #成功框选则样本数增加 count += 1 #保存图像,把灰度图片看成二维数组来检测人脸区域 #(这里是建立了data的文件夹,当然也可以设置为其他路径或者调用数据库) cv2.imwrite("data/User."+str(face_id)+'.'+str(count)+'.jpg',gray[y:y+h,x:x+w]) #显示图片 cv2.imshow('image',img) #保持画面的连续。waitkey方法可以绑定按键保证画面的收放,通过q键退出摄像 k = cv2.waitKey(1) if k == '27': break #或者得到800个样本后退出摄像,这里可以根据实际情况修改数据量,实际测试后800张的效果是比较理想的 elif count >= 800: break #关闭摄像头,释放资源 cap.realease() cv2.destroyAllWindows()Après avoir testé par des blogueurs, lors de l'exécution de la déclaration "face_detector = cv2.CascadeClssifier(r'C:UsersadminDesktoppythondatahaarcascade_frontalface_default.xml')", essayez de ne pas avoir de caractères chinois dans le nom du répertoire dans le nom réel chemin, sinon ce sera facile de signaler une erreur.
De cette façon, votre ordinateur peut vous voir !
2. Établir un modèle de comparaison grâce à des algorithmes
L'algorithme utilisé cette fois est l'algorithme inclus dansopencv est relativement. La nouvelle version (j'utilise la version 2.4.8) fournit une classe FaceRecognizer, qui contient des algorithmes de reconnaissance faciale et des interfaces de fonction associés, dont trois Reconnaissance facialealgorithme (nous utilisons le troisième)
1.eigenface2.fisherface3.LBPHFaceRecognizer LBP est une méthode d'extraction de fonctionnalités qui peut extraire des caractéristiques de texture d'une image. L'opérateur LBP initial prend la valeur du pixel central comme seuil dans une fenêtre 3X3 et la compare avec les valeurs des huit pixels environnants, si la valeur du pixel est. supérieur au seuil, le pixel est noté 1, sinon il est noté 0. De cette manière, un code binaire de huit bits peut être obtenu, qui est converti en code décimal ou LBP, de sorte que la valeur LBP de cette fenêtre est obtenue, et cette valeur est utilisée pour refléter les informations de texture dans cette fenêtre. LBPH est une amélioration par rapport au LBP original. Avec le support d'opencv, nous pouvons directement appeler la fonction pour créer directement un modèle LBPHde reconnaissance faciale.
Nous créons un fichier Python dans le même répertoire que la partie précédente, avec le nom de fichier trainner.py, pour écrire le script de génération de l'ensemble de données. Dans le même répertoire, créez un dossier nommé trainner pour stocker notre outil de reconnaissance formé.#-----建立模型、创建数据集-----#-----建立模型、创建数据集----- import os import cv2 import numpy as np from PIL import Image #导入pillow库,用于处理图像 #设置之前收集好的数据文件路径 path = 'data' #初始化识别的方法 recog = cv2.face.LBPHFaceRecognizer_create() #调用熟悉的人脸分类器 detector = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') #创建一个函数,用于从数据集文件夹中获取训练图片,并获取id #注意图片的命名格式为User.id.sampleNum def get_images_and_labels(path): image_paths = [os.path.join(path,f) for f in os.listdir(path)] #新建连个list用于存放 face_samples = [] ids = [] #遍历图片路径,导入图片和id添加到list中 for image_path in image_paths: #通过图片路径将其转换为灰度图片 img = Image.open(image_path).convert('L') #将图片转化为数组 img_np = np.array(img,'uint8') if os.path.split(image_path)[-1].split(".")[-1] != 'jpg': continue #为了获取id,将图片和路径分裂并获取 id = int(os.path.split(image_path)[-1].split(".")[1]) faces = detector.detectMultiScale(img_np) #将获取的图片和id添加到list中 for(x,y,w,h) in faces: face_samples.append(img_np[y:y+h,x:x+w]) ids.append(id) return face_samples,ids #调用函数并将数据喂给识别器训练 print('Training...') faces,ids = get_images_and_labels(path) #训练模型 recog.train(faces,np.array(ids)) #保存模型 recog.save('trainner/trainner.yml')
Cela permet à l'ordinateur de reconnaître que vous êtes l'étoile unique~
3. Reconnaissance
Détection, vérification. , et la sortie sont en fait le processus deidentification Différent des deux premiers processus, il s'agit d'un processus impliquant une utilisation réelle, nous l'intégrons donc dans un fichier unifié.
#-----检测、校验并输出结果----- import cv2 #准备好识别方法 recognizer = cv2.face.LBPHFaceRecognizer_create() #使用之前训练好的模型 recognizer.read('trainner/trainner.yml') #再次调用人脸分类器 cascade_path = "haarcascade_frontalface_default.xml" face_cascade = cv2.CascadeClassifier(cascade_path) #加载一个字体,用于识别后,在图片上标注出对象的名字 font = cv2.FONT_HERSHEY_SIMPLEX idnum = 0 #设置好与ID号码对应的用户名,如下,如0对应的就是初始 names = ['初始','admin','user1','user2','user3'] #调用摄像头 cam = cv2.VideoCapture(0) minW = 0.1*cam.get(3) minH = 0.1*cam.get(4) while True: ret,img = cam.read() gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #识别人脸 faces = face_cascade.detectMultiScale( gray, scaleFactor = 1.2, minNeighbors = 5, minSize = (int(minW),int(minH)) ) #进行校验 for(x,y,w,h) in faces: cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2) idnum,confidence = recognizer.predict(gray[y:y+h,x:x+w]) #计算出一个检验结果 if confidence <p>Maintenant, votre ordinateur peut vous reconnaître ! <strong></strong></p>Diverses fonctions telles que la détection de mise sous tension peuvent également être réalisées grâce à d'autres combinaisons. L'avez-vous appris ? <p></p>Voici les résultats des tests et quelques problèmes survenus lorsque le blogueur a révisé le manuscrit ~ J'espère que cela sera utile à tout le monde (呲ya.jpg) <p></p><p>Résultats des tests : <strong></strong></p><p><img alt="Apprenez à implémenter une reconnaissance faciale simple à laide de Python" src="https://img.php.cn/upload/article/000/000/052/53329dfc75f057b5271d004ca1012368-1.png"></p><p><img alt="Apprenez à implémenter une reconnaissance faciale simple à laide de Python" src="https://img.php.cn/upload/article/000/000/052/53329dfc75f057b5271d004ca1012368-2.png"></p><p>Problèmes survenus lors du processus d'examen et de test du blogueur : <strong></strong></p> <p>( 1) Problème de version <strong></strong></p><p>Solution : <strong>Après d'innombrables échecs, le blogueur rappelle à tout le monde qu'il est préférable d'installer python2.7. Vous pouvez utiliser directement pip install numpy. et pip install opencv- python installe numpy et la version python correspondante d'opencv</strong></p><p>(Si vous utilisez Anaconda2, les commandes liées au pip peuvent être saisies dans Anaconda Prompt sous le dossier Anaconda2 dans le menu Démarrer) </p><p>Cliquez sur le lien donné dans le tweet, téléchargez le fichier dans github et mettez-le dans Dans le dossier où se trouve le fichier compilé, et modifiez les répertoires concernés dans le code </p><p><strong> (2) S'il demande "l'objet module n'a pas d'attribut 'face'" </strong></p><p><strong>Solution : </strong>Vous pouvez entrer pip install opencv-contrib-python pour résoudre le problème. Si vous êtes invité à indiquer qu'une commission est requise, vous pouvez ajouter --user après, c'est-à-dire pip install. opencv-contrib-python --user</p><p> Si vous avez d'autres questions, n'hésitez pas à contacter le blogueur~~~</p><blockquote><p><strong>Un grand nombre de recommandations d'apprentissage gratuites , veuillez visiter le </strong><a href="https://www.php.cn/course/list/30.html" target="_blank"><strong>tutoriel Python</strong></a><strong>(Vidéo)</strong></p></blockquote>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!