-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfaceDetector.py
More file actions
119 lines (96 loc) · 4.06 KB
/
faceDetector.py
File metadata and controls
119 lines (96 loc) · 4.06 KB
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# -*- coding: utf-8 -*-
"""
Created on Wed Nov 4
@author: jongwon Kim
Deep.I Inc.
"""
import cv2
# 영상 검출기
def videoDetector(cam, cascade, age_net, gender_net, MODEL_MEAN_VALUES, age_list, gender_list):
while True:
# 캡처 이미지 불러오기
ret, img = cam.read()
# 영상 압축
try:
img = cv2.resize(img, dsize=None, fx=1.0, fy=1.0)
except:
break
# 그레이 스케일 변환
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cascade 얼굴 탐지 알고리즘
results = cascade.detectMultiScale(gray, # 입력 이미지
scaleFactor=1.1, # 이미지 피라미드 스케일 factor
minNeighbors=5, # 인접 객체 최소 거리 픽셀
minSize=(20, 20) # 탐지 객체 최소 크기
)
for box in results:
x, y, w, h = box
face = img[int(y):int(y + h), int(x):int(x + h)].copy()
blob = cv2.dnn.blobFromImage(face, 1, (227, 227), MODEL_MEAN_VALUES, swapRB=False)
# gender detection
gender_net.setInput(blob)
gender_preds = gender_net.forward()
gender = gender_preds.argmax()
# Predict age
age_net.setInput(blob)
age_preds = age_net.forward()
age = age_preds.argmax()
info = gender_list[gender] + ' ' + age_list[age]
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 255), thickness=2)
cv2.putText(img, info, (x, y - 15), 0, 0.5, (0, 255, 0), 1)
# 영상 출력
cv2.imshow('facenet', img)
if cv2.waitKey(1) > 0:
break
# 사진 검출기
def imgDetector(img, cascade, age_net, gender_net, MODEL_MEAN_VALUES, age_list, gender_list):
# 영상 압축
img = cv2.resize(img, dsize=None, fx=1.0, fy=1.0)
# 그레이 스케일 변환
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cascade 얼굴 탐지 알고리즘
results = cascade.detectMultiScale(gray, # 입력 이미지
scaleFactor=1.5, # 이미지 피라미드 스케일 factor
minNeighbors=5, # 인접 객체 최소 거리 픽셀
minSize=(20, 20) # 탐지 객체 최소 크기
)
for box in results:
x, y, w, h = box
face = img[int(y):int(y + h), int(x):int(x + h)].copy()
blob = cv2.dnn.blobFromImage(face, 1, (227, 227), MODEL_MEAN_VALUES, swapRB=False)
# gender detection
gender_net.setInput(blob)
gender_preds = gender_net.forward()
gender = gender_preds.argmax()
# Predict age
age_net.setInput(blob)
age_preds = age_net.forward()
age = age_preds.argmax()
info = gender_list[gender] + ' ' + age_list[age]
cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255, 255), thickness=2)
cv2.putText(img, (x, y), 'test', 1, 1)
# 사진 출력
cv2.imshow('facenet', img)
cv2.waitKey(10000)
# 얼굴 탐지 모델 가중치
cascade_filename = 'haarcascade_frontalface_alt.xml'
# 모델 불러오기
cascade = cv2.CascadeClassifier(cascade_filename)
MODEL_MEAN_VALUES = (78.4263377603, 87.7689143744, 114.895847746)
age_net = cv2.dnn.readNetFromCaffe(
'deploy_age.prototxt',
'age_net.caffemodel')
gender_net = cv2.dnn.readNetFromCaffe(
'deploy_gender.prototxt',
'gender_net.caffemodel')
age_list = ['(0 ~ 2)', '(4 ~ 6)', '(8 ~ 12)', '(15 ~ 20)',
'(25 ~ 32)', '(38 ~ 43)', '(48 ~ 53)', '(60 ~ 100)']
gender_list = ['Male', 'Female']
# 영상 파일
cam = cv2.VideoCapture('sample.mp4')
# 이미지 파일
img = cv2.imread('sample.jpg')
# 영상 탐지기
videoDetector(cam, cascade, age_net, gender_net, MODEL_MEAN_VALUES, age_list, gender_list)
# 사진 탐지기
# imgDetector(img,cascade,age_net,gender_net,MODEL_MEAN_VALUES,age_list,gender_list )