| import random |
| import time |
| from io import BytesIO |
|
|
| import PIL.Image as Image |
| import numpy as np |
| import openvino.runtime as ov |
| import pandas as pd |
| import streamlit as st |
| from cellpose import models |
| from skimage.color import label2rgb |
|
|
| from openvino_utils import ov_inference |
|
|
| cellpose_model = models.Cellpose( |
| gpu=False, |
| model_type="cyto2", |
| net_avg=False, |
| ) |
|
|
| core = ov.Core() |
| core_model = core.read_model("./converted_unet_cellpose/cyto2.xml") |
| ov_model = core.compile_model(core_model, "CPU") |
|
|
| gifs = [ |
| "https://gifdb.com/images/high/waiting-fingers-agent-cooper-83uxmdriug9b3eph.gif", |
| "https://gifdb.com/images/high/i-ll-be-waiting-nacho-libre-ij5d7npbjldtnd2j.webp", |
| "https://gifdb.com/images/high/waiting-cat-nail-file-fuyageziynzjynxt.webp", |
| "https://gifdb.com/images/high/waiting-for-you-squid-game-f52p9bou56mol0wa.webp", |
| "https://gifdb.com/images/high/waiting-man-tick-tock-lucgba3e6vq2eecp.webp", |
| "https://gifdb.com/images/high/waiting-impatiently-dumbledore-cu8xf3lc3o7pzyxq.webp", |
| "https://gifdb.com/images/high/waiting-dancing-mr-bean-zqemgdq7qldp6jl7.webp", |
| "https://gifdb.com/images/high/waiting-sad-pablo-narcos-zz7uiyio8n4g1yra.webp", |
| "https://gifdb.com/images/high/still-waiting-justin-timberlake-e06wu78iv4c62mmz.webp", |
| "https://gifdb.com/images/high/still-waiting-skeleton-chair-4yggsjnib7cs49ig.webp", |
| "https://gifdb.com/images/high/waiting-jared-silicon-valley-0jqzysdhn9om30av.webp", |
| "https://gifdb.com/images/high/waiting-for-reply-mocha-oo9sso1g90140bxi.webp", |
| "https://gifdb.com/images/high/still-waiting-mickey-mouse-w7kp6rhecp3yizsx.webp", |
| "https://gifdb.com/images/high/still-waiting-little-rascals-zedphzadck29jgl6.webp", |
| "https://gifdb.com/images/high/still-waiting-boo-monsters-inc-zmx0wumbaimraxf8.webp", |
| ] |
|
|
| st.title("OpenVINO :handshake: CellPose") |
|
|
| st.caption('Developed by CellAI - BECLS') |
| st.caption('Contributors: Gabriele Aldeghi :pig: Filip Krasniqi :bear:') |
|
|
| st.markdown( |
| "[](https://github.com/Valitacell-Ltd) [](https://github.com/grozby) [](https://github.com/filipkrasniqi) [](https://github.com/MouseLand/cellpose) Copyright © 2020 Howard Hughes Medical Institute", |
| unsafe_allow_html=True, |
| ) |
|
|
| uploaded_file = st.file_uploader("Choose a file") |
| container_warning = st.container() |
|
|
| col1, col2, col3 = st.columns(3) |
| container_table = st.container() |
| st.caption("OpenVINO vs CellPose: Inference Time [s] vs Image Size [pixels]") |
| st.image("assets/cellpose_benchmark.png") |
|
|
| MAX_SIZE = 1024 |
|
|
| if uploaded_file is not None: |
| try: |
| bytes_data = uploaded_file.getvalue() |
| image = Image.open(BytesIO(bytes_data)) |
|
|
| img_np = np.asarray(image) |
| display_warning = (img_np.shape[0] > MAX_SIZE or |
| img_np.shape[1] > MAX_SIZE) |
|
|
| if display_warning: |
| former_shape = img_np.shape |
| img_np = img_np[:MAX_SIZE, :MAX_SIZE] |
| container_warning.write(f"WARNING: Image has been cropped " |
| f"from {former_shape} to {img_np.shape}") |
|
|
| img_input_cellpose = img_np.copy() |
|
|
| if len(img_input_cellpose.shape) <= 2: |
| img_input_cellpose = np.expand_dims(img_input_cellpose, axis=-1) |
| img_input_cellpose = np.expand_dims(img_input_cellpose, axis=0) |
|
|
| img_input_cellpose = img_input_cellpose / (2**16 - 1) |
|
|
| col1.write("Input") |
| col2.write("CellPose") |
| col3.write("OpenVINO") |
|
|
| col1.image(img_input_cellpose) |
|
|
| cellpose_img_container = col2.empty() |
| cellpose_img_container.image(random.choice(gifs)) |
|
|
| t1 = time.time() |
|
|
| cp_mask, *_ = cellpose_model.eval( |
| img_input_cellpose, |
| batch_size=64, |
| normalize=False, |
| diameter=None, |
| flow_threshold=0.4, |
| channels=(0, 0), |
| ) |
|
|
| t2 = time.time() |
|
|
| cp_overlay = (label2rgb( |
| cp_mask, |
| image=img_input_cellpose.squeeze(), |
| bg_label=0, |
| ) * 255).astype(np.uint8,) |
|
|
| cellpose_img_container.image(cp_overlay) |
|
|
| ov_img_container = col3.empty() |
| ov_img_container.image(random.choice(gifs)) |
|
|
| img_input_ov = img_np.copy() |
|
|
| image = np.expand_dims(img_input_ov, axis=0) |
|
|
| image = np.concatenate( |
| [ |
| image, |
| np.zeros_like(image), |
| ], |
| axis=0, |
| ).astype(float) |
|
|
| image /= 2**16 - 1 |
|
|
| t3 = time.time() |
| ov_mask = ov_inference(model=ov_model, x=image) |
|
|
| t4 = time.time() |
|
|
| ov_overlay = (label2rgb( |
| ov_mask, |
| image=img_input_cellpose.squeeze(), |
| bg_label=0, |
| ) * 255).astype(np.uint8,) |
|
|
| ov_img_container.image(ov_overlay) |
|
|
| df = pd.DataFrame([ |
| { |
| "Model": "CellPose", |
| "Execution Time [s]": f"{(t2-t1):.2f} seconds" |
| }, |
| { |
| "Model": "OpenVINO", |
| "Execution Time [s]": f"{(t4-t3):.2f} seconds" |
| }, |
| ]) |
|
|
| container_table.table(df) |
| except Exception as e: |
| container_warning.write("WARNING: an error occurred. Please retry.") |
|
|