-
Notifications
You must be signed in to change notification settings - Fork 1
/
service.py
142 lines (133 loc) · 5.82 KB
/
service.py
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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import shutil
import cv2
import flask
from flask import request, jsonify
from werkzeug.utils import secure_filename
from face_encoder.support import predict
from utils import *
from waitress import serve
face_db_path = 'face_db/'
predict_path = 'predict/'
temp_path = 'temp/'
ID = None
list_id = None
mtcnn_detector, facenet, face_db = None, None, None
app = flask.Flask(__name__, static_url_path='', static_folder='')
app.config['MAX_CONTENT_LENGTH'] = 200 * 1024 * 1024 # max 200mb in a request
app.config["DEBUG"] = True # for debug
app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'
@app.route('/get_all', methods=['GET'])
def get_all():
global face_db_path
list_subfolders_with_paths = [f.name for f in os.scandir(face_db_path) if
f.is_dir()]
result = {}
for subfolder in list_subfolders_with_paths:
result[str(subfolder).split('_')[0]] = str(subfolder).split('_')[1]
return jsonify(result)
@app.route('/add_person', methods=['POST'])
def add_person():
global ID, list_id
if request.method == 'POST':
files = request.files.getlist('file')
if request.files['file'].filename == '':
return jsonify(message='No file selected for uploading'), 400
elif 'name' not in request.form:
return jsonify(message='Bad request! No name exist!'), 400
elif request.form['name'] == '':
return jsonify(message='Bad request! Name is empty!'), 400
else:
name = request.form['name']
folder_new_person = os.path.join(face_db_path, str(ID) + '_' + name)
ID = ID + 1
os.makedirs(folder_new_person)
result = {}
for file in files:
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
path_to_file = os.path.join(
folder_new_person, filename)
print(path_to_file)
path_temp = os.path.join(
temp_path, filename)
if os.path.isfile(path_temp):
os.remove(path_temp)
file.save(path_temp)
img = cv2.imread(path_temp)
faces, _ = mtcnn_detector.detect(img)
if len(faces) != 1:
result[file.filename] = 'Image must have only 1 face!'
# os.remove(path_temp)
else:
x1, y1, x2, y2 = int(faces[0][0]), int(
faces[0][1]), int(
faces[0][2]), int(faces[0][3])
# print('face size ', y2-y1, x2-x1)
if y2 - y1 < 161 or x2 - x1 < 161:
result[file.filename] = 'Need bigger face in image!'
# os.remove(path_temp)
else:
face_image = img[y1:y2, x1:x2]
cv2.imwrite(path_to_file, face_image)
result[file.filename] = 'Success'
os.remove(path_temp)
if len(os.listdir(folder_new_person)) != 0:
list_id.append(ID)
else:
ID = ID -1
os.rmdir(folder_new_person)
return jsonify(result), 200
@app.route('/del_person', methods=['GET'])
def del_person():
if 'id_person' not in request.form:
return jsonify(message='Bad request! No id_person exist!'), 400
else:
id_person = request.form['id_person']
global list_id
if not int(id_person):
return jsonify(message='id_person must be integer'), 400
if int(id_person) in list_id:
for folder in os.scandir(face_db_path):
if int(str(folder.name).split('_')[0]) == int(id_person):
shutil.rmtree(folder)
return jsonify(
message='delete on id_person ' + id_person), 200
else:
return jsonify(message='id does not exist'), 400
@app.route('/predict', methods=['POST'])
def predict_img():
global mtcnn_detector, facenet, face_db
if request.method == 'POST':
files = request.files.getlist('file')
# print(request.files['file'].filename)
# thresh = request.form['thresh']
if request.files['file'].filename == '':
return jsonify(message='No file selected for predict'), 400
else:
result = {}
for file in files:
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
path_to_file = os.path.join(
predict_path, filename)
print(path_to_file)
if os.path.isfile(path_to_file):
os.remove(path_to_file)
file.save(path_to_file)
img = cv2.imread(path_to_file)
faces, _ = mtcnn_detector.detect(img)
names, sims = [], []
for face in faces:
x1, y1, x2, y2 = int(face[0]), int(face[1]), int(
face[2]), int(face[3])
face_image = img[y1:y2, x1:x2]
names, sims = predict(face_image, facenet, face_db,
VERIFICATION_THRESHOLD=0.5)
result[filename] = len(names), names, sims
return jsonify(str(result)), 200
if __name__ == '__main__':
create_folder(face_db_path, predict_path, temp_path)
mtcnn_detector, facenet, face_db = init_recognizer()
ID, list_id = get_current_id(face_db_path)
# app.run(debug=app.config['DEBUG'], use_reloader=False)
serve(app, host='0.0.0.0', port=8000)