<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          手把手搭建人臉識別考勤系統(tǒng)

          共 7043字,需瀏覽 15分鐘

           ·

          2021-12-29 11:11

          點擊下方AI算法與圖像處理”,一起進步!

          重磅干貨,第一時間送達

          介紹
          在本文中,你將學習如何使用 Python 構建人臉識別系統(tǒng)。人臉識別比人臉檢測更進一步。在人臉檢測中,我們只檢測人臉在圖像中的位置,但在人臉識別中,我們制作了一個可以識別人的系統(tǒng)。
          “人臉識別是驗證或識別圖片或視頻中的人的挑戰(zhàn)。大型科技巨頭仍在努力打造更快、更準確的人臉識別模型。”

          人臉識別的實際應用

          人臉識別目前正被用于讓世界更安全、更智能、更方便。
          有幾個用例:
          • 尋找失蹤人員
          • 零售犯罪
          • 安全標識
          • 識別社交媒體上的帳戶
          • 考勤系統(tǒng)
          • 識別汽車中的駕駛員
          根據(jù)性能和復雜性,有多種方法可以執(zhí)行面部識別。
          傳統(tǒng)人臉識別算法
          在 1990 年代,整體方法被用于人臉識別。手工制作的局部描述符在 1920 年代初期開始流行,然后在 2000 年代后期采用局部特征學習方法。目前廣泛使用并在OpenCV中實現(xiàn)的算法如下:
          • Eigenfaces (1991):http://www.scholarpedia.org/article/Eigenfaces
          • Local Binary Patterns Histograms (LBPH) (1996):https://en.wikipedia.org/wiki/Local_binary_patterns
          • Fisherfaces(1997):http://www.scholarpedia.org/article/Fisherfaces
          • Scale Invariant Feature Transform (SIFT) (1999):https://en.wikipedia.org/wiki/Scale-invariant_feature_transform
          • Speed Up Robust Features (SURF)(2006):https://en.wikipedia.org/wiki/Speeded_up_robust_features
          每種方法都遵循不同的方法來提取圖像信息并將其與輸入圖像進行匹配。
          Fischer-facesEigenfaces與 SURF 和 SIFT 具有幾乎相似的方法。
          LBPH 是一種簡單但非常有效的方法,但與現(xiàn)代人臉識別器相比,速度較慢。
          與現(xiàn)代人臉識別算法相比,這些算法并不快。傳統(tǒng)算法不能僅通過拍攝一個人的單張照片來訓練。
          人臉識別深度學習:
          一些廣泛使用的基于深度學習的人臉識別系統(tǒng)如下:
          • DeepFace
          • DeepID series of systems
          • VGGFace
          • FaceNet
          人臉識別器一般是在人臉圖像中找出重要的點,如嘴角、眉毛、眼睛、鼻子、嘴唇等。這些點的坐標稱為五官點,這樣的點有66個。這樣,尋找特征點的不同技術給出不同的結果。
          來源:https://www.pinterest.com/mrmosherart/face-landmarks/
          人臉識別模型涉及的步驟:
          1. **人臉檢測:**定位人臉并在人臉周圍繪制邊界框并保留邊界框的坐標。
          2. **人臉對齊:**標準化人臉以與訓練數(shù)據(jù)庫一致。
          3. **特征提取:**提取將用于訓練和識別任務的人臉特征。
          4. 人臉識別: 將人臉與準備好的數(shù)據(jù)庫中的一張或多張已知人臉進行匹配。
          在傳統(tǒng)的人臉識別方法中,我們有單獨的模塊來執(zhí)行這 4 個步驟。在本文中,你將看到一個將這 4 個步驟組合在一個步驟中的庫。

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

          安裝庫

          我們需要安裝 2 個庫來實現(xiàn)人臉識別。
          dlib dlib是一個現(xiàn)代 C++ 工具包,包含機器學習算法和工具,用于在 C++ 中創(chuàng)建復雜的軟件以解決實際問題。
          #?installing?dlib?
          pip?install?dlib
          臉部識別:將face_recognition庫,創(chuàng)建和維護 Adam Geitgey(https://adamgeitgey.com/),包含了dlib人臉識別功能。
          #?installing?face?recognition
          pip?install?face?recognition
          Opencv 用于一些圖像預處理。
          #?installing?opencv?
          pip?install?opencv
          注意:如果你在安裝dlib 時遇到任何錯誤 **,**我建議你使用vs_code 社區(qū)版安裝 C++ 開發(fā)工具包:https://visualstudio.microsoft.com/vs/community/

          導入庫

          現(xiàn)在你已經(jīng)下載了所有重要的庫,讓我們導入它們來構建系統(tǒng)。
          import?cv2
          import?numpy?as?np
          import?face_recognition

          加載圖像

          導入庫后,你需要加載圖像。
          face_recognition 庫以 BGR 的形式加載圖像,為了打印圖像,你應該使用 OpenCV 將其轉換為 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)
          如你所見,RGB 看起來很自然,因此你將始終把通道更改為 RGB。

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

          你需要在人臉周圍繪制一個邊界框,以顯示是否已檢測到人臉。
          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)

          為人臉識別訓練圖像

          該庫的制作方式是自動查找人臉并僅處理人臉,因此你無需從圖片中裁剪人臉。
          訓練:
          在這個階段,我們將訓練圖像轉換為一些編碼,并使用該圖像的人名存儲編碼。
          train_elon_encodings?=?face_recognition.face_encodings(imgelon)[0]
          測試:
          為了測試,我們加載圖像并將其轉換為編碼,然后在訓練期間將編碼與存儲的編碼進行匹配,這種匹配基于尋找最大相似度。當你找到與測試圖像匹配的編碼時,你將獲得與訓練編碼相關聯(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,如果兩個圖像中的人相同,返回True,否則返回False。

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

          導入必要的庫
          import?cv2
          import?face_recognition
          import?os
          import?numpy?as?np
          from?datetime?import?datetime
          import?pickle
          定義將存儲訓練圖像數(shù)據(jù)集的文件夾路徑
          path?=?'student_images'
          注意:對于訓練,我們只需要將訓練圖片放到path目錄下,圖片名稱必須是person_name.jpg/jpeg格式。
          例如:
          正如你在我的 student_images 路徑中看到的,有 6 個人。因此我們的模型只能識別這 6 個人。你可以在此目錄中添加更多圖片,以便更多人識別
          • 現(xiàn)在創(chuàng)建一個列表來存儲 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)建一個函數(shù)來對所有訓練圖像進行編碼并將它們存儲在一個變量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)建一個函數(shù),該函數(shù)將創(chuàng)建一個Attendance.csv文件來存儲考勤時間。
          注意:這里需要手動創(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}')
          **with open(“filename.csv”,'r+')創(chuàng)建一個文件,'r+'**模式用于打開文件進行讀寫。
          我們首先檢查出席者的名字是否已經(jīng)在attenting .csv中可用。
          如果出席者的名字在attends.csv中不可用,我們將在函數(shù)調(diào)用的時間中寫入出席者的名字。
          閱讀網(wǎng)絡攝像頭進行實時識別
          #?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)用。對于人臉邊界框坐標必須乘以 4 才能覆蓋在輸出幀上。
          • **face_recognition.distance()**返回測試圖像的距離數(shù)組,其中包含我們訓練目錄中存在的所有圖像。
          • 最小人臉距離的索引將是匹配的人臉。
          • 找到匹配的名稱后,我們調(diào)用markAttendance函數(shù)。
          • 使用**cv2.rectangle()**繪制邊界框。
          • 我們使用**cv2.putText()**將匹配的名稱放在輸出幀上。
          考勤報告

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

          盡管構建面部識別看起來很容易,但在沒有任何限制的情況下拍攝的現(xiàn)實世界圖像中卻并不容易。面部識別系統(tǒng)面臨的幾個挑戰(zhàn)如下:
          • **照明:**它極大地改變了面部外觀,觀察到照明條件的輕微變化對其結果產(chǎn)生重大影響。
          • **姿勢:**面部識別系統(tǒng)對姿勢高度敏感,如果數(shù)據(jù)庫僅在正面視圖上進行訓練,可能會導致識別錯誤或無法識別。
          • 面部表情:同一個人的不同表情是另一個需要考慮的重要因素。不過,現(xiàn)代識別器可以輕松處理它。
          • 低分辨率:識別器的訓練必須在分辨率好的圖片上進行,否則模型將無法提取特征。
          • **老化:**隨著年齡的增長,人臉的形狀、線條、紋理變化是另一個挑戰(zhàn)。

          結論

          在本文中,我們討論了如何使用face_recognition庫創(chuàng)建人臉識別系統(tǒng)并制作了考勤系統(tǒng)。你可以使用TkinterPyqt進一步設計用于人臉識別考勤系統(tǒng)的GUI。

          努力分享優(yōu)質(zhì)的計算機視覺相關內(nèi)容,歡迎關注:

          交流群


          歡迎加入公眾號讀者群一起和同行交流,目前有美顏、三維視覺計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群


          個人微信(如果沒有備注不拉群!
          請注明:地區(qū)+學校/企業(yè)+研究方向+昵稱



          下載1:何愷明頂會分享


          AI算法與圖像處理」公眾號后臺回復:何愷明,即可下載。總共有6份PDF,涉及 ResNet、Mask RCNN等經(jīng)典工作的總結分析


          下載2:終身受益的編程指南:Google編程風格指南


          AI算法與圖像處理」公眾號后臺回復:c++,即可下載。歷經(jīng)十年考驗,最權威的編程規(guī)范!



          下載3 CVPR2021

          AI算法與圖像處公眾號后臺回復:CVPR,即可下載1467篇CVPR?2020論文 和 CVPR 2021 最新論文


          瀏覽 46
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久五月影院 | 中文字幕一级A片免费看 | 免费骚视频 | 小早川怜子爆乿护士中文 | 玖玖九九99 |