Spaces:
Sleeping
Sleeping
File size: 4,422 Bytes
3b1fcce |
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 |
import gradio as gr
from pyzbar.pyzbar import decode
from lambdas import upload_models, predict
import base64
from io import BytesIO
from PIL import Image
DEBUG = True
prefer_frontal_cam_html = """
<script>
const originalGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);
navigator.mediaDevices.getUserMedia = (constraints) => {
if (!constraints.video.facingMode) {
constraints.video.facingMode = {ideal: "environment"};
}
return originalGetUserMedia(constraints);
};
</script>
"""
config = {'possible_shifts': {'No shifts': 0}, 'possible_modes': ["waste"]}
restaurant_id = None
shift_id = None
def login(username, password) -> bool:
# TODO from username and password get restaurant_id
config_aux = {'restaurant_id': 3,
'restaurant_name': 'Proppos',
'mode': 'waste',
'possible_modes': ['waste'],
'possible_shifts': {'Esmorzar': 1, 'Dinar': 2, 'Sopar': 3},
}
config.update(config_aux)
return True
def start_app(shift_id, mode):
try:
config_aux = {'shift_id': shift_id,
'mode': mode}
config.update(config_aux)
gr.Info('Loading models', )
status_code, r = upload_models(**config)
if status_code in (201, 200, 204):
gr.Info('Models Correctly Loaded. Ready to predict')
else:
raise gr.Error(f'Error loading the models: {r}')
config.update(r)
except Exception as e:
raise gr.Error(f'Error Uploading the models. \n {e}')
def predict_app(image, patient_id):
buffered = BytesIO()
image.save(buffered, format='JPEG')
b64image = base64.b64encode(buffered.getvalue()).decode('utf-8')
status_code, r = predict(b64image=b64image,
patient_identifier=patient_id,
**config)
if status_code in (200, 201, 204):
gr.Info('Prediction Successful')
else:
raise gr.Error(f'Error predicting {r}')
# APP
with gr.Blocks(head=prefer_frontal_cam_html) as block:
with gr.Tab(label='Welcome'):
gr.Markdown(f'# User: {config.get("restaurant_name", "Proppos")}')
@gr.render()
def render_dropdowns():
shift_dropdown = gr.Dropdown(label='Meal/Comida/Apat',
value=list(config["possible_shifts"].items())[0],
choices=tuple(config["possible_shifts"].items()))
mode_dropdown = gr.Dropdown(label='Mode',
value=config['possible_modes'][0],
choices=config["possible_modes"])
start_button = gr.Button(value='START')
start_button.click(fn=start_app, inputs=[shift_dropdown, mode_dropdown])
with gr.Tab(label='📷 Capture'):
# MAIN TAB TO PREDICT
gr.Markdown(f""" 1. Click to Access Webcam
2.
""")
im = gr.Image(sources=['webcam'], streaming=True, mirror_webcam=False, type='pil')
with gr.Accordion():
eater_id = gr.Textbox(label='Patient Identification', placeholder='Searching Patient ID')
current_eater_id = {'value': None}
@gr.on(inputs=im, outputs=eater_id)
def search_eater_id(image):
d = decode(image)
default_value = None
current_value = current_eater_id['value'] or default_value
new_value = d[0].data if d else default_value
# If it is really a new value different from the default one, change it.
final_value = new_value if new_value != default_value else current_value
current_eater_id['value'] = final_value
return final_value
b = gr.Button('PRESS TO PREDICT')
b.click(fn=predict_app, inputs=[im, eater_id], outputs=gr.Info())
with gr.Tab(label='ℹ️ Status'):
gr.Markdown(' Press the button to see the status of the Application and technical information')
load_status_button = gr.Button('Load Status')
status_json = gr.Json(label='Status')
load_status_button.click(fn=lambda: config, outputs=status_json)
with gr.Tab(label='📄 Documentation'):
gr.Markdown()
#block.launch(auth=("proppos", "Proppos2019"))
block.launch(show_api=False, auth=login)
|