13 KiB
13 KiB
🦴 DXA Quality Assessment
Описание
Сервис для автоматизированной оценки качества денситометрических исследований (DXA). Система анализирует DICOM-изображения костной денситометрии и определяет качество исследования по следующим критериям:
- Артефакты — движение, размытость, металлические объекты, имплантаты
- Позиционирование — правильное расположение анатомической области в кадре
- Полнота изображения — видимость всех анатомических структур (позвонки L1-L4, бедро)
- Ротация — корректный угол поворота (для исследования бедра)
- ROI-валидация — правильность расположения области интереса
Основные возможности
- 🔬 Анализ DICOM — загрузка и обработка медицинских изображений
- 🧠 Классификация — бинарная оценка качества (OK / Violation)
- 🔍 Детекция нарушений — определение типа нарушения:
correct— качество соответствует нормеartifact_motion— артефакт движенияartifact_other— прочие артефактыposition_error— ошибка позиционированияrotation— нарушение ротацииincomplete_view— неполный видroi_error— ошибка ROIlabeling_error— ошибка разметки
- 🌐 REST API — интеграция с внешними системами
- 📊 Веб-интерфейс — загрузка и визуализация результатов
- 📈 Экспорт — выгрузка результатов в XLSX
Архитектура
┌─────────────────────────────────────────────────────────────┐
│ FastAPI Server │
│ (port 8000) │
├─────────────────────────────────────────────────────────────┤
│ /api/v1/analyze → Basic quality prediction │
│ /api/v1/analyze/detailed → Full report with metrics │
│ /api/v1/analyze/sr → DICOM SR (Structured Report) │
│ /api/v1/batch → Batch processing │
│ /api/v1/export → XLSX export │
├─────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌─────────────────┐ │
│ │ ResNet18 │───▶│ Quality Model │ │
│ │ (pretrained) │ │ (binary class) │ │
│ └──────────────┘ └────────┬────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────┐ │
│ │ Detailed Assessment │ │
│ │ - Motion detection │ │
│ │ - Artifact detection│ │
│ │ - ROI validation │ │
│ │ - View completeness│ │
│ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
Быстрый старт
Требования
- Python 3.10+
- PyTorch 2.0+
- 4GB+ RAM
- (опционально) GPU CUDA/MPS для ускорения
Установка
# Клонирование
git clone https://github.com/yourusername/bone-quality-assessment.git
cd bone-quality-assessment
# Создание виртуального окружения
python -m venv venv
source venv/bin/activate # Linux/Mac
# venv\Scripts\activate # Windows
# Установка зависимостей
pip install -r requirements.txt
# Загрузка модели (опционально)
# Поместите файл модели в models/dxa_model.pth
Запуск сервера
# Локальный запуск
python -m uvicorn src.main:app --host 0.0.0.0 --port 8000
# Или через run.py
python run.py
После запуска:
- Web-интерфейс: http://localhost:8000
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
Docker
# Сборка
docker build -t dxa-quality-api .
# Запуск
docker run -p 8000:8000 dxa-quality-api
API Endpoints
| Метод | Эндпоинт | Описание |
|---|---|---|
| GET | / |
Главная страница (веб-интерфейс) |
| GET | /api/v1/health |
Проверка статуса сервиса |
| POST | /api/v1/analyze |
Базовый анализ изображения |
| POST | /api/v1/analyze/detailed |
Детальный анализ с метриками |
| POST | /api/v1/analyze/sr |
DICOM SR отчёт |
| POST | /api/v1/batch |
Пакетный анализ |
| POST | /api/v1/export |
Анализ и экспорт в XLSX |
Пример использования
# Анализ файла
curl -X POST "http://localhost:8000/api/v1/analyze" \
-H "accept: application/json" \
-H "Content-Type: multipart/form-data" \
-F "file=@/path/to/image.dcm"
# Детальный анализ
curl -X POST "http://localhost:8000/api/v1/analyze/detailed" \
-H "accept: application/json" \
-H "Content-Type: multipart/form-data" \
-F "file=@/path/to/image.dcm"
Ответ детального анализа
{
"anatomical_region": "spine",
"quality_class": 1,
"quality_label": "Violation detected",
"violation_type": "artifact_motion",
"reason": "Обнаружен артефакт движения (размытие)",
"confidence": 0.85,
"confidence_per_class": {
"correct": 0.15,
"violation": 0.85
},
"view_quality": "full",
"metrics": {
"motion": {
"motion_detected": true,
"blur_laplacian": 0.0008,
"severity": "HIGH"
},
"artifacts": {
"any_detected": false,
"metal_detected": false
},
"roi_check": {
"valid": true
}
},
"overall_quality": "POOR",
"severity": "HIGH"
}
Структура проекта
bone_2026/
├── src/
│ ├── main.py # FastAPI приложение
│ ├── run.py # Запуск сервера
│ ├── dxa/ # DXA модуль
│ │ ├── model.py # ResNet18 классификатор
│ │ ├── dataset.py # Загрузчик данных
│ │ ├── train.py # Обучение модели
│ │ └── inference.py # Инференс и batch-обработка
│ ├── quality/ # Оценка качества
│ │ ├── quality_scorer.py # Базовый скорer
│ │ └── detailed_assessment.py # Детальный анализ
│ ├── api/ # REST API
│ │ ├── endpoints.py # Дополнительные эндпоинты
│ │ └── static/ # Веб-интерфейс
│ └── utils/ # Утилиты
├── models/ # Обученные модели
│ └── dxa_model.pth # Модель классификатора
├── dataset_hack/ # Датасет для обучения/тестирования
├── docs/ # Документация
├── Dockerfile
├── requirements.txt
└── README.md
Обучение модели
Подготовка данных
- Разместите DICOM-файлы в
dataset_hack/НД_для_обучения/Исследования/ - Подготовьте Excel-файл разметки
dataset_hack/НД_для_обучения/разметка.xlsx
Столбцы разметки:
study_uid— ID исследованияпозвоночник_укладка,позвоночник_ось,позвоночник_артефакты— критерии для позвоночникабедро_позиция_лев,бедро_roi_лев— критерии для левого бедрабедро_позиция_прав,бедро_roi_прав— критерии для правого бедраитог_позвоночник,итог_бедро_лев,итог_бедро_прав— итоговая оценка (0/1)
Запуск обучения
python src/dxa/train.py \
--epochs 20 \
--batch-size 8 \
--backbone resnet18 \
--output-dir models
Аргументы
| Параметр | По умолчанию | Описание |
|---|---|---|
--data-root |
dataset_hack |
Путь к директории с данными |
--annotation-path |
dataset_hack/НД_для_обучения/разметка.xlsx |
Путь к файлу разметки |
--epochs |
20 | Количество эпох |
--batch-size |
8 | Размер батча |
--backbone |
resnet18 |
Архитектура (resnet18/resnet34/efficientnet_b0) |
--input-size |
224 | Размер входного изображения |
--output-dir |
models |
Директория для сохранения модели |
Инференс
Одиночный файл
python src/dxa/inference.py \
--input-path path/to/image.dcm \
--output-path result.xlsx
Директория
python src/dxa/inference.py \
--input-path dataset_hack/Для\ теста \
--output-path results.xlsx \
--model-path models/dxa_model.pth
Выходной формат (XLSX/CSV)
| Колонка | Описание |
|---|---|
path_to_study |
Путь к директории исследования |
study_uid |
StudyInstanceUID |
image_uid |
SOPInstanceUID |
anatomical_region |
Анатомическая область (spine/hip_left/hip_right) |
quality_class |
Класс качества (0 — OK, 1 — Violation) |
violation_type |
Тип нарушения |
processing_status |
Статус обработки |
time_of_processing |
Время обработки (сек) |
Метрики качества
Детекция движения
- Laplacian variance — дисперсия лапласиана (меньше = сильнее размытие)
- FFT high-frequency ratio — отношение высокочастотной энергии (меньше = размытие)
- Edge duplication — проверка "призрачных" контуров
Детекция артефактов
- Metal detection — яркие области (>99.5 перцентиль)
- Implant detection — линейные структуры (морфологические операции)
- Cement detection — локальные яркие пятна в ROI
- Calcification — малые яркие области вне ROI
Полнота изображения
- Spine: подсчет позвонков (ожидается 3-4), проверка межпозвоночных промежутков
- Hip: проверка видимости шейки бедра, большого/малого вертелов
Валидация ROI
- Проверка отступа от краев (>10 пикселей)
- Проверка размера ROI (>30% высоты, >20% ширины изображения)
Лицензия
MIT License
Команда
- Грачев Денис — Разработка
- Грачев Татьяна — Капитан
Built for Bone Quality Assessment Hackathon 2026