IPD-app / app.py
DanielFD's picture
Update app.py
3ba327b
from f_segment_img import *
from f_measurents import *
import gradio as gr
import dotenv
import ast
dotenv.load_dotenv()
#
def create_sam():
sam_checkpoint = "sam_vit_h_4b8939.pth"
model_type = "vit_h"; device = "cuda"
sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
return sam
def plt2arr(fig, draw=True):
if draw: fig.canvas.draw()
rgba_buf = fig.canvas.buffer_rgba()
(w,h) = fig.canvas.get_width_height()
rgba_arr = np.frombuffer(rgba_buf, dtype=np.uint8).reshape((h,w,4))
return rgba_arr
def frame_size_width_mm(dropdown_label):
if dropdown_label == 'Small (142 mm)': frame_width_px = 142
elif dropdown_label == 'Medium (xx mm)': frame_width_px = 150
elif dropdown_label == 'Large (xx mm)': frame_width_px = 155
return frame_width_px
#
def ipd_app(image,dropdown_label):
# Measure image
landmarks = ast.literal_eval(os.environ['landmarks'])
frame_processed, measurements = measure_landmarks_img(image, landmarks, plot_landmarks_on_img = True, plot_data_on_img = True)
# Segment Frame
image, img_cropped, masks_selection, objects_segmented = segment_frame_from_img(image, landmarks, create_sam())
# Calibrate measurements
frame_width_px = get_frame_width(masks_selection)
frame_width_mm = frame_size_width_mm(dropdown_label)
ipd_mm = ipd_calibration(measurements['ipd_px'], frame_width_px, frame_width_mm)
text_ipd = 'IPD: ' + str(round(ipd_mm,2)) + ' mm'
# Check
sam_check = plot_sam_check_segmentation_frame(image, img_cropped, objects_segmented)
sam_check_numpy = plt2arr(sam_check, draw = True)
#
return text_ipd, frame_processed, str(measurements), sam_check_numpy
dropdown = gr.Dropdown(["Small (142 mm)", "Medium (xx mm)", "Large (xx mm)"], label="Refractives Frame Size", info="For calibration")
demo = gr.Interface(fn=ipd_app, inputs=["image",dropdown], outputs=["text", "image", "text", "image"])
demo.launch(debug=True)