Heim  >  Artikel  >  Backend-Entwicklung  >  Erfahren Sie, wie Sie eine einfache Gesichtserkennung mit Python implementieren

Erfahren Sie, wie Sie eine einfache Gesichtserkennung mit Python implementieren

coldplay.xixi
coldplay.xixinach vorne
2021-03-22 10:16:073533Durchsuche

Erfahren Sie, wie Sie eine einfache Gesichtserkennung mit Python implementieren

Vorwort

Lass meinen Computer mich kennen. Nur wenn mein Computer mich kennt, kann er mein Computer genannt werden!

Heute verwenden wir Python, um einfache Gesichtserkennungstechnologie zu implementieren!

In Python gibt es viele Möglichkeiten, eine einfache Gesichtserkennung zu erreichen. Abhängig von den Eigenschaften der Python-Klebersprache können wir dieses Ziel schnell und genau erreichen, indem wir das Paket aufrufen. Der hier vorgestellte ist einer mit höherer Genauigkeit.

(Kostenlose Lernempfehlung: Python-Video-Tutorial)

1. Zunächst

klären Sie die erforderlichen Schritte zur Gesichtserkennung:

Der Prozess ist grob Hier müssen wir das menschliche Gesicht genau finden, das heißt, wir können einen bereits trainierten Klassifikator verwenden. Die Klassifizierungsgenauigkeit ist relativ hoch Außerdem können Sie die dafür aufgewendete Zeit sparen.

ps: Die Schatzquelle des Bloggers wurde im folgenden Link platziert~

Empfohlen: GitHub-Projekt

https://github.com/opencv/opencv/tree/master/data/haarcascades

Da ich Python verwende Natürlich ist die Verwendung von Paketen unverzichtbar. Bevor wir uns den Code ansehen, listen wir zunächst die für das gesamte Projekt benötigten Pakete auf:

· CV2 (Opencv): Bilderkennung, Kameraaufruf

· Betriebssystem: Dateioperation

· numpy: NumPy (Numerical Python) ist eine Erweiterungsbibliothek der Python-Sprache, die eine große Anzahl dimensionaler Array- und Matrixoperationen unterstützt. Darüber hinaus bietet sie auch eine große Anzahl mathematischer Funktionsbibliotheken für Array-Operationen

· PIL: Python Imaging Library, die De-facto-Standardbibliothek für die Bildverarbeitung auf der Python-Plattform

2. Weiter

1. Erhalten Sie das Gesicht gegen das Gesicht

#-----获取人脸样本-----
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()

Nach dem Testen durch den Blogger Versuchen Sie nach der Ausführung von

"face_detector = cv2.CascadeClssifier(r 'C:UsersadminDesktoppythondatahaarcascade_frontalface_default.xml')" bei dieser Anweisung, keine chinesischen Zeichen im Verzeichnisnamen im tatsächlichen Pfad zu enthalten, da es sonst leicht zu melden ist Fehler.

Auf diese Weise kann Ihr Computer Sie sehen!

2. Erstellen Sie ein Vergleichsmodell mithilfe von Algorithmen.

Der dieses Mal verwendete Algorithmus ist der in opencv enthaltene Algorithmus (ich verwende 2.4.8) und stellt eine FaceRecognizer-Klasse bereit enthält einige verwandte Gesichtserkennungsalgorithmen und Funktionsschnittstellen, darunter drei Gesichtserkennungsalgorithmen (wir verwenden den dritten). kann lokale Texturmerkmale eines Bildes extrahieren. Der anfängliche LBP-Operator befindet sich in einem 3X3-Fenster und verwendet den Pixelwert des mittleren Pixels als Schwellenwert und die umliegenden acht Pixel. Vergleicht den Pixelwert, wenn der Pixelwert des Pixels größer ist als der Schwellenwert, wird das Pixel als 1 markiert, andernfalls als 0. Auf diese Weise kann ein 8-Bit-Binärcode erhalten werden, der in einen Dezimal- oder LBP-Code umgewandelt wird, sodass der LBP-Wert dieses Fensters erhalten wird und dieser Wert zur Wiedergabe der Texturinformationen in diesem Fenster verwendet wird. LBPH ist eine Verbesserung gegenüber dem ursprünglichen LBP. Mit der OpenCV-Unterstützung können wir die Funktion direkt aufrufen, um direkt ein LBPH-Gesichtserkennungsmodell zu erstellen.

