File size: 2,992 Bytes
f2c28c8 3c3ec87 f2c28c8 dfbd972 f2c28c8 dfbd972 f2c28c8 dfbd972 f2c28c8 dfbd972 f2c28c8 dfbd972 f2c28c8 dfbd972 f2c28c8 dfbd972 f2c28c8 dfbd972 f2c28c8 dfbd972 f2c28c8 dfbd972 f2c28c8 dfbd972 a7e5224 dfbd972 a7e5224 dfbd972 f2c28c8 |
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 |
# Copyright (C) 2023, Xu Sun.
# This program is licensed under the Apache License version 2.
# See LICENSE or go to <https://www.apache.org/licenses/LICENSE-2.0.txt> for full license details.
import torch
import numpy as np
import matplotlib.pyplot as plt
import streamlit as st
from PIL import Image
from glaucoma import GlaucomaModel
run_device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
def main():
# Wide mode
st.set_page_config(layout="wide")
# Designing the interface
st.title("Glaucoma Screening from Retinal Fundus Images")
# For newline
st.write('\n')
# Author info
st.write('Developed by X. Sun. Find more info about me: https://pamixsun.github.io')
# For newline
st.write('\n')
# Instructions
st.markdown("*Hint: click on the top-right corner of an image to enlarge it!*")
# Set the columns
cols = st.beta_columns((1, 1, 1))
cols[0].subheader("Input image")
cols[1].subheader("Optic disc and optic cup")
cols[2].subheader("Class activation map")
# set the visualization figure
fig, ax = plt.subplots()
# Sidebar
# File selection
st.sidebar.title("Image selection")
# Disabling warning
st.set_option('deprecation.showfileUploaderEncoding', False)
# Choose your own image
uploaded_file = st.sidebar.file_uploader("Upload image", type=['png', 'jpeg', 'jpg'])
if uploaded_file is not None:
# read the upload image
image = Image.open(uploaded_file).convert('RGB')
image = np.array(image).astype(np.uint8)
# page_idx = 0
ax.imshow(image)
ax.axis('off')
cols[0].pyplot(fig)
# For newline
st.sidebar.write('\n')
# actions
if st.sidebar.button("Analyze image"):
if uploaded_file is None:
st.sidebar.write("Please upload an image")
else:
with st.spinner('Loading model...'):
# load model
model = GlaucomaModel(device=run_device)
with st.spinner('Analyzing...'):
# Forward the image to the model and get results
disease_idx, disc_cup_image, cam, vcdr = model.process(image)
# plot the optic disc and optic cup image
ax.imshow(disc_cup_image)
ax.axis('off')
cols[1].pyplot(fig)
# plot the stitched image
ax.imshow(cam)
ax.axis('off')
cols[2].pyplot(fig)
# Display JSON
st.subheader(" Screening results:")
st.write('\n')
final_results_as_table = f"""
|Parameters|Outcomes|
|---|---|
|Vertical cup-to-disc ratio|{vcdr:.04f}|
|Category|{model.cls_id2label[disease_idx]}|
"""
st.markdown(final_results_as_table)
if __name__ == '__main__':
main() |