ACE_III / app.py
Serg234's picture
Rename ace_diff_gradio.py to app.py
1745d0b verified
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="Структура выборки")
# Confusion Matrix (готовая картинка)
with gr.Column():
gr.Markdown("### Confusion Matrix")
gr.Image("pic/confusion_matrix_neuon.png", label="Confusion Matrix")
# Метрики F1
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()