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