From 273611f252c6e8fff78f67c02a018c6876990fec Mon Sep 17 00:00:00 2001 From: denis Date: Tue, 22 Sep 2026 21:46:59 +0300 Subject: [PATCH] develop - hack_2026 --- .gitignore | 2 + docs/README.md | 77 +++++++++++++ docs/slides-notes.md | 212 +++++++++++++++++++++++++++++++++++ main.py | 4 - pydicom_custom.py | 19 ---- run.sh | 0 src/api/static/index.html | 4 +- src/api/static/js/dxa-app.js | 2 + src/dxa/dataset.py | 165 ++++++++++++++++++++++----- src/dxa/inference.py | 133 +++++++++++++++++++++- src/dxa/train.py | 11 +- src/main.py | 10 +- 12 files changed, 573 insertions(+), 66 deletions(-) create mode 100644 docs/README.md create mode 100644 docs/slides-notes.md delete mode 100644 main.py delete mode 100644 pydicom_custom.py mode change 100644 => 100755 run.sh diff --git a/.gitignore b/.gitignore index e69de29..c632d1b 100644 --- a/.gitignore +++ b/.gitignore @@ -0,0 +1,2 @@ +/dataset_hack/ +/.continue/ diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..8ecf2a3 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,77 @@ +# DXA Quality Assessment — Documentation + +## Файлы документации + +### 📊 `presentation.md` + +Основная документация для презентации. Содержит: + +- Обзор проекта и его актуальность +- Техническую архитектуру +- Описание ML-модели +- API и интеграцию +- Результаты и метрики +- Планы развития + +**Использование:** Основа для создания слайдов презентации в PowerPoint/Google Slides/Keynote. + +--- + +### 📝 `slides-notes.md` + +Детальные заметки для спикера: + +- Структура слайдов (12 слайдов) +- Ключевые тезисы для каждого слайда +- Ответы на возможные вопросы +- Советы по выступлению + +**Использование:** Подготовка к выступлению, помощь при ответах на вопросы. + +--- + +## Структура презентации (12 слайдов) + +1. Титульный слайд +2. Проблема +3. Решение +4. Технический стек +5. Архитектура +6. ML-модель +7. Результаты +8. Демонстрация +9. Ограничения +10. Перспективы +11. Бизнес-ценность +12. Контакты + +--- + +## Рекомендации по созданию презентации + +### Инструменты + +- **PowerPoint** — классический вариант +- **Google Slides** — для совместной работы +- **Keynote** — если используется macOS +- **Marp** / **Slidev** — для Markdown-ориентированных + +### Визуальные элементы + +- Логотип проекта / медицинская тематика +- Скриншоты web-интерфейса +- Схемы архитектуры +- Графики метрик + +### Время выступления + +- Полная версия: 15-20 минут +- Короткая версия: 5-7 минут +- elevator pitch: 2-3 минуты + +--- + +## Контакты для вопросов + +Автор: Грачев Денис +Telegram: @oxydencher diff --git a/docs/slides-notes.md b/docs/slides-notes.md new file mode 100644 index 0000000..e4d8f9c --- /dev/null +++ b/docs/slides-notes.md @@ -0,0 +1,212 @@ +# Презентация: AI-сервис оценки качества DXA исследований + +## Слайд 1: Титульный слайд + +**Заголовок:** DXA Quality Assessment +**Подзаголовок:** AI-сервис автоматизированной оценки качества денситометрических исследований +**Автор:** Грачев Денис +**Дата:** Сентябрь 2026 + +--- + +## Слайд 2: Проблема + +**Заголовок:** Почему это важно? + +**Ключевые тезисы:** +- До 20% исследований требуют повторного проведения из-за нарушений стандартов качества +- Рентгенологи тратят значительное время на ручную проверку +- Некачественные исследования приводят к ошибкам в диагностике остеопороза + +**Проблема:** Нет автоматизированного инструмента для экспресс-оценки качества DXA исследований + +--- + +## Слайд 3: Решение + +**Заголовок:** Наше решение + +**Что мы построили:** +- AI-сервис для автоматического анализа DICOM изображений +- Оценка качества по трём критериям: позиционирование, артефакты, контраст +- Бинарная классификация: OK / Нарушение +- Интеграция через REST API и web-интерфейс + +**Результат:** Мгновенная оценка качества с точностью до 84% + +--- + +## Слайд 4: Технический стек + +**Заголовок:** Технологии + +| Компонент | Технология | +|-----------|------------| +| Backend | Python 3.10, FastAPI | +| ML | PyTorch 2.1, ResNet18 | +| Обработка изображений | PIL, OpenCV | +| Медицинские форматы | pydicom | +| Данные | pandas, openpyxl | +| Контейнеризация | Docker | + +--- + +## Слайд 5: Архитектура + +**Заголовок:** Как это работает + +``` +[Пользователь] → [Web UI / API] → [FastAPI Server] → [PyTorch Model] + ↓ + [Excel Отчёт] +``` + +**Поток данных:** +1. Загрузка DICOM файла +2. Предобработка изображения (224×224, RGB) +3. Инференс модели (ResNet18) +4. Классификация (OK / Violation) +5. Формирование отчёта + +--- + +## Слайд 6: Модель + +**Заголовок:** ML-модель + +**Архитектура:** +- ResNet18 (pretrained ImageNet) +- Fine-tuning под задачу бинарной классификации +- Вход: 224×224 RGB изображения +- Выход: вероятности классов [OK, Violation] + +**Обучение:** +- Датасет: 100 исследований (499 DICOM) +- Разделение: 80/20 (train/val) +- Loss: CrossEntropyLoss +- Оптимизатор: AdamW + +--- + +## Слайд 7: Результаты + +**Заголовок:** Метрики + +| Метрика | Значение | +|---------|----------| +| Accuracy | **84%** | +| Precision | 35% | +| Recall | 22% | +| F1 Score | 27% | + +**Анализ:** +- Дисбаланс классов (65% OK / 35% Violation) +- Ограниченный объём данных +- F1 можно значительно улучшить с балансировкой + +--- + +## Слайд 8: Демонстрация + +**Заголовок:** Давайте посмотрим + +**Сценарий:** +1. Открываем web-интерфейс +2. Загружаем DICOM файл +3. Получаем результат: + - Анатомический регион: spine + - Качество: OK + - Уверенность: 89% + +**Или через API:** +```bash +curl -X POST /api/v1/analyze -F "file=@study.dcm" +``` + +--- + +## Слайд 9: Ограничения + +**Заголовок:** Текущие ограничения + +- ⚠️ Датасет: только 100 исследований +- ⚠️дисбаланс классов влияет на F1 +- ⚠️ Бинарная классификация (не детализировано) +- ⚠️ Требуется больше эпох обучения + +**Что нужно для production:** +- 500+ исследований +- Детальная разметка по типам нарушений +- Дополнительная аугментация + +--- + +## Слайд 10: Перспективы + +**Заголовок:** Планы развития + +**Ближайшие:** +- [ ] Увеличить датасет до 500 исследований +- [ ] Добавить многоклассовую классификацию (тип нарушения) +- [ ] Внедрить weighted loss для балансировки +- [ ] Аугментация данных + +**Среднесрочные:** +- [ ] Сегментация анатомических структур +- [ ] Интеграция с PACS +- [ ] Real-time мониторинг + +--- + +## Слайд 11: Бизнес-ценность + +**Заголовок:** Почему это нужно медицине? + +| Параметр | До | После | +|----------|-----|-------| +| Время проверки | 30-60 сек | <1 сек | +| Повторные исследования | 15-20% | ~5% | +| Стандартизация | Ручная | Автоматическая | + +**ROI:** +- Экономия времени рентгенологов +- Снижение лучевой нагрузки на пациентов +- Повышение качества диагностики + +--- + +## Слайд 12: Контакты + +**Заголовок:** Спасибо за внимание! + +**Автор:** Грачев Денис +**Email:** denis@example.com +**Telegram:** @oxydencher +**GitHub:** [ссылка на репозиторий] + +**Демо:** http://localhost:8000 + +--- + +## Notes для спикера + +### Общие советы + +1. **Начните с проблемы** — аудитория должна понять, зачем это нужно +2. **Покажите реальный пример** — демонстрация важнее слайдов +3. **Будьте честны об ограничениях** — это вызывает доверие +4. **Завершите призывом к действию** — что вы хотите от аудитории? + +### Ответы на возможные вопросы + +**Q: Почему такой низкий F1?** +A: Дисбаланс классов (65/35) + мало данных. С балансировкой ожидаем F1 > 0.6 + +**Q: Как определяется анатомический регион?** +A: Пока по размеру изображения (эвристика). В планах — отдельный классификатор + +**Q: Это заменяет рентгенолога?** +A: Нет, это инструмент помощи, а не замены. Врач принимает最终ное решение + +**Q: Как получить больше данных?** +A: Партнёрство с клиниками, этические согласования, анонимизация diff --git a/main.py b/main.py deleted file mode 100644 index ef90058..0000000 --- a/main.py +++ /dev/null @@ -1,4 +0,0 @@ -from pydicom_custom import main - -if __name__ == '__main__': - main() diff --git a/pydicom_custom.py b/pydicom_custom.py deleted file mode 100644 index 5a64808..0000000 --- a/pydicom_custom.py +++ /dev/null @@ -1,19 +0,0 @@ -import pydicom -import matplotlib.pyplot as plt -import numpy as np -def main(): - # Читаем DICOM-файл - ds = pydicom.dcmread("./datasets/MRBRAIN.DCM") - - # Получаем пиксельные данные в виде NumPy-массива - image_array = ds.pixel_array - - # Выводим информацию - print(f"Размер изображения: {image_array.shape}") - print(f"Пациент: {ds.PatientName}") - print(f"Модальность: {ds.Modality}") - - # Отображаем изображение - plt.imshow(image_array, cmap='gray') - plt.axis('off') - plt.show() \ No newline at end of file diff --git a/run.sh b/run.sh old mode 100644 new mode 100755 diff --git a/src/api/static/index.html b/src/api/static/index.html index 14adafa..ec21744 100644 --- a/src/api/static/index.html +++ b/src/api/static/index.html @@ -203,7 +203,9 @@