bone_2026/README.md

13 KiB
Raw Blame History

🦴 DXA Quality Assessment

Python FastAPI PyTorch

Описание

Сервис для автоматизированной оценки качества денситометрических исследований (DXA). Система анализирует DICOM-изображения костной денситометрии и определяет качество исследования по следующим критериям:

  • Артефакты — движение, размытость, металлические объекты, имплантаты
  • Позиционирование — правильное расположение анатомической области в кадре
  • Полнота изображения — видимость всех анатомических структур (позвонки L1-L4, бедро)
  • Ротация — корректный угол поворота (для исследования бедра)
  • ROI-валидация — правильность расположения области интереса

Основные возможности

  • 🔬 Анализ DICOM — загрузка и обработка медицинских изображений
  • 🧠 Классификация — бинарная оценка качества (OK / Violation)
  • 🔍 Детекция нарушений — определение типа нарушения:
    • correct — качество соответствует норме
    • artifact_motion — артефакт движения
    • artifact_other — прочие артефакты
    • position_error — ошибка позиционирования
    • rotation — нарушение ротации
    • incomplete_view — неполный вид
    • roi_error — ошибка ROI
    • labeling_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

После запуска:

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

Обучение модели

Подготовка данных

  1. Разместите DICOM-файлы в dataset_hack/НД_для_обучения/Исследования/
  2. Подготовьте 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