Opencv 프로젝트 전투: 07 얼굴 인식 및 출석 시스템

1. 효과 표시

얼굴 인식:

fafb42116b9e4342b317665d63394fb0.gif

출석 효과:

2c09a39d7e05411ebb0c69ca20935732.png

 

2. 프로젝트 소개

다음으로, 이론에 대한 간략한 소개를 시작으로 기본 구현을 배우면서 얼굴 인식을 고정밀도로 수행하는 방법을 배우게 됩니다. 그런 다음 웹캠을 사용하여 얼굴을 감지하고 Excel 시트에 실시간으로 출석을 기록하는 출석 프로젝트를 만듭니다.

3. 프로젝트 기본 이론

(1) 프로젝트 패키지 구성

그 전에 이 기사를 읽고 프로젝트 패키지 구성을 완료했어야 합니다 (37개 메시지) Python 3.7이 dlib 및 face_recognition 다운로드 문제를 해결하는 가장 쉬운 방법

또한 패키지도 설치해야 합니다. 다음 단계를 따르세요.

pip install face_recognition_models

(2) 파일 구성

7cde9cce89c74e128806652830afa324.png

그림의 구성에 따르면 Attendance.csv 파일의 내용은 (이름, 시간)만 있으며, Attendance_images 파일에는 추가하고 싶은 사진, 가급적이면 개별 캐릭터 사진을 추가하고, 사진 이름을 그들의 영어 이름.

(3) basic.py 코드 표시 및 설명

import cv2
import face_recognition

imgElon = face_recognition.load_image_file('ImagesBasic/Elon Musk.png')
imgElon = cv2.cvtColor(imgElon, cv2.COLOR_BGR2RGB)
imgTest = face_recognition.load_image_file('ImagesBasic/Elon test.png')
imgTest = cv2.cvtColor(imgTest, cv2.COLOR_BGR2RGB)

faceLoc = face_recognition.face_locations(imgElon)[0]
encodeElon = face_recognition.face_encodings(imgElon)[0]
cv2.rectangle(imgElon, (faceLoc[3], faceLoc[0]), (faceLoc[1], faceLoc[2]), (255, 0, 255), 2)

faceLocTest = face_recognition.face_locations(imgTest)[0]
encodeTest = face_recognition.face_encodings(imgTest)[0]
cv2.rectangle(imgTest, (faceLocTest[3], faceLocTest[0]), (faceLocTest[1], faceLocTest[2]), (255, 0, 255), 2)

results = face_recognition.compare_faces([encodeElon], encodeTest)
faceDis = face_recognition.face_distance([encodeElon], encodeTest)
print(results, faceDis)
cv2.putText(imgTest, f'{results} {round(faceDis[0], 2)}', (50, 50), cv2.FONT_HERSHEY_COMPLEX, 1, (0, 0, 255), 2)

cv2.imshow('Elon Musk', imgElon)
cv2.imshow('Elon Test', imgTest)
cv2.waitKey(0)

Musk 씨의 사진을 표준 테스트인 'Elon Musk.png'로 사용하겠습니다. 다른 두 사진은 빌 게이츠 씨와 머스크 씨입니다.

오늘의 설명은 크게 두 부분으로 나누어서 설명할 것이며, 이것이 설명의 기본 부분입니다.

  • 먼저 이 두 코드의 그림을 가져옵니다. face_recognition에서 load_image_file 함수를 사용하여 이미지 파일(.jpg, .png 등)을 numpy 배열로 로드하고 기본 모드='RGB' 형식이므로 여기에 변형이 있습니다.
  • 두 번째로, faceLoc은 face_locations() 함수에 의해 반환된 이미지에서 얼굴의 경계 상자 배열을 허용합니다. 참고 1을 참조하십시오. 첫 번째 숫자를 선택하고 튜플이 될 때까지 기다리며 css(위, 오른쪽, 아래)를 눌러야 합니다. , 왼쪽 ) 순차적으로 찾은 얼굴 위치의 튜플 목록. encodeElon() 함수는 128차원 얼굴 인코딩 목록(이미지의 각 얼굴에 대해 하나씩)을 반환합니다. 왜 128차원입니까? 참고 2를 참조하십시오. 그 다음부터는 다시 프레임 조작입니다 제 이전 글을 보신 분들은 많이 아실 거라 생각합니다 참고 3 에 따라 좌표를 입력하세요.
  • 그 후, compare_faces()는 얼굴 인코딩 목록을 후보 인코딩과 비교하여 일치하는지 확인합니다. 첫 번째 항목만 참/거짓 값 목록을 반환하는 목록임을 기억하십시오. 목록을 작성하고 알려진 얼굴 인코딩과 비교하고 비교된 각 얼굴에 대한 유클리드 거리를 구합니다. 거리는 얼굴이 얼마나 비슷한지 알려줍니다. 다시 말하지만 첫 번째 항목만 목록입니다. 위의 참고 4를 참조하십시오.
  • 마지막으로 프레임 정보를 적절한 위치에 배치하여 이미지를 표시합니다.

