Davinci_EYE / app.py
alibidaran's picture
Update app.py
5851bad verified
#from openvino.runtime import Core
import gradio as gr
import numpy as np
from PIL import Image
import cv2
from torchvision import models,transforms
from typing import Iterable
import gradio as gr
from torch import nn
from gradio.themes.base import Base
from gradio.themes.utils import colors, fonts, sizes
import time
import torch
import intel_extension_for_pytorch as ipex
#core = Core()
def conv(in_channels, out_channels):
return nn.Sequential(
nn.ReflectionPad2d(1),
nn.Conv2d(in_channels, out_channels, kernel_size=3),
nn.BatchNorm2d(out_channels),
nn.ReLU(inplace=True)
)
class resconv(nn.Module):
def __init__(self,in_features,out_features):
super(resconv,self).__init__()
self.block=nn.Sequential(
nn.ReflectionPad2d(1),
nn.Conv2d(in_features,out_features,3),
nn.InstanceNorm2d(out_features),
nn.ReLU(inplace=True),
nn.ReflectionPad2d(1),
nn.Conv2d(out_features,out_features,3),
nn.InstanceNorm2d(out_features),
nn.ReLU(inplace=True),
)
def forward(self,x):
return x+self.block(x)
def up_conv(in_channels, out_channels):
return nn.Sequential(
nn.ConvTranspose2d(in_channels, out_channels, kernel_size=2, stride=2),
nn.BatchNorm2d(out_channels),
nn.ReLU(inplace=True)
)
class ResnUnet(nn.Module):
def __init__(self, out_channels=32,number_of_block=9):
super().__init__()
out_features=64
channels=3
model=[nn.ReflectionPad2d(3),nn.Conv2d(3,out_features,7),nn.InstanceNorm2d(out_features),
nn.ReLU(inplace=True),nn.MaxPool2d(3,stride=2)]
model+=[resconv(out_features,out_features)]
model+=[nn.Conv2d(out_features,out_features*2,3,stride=2,padding=1),nn.InstanceNorm2d(out_features),
nn.ReLU(inplace=True)]
model+=[resconv(out_features*2,out_features*2)]
model+=[nn.Conv2d(out_features*2,out_features*4,3,stride=2,padding=1),nn.InstanceNorm2d(out_features),
nn.ReLU(inplace=True)]
model+=[resconv(out_features*4,out_features*4)]
model+=[nn.Conv2d(out_features*4,out_features*8,3,stride=2,padding=1),nn.InstanceNorm2d(out_features),
nn.ReLU(inplace=True)]
model+=[resconv(out_features*8,out_features*8)]
out_features*=8
input_features=out_features
for _ in range(4):
out_features//=2
model+=[
nn.Upsample(scale_factor=2),
nn.Conv2d(input_features,out_features,3,stride=1,padding=1),
nn.InstanceNorm2d(out_features),
nn.ReLU(inplace=True)
]
input_features=out_features
model+=[nn.ReflectionPad2d(3),nn.Conv2d(32,32,7),
]
self.model=nn.Sequential(*model)
def forward(self,x):
return self.model(x)
model=ResnUnet().to('cpu')
# Load the state_dict
state_dict = torch.load('real_model2_onnx_compat.pt',map_location='cpu')
# Create a new state_dict without the 'module.' prefix
new_state_dict = {}
for key, value in state_dict.items():
new_key = key.replace("module.", "") # Remove the 'module.' prefix
new_state_dict[new_key] = value
# Load the new state_dict into your model
model.load_state_dict(new_state_dict)
model.eval()
model = ipex.optimize(model, weights_prepack=False)
model = torch.compile(model, backend="ipex")
# Read model to OpenVINO Runtime
#model_ir = core.read_model(model="Davinci_eye.onnx")
#compiled_model_ir = core.compile_model(model=model_ir, device_name='CPU')
tfms = transforms.Compose([
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) # imagenet
])
color_map={
(251,244,5): 1,
(37,250,5):2,
(0,21,209):3,
(172,21,2): 4,
(172,21,229): 5,
(6,254,249): 6,
(141,216,23):7,
(96,13,13):8,
(65,214,24):9,
(124,3,252):10,
(214,55,153):11,
(48,61,173):12,
(110,31,254):13,
(249,37,14):14,
(249,137,254):15,
(34,255,113):16,
(169,52,14):17,
(124,49,176):18,
(4,88,238):19,
(115,214,178):20,
(115,63,178):21,
(115,214,235):22,
(63,63,178): 23,
(130,34,26):24,
(220,158,161):25,
(201,117,56):26,
(121,16,40):27,
(15,126,0):28,
(0,50,70):29,
(20,20,0):30,
(20,20,0):31,
}
colormap={v:[i for i in k] for k,v in color_map.items()}
items = {
1: "HarmonicAce_Head",
2: "HarmonicAce_Body",
3: "MarylandBipolarForceps_Head",
4: "MarylandBipolarForceps_Wrist",
5: "MarylandBipolarForceps_Body",
6: "CadiereForceps_Head",
7: "CadiereForceps_Wrist",
8: "CadiereForceps_Body",
9: "CurvedAtraumaticGrasper_Head",
10: "CurvedAtraumaticGrasper_Body",
11: "Stapler_Head",
12: "Stapler_Body",
13: "MediumLargeClipApplier_Head",
14: "MediumLargeClipApplier_Wrist",
15: "MediumLargeClipApplier_Body",
16: "SmallClipApplier_Head",
17: "SmallClipApplier_Wrist",
18: "SmallClipApplier_Body",
19: "SuctionIrrigation",
20: "Needle",
21: "Endotip",
22: "Specimenbag",
23: "DrainTube",
24: "Liver",
25: "Stomach",
26: "Pancreas",
27: "Spleen",
28: "Gallbladder",
29:"Gauze",
30:"TheOther_Instruments",
31:"TheOther_Tissues",
}
class Davinci_Eye(Base):
def __init__(
self,
*,
primary_hue: colors.Color | str = colors.stone,
secondary_hue: colors.Color | str = colors.blue,
neutral_hue: colors.Color | str = colors.gray,
spacing_size: sizes.Size | str = sizes.spacing_md,
radius_size: sizes.Size | str = sizes.radius_md,
text_size: sizes.Size | str = sizes.text_lg,
font: fonts.Font
| str
| Iterable[fonts.Font | str] = (
fonts.GoogleFont("IBM Plex Mono"),
"ui-sans-serif",
"sans-serif",
),
font_mono: fonts.Font
| str
| Iterable[fonts.Font | str] = (
fonts.GoogleFont("IBM Plex Mono"),
"ui-monospace",
"monospace",
),
):
super().__init__(
primary_hue=primary_hue,
secondary_hue=secondary_hue,
neutral_hue=neutral_hue,
spacing_size=spacing_size,
radius_size=radius_size,
text_size=text_size,
font=font,
font_mono=font_mono,
)
davincieye = Davinci_Eye()
def convert_mask_to_rgb(pred_mask):
rgb_mask=np.zeros((pred_mask.shape[0],pred_mask.shape[1],3),dtype=np.uint8)
for k,v in colormap.items():
rgb_mask[pred_mask==k]=v
return rgb_mask
def segment_image(filepath,tag):
image=cv2.imread(filepath)
image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
image = cv2.resize(image, (224,224))
x=tfms(image.copy()/255.)
with torch.no_grad():
mask=model(x.unsqueeze(0).float())
#ort_input={ort_session.get_inputs()[0].name:x.cpu().unsqueeze(0).float().numpy()}
#out=ort_session.run(None,ort_input)
_,pred_mask=torch.max(mask,dim=1)
pred_mask=pred_mask[0].numpy()
pred_mask=pred_mask.astype(np.uint8)
color_mask=convert_mask_to_rgb(pred_mask)
masked_image=cv2.addWeighted(image,0.3,color_mask,0.8,0.2)
pred_keys=pred_mask[np.nonzero(pred_mask)]
objects=[items[k] for k in pred_keys]
surgery_items=np.unique(np.array(objects),axis=0)
surg=""
for item in surgery_items:
surg+=item+","+" "
return Image.fromarray(masked_image),surg
demo=gr.Interface(fn=segment_image,inputs=[gr.Image(type='filepath')],
outputs=[gr.Image(type="pil"),gr.Text()],
examples=["R001_ch1_video_03_00-29-13-03.jpg",
"R002_ch1_video_01_01-07-25-19.jpg",
"R003_ch1_video_05_00-22-42-23.jpg",
"R004_ch1_video_01_01-12-22-00.jpg",
"R005_ch1_video_03_00-19-10-11.jpg",
"R006_ch1_video_01_00-45-02-10.jpg",
"R013_ch1_video_03_00-40-17-11.jpg"],
#examples='R001_ch1_video_03_00-29-13-03.jpg',
theme=davincieye.set(loader_color='#65aab1'),
title="Davinci Eye(Quantized for CPU)")
demo.launch()