Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 기초 100제
- 입출력
- Docker
- 비교연산
- 16진수
- 딥러닝
- 코드업
- 파이썬
- 비트단위논리연산
- face recognition
- 선택실행구조
- 진수
- 10진수
- input()
- bitwise
- 2진수
- 불 연산
- 출력
- 기초100제
- 문자열
- 반복실행구조
- 아스키코드
- 불 자료형
- OpenCV
- codeup
- 8진수
- 산술연산
- 종합
- 2차원배열
- 논리연산
Archives
- Today
- Total
DeepFlowest
[Face Recognition] 실시간 얼굴 인식 (Haar feature 기반 cascade classifier 이용) 본문
Computer Vision/실습, 세미 프로젝트
[Face Recognition] 실시간 얼굴 인식 (Haar feature 기반 cascade classifier 이용)
Orange57 2020. 8. 5. 23:21728x90
반응형
SMALL
https://www.hackster.io/mjrobot/real-time-face-recognition-an-end-to-end-project-a10826
위 링크를 참고하여 웹캠을 이용한 실시간 얼굴 인식 세미 프로젝트를 진행해 보았다.
1. 얼굴 데이터 수집
Haar-cascade 검출기로 얼굴 검출 → 실시간 웹캠으로 프레임 단위로 캡쳐하여 200개의 이미지 데이터 수집
import cv2
import os
cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
face_detector = cv2.CascadeClassifier('haarcascades/haarcascade_frontalface_default.xml')
# ID 입력
face_id = input('\n USER ID 입력하고 엔터 누르세요 ') # 1부터 입력
count = 0
while(True):
ret, img = cap.read()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
faces = face_detector.detectMultiScale(gray, 1.3, 5)
for (x,y,w,h) in faces:
cv2.rectangle(img, (x,y), (x+w,y+h), (255,0,0), 2)
count += 1
cv2.imwrite("dataset/User." + str(face_id) + '.' + str(count) + ".jpg", gray[y:y+h,x:x+w])
cv2.imshow('image', img)
k = cv2.waitKey(100) & 0xff # 비디오 종료 시 'ESC' 누르기
if k == 27:
break
elif count >= 200: # 200개 이미지 뽑고, 종료하기
break
cap.release()
cv2.destroyAllWindows()
2. 학습
Haar-cascade 학습기로 학습 → yml 파일로 모델 저장 하기
import cv2
import numpy as np
from PIL import Image
import os
path = 'dataset'
recognizer = cv2.face.LBPHFaceRecognizer_create()
detector = cv2.CascadeClassifier("haarcascades/haarcascade_frontalface_default.xml");
# 이미지 불러와서 라벨링 하기
def getImagesAndLabels(path):
imagePaths = [os.path.join(path,f) for f in os.listdir(path)]
faceSamples=[]
ids = []
for imagePath in imagePaths:
PIL_img = Image.open(imagePath).convert('L') # grayscale로 변환
img_numpy = np.array(PIL_img,'uint8')
id = int(os.path.split(imagePath)[-1].split(".")[1])
faces = detector.detectMultiScale(img_numpy)
for (x,y,w,h) in faces:
faceSamples.append(img_numpy[y:y+h,x:x+w])
ids.append(id)
return faceSamples,ids
print ("\n [INFO] Training faces. It will take a few seconds. Wait ...")
faces,ids = getImagesAndLabels(path)
recognizer.train(faces, np.array(ids))
# trainer.yml로 모델 저장하기
recognizer.write('trainer.yml')
# 학습 된 얼굴 수 뽑고, 종료 하기
print("\n [INFO] {0} faces trained. Exiting Program".format(len(np.unique(ids))))
3. 실시간 얼굴 인식 및 라벨링
학습한 yml 파일 모델 불러 오기 → 실시간으로 얼굴 인식 & 라벨링
import cv2
import numpy as np
import os
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('trainer.yml')
cascadePath = "haarcascades/haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath);
font = cv2.FONT_HERSHEY_SIMPLEX
id = 0
# id = 0 : None
# id = 1 : YR
names = ['None', 'YR']
cam = cv2.VideoCapture(0)
cam.set(3, 640)
cam.set(4, 480)
# Define min window size to be recognized as a face
minW = 0.1*cam.get(3)
minH = 0.1*cam.get(4)
if cam.isOpened() == False : # 카메라 생성 확인
exit()
while True:
ret, img =cam.read()
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
faces = faceCascade.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)
id, confidence = recognizer.predict(gray[y:y+h,x:x+w]) # gray[y:y+h,x:x+w] : 얼굴 부분만 가져오기
# Check if confidence is less them 100 ==> "0" is perfect match
if (confidence < 100):
id = names[id]
confidence = " {0}%".format(round(100 - confidence))
else:
id = "unknown"
confidence = " {0}%".format(round(100 - confidence))
cv2.putText(img, str(id), (x+5,y-5), font, 1, (255,255,255), 2)
cv2.putText(img, str(confidence), (x+5,y+h-5), font, 1, (255,255,0), 1)
cv2.imshow('camera',img)
k = cv2.waitKey(10) & 0xff # 비디오 종료 시 'ESC' 누르기
if k == 27:
break
print("\n [INFO] Exiting Program and cleanup stuff")
cam.release()
cv2.destroyAllWindows()
728x90
반응형
LIST
'Computer Vision > 실습, 세미 프로젝트' 카테고리의 다른 글
[Object Detection] YOLO v4 설치 및 demo 실행 : window+python 버전 (6) | 2020.10.12 |
---|---|
Video Inpainting2 (0) | 2020.09.25 |
[Face Recognition] FaceNet 이용하여 실시간 얼굴 인식하기 (0) | 2020.08.11 |
[Face Recognition] 실시간 얼굴 인식 (dlib, python, opencv) (1) | 2020.08.06 |
[OpenCV] 코드 실습 (0) | 2020.05.14 |
Comments