-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
133 lines (110 loc) · 3.97 KB
/
app.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
from segmentation_mask.segmentation import Segmentation
from utils.utils import Utils
from flask import Flask, Response, render_template
from flask_socketio import SocketIO, emit
from application_logging.logger import AppLogger
from flask_cors import cross_origin
import cv2
import os
import io
from PIL import Image
import base64
import numpy as np
from engineio.payload import Payload
Payload.max_decode_packets = 2048
app = Flask(__name__)
socketio = SocketIO(app, cors_allowed_origins='*')
segmentation = Segmentation()
utils = Utils()
logger = AppLogger()
log_file_object = open("prediction_log/api_handler.txt", 'a+')
@app.route('/', methods=['GET', 'POST'])
@cross_origin()
def home():
try:
logger.log(log_file_object, 'Initiating app', 'Info')
return render_template('index.html')
except Exception as e:
logger.log(
log_file_object,
f'Exception occured in initiating or creation/deletion of Input_data directory. Message: {str(e)}',
'Error')
message = 'ERROR :: '+str(e)
return render_template('exception.html', exception=message)
def readb64(base64_string):
try:
idx = base64_string.find('base64,')
base64_string = base64_string[idx+7:]
sbuf = io.BytesIO()
sbuf.write(base64.b64decode(base64_string, ' /'))
pimg = Image.open(sbuf)
return cv2.cvtColor(np.array(pimg), cv2.COLOR_RGB2BGR)
except Exception as e:
raise e
@socketio.on('image')
def image(data_image):
try:
frame = (readb64(data_image['data']))
frame = gen_frames(frame, data_image['mode'])
imgencode = cv2.imencode('.jpeg', frame, [cv2.IMWRITE_JPEG_QUALITY, 40])[1]
# base64 encode
string_data = base64.b64encode(imgencode).decode('utf-8')
b64_src = 'data:image/jpeg;base64,'
string_data = b64_src + string_data
# emit the frame back
emit('response_back', string_data)
except Exception as e:
logger.log(log_file_object,
f'Exception occured while recieving data in image method. Message: {str(e)}',
'Error')
message = 'ERROR :: ' + str(e)
return render_template('exception.html', exception=message)
def gen_frames(frame, mode=0):
try:
logger.log(log_file_object, 'Entered Gen_frames method', 'Info')
if mode == 1:
mask, frame = segmentation.get_mask(frame)
frame = utils.remove_background(mask, frame)
elif mode == 2:
mask, frame = segmentation.get_mask(frame)
frame = utils.blur_background(mask, frame)
elif mode == 3:
lst = os.listdir('bg_images/')
path = 'bg_images/'+lst[0]
mask, frame = segmentation.get_mask(frame)
frame = utils.change_background(mask, frame, path)
return frame
except Exception as e:
logger.log(log_file_object,
f'Exception occured while streaming video/Changing background in gen_frames method. Message: {str(e)}',
'Error')
message = 'ERROR :: ' + str(e)
return render_template('exception.html', exception=message)
@app.route('/getlogs', methods=['GET'])
@cross_origin()
def view_logs():
"""
Returns Html page for Logs
:return: html
"""
try:
return render_template('logs.html')
except Exception as e:
message = 'Error :: ' + str(e)
return render_template('exception.html', exception=message)
@app.route('/getlogs/<log>', methods=['GET'])
@cross_origin()
def get_logs(log):
"""
Returns logs for inspection of the system
:return: html
"""
try:
with open(f"prediction_log/{log}.txt", 'r') as log:
data = log.readlines()
return render_template('logs.html', logs=data)
except Exception as e:
message = 'Error :: ' + str(e)
return render_template('exception.html', exception=message)
if __name__ == "__main__":
socketio.run(app, debug=True)