참고 1: [(44, 306, 152, 199)]

참고 2: 머신 러닝은 재미있습니다! 4부: 현대적 얼굴 인식 및 딥 러닝 - Adam Geitgey 의 Fintech Ranking ( fintechranking.com)  .

참고 3: 좌표 다이어그램

2e2024a3f83d4c16975004f7d2180630.png

참고 4: [참] [0.4559636]

 (5) 효과 표시

aaf56405413c4224bc77000eea0a7589.png

 여기에서 코드를 수정하여 처음에 얼굴 인식을 구현했습니다.

imgTest = face_recognition.load_image_file('ImagesBasic/Bill Gates.png')
imgTest = cv2.cvtColor(imgTest, cv2.COLOR_BGR2RGB)

fa0b34327a0f44978af4a73a52526125.png

 

4. 프로젝트 코드 표시 및 설명

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

# from PIL import ImageGrab

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


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


def markAttendance(name):
    with open('Attendance_lists.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()
            dtString = now.strftime('%H:%M:%S')
            f.writelines(f'\n{name},{dtString}')


#### FOR CAPTURING SCREEN RATHER THAN WEBCAM
# def captureScreen(bbox=(300,300,690+300,530+300)):
#     capScr = np.array(ImageGrab.grab(bbox))
#     capScr = cv2.cvtColor(capScr, cv2.COLOR_RGB2BGR)
#     return capScr

encodeListKnown = findEncodings(images)
print('Encoding Complete')

cap = cv2.VideoCapture(1)

while True:
    success, img = cap.read()
    # img = captureScreen()
    imgS = cv2.resize(img, (0, 0), None, 0.25, 0.25)
    imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)

    facesCurFrame = face_recognition.face_locations(imgS)
    encodesCurFrame = face_recognition.face_encodings(imgS, facesCurFrame)

    for encodeFace, faceLoc in zip(encodesCurFrame, facesCurFrame):
        matches = face_recognition.compare_faces(encodeListKnown, encodeFace)
        faceDis = face_recognition.face_distance(encodeListKnown, encodeFace)
        # print(faceDis)
        matchIndex = np.argmin(faceDis)

        if matches[matchIndex]:
            name = classNames[matchIndex].upper()
            # print(name)
            y1, x2, y2, x1 = faceLoc
            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 - 6), cv2.FONT_HERSHEY_COMPLEX, 1, (255, 255, 255), 2)
            markAttendance(name)


    cv2.imshow('Webcam', img)
    cv2.waitKey(1)

여기에 있는 작업 중 일부는 이전 블로그에서 언급한 적이 있으며 매우 명확하게 설명했으므로 간략하게 설명하겠습니다.

  • 먼저 Attendance_images 파일에서 이미지 이름을 읽고 .png가 있고 이름 지정에는 필요하지 않으므로 [0]을 사용합니다.
  • 둘째, 표준 이미지의 인코딩을 목록 형태로 저장하기 위해 findEncodings()를 작성합니다. markAttendance() 함수는 Attendance_lists.csv의 파일 정보를 읽어 엑셀에 작성하는데 시간을 기록할 수도 있습니다.
  • 그럼 나머지는 위의 설명을 참고하시면 문제 없을 거라 생각합니다. y1, x2, y2, x1 = y1 * 4, x2 * 4, y2 * 4, x1 * 4에 대해 이야기해 보겠습니다. 왜 4를 곱해야 하는지, 위의 크기 조정을 기억하세요. 픽셀 변경이 필요하지 않지만 축소됩니다. 비율은 정확히 0.25.

 

5. 프로젝트 자료

Github:Opencv-project-training/Opencv 프로젝트 교육/07 얼굴 인식 및 출석 시스템 메인 · Auorui/Opencv-project-training · GitHub

 

6. 프로젝트 요약

오늘 프로젝트는 여전히 이전 개체 감지보다 더 어렵습니다. 저에게는 현재 효율성이 그다지 높지 않습니다. 어제 dlib 및 face_recognition 패키지 다운로드가 실제로 완료되지 않았습니다. 프로젝트를 임시로 변경하고 오늘 오래했습니다. .

그럼 이 프로젝트를 즐기시기 바랍니다! !

f95ce6a2ac5047c7beb428f01ad37338.jpeg

 

 

추천

출처blog.csdn.net/m0_62919535/article/details/126679859