[OpenCV+dlib] 얼굴 인식 실험
1. 소개
OpenCV와 dlib로 얼굴 인식을 실험해 보았습니다.
2. Face Detector()
먼저 얼굴을 감지합니다.
얼굴 감지는 "이미지 중에서 사람의 얼굴을 인식하고 그 위치를 식별"하는 것을 의미합니다.
dlib의 get_frontal_face_detector()를 이용합니다.
import dlib
#dlibのget_frontal_face_detectorのインスタンスを立てる。
detector = dlib.get_frontal_face_detector()
#imagesで顔を検出し、それをfacesに保存する。
faces = detector(images)
위 코드의 faces에 저장된 정보를 바탕으로 감지된 얼굴에 사각형 테두리를 표시합니다.
실행 결과를 나타냅니다. 두 여자가 얼굴을 감지하고 흰색 테두리로 표시되는 것을 알 수 있습니다.
3. Facial Landmark Detection
얼굴 안의 각 파트의 위치 관계, 치수를 바탕으로 식별 가능한 정보를 추출합니다.
이 정보를 Facial Landmark라고합니다.
dlib는 얼굴에서 68 포인트의 정보를 가져옵니다.
실제 얼굴을 식별하려면 랜드마크 포인트의 유클리드 거리가 사용됩니다. 기준이 되는 얼굴의 Landmark point와 새롭게 인식된 얼굴의 Landmark point와의 유클리드 거리를 계산해, 그 값이 역치보다 작은 것과 같은 얼굴인 것을 인식합니다. Google Photos와 스마트 폰의 사진 폴더와 같은 얼굴 인식 알고리즘이 채택되었습니다.
방금 전의 여성의 얼굴보다 Landmark point를 취득합니다. 두 단계로 나뉘어집니다.
import dlib
#---------------------------
#Step 1. Faceを認識する。
#---------------------------
#dlibのget_frontal_face_detectorのインスタンスを立てる。
detector = dlib.get_frontal_face_detector()
#imagesで顔を検出し、それをfacesに保存する。
faces = detector(images)
#--------------------------
#Step 2. FaceよりLandmark pointを抽出する。
#---------------------------
for face in faces:
dlib_shape = landmark_predictor(imgage,face)
shape_2d = np.array([[p.x, p.y] for p in dlib_shape.parts()])
취득한 shape_2d의 shape를 확인하면 tuple로서(68,2)가 되어 있습니다. (68=landmark point 68 points, 2= x,y 좌표)
이 정보를 바탕으로 얼굴 주변에 Landmark points를 그립니다.
for s in shape_2d:
cv2.circle(image, center=tuple(s), radius=1, color=(255, 255, 255), thickness=2, lineType=cv2.LINE_AA)
요약
먼저 얼굴을 감지합니다.
얼굴 감지는 "이미지 중에서 사람의 얼굴을 인식하고 그 위치를 식별"하는 것을 의미합니다.
dlib의 get_frontal_face_detector()를 이용합니다.
import dlib
#dlibのget_frontal_face_detectorのインスタンスを立てる。
detector = dlib.get_frontal_face_detector()
#imagesで顔を検出し、それをfacesに保存する。
faces = detector(images)
위 코드의 faces에 저장된 정보를 바탕으로 감지된 얼굴에 사각형 테두리를 표시합니다.
실행 결과를 나타냅니다. 두 여자가 얼굴을 감지하고 흰색 테두리로 표시되는 것을 알 수 있습니다.
3. Facial Landmark Detection
얼굴 안의 각 파트의 위치 관계, 치수를 바탕으로 식별 가능한 정보를 추출합니다.
이 정보를 Facial Landmark라고합니다.
dlib는 얼굴에서 68 포인트의 정보를 가져옵니다.
실제 얼굴을 식별하려면 랜드마크 포인트의 유클리드 거리가 사용됩니다. 기준이 되는 얼굴의 Landmark point와 새롭게 인식된 얼굴의 Landmark point와의 유클리드 거리를 계산해, 그 값이 역치보다 작은 것과 같은 얼굴인 것을 인식합니다. Google Photos와 스마트 폰의 사진 폴더와 같은 얼굴 인식 알고리즘이 채택되었습니다.
방금 전의 여성의 얼굴보다 Landmark point를 취득합니다. 두 단계로 나뉘어집니다.
import dlib
#---------------------------
#Step 1. Faceを認識する。
#---------------------------
#dlibのget_frontal_face_detectorのインスタンスを立てる。
detector = dlib.get_frontal_face_detector()
#imagesで顔を検出し、それをfacesに保存する。
faces = detector(images)
#--------------------------
#Step 2. FaceよりLandmark pointを抽出する。
#---------------------------
for face in faces:
dlib_shape = landmark_predictor(imgage,face)
shape_2d = np.array([[p.x, p.y] for p in dlib_shape.parts()])
취득한 shape_2d의 shape를 확인하면 tuple로서(68,2)가 되어 있습니다. (68=landmark point 68 points, 2= x,y 좌표)
이 정보를 바탕으로 얼굴 주변에 Landmark points를 그립니다.
for s in shape_2d:
cv2.circle(image, center=tuple(s), radius=1, color=(255, 255, 255), thickness=2, lineType=cv2.LINE_AA)
요약
import dlib
#---------------------------
#Step 1. Faceを認識する。
#---------------------------
#dlibのget_frontal_face_detectorのインスタンスを立てる。
detector = dlib.get_frontal_face_detector()
#imagesで顔を検出し、それをfacesに保存する。
faces = detector(images)
#--------------------------
#Step 2. FaceよりLandmark pointを抽出する。
#---------------------------
for face in faces:
dlib_shape = landmark_predictor(imgage,face)
shape_2d = np.array([[p.x, p.y] for p in dlib_shape.parts()])
for s in shape_2d:
cv2.circle(image, center=tuple(s), radius=1, color=(255, 255, 255), thickness=2, lineType=cv2.LINE_AA)
참고 자료
1. Dlib Main Page
2. Github Davis King's Page
실행 코드
1. 7행 'model/shape_predictor_68_face_landmarks.dat'는 여기 링크에서 다운로드하십시오.
2. 9행의 load video
는, 동영상의 mp4 파일, 혹은 WebCAM를 사용해 주세요. 자신의 얼굴로 하면 꽤 재미있습니다.
import cv2
import dlib
import sys
import numpy as np
scaler = 0.5
#Initialize face detector and shape predictor
detector = dlib.get_frontal_face_detector()
landmark_predictor = dlib.shape_predictor('model/shape_predictor_68_face_landmarks.dat')
#load video
cap = cv2.VideoCapture('samples/girls3.mp4')
#cap = cv2.VideoCapture(0) #内臓カメラ
#cap = cv2.VideoCapture(1) #USBカメラ
#Face recognition
while True:
# read frame buffer from video
ret, img = cap.read()
if not ret:
cap.set(cv2.CAP_PROP_POS_FRAMES,0)
continue
# resize frame
img = cv2.resize(img, (int(img.shape[1] * scaler), int(img.shape[0] * scaler)))
ori = img.copy()
# detect faces
faces = detector(img)
#例外処理 顔が検出されなかった時
if len(faces) == 0:
print('no faces')
img_rec = img
for face in faces:
# rectangle visualize
img_rec = cv2.rectangle(img, pt1=(face.left(), face.top()), pt2=(face.right(), face.bottom()),
color=(255, 255, 255), lineType=cv2.LINE_AA, thickness=2)
# landmark
dlib_shape = landmark_predictor(img,face)
shape_2d = np.array([[p.x, p.y] for p in dlib_shape.parts()])
print(shape_2d.shape)
for s in shape_2d:
cv2.circle(img, center=tuple(s), radius=1, color=(255, 255, 255), thickness=2, lineType=cv2.LINE_AA)
cv2.imshow('original', ori)
cv2.imshow('img_rec', img_rec)
if cv2.waitKey(1) == ord('q'):
sys.exit(1)
Reference
이 문제에 관하여([OpenCV+dlib] 얼굴 인식 실험), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/kotai2003/items/fb1f35da5437eefbc5da
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
1. 7행 'model/shape_predictor_68_face_landmarks.dat'는 여기 링크에서 다운로드하십시오.
2. 9행의
load video
는, 동영상의 mp4 파일, 혹은 WebCAM를 사용해 주세요. 자신의 얼굴로 하면 꽤 재미있습니다.import cv2
import dlib
import sys
import numpy as np
scaler = 0.5
#Initialize face detector and shape predictor
detector = dlib.get_frontal_face_detector()
landmark_predictor = dlib.shape_predictor('model/shape_predictor_68_face_landmarks.dat')
#load video
cap = cv2.VideoCapture('samples/girls3.mp4')
#cap = cv2.VideoCapture(0) #内臓カメラ
#cap = cv2.VideoCapture(1) #USBカメラ
#Face recognition
while True:
# read frame buffer from video
ret, img = cap.read()
if not ret:
cap.set(cv2.CAP_PROP_POS_FRAMES,0)
continue
# resize frame
img = cv2.resize(img, (int(img.shape[1] * scaler), int(img.shape[0] * scaler)))
ori = img.copy()
# detect faces
faces = detector(img)
#例外処理 顔が検出されなかった時
if len(faces) == 0:
print('no faces')
img_rec = img
for face in faces:
# rectangle visualize
img_rec = cv2.rectangle(img, pt1=(face.left(), face.top()), pt2=(face.right(), face.bottom()),
color=(255, 255, 255), lineType=cv2.LINE_AA, thickness=2)
# landmark
dlib_shape = landmark_predictor(img,face)
shape_2d = np.array([[p.x, p.y] for p in dlib_shape.parts()])
print(shape_2d.shape)
for s in shape_2d:
cv2.circle(img, center=tuple(s), radius=1, color=(255, 255, 255), thickness=2, lineType=cv2.LINE_AA)
cv2.imshow('original', ori)
cv2.imshow('img_rec', img_rec)
if cv2.waitKey(1) == ord('q'):
sys.exit(1)
Reference
이 문제에 관하여([OpenCV+dlib] 얼굴 인식 실험), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kotai2003/items/fb1f35da5437eefbc5da텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)