Wir erstellen eine Python-Datei mit dem Namen trainner.py im selben Verzeichnis wie im vorherigen Teil, die zum Schreiben des Skripts zur Datensatzgenerierung verwendet wird. Erstellen Sie im selben Verzeichnis einen Ordner mit dem Namen trainner, um unseren trainierten Erkenner zu speichern.

#-----建立模型、创建数据集-----#-----建立模型、创建数据集-----

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')

Dadurch erkennt der Computer, dass Sie der einzigartige Star sind~

3. Erkennung, Überprüfung und Ausgabe sind eigentlich der Prozess der

Erkennung, der sich von den beiden vorherigen unterscheidet. Jeder Prozess ist anders. Da es sich um einen Prozess mit tatsächlicher Nutzung handelt, integrieren wir ihn in eine einheitliche Datei.

#-----检测、校验并输出结果-----
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 < 100:
            idum = names[idnum]
            confidence = "{0}%",format(round(100-confidence))
        else:
            idum = "unknown"
            confidence = "{0}%",format(round(100-confidence))

        #输出检验结果以及用户名
        cv2.putText(img,str(idum),(x+5,y-5),font,1,(0,0,255),1)
        cv2.putText(img,str(confidence),(x+5,y+h-5),font,1,(0,0,0),1)

        #展示结果
        cv2.imshow('camera',img)
        k = cv2.waitKey(20)
        if k == 27:
            break

#释放资源
cam.release()
cv2.destroyAllWindows()
Jetzt kann Ihr Computer Sie erkennen!

Verschiedene Funktionen wie die Einschalterkennung können auch durch andere Kombinationen erreicht werden. Haben Sie es gelernt?

Im Folgenden sind die Testergebnisse und einige Probleme aufgeführt, die aufgetreten sind, als der Blogger das Manuskript überprüft hat ~ Ich hoffe, es wird für alle hilfreich sein (呲ya.jpg)

Testergebnisse:

Der Blogger überprüfte das Manuskript. Probleme, die während des Testvorgangs aufgetreten sind:

(1) Versionsproblem

Lösung:

Nach unzähligen Fehlern des Bloggers wird jeder daran erinnert, dass es am besten ist, Python2.7 zu installieren kann direkt pip install numpy und pip install opencv-python verwenden, um numpy und die entsprechende Python-Version von opencv

zu installieren

(Wenn Sie Anaconda2 verwenden, können Pip-bezogene Befehle in der Anaconda-Eingabeaufforderung im Anaconda2-Ordner im Startmenü eingegeben werden)

Klicken Sie auf den im Tweet angegebenen Link, laden Sie die Datei in Github herunter und legen Sie sie in dem Ordner ab, in dem sie kompiliert wurde Die Datei befindet sich. Laden Sie die relevanten Verzeichnisse im Code herunter und ändern Sie sie

(2) Wenn Sie gefragt werden: „Modulobjekt hat kein Attribut „Gesicht““

Lösung: Sie können pip install opencv-contrib-python eingeben Um das Problem zu lösen, können Sie, wenn eine Eingabeaufforderung erforderlich ist, am Ende --user hinzufügen, also pip install opencv-contrib-python --user

Wenn Sie weitere Fragen haben, wenden Sie sich bitte an die Blogger~~~

Viele kostenlose Lernempfehlungen finden Sie im Python-Tutorial(Video)

Das obige ist der detaillierte Inhalt vonErfahren Sie, wie Sie eine einfache Gesichtserkennung mit Python implementieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen