溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python如何搭建人臉識別考勤系統(tǒng)

發(fā)布時(shí)間:2021-12-29 12:45:51 來源:億速云 閱讀:241 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)Python如何搭建人臉識別考勤系統(tǒng)的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

    人臉識別的實(shí)際應(yīng)用

    人臉識別目前正被用于讓世界更安全、更智能、更方便。

    有幾個(gè)用例:

    • 尋找失蹤人員

    • 零售犯罪

    • 安全標(biāo)識

    • 識別社交媒體上的帳戶

    • 考勤系統(tǒng)

    • 識別汽車中的駕駛員

    根據(jù)性能和復(fù)雜性,有多種方法可以執(zhí)行面部識別。

    傳統(tǒng)人臉識別算法:

    在 1990 年代,整體方法被用于人臉識別。手工制作的局部描述符在 1920 年代初期開始流行,然后在 2000 年代后期采用局部特征學(xué)習(xí)方法。目前廣泛使用并在OpenCV中實(shí)現(xiàn)的算法如下:

    • Eigenfaces (1991)

    • Local Binary Patterns Histograms (LBPH) (1996)

    • Fisherfaces(1997)

    • Scale Invariant Feature Transform (SIFT) (1999)

    • Speed Up Robust Features (SURF)(2006)

    每種方法都遵循不同的方法來提取圖像信息并將其與輸入圖像進(jìn)行匹配。

    Fischer-faces和Eigenfaces與 SURF 和 SIFT 具有幾乎相似的方法。

    LBPH 是一種簡單但非常有效的方法,但與現(xiàn)代人臉識別器相比,速度較慢。

    與現(xiàn)代人臉識別算法相比,這些算法并不快。傳統(tǒng)算法不能僅通過拍攝一個(gè)人的單張照片來訓(xùn)練。

    人臉識別深度學(xué)習(xí):

    一些廣泛使用的基于深度學(xué)習(xí)的人臉識別系統(tǒng)如下:

    • DeepFace

    • DeepID series of systems

    • VGGFace

    • FaceNet

    人臉識別器一般是在人臉圖像中找出重要的點(diǎn),如嘴角、眉毛、眼睛、鼻子、嘴唇等。這些點(diǎn)的坐標(biāo)稱為五官點(diǎn),這樣的點(diǎn)有66個(gè)。這樣,尋找特征點(diǎn)的不同技術(shù)給出不同的結(jié)果。

    Python如何搭建人臉識別考勤系統(tǒng)

    來源:https://www.pinterest.com/mrmosherart/face-landmarks/

    人臉識別模型涉及的步驟:

    1.人臉檢測:定位人臉并在人臉周圍繪制邊界框并保留邊界框的坐標(biāo)。

    2.人臉對齊:標(biāo)準(zhǔn)化人臉以與訓(xùn)練數(shù)據(jù)庫一致。

    3.特征提?。禾崛⒂糜谟?xùn)練和識別任務(wù)的人臉特征。

    4.人臉識別: 將人臉與準(zhǔn)備好的數(shù)據(jù)庫中的一張或多張已知人臉進(jìn)行匹配。

    在傳統(tǒng)的人臉識別方法中,我們有單獨(dú)的模塊來執(zhí)行這 4 個(gè)步驟。在本文中,你將看到一個(gè)將這 4 個(gè)步驟組合在一個(gè)步驟中的庫。

    構(gòu)建人臉識別系統(tǒng)的步驟

    安裝庫

    我們需要安裝 2 個(gè)庫來實(shí)現(xiàn)人臉識別。

    dlib : dlib是一個(gè)現(xiàn)代 C++ 工具包,包含機(jī)器學(xué)習(xí)算法和工具,用于在 C++ 中創(chuàng)建復(fù)雜的軟件以解決實(shí)際問題。

    # installing dlib 
    pip install dlib

    臉部識別:將face_recognition庫,創(chuàng)建和維護(hù) Adam Geitgey,包含了dlib人臉識別功能。

    # installing face recognition
    pip install face recognition

    Opencv 用于一些圖像預(yù)處理。

    # installing opencv 
    pip install opencv

    導(dǎo)入庫

    現(xiàn)在你已經(jīng)下載了所有重要的庫,讓我們導(dǎo)入它們來構(gòu)建系統(tǒng)。

    import cv2
    import numpy as np
    import face_recognition

    加載圖像

    導(dǎo)入庫后,你需要加載圖像。

    face_recognition 庫以 BGR 的形式加載圖像,為了打印圖像,你應(yīng)該使用 OpenCV 將其轉(zhuǎn)換為 RGB。

    imgelon_bgr = face_recognition.load_image_file('elon.jpg')
    imgelon_rgb = cv2.cvtColor(imgelon_bgr,cv2.COLOR_BGR2RGB)
    cv2.imshow('bgr', imgelon_bgr)
    cv2.imshow('rgb', imgelon_rgb)
    cv2.waitKey(0)

    Python如何搭建人臉識別考勤系統(tǒng)

    如你所見,RGB 看起來很自然,因此你將始終把通道更改為 RGB。

    查找人臉位置并繪制邊界框

    你需要在人臉周圍繪制一個(gè)邊界框,以顯示是否已檢測到人臉。

    imgelon =face_recognition.load_image_file('elon.jpg')
    imgelon = cv2.cvtColor(imgelon,cv2.COLOR_BGR2RGB)
    #----------Finding face Location for drawing bounding boxes-------
    face = face_recognition.face_locations(imgelon_rgb)[0]
    copy = imgelon.copy()
    #-------------------Drawing the Rectangle-------------------------
    cv2.rectangle(copy, (face[3], face[0]),(face[1], face[2]), (255,0,255), 2)
    cv2.imshow('copy', copy)
    cv2.imshow('elon',imgelon)
    cv2.waitKey(0)

    Python如何搭建人臉識別考勤系統(tǒng)

    為人臉識別訓(xùn)練圖像

    該庫的制作方式是自動查找人臉并僅處理人臉,因此你無需從圖片中裁剪人臉。

    訓(xùn)練:

    在這個(gè)階段,我們將訓(xùn)練圖像轉(zhuǎn)換為一些編碼,并使用該圖像的人名存儲編碼。

    train_elon_encodings = face_recognition.face_encodings(imgelon)[0]

    測試:

    為了測試,我們加載圖像并將其轉(zhuǎn)換為編碼,然后在訓(xùn)練期間將編碼與存儲的編碼進(jìn)行匹配,這種匹配基于尋找最大相似度。當(dāng)你找到與測試圖像匹配的編碼時(shí),你將獲得與訓(xùn)練編碼相關(guān)聯(lián)的名稱。

    # lets test an image
    test = face_recognition.load_image_file('elon_2.jpg')
    test = cv2.cvtColor(test, cv2.COLOR_BGR2RGB)
    test_encode = face_recognition.face_encodings(test)[0]
    print(face_recognition.compare_faces([train_encode],test_encode))

    face_recognition.compare_faces,如果兩個(gè)圖像中的人相同,返回True,否則返回False。

    構(gòu)建人臉識別系統(tǒng)

    導(dǎo)入必要的庫

    import cv2
    import face_recognition
    import os
    import numpy as np
    from datetime import datetime
    import pickle

    定義將存儲訓(xùn)練圖像數(shù)據(jù)集的文件夾路徑

    path = 'student_images'

    注意:對于訓(xùn)練,我們只需要將訓(xùn)練圖片放到path目錄下,圖片名稱必須是person_name.jpg/jpeg格式。

    例如:

    正如你在我的 student_images 路徑中看到的,有 6 個(gè)人。因此我們的模型只能識別這 6 個(gè)人。你可以在此目錄中添加更多圖片,以便更多人識別

    Python如何搭建人臉識別考勤系統(tǒng)

    現(xiàn)在創(chuàng)建一個(gè)列表來存儲 person_name 和圖像數(shù)組。

    遍歷path目錄中存在的所有圖像文件,讀取圖像,并將圖像數(shù)組附加到圖像列表,并將文件名附加到classNames。

    images = []
    classNames = []mylist = os.listdir(path)
    for cl in mylist:
        curImg = cv2.imread(f'{path}/{cl}')
        images.append(curImg)
        classNames.append(os.path.splitext(cl)[0])

    創(chuàng)建一個(gè)函數(shù)來對所有訓(xùn)練圖像進(jìn)行編碼并將它們存儲在一個(gè)變量encoding_face_train 中。

    def findEncodings(images):
        encodeList = []
        for img in images:
            img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
            encoded_face = face_recognition.face_encodings(img)[0]
            encodeList.append(encoded_face)
        return encodeList
    encoded_face_train = findEncodings(images)

    創(chuàng)建一個(gè)函數(shù),該函數(shù)將創(chuàng)建一個(gè)Attendance.csv文件來存儲考勤時(shí)間。

    注意:這里需要手動創(chuàng)建Attendance.csv文件并在函數(shù)中給出路徑

    def markAttendance(name):
        with open('Attendance.csv','r+') as f:
            myDataList = f.readlines()
            nameList = []
            for line in myDataList:
                entry = line.split(',')
                nameList.append(entry[0])
            if name not in nameList:
                now = datetime.now()
                time = now.strftime('%I:%M:%S:%p')
                date = now.strftime('%d-%B-%Y')
                f.writelines(f'n{name}, {time}, {date}')

    我們首先檢查出席者的名字是否已經(jīng)在attenting .csv中可用。

    如果出席者的名字在attends.csv中不可用,我們將在函數(shù)調(diào)用的時(shí)間中寫入出席者的名字。

    閱讀網(wǎng)絡(luò)攝像頭進(jìn)行實(shí)時(shí)識別

    # take pictures from webcam 
    cap  = cv2.VideoCapture(0)while True:
        success, img = cap.read()
        imgS = cv2.resize(img, (0,0), None, 0.25,0.25)
        imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)
        faces_in_frame = face_recognition.face_locations(imgS)
        encoded_faces = face_recognition.face_encodings(imgS, faces_in_frame)for encode_face, faceloc in zip(encoded_faces,faces_in_frame):
            matches = face_recognition.compare_faces(encoded_face_train, encode_face)
            faceDist = face_recognition.face_distance(encoded_face_train, encode_face)
            matchIndex = np.argmin(faceDist)
            print(matchIndex)
            if matches[matchIndex]:
                name = classNames[matchIndex].upper().lower()
                y1,x2,y2,x1 = faceloc
                # since we scaled down by 4 times
                y1, x2,y2,x1 = y1*4,x2*4,y2*4,x1*4
                cv2.rectangle(img,(x1,y1),(x2,y2),(0,255,0),2)
                cv2.rectangle(img, (x1,y2-35),(x2,y2), (0,255,0), cv2.FILLED)
                cv2.putText(img,name, (x1+6,y2-5), cv2.FONT_HERSHEY_COMPLEX,1,(255,255,255),2)
                markAttendance(name)
        cv2.imshow('webcam', img)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    僅將識別部分的圖像大小調(diào)整為 1/4。輸出幀將是原始大小。

    調(diào)整大小可提高每秒幀數(shù)。

    face_recognition.face_locations()在調(diào)整大小的圖像(imgS)上被調(diào)用。對于人臉邊界框坐標(biāo)必須乘以 4 才能覆蓋在輸出幀上。

    **face_recognition.distance()**返回測試圖像的距離數(shù)組,其中包含我們訓(xùn)練目錄中存在的所有圖像。

    最小人臉距離的索引將是匹配的人臉。

    找到匹配的名稱后,我們調(diào)用markAttendance函數(shù)。

    使用**cv2.rectangle()**繪制邊界框。

    我們使用**cv2.putText()**將匹配的名稱放在輸出幀上。

    Python如何搭建人臉識別考勤系統(tǒng)

    考勤報(bào)告

    Python如何搭建人臉識別考勤系統(tǒng)

    人臉識別系統(tǒng)面臨的挑戰(zhàn)

    盡管構(gòu)建面部識別看起來很容易,但在沒有任何限制的情況下拍攝的現(xiàn)實(shí)世界圖像中卻并不容易。面部識別系統(tǒng)面臨的幾個(gè)挑戰(zhàn)如下:

    **照明:**它極大地改變了面部外觀,觀察到照明條件的輕微變化對其結(jié)果產(chǎn)生重大影響。

    **姿勢:**面部識別系統(tǒng)對姿勢高度敏感,如果數(shù)據(jù)庫僅在正面視圖上進(jìn)行訓(xùn)練,可能會導(dǎo)致識別錯(cuò)誤或無法識別。

    面部表情:同一個(gè)人的不同表情是另一個(gè)需要考慮的重要因素。不過,現(xiàn)代識別器可以輕松處理它。

    低分辨率:識別器的訓(xùn)練必須在分辨率好的圖片上進(jìn)行,否則模型將無法提取特征。

    **老化:**隨著年齡的增長,人臉的形狀、線條、紋理變化是另一個(gè)挑戰(zhàn)。

    感謝各位的閱讀!關(guān)于“Python如何搭建人臉識別考勤系統(tǒng)”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI