File size: 4,132 Bytes
d5b4d18
 
 
49d4610
 
 
 
 
d5b4d18
 
49d4610
eca9fd3
d5b4d18
49d4610
d5b4d18
 
 
49d4610
d5b4d18
 
49d4610
d5b4d18
 
 
 
 
eca9fd3
49d4610
 
eca9fd3
 
 
 
 
 
 
 
49d4610
 
 
 
 
04c11d1
 
d84c975
 
 
 
 
 
 
49d4610
d84c975
2bbf32f
 
 
 
 
 
 
 
 
 
 
d84c975
49d4610
0f02a70
 
49d4610
 
 
 
 
 
 
 
06c4589
 
 
d84c975
49d4610
 
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
import streamlit as st
import os
import numpy as np
import pydicom                  # библиотека для работы с DICOM-изображениями в медицине.
import tensorflow as tf         # библиотека для создания сети

from PIL import Image           # библиотека для работы с изображениями
from tensorflow import keras
from tensorflow.keras.preprocessing import image

# Модель 
model = tf.keras.models.load_model('model.h5')

# функция для принятия на вход dcm формат        
def read_dcm(path):
    # Конвертируем
    dcm = pydicom.dcmread(path)
    img = dcm.pixel_array.astype(np.float32) # преобразование изображения в numpy-массив
    intercept = dcm.RescaleIntercept if 'RescaleIntercept' in dcm else 0.0
    slope = dcm.RescaleSlope if 'RescaleSlope' in dcm else 1.0
    img = slope * img + intercept # масштабирование
    if len(img.shape) > 2: img = img[0]
    img -= img.min()
    img /= img.max()
    img *= 255.0
    img = img.astype('uint8')

    img = Image.fromarray(img).convert('L') # Преобразование в изображение в оттенках серого
    img = img.resize((512, 512)) # Изменение размера изображения
    img = image.img_to_array(img)
    return tf.expand_dims(img, 0)  # добавляем дополнительное измерение (batch size)

def read_img(path):
    img = image.load_img(path, color_mode='grayscale', target_size=(512, 512))
    img_array = image.img_to_array(img)
    return tf.expand_dims(img_array, 0)  # добавляем дополнительное измерение (batch size)

# Преобразует EagerTensor в NumPy array
img = lambda x: Image.fromarray(x.numpy().astype(np.uint8).reshape(512, 512))

def main():
    st.title("Прогноз вероятности рассеянного склероза на снимке МРТ.")
    st.write("Где 0 - нет склероза, 1 - есть склероз.")
    
    # Display instruction text
    st.markdown("##### Инструкция:")
    st.write("1. Загрузите свое изображение, используя кнопку 'Upload an image'.")
    st.write("2. Либо выберите одно из предварительно загруженных изображений ниже.")
    st.write("3. После загрузки изображения результаты обработки отобразятся ниже.")
    st.write("")
    
    uploaded_file = st.file_uploader("Выберите изображение", type=["dcm", "jpg", "png"])

    if uploaded_file is None:
        # Display a row of preloaded images
        st.markdown("##### Preloaded Images")
        col1, col2 = st.columns(2)  # Create 2 columns for 2 images
        with col1:
            image1 = img(read_img("image_example_1.jpg"))
            st.image(image1, caption='jpg example', use_column_width=True)
    
        with col2:
            image2 = img(read_dcm("image_example.dcm"))
            st.image(image2, caption='dcm example', use_column_width=True)

    if uploaded_file is not None:
        if uploaded_file.name.endswith('.dcm'): img_array = read_dcm(uploaded_file)
        else: img_array = read_img(uploaded_file)     
        # Отображение выбранного изображения
        st.image(img(img_array), caption='Выбранное изображение', use_column_width=True)
        # Предсказание вероятности с помощью модели
        predictions = model.predict(img_array)
        predictions = tf.nn.softmax(predictions[0])
        predictions =  round(float(predictions[1]), 2)
        st.write(f"Вероятность: {predictions}")

    st.write("")
    st.write("Автор: https://t.me/dtatarintsev")
    st.write("GitHub проекта: https://github.com/DmitryTatarintsev/internship/tree/main/multiple_sclerosis")

if __name__ == "__main__":
    main()