-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.py
157 lines (112 loc) · 3.16 KB
/
server.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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
'''
Server Module to track online nodes
Authors:
Thomas Binu
Ruzan Sasuri
Amol Gaikwad
'''
import json
import socket
import requests
import random
from flask import Flask, request
from utils import log, find_successor, get_hash_value, send_as_json, send_as_bytes
import time
import face_recognition
from os.path import join
import glob
import traceback
import threading
HOST_NAME = socket.gethostbyname(socket.gethostname())
NODE_COUNT = 64
app = Flask(__name__)
url_head = 'http://'
URLS = {
'update_online': '/update_online',
'update_encodings': '/update_encodings'
}
PORT = 5000
nodes = dict()
train_image_encodings = {}
# Calculate the face encodings of images and store in server
def train_models_in_system():
global train_image_encodings
train_images_dir = join("images", "train")
train_image_files = glob.glob(join(train_images_dir, "*.jpg"))
log('Loading images to server....')
for train_image_file in train_image_files:
train_image = face_recognition.load_image_file(train_image_file)
train_image_encoding = face_recognition.face_encodings(train_image)
train_image_name = train_image_file.split("/")[-1].split(".")[0]
if len(train_image_encoding) > 0:
train_image_encodings[train_image_name] = train_image_encoding[0].tolist()
for name, face_encoding in train_image_encodings.items():
log(name + ":" + str(get_hash_value(face_encoding)))
def send_encodings_to_node(node_id):
message = {
'encodings': train_image_encodings
}
url = nodes[node_id] + URLS['update_encodings']
send_as_json(url, message)
# Generate random node id
def get_new_node_id():
register_id = -1
exists = True
while exists:
register_id = random.randint(0, NODE_COUNT)
if register_id not in nodes:
exists = False
return register_id
# Update all online nodes with the node status
def update_online_nodes():
message = {
'nodes': nodes
}
log('Node List')
for key, value in nodes.items():
full_url = value + URLS['update_online']
log(str(key) + " " + full_url)
send_as_json(full_url, message)
# Register the nodes in service
@app.route('/register', methods=['POST'])
def register():
try:
register_id = get_new_node_id()
if register_id != -1:
response = request.get_json(force=True)
ip = response['ip']
nodes[register_id] = url_head + ip + ':' + str(PORT)
update_online_nodes()
if len(nodes) == 1: # Send all the pics to the first node
send_encodings_to_node(register_id)
except Exception as e:
traceback.print_exc()
message = {'error': 'Could not send'}
return json.dumps(message)
message = {'id': register_id}
return json.dumps(message)
# Get online nodes
@app.route('/online_nodes', methods=['GET'])
def online_nodes():
message = {
'nodes': nodes
}
return json.dumps(message)
@app.route('/test', methods=['POST'])
def test_message():
response = request.get_json(force=True)
message = response['message']
return json.dumps(message)
# Start the flask service
def start_server():
threading.Thread(target=app.run, args=(HOST_NAME, PORT)).start()
time.sleep(0.5)
def main():
train_models_in_system()
try:
start_server()
except Exception:
print('Could not start flask server')
return
if __name__ == '__main__':
main()