SonFox2920 commited on
Commit
40db57d
1 Parent(s): b104d25

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +100 -0
app.py ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import cv2
3
+ import numpy as np
4
+
5
+ # Định nghĩa các biến về trọng số và kiến trúc của các mô hình nhận diện khuôn mặt, tuổi và giới tính
6
+ FACE_PROTO = "weights/deploy.prototxt.txt"
7
+ FACE_MODEL = "weights/res10_300x300_ssd_iter_140000_fp16.caffemodel"
8
+ GENDER_MODEL = 'weights/deploy_gender.prototxt'
9
+ GENDER_PROTO = 'weights/gender_net.caffemodel'
10
+ MODEL_MEAN_VALUES = (78.4263377603, 87.7689143744, 114.895847746)
11
+ GENDER_LIST = ['Male', 'Female']
12
+ AGE_MODEL = 'weights/deploy_age.prototxt'
13
+ AGE_PROTO = 'weights/age_net.caffemodel'
14
+ AGE_INTERVALS = ['(0, 2)', '(4, 6)', '(8, 12)', '(15, 20)',
15
+ '(25, 32)', '(38, 43)', '(48, 53)', '(60, 100)']
16
+
17
+ # Hàm nhận diện khuôn mặt từ hình ảnh
18
+ def get_faces(frame, confidence_threshold=0.5):
19
+ blob = cv2.dnn.blobFromImage(frame, 1.0, (300, 300), (104, 177.0, 123.0))
20
+ face_net.setInput(blob)
21
+ output = np.squeeze(face_net.forward())
22
+ faces = []
23
+ for i in range(output.shape[0]):
24
+ confidence = output[i, 2]
25
+ if confidence > confidence_threshold:
26
+ box = output[i, 3:7] * np.array([frame.shape[1], frame.shape[0], frame.shape[1], frame.shape[0]])
27
+ start_x, start_y, end_x, end_y = box.astype(np.int)
28
+ start_x, start_y, end_x, end_y = start_x - 10, start_y - 10, end_x + 10, end_y + 10
29
+ start_x = 0 if start_x < 0 else start_x
30
+ start_y = 0 if start_y < 0 else start_y
31
+ end_x = 0 if end_x < 0 else end_x
32
+ end_y = 0 if end_y < 0 else end_y
33
+ faces.append((start_x, start_y, end_x, end_y))
34
+ return faces
35
+
36
+ # Hàm dự đoán giới tính từ hình ảnh khuôn mặt
37
+ def get_gender_predictions(face_img):
38
+ blob = cv2.dnn.blobFromImage(
39
+ image=face_img, scalefactor=1.0, size=(227, 227),
40
+ mean=MODEL_MEAN_VALUES, swapRB=False, crop=False
41
+ )
42
+ gender_net.setInput(blob)
43
+ return gender_net.forward()
44
+
45
+ # Hàm dự đoán tuổi từ hình ảnh khuôn mặt
46
+ def get_age_predictions(face_img):
47
+ blob = cv2.dnn.blobFromImage(
48
+ image=face_img, scalefactor=1.0, size=(227, 227),
49
+ mean=MODEL_MEAN_VALUES, swapRB=False
50
+ )
51
+ age_net.setInput(blob)
52
+ return age_net.forward()
53
+
54
+ # Hàm hiển thị hình ảnh trong Streamlit
55
+ def display_img(img):
56
+ img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
57
+ st.image(img_rgb, channels="RGB", use_column_width=True)
58
+
59
+ # Hàm chính để dự đoán tuổi và giới tính từ hình ảnh
60
+ def predict_age_and_gender(input_path: str):
61
+ img = cv2.imread(input_path)
62
+ frame = img.copy()
63
+ faces = get_faces(frame)
64
+ for i, (start_x, start_y, end_x, end_y) in enumerate(faces):
65
+ face_img = frame[start_y: end_y, start_x: end_x]
66
+ age_preds = get_age_predictions(face_img)
67
+ gender_preds = get_gender_predictions(face_img)
68
+ i = gender_preds[0].argmax()
69
+ gender = GENDER_LIST[i]
70
+ gender_confidence_score = gender_preds[0][i]
71
+ i = age_preds[0].argmax()
72
+ age = AGE_INTERVALS[i]
73
+ age_confidence_score = age_preds[0][i]
74
+ label = f"{gender}-{gender_confidence_score*100:.1f}%, {age}-{age_confidence_score*100:.1f}%"
75
+ box_color = (255, 0, 0) if gender == "Male" else (147, 20, 255)
76
+ cv2.rectangle(frame, (start_x, start_y), (end_x, end_y), box_color, 2)
77
+ font_scale = 0.54
78
+ cv2.putText(frame, label, (start_x, start_y - 10), cv2.FONT_HERSHEY_SIMPLEX, font_scale, box_color, 2)
79
+ display_img(frame)
80
+
81
+ # Streamlit app
82
+ def main():
83
+ st.title("Age and Gender Detection App")
84
+ uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"])
85
+ if uploaded_file is not None:
86
+ image = np.array(bytearray(uploaded_file.read()), dtype=np.uint8)
87
+ file_path = "temp_image.jpg"
88
+ with open(file_path, "wb") as f:
89
+ f.write(image)
90
+ predict_age_and_gender(file_path)
91
+
92
+ if __name__ == "__main__":
93
+ # Initialize face detection model
94
+ face_net = cv2.dnn.readNetFromCaffe(FACE_PROTO, FACE_MODEL)
95
+ # Initialize age prediction model
96
+ age_net = cv2.dnn.readNetFromCaffe(AGE_MODEL, AGE_PROTO)
97
+ # Initialize gender prediction model
98
+ gender_net = cv2.dnn.readNetFromCaffe(GENDER_MODEL, GENDER_PROTO)
99
+ # Run the Streamlit app
100
+ main()