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()