|
|
import gradio as gr
|
|
|
from app_function import *
|
|
|
from plot_function import calculate_plot, predict_plot
|
|
|
|
|
|
|
|
|
def run_test():
|
|
|
with gr.Blocks(title="Адденбрукский когнитивный тест (ACE-III)") as demo:
|
|
|
gr.Markdown("# Адденбрукский когнитивный тест (ACE-III)")
|
|
|
|
|
|
|
|
|
with gr.Row():
|
|
|
with gr.Column(scale=2):
|
|
|
gr.Markdown("""
|
|
|
## Описание теста ACE-III
|
|
|
|
|
|
**Адденбрукский когнитивный тест (ACE-III)** - это скрининговый инструмент
|
|
|
для диагностики когнитивных нарушений и деменций. Является усовершенствованной
|
|
|
версией теста ACE-R.
|
|
|
|
|
|
### Основные характеристики:
|
|
|
- Оценивает 5 когнитивных доменов:
|
|
|
1. Внимание и концентрация
|
|
|
2. Память
|
|
|
3. Речевые функции
|
|
|
4. Визуально-пространственные способности
|
|
|
5. Ориентация
|
|
|
- Общее максимальное количество баллов: 100
|
|
|
- Время проведения: 15-20 минут
|
|
|
- Чувствительность для выявления деменции: 84-94%
|
|
|
|
|
|
### Интерпретация результатов:
|
|
|
- 88-100 баллов: норма
|
|
|
- 82-87 баллов: легкие когнитивные нарушения
|
|
|
- Менее 82 баллов: вероятна деменция
|
|
|
|
|
|
Тест особенно полезен для дифференциальной диагностики между
|
|
|
болезнью Альцгеймера, лобно-височной деменцией и деменцией с тельцами Леви.
|
|
|
""")
|
|
|
|
|
|
with gr.Column(scale=1):
|
|
|
|
|
|
gr.Markdown("[Подробнее о тесте](https://www.sydney.edu.au/brain-mind/our-clinics/dementia-test.html#addenbrookes-cognitive-examination-iii)")
|
|
|
|
|
|
|
|
|
with gr.Tab("Внимание"):
|
|
|
gr.Markdown("## ВНИМАНИЕ")
|
|
|
|
|
|
with gr.Column():
|
|
|
time_orientation = gr.Slider(0, 5, label='Ориентирование во времени', value=0, step=1)
|
|
|
space_orientation = gr.Slider(0, 5, label='Ориентирование в пространстве', value=0, step=1)
|
|
|
three_words = gr.Slider(0, 3, label='Повторение 3-х слов', value=0, step=1)
|
|
|
calculate = gr.Slider(0, 5, label='Серийный счет (100-7 последовательно)', value=0, step=1)
|
|
|
|
|
|
total_att = gr.Number(label="Общий балл за внимание", value=0)
|
|
|
|
|
|
for slider in [time_orientation, space_orientation, three_words, calculate]:
|
|
|
slider.change(
|
|
|
fn=calculate_total,
|
|
|
inputs=[time_orientation, space_orientation, three_words, calculate],
|
|
|
outputs=total_att
|
|
|
)
|
|
|
|
|
|
|
|
|
with gr.Tab("Память"):
|
|
|
gr.Markdown("## ПАМЯТЬ")
|
|
|
|
|
|
with gr.Column():
|
|
|
three_word_memory = gr.Slider(0, 3, label='Припоминание 3-х слов', value=0, step=1)
|
|
|
memory_adress = gr.Slider(0, 7, label='Запоминание адреса', value=0, step=1)
|
|
|
memory_president = gr.Slider(0, 4, label='Осведомленность (президент, премьер-министр)', value=0, step=1)
|
|
|
free_recall_adress = gr.Slider(0, 7, label='Свободное припоминание адреса', value=0, step=1)
|
|
|
choice_adress = gr.Slider(0, 5, label='Выбор из множества (подсказка)', value=0, step=1)
|
|
|
|
|
|
total_memory = gr.Number(label="Общий балл за память", value=0)
|
|
|
|
|
|
for slider in [three_word_memory, memory_adress, memory_president, free_recall_adress, choice_adress]:
|
|
|
slider.change(
|
|
|
fn=calculate_memory,
|
|
|
inputs=[three_word_memory, memory_adress, memory_president, free_recall_adress, choice_adress],
|
|
|
outputs=total_memory
|
|
|
)
|
|
|
|
|
|
with gr.Tab("Беглость"):
|
|
|
gr.Markdown("## БЕГЛОСТЬ")
|
|
|
|
|
|
with gr.Column():
|
|
|
words_minuts = gr.Slider(0, 7, label='Балл за количество слов в минуту', value=0, step=1)
|
|
|
animal_minuts = gr.Slider(0, 7, label='Балл за число названных животных в минуту', value=0, step=1)
|
|
|
|
|
|
|
|
|
total_fluency = gr.Number(label="Общий балл за беглость", value=0)
|
|
|
|
|
|
for slider in [words_minuts, animal_minuts]:
|
|
|
slider.change(
|
|
|
fn=calculate_fluency,
|
|
|
inputs=[words_minuts, animal_minuts],
|
|
|
outputs= total_fluency
|
|
|
)
|
|
|
|
|
|
|
|
|
with gr.Tab("Речь"):
|
|
|
gr.Markdown("## РЕЧЬ")
|
|
|
|
|
|
with gr.Column():
|
|
|
instruction = gr.Slider(0, 3, label='Понимание инструкций', value=0, step=1)
|
|
|
write_two_sentence = gr.Slider(0, 2, label='Написание двух предложений', value=0, step=1)
|
|
|
repit_words= gr.Slider(0, 2, label='Повторение', value=0, step=1)
|
|
|
repit_phrase = gr.Slider(0, 2, label='Повторение пословиц', value=0, step=1)
|
|
|
naming = gr.Slider(0, 12, label='Название', value=0, step=1)
|
|
|
understanding = gr.Slider(0, 4, label='Понимание', value=0, step=1)
|
|
|
reading = gr.Slider(0, 1, label='Чтение', value=0, step=1)
|
|
|
|
|
|
|
|
|
total_speech = gr.Number(label="Общий балл за речь", value=0)
|
|
|
|
|
|
for slider in [instruction, write_two_sentence, repit_words, repit_phrase, naming, understanding, reading]:
|
|
|
slider.change(
|
|
|
fn=calculate_speech,
|
|
|
inputs=[instruction, write_two_sentence, repit_words, repit_phrase, naming, understanding, reading],
|
|
|
outputs= total_speech
|
|
|
)
|
|
|
|
|
|
|
|
|
with gr.Tab("зрительно-простраснтвенные способности"):
|
|
|
gr.Markdown("## ПРОСТРАНСТВО")
|
|
|
|
|
|
with gr.Column():
|
|
|
infinity = gr.Slider(0, 1, label='копирование бесконечностей', value=0, step=1)
|
|
|
cube = gr.Slider(0, 2, label='Копирование куба', value=0, step=1)
|
|
|
clock= gr.Slider(0, 5, label='Рисование часов', value=0, step=1)
|
|
|
punkt = gr.Slider(0, 4, label='Подсчет точек', value=0, step=1)
|
|
|
letters = gr.Slider(0, 4, label='Распознавание букв', value=0, step=1)
|
|
|
|
|
|
|
|
|
total_spatial = gr.Number(label="Общий балл за речь", value=0)
|
|
|
|
|
|
for slider in [infinity, cube, clock, punkt, letters]:
|
|
|
slider.change(
|
|
|
fn=calculate_spatial,
|
|
|
inputs=[infinity, cube, clock, punkt, letters],
|
|
|
outputs= total_spatial
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
with gr.Tab("Всего"):
|
|
|
gr.Markdown("## ОБЩИЙ БАЛЛ")
|
|
|
|
|
|
with gr.Column():
|
|
|
total_score = gr.Number(label="Общий балл по тесту", value=0)
|
|
|
|
|
|
|
|
|
total_att.change(
|
|
|
fn=calculate_overall,
|
|
|
inputs=[total_att, total_memory, total_fluency, total_speech, total_spatial],
|
|
|
outputs=total_score
|
|
|
)
|
|
|
|
|
|
total_memory.change(
|
|
|
fn=calculate_overall,
|
|
|
inputs=[total_att, total_memory, total_fluency, total_speech, total_spatial],
|
|
|
outputs=total_score
|
|
|
)
|
|
|
|
|
|
total_fluency.change(
|
|
|
fn=calculate_overall,
|
|
|
inputs=[total_att, total_memory, total_fluency, total_speech, total_spatial],
|
|
|
outputs=total_score
|
|
|
)
|
|
|
|
|
|
total_speech.change(
|
|
|
fn=calculate_overall,
|
|
|
inputs=[total_att, total_memory, total_fluency, total_speech, total_spatial],
|
|
|
outputs=total_score
|
|
|
)
|
|
|
|
|
|
total_spatial.change(
|
|
|
fn=calculate_overall,
|
|
|
inputs=[total_att, total_memory, total_fluency, total_speech, total_spatial],
|
|
|
outputs=total_score
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
with gr.Tab("Анализ"):
|
|
|
gr.Markdown("## Визуализация результатов")
|
|
|
|
|
|
with gr.Row():
|
|
|
|
|
|
with gr.Column():
|
|
|
gr.Markdown("### Когнитивные функции")
|
|
|
cognitive_plot = gr.Plot()
|
|
|
|
|
|
|
|
|
for component in [total_att, total_memory, total_fluency, total_speech, total_spatial]:
|
|
|
component.change(
|
|
|
fn=calculate_plot,
|
|
|
inputs=[total_att, total_memory, total_fluency, total_speech, total_spatial],
|
|
|
outputs=cognitive_plot
|
|
|
)
|
|
|
|
|
|
|
|
|
with gr.Column():
|
|
|
gr.Markdown("### Прогноз модели")
|
|
|
|
|
|
age_slider = gr.Slider(20, 100, value=56, label="Возраст")
|
|
|
prediction_plot = gr.Plot()
|
|
|
|
|
|
predict_btn = gr.Button("Выполнить прогноз")
|
|
|
predict_btn.click(
|
|
|
fn=predict_plot,
|
|
|
inputs=[total_score, total_att, total_memory, total_fluency, total_speech, total_spatial, age_slider],
|
|
|
outputs=prediction_plot
|
|
|
)
|
|
|
|
|
|
with gr.Tab("Метрики"):
|
|
|
gr.Markdown("## Метрики классификации")
|
|
|
|
|
|
with gr.Row():
|
|
|
|
|
|
with gr.Column():
|
|
|
gr.Markdown("### Структура выборки")
|
|
|
gr.Image("pic/clases.png", label="Структура выборки")
|
|
|
|
|
|
|
|
|
with gr.Column():
|
|
|
gr.Markdown("### Confusion Matrix")
|
|
|
gr.Image("pic/confusion_matrix_neuon.png", label="Confusion Matrix")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
with gr.Row():
|
|
|
with gr.Column():
|
|
|
gr.Markdown("### Метрики классификации")
|
|
|
metrics_table = gr.Dataframe(
|
|
|
headers=["Метрика", "Значение"],
|
|
|
datatype=["str", "number"],
|
|
|
row_count=4)
|
|
|
|
|
|
gr.Markdown("### F1-мера ")
|
|
|
|
|
|
predefined_metrics = [
|
|
|
["F1-мера (норма)", 0.92],
|
|
|
["F1-мера (умеренные нарушения)", 0.90],
|
|
|
["F1-мера (деменция)", 0.99],
|
|
|
|
|
|
]
|
|
|
gr.Dataframe(
|
|
|
predefined_metrics,
|
|
|
headers=["Метрика", "Значение"],
|
|
|
datatype=["str", "number"],
|
|
|
row_count=4,
|
|
|
col_count=2,
|
|
|
interactive=False
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
return demo
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
demo = run_test()
|
|
|
demo.launch() |