Spaces:
Runtime error
Runtime error
add app.py
Browse files- age_deploy.prototxt +175 -0
- app.py +72 -0
age_deploy.prototxt
ADDED
@@ -0,0 +1,175 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
name: "CaffeNet"
|
2 |
+
input: "data"
|
3 |
+
input_dim: 1
|
4 |
+
input_dim: 3
|
5 |
+
input_dim: 227
|
6 |
+
input_dim: 227
|
7 |
+
layers {
|
8 |
+
name: "conv1"
|
9 |
+
type: CONVOLUTION
|
10 |
+
bottom: "data"
|
11 |
+
top: "conv1"
|
12 |
+
convolution_param {
|
13 |
+
num_output: 96
|
14 |
+
kernel_size: 7
|
15 |
+
stride: 4
|
16 |
+
}
|
17 |
+
}
|
18 |
+
layers {
|
19 |
+
name: "relu1"
|
20 |
+
type: RELU
|
21 |
+
bottom: "conv1"
|
22 |
+
top: "conv1"
|
23 |
+
}
|
24 |
+
layers {
|
25 |
+
name: "pool1"
|
26 |
+
type: POOLING
|
27 |
+
bottom: "conv1"
|
28 |
+
top: "pool1"
|
29 |
+
pooling_param {
|
30 |
+
pool: MAX
|
31 |
+
kernel_size: 3
|
32 |
+
stride: 2
|
33 |
+
}
|
34 |
+
}
|
35 |
+
layers {
|
36 |
+
name: "norm1"
|
37 |
+
type: LRN
|
38 |
+
bottom: "pool1"
|
39 |
+
top: "norm1"
|
40 |
+
lrn_param {
|
41 |
+
local_size: 5
|
42 |
+
alpha: 0.0001
|
43 |
+
beta: 0.75
|
44 |
+
}
|
45 |
+
}
|
46 |
+
layers {
|
47 |
+
name: "conv2"
|
48 |
+
type: CONVOLUTION
|
49 |
+
bottom: "norm1"
|
50 |
+
top: "conv2"
|
51 |
+
convolution_param {
|
52 |
+
num_output: 256
|
53 |
+
pad: 2
|
54 |
+
kernel_size: 5
|
55 |
+
}
|
56 |
+
}
|
57 |
+
layers {
|
58 |
+
name: "relu2"
|
59 |
+
type: RELU
|
60 |
+
bottom: "conv2"
|
61 |
+
top: "conv2"
|
62 |
+
}
|
63 |
+
layers {
|
64 |
+
name: "pool2"
|
65 |
+
type: POOLING
|
66 |
+
bottom: "conv2"
|
67 |
+
top: "pool2"
|
68 |
+
pooling_param {
|
69 |
+
pool: MAX
|
70 |
+
kernel_size: 3
|
71 |
+
stride: 2
|
72 |
+
}
|
73 |
+
}
|
74 |
+
layers {
|
75 |
+
name: "norm2"
|
76 |
+
type: LRN
|
77 |
+
bottom: "pool2"
|
78 |
+
top: "norm2"
|
79 |
+
lrn_param {
|
80 |
+
local_size: 5
|
81 |
+
alpha: 0.0001
|
82 |
+
beta: 0.75
|
83 |
+
}
|
84 |
+
}
|
85 |
+
layers {
|
86 |
+
name: "conv3"
|
87 |
+
type: CONVOLUTION
|
88 |
+
bottom: "norm2"
|
89 |
+
top: "conv3"
|
90 |
+
convolution_param {
|
91 |
+
num_output: 384
|
92 |
+
pad: 1
|
93 |
+
kernel_size: 3
|
94 |
+
}
|
95 |
+
}
|
96 |
+
layers{
|
97 |
+
name: "relu3"
|
98 |
+
type: RELU
|
99 |
+
bottom: "conv3"
|
100 |
+
top: "conv3"
|
101 |
+
}
|
102 |
+
layers {
|
103 |
+
name: "pool5"
|
104 |
+
type: POOLING
|
105 |
+
bottom: "conv3"
|
106 |
+
top: "pool5"
|
107 |
+
pooling_param {
|
108 |
+
pool: MAX
|
109 |
+
kernel_size: 3
|
110 |
+
stride: 2
|
111 |
+
}
|
112 |
+
}
|
113 |
+
layers {
|
114 |
+
name: "fc6"
|
115 |
+
type: INNER_PRODUCT
|
116 |
+
bottom: "pool5"
|
117 |
+
top: "fc6"
|
118 |
+
inner_product_param {
|
119 |
+
num_output: 512
|
120 |
+
}
|
121 |
+
}
|
122 |
+
layers {
|
123 |
+
name: "relu6"
|
124 |
+
type: RELU
|
125 |
+
bottom: "fc6"
|
126 |
+
top: "fc6"
|
127 |
+
}
|
128 |
+
layers {
|
129 |
+
name: "drop6"
|
130 |
+
type: DROPOUT
|
131 |
+
bottom: "fc6"
|
132 |
+
top: "fc6"
|
133 |
+
dropout_param {
|
134 |
+
dropout_ratio: 0.5
|
135 |
+
}
|
136 |
+
}
|
137 |
+
layers {
|
138 |
+
name: "fc7"
|
139 |
+
type: INNER_PRODUCT
|
140 |
+
bottom: "fc6"
|
141 |
+
top: "fc7"
|
142 |
+
inner_product_param {
|
143 |
+
num_output: 512
|
144 |
+
}
|
145 |
+
}
|
146 |
+
layers {
|
147 |
+
name: "relu7"
|
148 |
+
type: RELU
|
149 |
+
bottom: "fc7"
|
150 |
+
top: "fc7"
|
151 |
+
}
|
152 |
+
layers {
|
153 |
+
name: "drop7"
|
154 |
+
type: DROPOUT
|
155 |
+
bottom: "fc7"
|
156 |
+
top: "fc7"
|
157 |
+
dropout_param {
|
158 |
+
dropout_ratio: 0.5
|
159 |
+
}
|
160 |
+
}
|
161 |
+
layers {
|
162 |
+
name: "fc8"
|
163 |
+
type: INNER_PRODUCT
|
164 |
+
bottom: "fc7"
|
165 |
+
top: "fc8"
|
166 |
+
inner_product_param {
|
167 |
+
num_output: 8
|
168 |
+
}
|
169 |
+
}
|
170 |
+
layers {
|
171 |
+
name: "prob"
|
172 |
+
type: SOFTMAX
|
173 |
+
bottom: "fc8"
|
174 |
+
top: "prob"
|
175 |
+
}
|
app.py
ADDED
@@ -0,0 +1,72 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import gradio as gr
|
2 |
+
import cv2
|
3 |
+
import dlib
|
4 |
+
|
5 |
+
def age_predict(photo):
|
6 |
+
|
7 |
+
# photo = "face_age/001/16.png"
|
8 |
+
|
9 |
+
img = cv2.imread(photo)
|
10 |
+
img = cv2.resize(img, (720, 640))
|
11 |
+
frame = img.copy()
|
12 |
+
|
13 |
+
# Model for Age detection
|
14 |
+
age_weights = "age_deploy.prototxt"
|
15 |
+
age_config = "age_net.caffemodel"
|
16 |
+
age_Net = cv2.dnn.readNet(age_config, age_weights)
|
17 |
+
|
18 |
+
# Model requirements for image
|
19 |
+
ageList = ['(0-2)', '(4-6)', '(8-12)', '(15-20)', '(25-32)', '(38-43)', '(48-53)', '(60-100)']
|
20 |
+
model_mean = (78.4263377603, 87.7689143744, 114.895847746) # Taken from the official site
|
21 |
+
|
22 |
+
# Storing the image dimensions
|
23 |
+
fH = img.shape[0]
|
24 |
+
fW = img.shape[1]
|
25 |
+
|
26 |
+
Boxes = [] # to store the face co-ordinates
|
27 |
+
mssg = 'Face Detected'
|
28 |
+
|
29 |
+
# Model for face detection
|
30 |
+
face_detector = dlib.get_frontal_face_detector()
|
31 |
+
# converting to grayscale
|
32 |
+
img_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
33 |
+
|
34 |
+
# Detecting the faces
|
35 |
+
faces = face_detector(img_gray)
|
36 |
+
|
37 |
+
# If no faces are detected
|
38 |
+
if not faces:
|
39 |
+
mssg = 'No face detected'
|
40 |
+
# cv2.putText(img, f'{mssg}', (40,40), cv2.FONT_HERSHEY_SIMPLEX, 2, (200), 2)
|
41 |
+
# cv2.imshow('image',img)
|
42 |
+
# cv2.waitKey(0)
|
43 |
+
return mssg
|
44 |
+
else:
|
45 |
+
# Bounding face
|
46 |
+
for face in faces:
|
47 |
+
x = face.left() # extracting the face coordinates
|
48 |
+
y = face.top()
|
49 |
+
x2 = face.right()
|
50 |
+
y2 = face.bottom()
|
51 |
+
|
52 |
+
# Rescaling those coordinates for our image
|
53 |
+
box = [x, y, x2, y2]
|
54 |
+
Boxes.append(box)
|
55 |
+
cv2.rectangle(frame, (x,y), (x2, y2), (00, 200, 200), 2)
|
56 |
+
|
57 |
+
for box in Boxes:
|
58 |
+
face = frame[box[1]:box[3], box[0]:box[2]]
|
59 |
+
|
60 |
+
# Image preprocessing
|
61 |
+
blob = cv2.dnn.blobFromImage(face, 1.0, (227, 227), model_mean, swapRB = False)
|
62 |
+
|
63 |
+
# Age Prediction
|
64 |
+
age_Net.setInput(blob)
|
65 |
+
age_preds = age_Net.forward()
|
66 |
+
age = ageList[age_preds[0].argmax()]
|
67 |
+
|
68 |
+
# cv2.putText(frame, f'{mssg}:{age}', (box[0], box[1] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0,255,255),2,cv2.LINE_AA)
|
69 |
+
|
70 |
+
# cv2.imshow('image', frame)
|
71 |
+
# cv2.waitKey(0)
|
72 |
+
return f'{mssg}:{age}'
|