from pathlib import Path from typing import List, Dict, Tuple import matplotlib.colors as mpl_colors import matplotlib.pyplot as plt import pandas as pd import seaborn as sns import shinyswatch import run import PIL from shiny import App, Inputs, Outputs, Session, reactive, render, req, ui from transformers import SamModel, SamConfig, SamProcessor import torch sns.set_theme() www_dir = Path(__file__).parent.resolve() / "www" app_ui = ui.page_fillable( shinyswatch.theme.minty(), ui.layout_sidebar( ui.sidebar( ui.input_file("image_input", "Upload image: ", multiple=True), ), ui.output_image("image"), # ui.output_image("image_output"), ui.output_plot("plot"), # ui.output_image("prediction"), # ui.output_image("prob") ), ) def server(input: Inputs, output: Outputs, session: Session): @output @render.image def image(): here = Path(__file__).parent if input.image_input(): src = input.image_input()[0]['datapath'] img = {"src": src, "width": "500px"} return img return None @output # @render.image # def image_output(): # here = Path(__file__).parent # if input.image_input(): # src = input.image_input()[0]['datapath'] # img = {"src": src, "width": "500px"} # x = run.pred(src) # print(x) # return img # return None @output @render.plot def plot(): if input.image_input(): new_image = input.image_input()[0]['datapath'] pred_prob, pred_prediction = run.pred(new_image) fig, axes = plt.subplots(1, 3, figsize=(15, 5)) axes[0].imshow(new_image, cmap='gray') axes[0].set_title("Image") im = axes[1].imshow(pred_prob) axes[1].set_title("Probability Map") cbar = fig.colorbar(im, ax=axes[1]) axes[2].imshow(pred_prediction, cmap='gray') axes[2].set_title("Prediction") for ax in axes: ax.set_xticks([]) ax.set_yticks([]) ax.set_xticklabels([]) ax.set_yticklabels([]) else: print("no image received") fig, _ = plt.subplots() # Create an empty figure if no image received fig.text(0.5, 0.5, "No image received", ha='center', va='center', fontsize=14) return fig app = App( app_ui, server, static_assets=str(www_dir), )