Skip to content

FscoreLab/Celsus_PLI

Repository files navigation

CT-CLIP Inference API

📋 Описание решения

CT-CLIP Inference API — система автоматического анализа компьютерных томограмм (КТ) грудной клетки. Решение предоставляет REST API для обработки DICOM-архивов и выявления патологий и аномалий.

Назначение

Система разработана для автоматизированной диагностической поддержки врачей-рентгенологов при анализе КТ-исследований. API принимает ZIP-архив с DICOM-файлами и возвращает вероятность наличия патологии в исследовании, а также дополнительную информацию.

Архитектура решения

Система использует ансамбль из пяти моделей:

  1. CT-CLIP Model — предобученная модель на основе Vision Transformer (https://arxiv.org/abs/2403.17834)
  2. Supervised Model — энкодер CT-CLIP, дообученный на размеченных данных с патологиями
  3. Anomaly Diffusion Detector - модель детекции аномалий на основе диффузии
  4. fVLM Model - предобученная модель на основе визуального и текстового энкодера + тонкое контрастивное обучение (благодаря известным анатомическим структурам от TotalSegmentator модель училась сопоставлять каждую часть изображения с её куском текста) (https://openreview.net/pdf?id=nYpPAT4L3D)
  5. MedNeXt Model - supervised-модель на базе архитектуры MedNext с multilabel-классификацией на 22 класса

Предсказания моделей объединяются с помощью двух LightGBM классификаторов на основе градиентного бустинга:

  • Основная модель — универсальная модель для всех типов патологий
  • Thoracic модель — специализированная модель для патологий области органов грудной клетки (ОГК)

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

  • Автоматическая распаковка и обработка ZIP-архивов с DICOM-исследованиями
  • Базовый алгоритм валидации и выбора серии
  • Система возвращает вероятность наличия патологии, а также наиболее вероятную патологию

💻 Системные требования

Минимальные требования

  • ОС: Linux (Ubuntu 20.04+)
  • Docker: Docker >= 20.10
  • Docker Compose: >= 1.29
  • Диск: 50 GB
  • RAM: 32 GB
  • GPU: Nvidia, не менее 12GB vRAM

🚀 Инструкция (локальное развёртывание)

Вариант 1: Использование готового Docker образа (рекомендуется)

1. Скачивание контейнера с моделями

cd api
docker compose pull 

2. Запуск

docker compose up -d

3. Проверка

curl http://localhost:8000/health

Ожидаемый ответ:

{
  "status": "healthy"
}

4. Пример использования

zip -r test_study.zip /path/to/dicom/files/

curl -X POST "http://localhost:8000/predict" \
  -F "file=@test_study.zip" \
  -o result.json

cat result.json | jq .

Вариант 2: Сборка образа из исходников

Требования:

  • Доступ к папке best_models/ с весами моделей
  • Доступ к папке fvlm/weights/ с весами FVLM

1. Сборка образа

cd api
docker compose build

2. Запуск

docker compose up -d

3. Проверка и использование

См. шаги 3-4 из Варианта 1


Локальная разработка (опционально)

Для быстрой итерации без пересборки образа можно использовать volume mounts:

cd api
cp docker-compose.override.yml.example docker-compose.override.yml
# Отредактируйте docker-compose.override.yml, раскомментируйте нужные volume mounts
docker compose up -d

Примечание: docker-compose.override.yml автоматически применяется поверх docker-compose.yml и не коммитится в репозиторий.

🚀 Инструкция (облачное развёртывание)

1. Проверка

curl http://93.187.188.50:7654/health

Ожидаемый ответ:

{
  "status": "healthy"
}

2. Пример использования

zip -r test_study.zip /path/to/dicom/files/

curl -X POST "http://93.187.188.50:7654/predict" \
  -F "file=@test_study.zip" \
  -o result.json

cat result.json | jq .

📁 Структура проекта

Celsus_PLI/
├── api/
│   ├── __init__.py                  # Python пакет инициализация
│   ├── main.py                      # FastAPI приложение
│   ├── inference_service.py         # Логика инференса моделей
│   ├── ctclip_pathology_groups.py   # Группы патологий CT-CLIP
│   ├── requirements.txt             # Python зависимости
│   ├── Dockerfile                   # Docker образ
│   ├── docker-compose.yml           # Docker Compose конфигурация
│   ├── batch_inference_client.py    # Клиент для пакетной обработки
│   ├── prepare_and_run_inference.py # Утилита подготовки DICOM архивов
│   └── run_api.sh                   # Bash скрипт запуска API
│
├── best_models/                     # Предобученные модели (не в репозитории)
│   ├── CT_VocabFine_v2.pt          # CT-CLIP модель
│   ├── supervised_model.pt          # Supervised модель
│   ├── lightgbm_model.pkl           # LightGBM модель
│   ├── ct_classifier.pt             # Diffusion classifier
│   └── diffusion_checkpoint.pt      # Diffusion UNet модель
│
├── CT_CLIP/                         # CT-CLIP пакет
│   └── ct_clip/                     # Основной модуль
│       ├── ct_clip.py               # Основная модель
│       ├── distributed.py           # Распределённое обучение
│       ├── mlm.py                   # Masked Language Modeling
│       ├── tokenizer.py             # Токенизатор
│       └── visual_ssl.py            # Visual SSL
│
├── diffusion_anomaly/               # Diffusion anomaly detection
│   ├── gaussian_diffusion.py        # Gaussian diffusion процесс
│   ├── unet.py                      # U-Net архитектура
│   ├── script_util.py               # Вспомогательные функции
│   └── ...                          # Другие модули diffusion
│
├── fvlm/                            # fVLM модель (контрастивное обучение)
│   ├── inference_nifti_separate_masks.py  # Инференс на NIfTI с масками
│   ├── lct_validation.py            # Валидация легких
│   ├── utils.py                     # Вспомогательные функции
│   ├── requirements.txt             # Все fVLM зависимости
│   ├── requirements_core.txt        # Базовые fVLM зависимости
│   ├── README.md                    # Документация fVLM
│   ├── lavis/                       # LAVIS фреймворк
│   ├── weights/                     # Веса моделей
│   │   ├── fvlm_model.pth           # Основная fVLM модель
│   │   ├── mae_pretrain_vit_base.pth # MAE предобученный ViT
│   │   └── BiomedVLP-CXR-BERT-specialized/ # CXR-BERT веса
│   └── ...                          # Другие модули fvlm
│
├── mednext/                         # MedNeXt архитектура
│   ├── __init__.py
│   ├── mednext_v1.py                # MedNeXt v1 модель
│   ├── mednext_blocks.py            # Блоки MedNeXt
│   ├── mednext_classifier3d.py      # 3D классификатор
│   ├── inference.py                 # Инференс MedNeXt
│   ├── crop_human_body.py           # Обрезка области тела
│   └── artifacts/                   # Артефакты и веса
│
├── transformer_maskgit/             # Transformer MaskGIT
│   └── transformer_maskgit/
│       ├── attention.py             # Attention механизм
│       └── ctvit.py                 # CT Vision Transformer
│
├── scripts/
│   └── universal_ct_inference.py    # Универсальный инференс скрипт
│
├── ct_clip_classifier.py            # CT-CLIP классификатор
├── README.md                        # Этот файл
├── DEPLOYMENT_GUIDE.md              # Руководство по развертыванию
└── USER_GUIDE.md                    # Руководство пользователя

🔌 API Эндпоинты

GET /health — Health Check

curl http://localhost:8000/health

Ответ:

{
  "status": "healthy"
}

POST /predict — Инференс на DICOM архиве

curl -X POST "http://localhost:8000/predict" \
  -F "file=@/path/to/dicom_archive.zip"

Формат ответа (Success):

{
  "study_uid": "1.2.840.113619.2.xxx",
  "series_uid": "1.2.840.113619.2.yyy",
  "probability_of_pathology": 0.87,
  "pathology": 1,
  "top_pathologies": ["Pneumonia", "Consolidation", "Atelectasis"],
  "probability_of_pathology_thoracic": 0.92,
  "pathology_thoracic": 1,
  "processing_status": "Success",
  "time_of_processing": 45.67
}

Описание полей:

  • study_uid — уникальный идентификатор исследования (DICOM StudyInstanceUID)
  • series_uid — уникальный идентификатор серии (DICOM SeriesInstanceUID)
  • probability_of_pathology — вероятность наличия патологии (основная модель, 0.0 - 1.0)
  • pathology — классификация основной модели: 0 (норма) или 1 (патология)
  • top_pathologies — список топ-патологий от основной модели
  • probability_of_pathology_thoracic — вероятность наличия патологии (thoracic модель, 0.0 - 1.0)
  • pathology_thoracic — классификация thoracic модели: 0 (норма) или 1 (патология)
  • processing_status — статус обработки: "Success" или "Failure"
  • time_of_processing — время обработки в секундах

POST /predict_nifti — Инференс на NIFTI файле

Этот endpoint позволяет отправлять NIFTI файлы напрямую, без конвертации из DICOM.

curl -X POST "http://localhost:8000/predict_nifti" \
  -F "file=@/path/to/volume.nii.gz"

Формат ответа: идентичен /predict

Поддерживаемые форматы: .nii.gz, .nii

Формат ответа (Failure):

{
  "study_uid": "",
  "series_uid": "",
  "probability_of_pathology": null,
  "pathology": null,
  "most_dangerous_pathology_type": null,
  "processing_status": "Failure",
  "time_of_processing": 12.34,
  "error": "Описание ошибки"
}

📊 Пакетная обработка директории с DICOM-архивами

python api/batch_inference_client.py \
  --input-dir /path/to/archives/ \
  --output results.xlsx \
  --api-url http://localhost:8000

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages