diff --git a/QWEN.md b/QWEN.md index 4a087e8..6e8accd 100644 --- a/QWEN.md +++ b/QWEN.md @@ -8,6 +8,7 @@ Medical AI service for automated assessment of DXA (bone densitometry) study qua - Analyze DICOM densitometry studies - Determine anatomical region (spine/hip) - Binary classification: quality (OK/violation) +- Detailed violation type detection (motion, artifacts, position, ROI) - Output results in XLSX/CSV format per requirements ### Tech Stack @@ -15,7 +16,7 @@ Medical AI service for automated assessment of DXA (bone densitometry) study qua |-----------|------------| | Backend | Python 3.10, FastAPI, Uvicorn | | ML/Deep Learning | PyTorch, torchvision (ResNet18) | -| Image Processing | PIL, OpenCV, pydicom | +| Image Processing | PIL, OpenCV, pydicom, scipy | | Data Handling | pandas, openpyxl | | Containerization | Docker | @@ -34,25 +35,65 @@ bone_2026/ │ │ ├── train.py # Training script │ │ ├── inference.py # Batch inference │ │ └── __init__.py -│ ├── api/ # REST endpoints +│ ├── api/ # REST endpoints & schemas +│ │ ├── endpoints.py # Original endpoints +│ │ └── static/ # Web UI +│ │ ├── index.html +│ │ └── js/dxa-app.js │ ├── core/ # Orchestrator │ ├── quality/ # Quality scoring -│ ├── segmentators/ # Segmentation models -│ └── classifiers/ # Classification models +│ │ ├── quality_scorer.py # Base scorer +│ │ ├── detailed_assessment.py # NEW: Detailed assessment +│ │ ├── position_validator.py +│ │ └── artifact_detector.py +│ └── segmentators/ # Segmentation models ├── models/ │ └── dxa_model.pth # Trained DXA classifier ├── dataset_hack/ # DICOM datasets -│ ├── Для теста/ # Test data (3 files) -│ └── НД_для_обучения/ # Training data (100 studies, 499 DICOMs) -│ └── разметка.xlsx # Annotation file +│ ├── Для теста/ # Test data +│ └── НД_для_обучения/ # Training data ├── requirements.txt ├── Dockerfile -├── run.sh # Main entry script +├── run.sh └── README.md ``` --- +## Implemented Features (Current) + +### ✅ API Endpoints +| Method | Endpoint | Description | +|--------|----------|-------------| +| GET | `/` | Web interface | +| GET | `/api/v1/health` | Health check | +| POST | `/api/v1/analyze` | Basic analysis | +| POST | `/api/v1/analyze/detailed` | **NEW: Detailed analysis with metrics** | +| POST | `/api/v1/analyze/sr` | **NEW: DICOM SR report** | +| POST | `/api/v1/batch` | Batch processing | +| POST | `/api/v1/export` | Export to XLSX | + +### ✅ Detailed Assessment (`src/quality/detailed_assessment.py`) +- **Motion detection**: Laplacian variance, FFT blur analysis +- **Artifact detection**: Metal, implants, cement, calcifications +- **Spine completeness**: Vertebrae count, alignment, spacing +- **Hip completeness**: Full visibility, aspect ratio +- **Hip rotation**: Major axis angle calculation +- **ROI validation**: Boundary check, margin, size +- **Violation types**: correct, position_error, artifact_motion, artifact_other, labeling_error, incomplete_view, roi_error, rotation + +### ✅ Web Interface +- Drag-and-drop DICOM upload +- Table with results (filter, sort, search) +- **NEW: Detail panel** - click on row to see: + - Violation type + - Reason (human-readable) + - Motion metrics + - Artifact detection + - ROI validation + +--- + ## DXA Module (`src/dxa/`) ### Dataset (`dataset.py`) @@ -61,7 +102,6 @@ bone_2026/ - **Automatically detects anatomical region from image content** - Maps regions: spine, hip_right, hip_left - Quality labels: 0 (OK), 1 (violation) -- Uses the same algorithm as inference for consistency ### Model (`model.py`) - Architecture: ResNet18 (pretrained on ImageNet) @@ -88,20 +128,12 @@ python src/dxa/inference.py \ ### Training ```bash -# Option 1: Direct Python python src/dxa/train.py --epochs 10 - -# Option 2: Via run.sh -bash run.sh train ``` ### Inference ```bash -# Single file python src/dxa/inference.py --input-path file.dcm --output-path result.xlsx - -# Directory (batch) -python src/dxa/inference.py --input-path dataset_hack/Для\ теста --output-path results.xlsx ``` ### API Server @@ -109,10 +141,13 @@ python src/dxa/inference.py --input-path dataset_hack/Для\ теста --outpu python -m uvicorn src.main:app --host 0.0.0.0 --port 8000 ``` +Web UI: http://localhost:8000 + --- ## Output Format (per Hackathon Requirements) +### Basic Output | Column | Description | |--------|-------------| | path_to_study | Path to study directory | @@ -124,6 +159,30 @@ python -m uvicorn src.main:app --host 0.0.0.0 --port 8000 | processing_status | Success / Failure | | time_of_processing | Processing time (seconds) | +### Detailed Output (/api/v1/analyze/detailed) +```json +{ + "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, "severity": "HIGH" }, + "artifacts": { "any_detected": true, "metal_detected": false }, + "roi_check": { "valid": true } + }, + "overall_quality": "POOR", + "severity": "HIGH" +} +``` + --- ## Anatomical Region Detection @@ -143,38 +202,28 @@ The system automatically determines the anatomical region from the DICOM image c - hip_right: L/R ratio > 1.3 (right side brighter) - hip: unclear (fallback) -### Features Used -- Bright region aspect ratio (primary discriminator) -- Image symmetry (secondary for borderline cases) -- Left/right brightness ratio (for hip side detection) +--- -### Fallback -If image analysis fails, uses filename-based detection as fallback. +## Known Issues & Limitations + +1. **Model training** - Needs retraining with new violation types +2. **Dataset size** - Currently ~100 studies, needs 500+ +3. **Segmentation** - Uses simple threshold, needs proper model +4. **F1 score** - Currently ~0.27, needs improvement with weighted loss +5. **Heatmap visualization** - Not implemented (requires model retraining) --- -## Model Performance +## Docker -``` -Training data: 36 samples (80%) -Validation data: 9 samples (20%) - -Note: Limited dataset - more data needed for production +```bash +docker build -t dxa-quality . +docker run -v /data:/data -p 8000:8000 dxa-quality ``` --- -## Annotation Format - -The annotation Excel (`разметка.xlsx`) contains: -- Study UID -- Spine columns: укладка, ось, артефакты -- Hip columns: позиция, ROI (left/right) -- Total columns: итого - ---- - -## Development Conventions +## Development Notes ### Code Style - Follow existing patterns in src/ @@ -185,6 +234,7 @@ The annotation Excel (`разметка.xlsx`) contains: - **DXADataset**: Handles DICOM loading + annotation parsing - **DXAQualityClassifier**: ResNet18-based classifier - **process_dicom_files**: Batch inference with XLSX output +- **generate_quality_report**: Detailed assessment with metrics ### Dependencies All in `requirements.txt`: @@ -193,25 +243,4 @@ All in `requirements.txt`: - `pandas`, `openpyxl` - Data/Excel - `fastapi`, `uvicorn` - Web framework - `Pillow`, `opencv-python-headless` - Image processing - ---- - -## Docker - -```bash -# Build -docker build -t dxa-quality . - -# Run -docker run -v /data:/data -p 8000:8000 dxa-quality -``` - ---- - -## Notes - -- This is a **hackathon project** for DXA quality assessment -- Model trained on limited data (100 studies) -- Binary classification (quality OK / violation) -- **Anatomical region detection via image analysis** (bright region shape + asymmetry) -- Output format matches hackathon requirements (XLSX/CSV) +- `scipy` - Image analysis (blur, artifacts) diff --git a/README.md b/README.md index 6d5a345..7a9478a 100644 --- a/README.md +++ b/README.md @@ -88,11 +88,15 @@ docker-compose up -d | Метод | Эндпоинт | Описание | |--------|-------------------|--------------------------| -| GET | / | Главная страница -| GET | /docs | Swagger UI документация -| GET | /redoc | ReDoc документация -| GET | /api/v1/health | Проверка статуса сервиса -| POST | /api/v1/analyze | Анализ изображения +| GET | / | Главная страница +| GET | /docs | Swagger UI документация +| GET | /redoc | ReDoc документация +| 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 Пример запроса @@ -132,6 +136,46 @@ curl -X POST "http://localhost:8000/api/v1/analyze" \ } ``` +### Детальный анализ (/api/v1/analyze/detailed) + +Возвращает расширенную информацию с детализацией нарушений: + +```json +{ + "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.001, + "severity": "HIGH" + }, + "artifacts": { + "any_detected": false, + "metal_detected": false + }, + "roi_check": { + "valid": true + } + }, + "spine_completeness": { + "valid": true, + "num_vertebrae": 4 + }, + "overall_quality": "POOR", + "severity": "HIGH" +} +``` + 📊 Интерфейс Веб-интерфейс доступен по адресу http://localhost:8000/: @@ -141,6 +185,7 @@ curl -X POST "http://localhost:8000/api/v1/analyze" \ - 🎯 Визуализация маски сегментации - 📈 Детальные метрики качества - 🏷️ Подробный отчет о нарушениях + - 👆 Клик по строке для просмотра деталей 🛠️ Технологии diff --git a/condition.txt b/condition.txt new file mode 100644 index 0000000..b279d10 --- /dev/null +++ b/condition.txt @@ -0,0 +1,209 @@ + +Digital Imaging and Communications in Medicine +— стандарт хранения и передачи медицинских +изображений +DXA / ДРА Двухэнергетическая рентгеновская +абсорбциометрия (денситометрия) +ИИ Искусственный интеллект +ROI Region of Interest — область интереса, +используемая для измерений +MVP Минимально жизнеспособный продукт +AUC Площадь под ROC-кривой +1. Контекст и актуальность задачи +Денситометрия является основным инструментальным методом количественной оценки +минеральной плотности костной ткани и широко применяется для диагностики остеопороза, +оценки риска переломов и динамического наблюдения пациентов. Достоверность результата +зависит не только от работы оборудования, но и от правильности укладки пациента, выбора +исследуемой области, отсутствия значимых артефактов и корректности разметки анатомических +структур. +Ошибки позиционирования и разметки могут приводить к искажению измеряемых +показателей, ошибочной интерпретации динамики и необходимости повторного анализа или +повторного исследования. При этом контроль качества обычно выполняется специалистом +вручную и требует знания критериев корректности для разных анатомических областей. +Применение алгоритмов компьютерного зрения позволяет объективизировать +и стандартизировать контроль качества, автоматически выявлять типовые нарушения +и своевременно сообщать специалисту о необходимости коррекции разметки или повторной +обработки исследования. Такое решение потенциально снижает нагрузку на врача- +рентгенолога и рентгенолаборанта, повышает воспроизводимость измерений и формирует +единый подход к контролю качества денситометрии в медицинских организациях. +Участникам предлагается создать интеллектуальный сервис, который не просто распознаёт +изображение, а выступает цифровым помощником по контролю качества: проверяет, можно ли +использовать исследование для клинической интерпретации, оценивает корректность +нанесённых областей измерения и объясняет, какое именно нарушение обнаружено. + +2. Описание задачи +Разработать программное обеспечение на основе искусственного интеллекта для +автоматизированной оценки качества рентгеновских денситометрических исследований и +корректности разметки анатомических структур. +На вход сервис получает денситометрическое исследование в формате DICOM. Решение +должно определить, соответствует ли изображение установленным критериям качества, +корректно ли выполнена разметка, а при наличии нарушения — определить его тип. Основная +задача — обеспечить автоматизированный контроль качества без необходимости первичного +ручного просмотра каждого исследования специалистом. +2.1. Объекты анализа +В базовый контур задачи рекомендуется включить денситометрические исследования +следующих анатомических областей: +• поясничный отдел позвоночника; +• проксимальный отдел бедренной кости. +Допускается разработка единой модели для всех областей либо отдельных +специализированных моделей с автоматическим определением области исследования. +2.2. Основной функционал +• определение анатомической области и проекции исследования; +• классификация исследования как качественного или содержащего нарушение качества; +• оценка корректности укладки и позиционирования пациента по стандартным критериям; +• оценка корректности разметки анатомических структур и областей измерения; +• определение одного или нескольких типов нарушения качества; +• формирование структурированного отчёта с результатами работы. +2.3. Перечень оцениваемых нарушений +От решения требуется рассматривать следующие категории: +1. Поясничный отдел позвоночника +• корректная укладка (на нижнем уровне сканирования визуализированы верхние края +подвздошных костей, верхний уровень — половина тела позвонка Th12) + +2.4. Входные данные +• Исследования в формате DICOM без разметки. +• Одно исследование может включать одно или несколько изображений/серий +(не более 3). +• Метаданные DICOM могут использоваться моделью, однако решение не должно зависеть +от наличия персональных данных. +• Организатор предоставляет обезличенные изображения и часть исследований +с экспертной разметкой. +3 см +и более +2 см +и более +3 см + +2.5. Требования к выходным данным +Решение должно формировать итоговый файл в формате .xlsx или .csv. Одна строка +соответствует одному изображению (одна анатомическая область) в исследовании. +Рекомендуемая структура: +Название колонки Описание Формат +path_to_study Путь к исследованию или файлу String +study_uid Идентификатор исследования из +DICOM-тегов String +image_uid Идентификатор изображения из +DICOM-тегов String +anatomical_region Определённая анатомическая область String +quality_class 0 — качественное, 1 — есть нарушение Integer +violation_type Тип или перечень нарушений String +processing_status Success / Failure String +time_of_processing Время обработки в секундах Float +2.6. Дополнительный функционал +• Дополнительная серия с визуализацией обнаруженного нарушения на изображении: +маска, контур, ключевые точки или тепловая карта. +• Текстовое описание выявленных нарушений в формате DICOM SR. +• Автоматическая коррекция разметки с возможностью подтверждения специалистом. +• Интерактивный веб-интерфейс для загрузки, просмотра и пакетной обработки +исследований. +2.7. Технические требования +• Время обработки одного исследования: не более 3 минут на целевой конфигурации. +• Отсутствие необработанных исключений; все ошибки фиксируются в отчёте. +• Воспроизводимость результатов при повторном запуске на одинаковых данных. +• Возможность пакетной обработки исследований из архива с предоставлением общей +таблицы (xlsx/csv) в качестве результата обработки, а также zip-архива с дополнительными +сериями (при наличии функционала) + +3. Программно-аппаратные требования +3.1. Аппаратные требования +Специальные аппаратные ограничения не предъявляются при условии выполнения +функциональных и нефункциональных требований. Участник должен указать минимальную +и рекомендуемую конфигурацию для инференса: объём оперативной памяти, требования +к процессору и графическому ускорителю, объём дискового пространства. +Конфигурация оборудования, на котором будет проводиться финальное тестирование: +2 × H200 141 GB, каждая H200 в своей виртуальной машине c флейвором GPU-44-256-H200-1 +(44 CPU, 256 RAM, 141 VRAM). +3.2. Программные требования +• Выбор языка программирования, библиотек машинного обучения и архитектуры решения +остаётся на усмотрение участников. +• Обязательна контейнеризация решения. +• Участники должны предоставить скрипт для сборки и запуска контейнеризированного +приложения в Linux и UNIX-подобных системах. +• Решение должно запускаться локально без обращения к внешним закрытым сервисам +и без передачи медицинских изображений во внешние системы. +• Должен быть реализован API для пакетной обработки тестового набора данных. +• Все используемые зависимости, включая версии библиотек, сред выполнения и базового +контейнера, должны быть зафиксированы. +4. Требования к презентации/демонстрации +Презентация должна показать не только итоговые метрики, но и логику клинического +контроля качества. Команде необходимо продемонстрировать: +• описание и обоснование выбранного подхода; +• архитектуру модели и программного решения; +• состав наборов данных, правила разбиения выборки и методы предобработки; +• таксономию нарушений качества и подход к исследованиям с несколькими нарушениями; +• результаты экспериментов, сравнение вариантов модели и анализ ошибок; +• метрики качества с доверительными интервалами; +• скорость обработки и системные требования; +• ограничения решения и сценарий дальнейшего внедрения; +• кейсы, демонстрирующие работу решения. + + +• описание структуры проекта; +• системные требования и перечень зависимостей; +• инструкцию по сборке и запуску контейнеризированного приложения; +• описание реализованного API; +• описание формата входных и выходных данных; +• описание модели, предобработки и постобработки; +• перечень известных ошибок и способы их обработки. +Дополнительно предоставляются руководство пользователя, руководство +по развёртыванию и краткое описание процедуры обучения или дообучения модели. +6. Ресурсы +• Обезличенные медицинские изображения денситометрии в формате DICOM +с экспертной оценкой качества (НД_для_обучения.zip). +• Описание критериев качества и примеры корректной разметки — можно детальнее +изучить в методических рекомендациях в разделах 2.6, 2.7. +• Фрагмент данных для проверки формата и отладки загрузчика (Для теста.zip). +• Закрытый тестовый набор для финальной оценки, не передаваемый участникам. +7. Требования к сдаче решений +7.1. Требования для промежуточной сдачи решения +Промежуточная сдача предусматривает предоставление MVP, включающего: +• обученную модель и скрипт инференса; +• модуль чтения DICOM и пакетной обработки; +• определение как минимум бинарного класса «качественное / есть нарушение»; +• оценку корректности разметки для как минимум одной анатомической области; +• файл с результатами в согласованном формате; +• расчёт основных метрик на валидационной выборке; +• краткая инструкция по работе с моделью; +• описание текущих ограничений и план доработки + + +• поддержку всех обязательных анатомических областей и классов нарушений, +утверждённых организатором; +• скрипт для сборки и запуска контейнеризированного приложения; инструкция +по запуску скрипта в Linux и Unix-подобных системах; +• устойчивую пакетную обработку закрытого тестового набора; +• структурированный файл результатов; +• полный комплект документации; +• презентацию и демонстрационный сценарий; +• исходный код либо иной комплект материалов в объёме, установленном правилами +конкурса. +Финальная проверка проводится экспертами на закрытых данных без участия команды. +Расчёт итоговых метрик выполняется на стороне организатора. +8. Критерии оценки +8.1. Подход коллектива к решению задачи +Оцениваются понимание клинической задачи, обоснованность таксономии нарушений, +подход к формированию обучающей выборки, работа с дисбалансом классов и предотвращение +утечки данных между обучающей и тестовой выборками. +8.2. Техническая проработка решения +Оцениваются архитектура модели, качество предобработки DICOM, корректность работы с +изображениями, устойчивость программной реализации, обработка ошибок, контейнеризация, +воспроизводимость работы. +8.3. Соответствие решения поставленной задаче +Оцениваются полнота выполнения обязательных функций, соответствие форматов входных +и выходных данных, поддержка заявленных анатомических областей, прозрачность ограничений +и пригодность решения для локального использования + + +• сбалансированная точность и F1-мера; +• ROC AUC и/или PR AUC для бинарной классификации; +• macro-F1 для многоклассового или мультилейбл-определения типов нарушений; +• метрики локализации или сегментации — Dice, IoU, расстояние между ключевыми точками +— при наличии соответствующего функционала; +• время обработки одного исследования и доля успешно обработанных файлов. +Приоритетной клинической характеристикой являются F1-мера и ROC-AUC, +как сбалансированные метрики работы решения. Метрики диагностической точности +желательно представлять с 95% доверительными интервалами. +8.5. Выступление коллектива на питч-сессии +Оцениваются владение материалом, способность объяснить клиническую и техническую +логику решения, качество демонстрации, аргументированность выбранных подходов, понимание +ограничений и реалистичность плана пилотирования и внедрения \ No newline at end of file diff --git a/condition_doctor.txt b/condition_doctor.txt new file mode 100644 index 0000000..a67b51b --- /dev/null +++ b/condition_doctor.txt @@ -0,0 +1,17 @@ +Модель должна оценивать на изображении: положение костей, их взаимное расположение, качество контуров, правильность разметки, наличие движения, артефактов и перекрытий. +Итог должен иметь только одну из двух категорий: «пригоден» или «непригоден». Категория «пригоден» означает, что по изображению нет видимых причин, которые помешали бы специалисту выполнить дальнейший анализ. Это не означает, что снимок диагностически нормальный, что минерализация костей нормальная или что окончательное исследование уже выполнено. Категория «непригоден» означает, что на изображении есть хотя бы одна существенная проблема: нужная область не видна полностью, видимая геометрия сильно нарушена, разметка неверна, есть значимый артефакт, контуры костей нельзя надёжно определить, изображение смазано или область интереса проведена неправильно. + +Сначала нужно определить, какая область исследуется. На снимке должен быть узнаваемый поясничный отдел позвоночника или тазобедренный сустав, в зависимости от поставленной задачи. Нужная область должна быть видна достаточно полно. Если часть позвоночника, бедренная шейка или проксимальный отдел бедра обрезаны, закрыты или находятся за пределами изображения, снимок нужно считать непригодным. Если модель не может уверенно понять, какая анатомическая область показана, снимок также непригоден для автоматического дальнейшего анализа. + +Для поясничного отдела нужно проверить, что тела поясничных позвонков видны, их контуры различимы, межпозвонковые промежутки не закрыты полностью, а позвоночник не имеет выраженного поворота или перекоса. В стандартном исследовании обычно оценивается область L1-L4. На изображении не должно быть сильного наложения костей, заметного размытия или такого искажения, при котором невозможно отделить один позвонок от другого. Если нужные позвонки видны достаточно хорошо и их границы можно уверенно определить, этот критерий выполнен. +При проверке позвонков нужно смотреть не только на подписи, но и на анатомию. Метка L1 должна стоять на L1, метка L2 на L2, метка L3 на L3, а метка L4 на L4. Нельзя допускать пропущенный позвонок, двойную метку, смещение метки на соседний позвонок или включение в анализ другой структуры. Позвонки обычно считают снизу вверх, но у людей бывают анатомические варианты: может быть четыре или шесть поясничноподобных позвонков, а также переходный пояснично-крестцовый позвонок. Поэтому нельзя автоматически исправлять разметку по шаблону. Если по самому изображению нельзя уверенно определить уровень позвонка, снимок нужно считать непригодным для автоматического использования. +Если разметка на снимке отсутствует, это не всегда означает непригодность. Важно, можно ли по видимой анатомии однозначно понять, где находятся нужные позвонки, чтобы специалист мог выполнить разметку. Если анатомия видна ясно и уровни можно определить без догадки, снимок может быть пригоден. Если же без отсутствующей информации невозможно уверенно определить уровни, снимок нужно считать непригодным. +Для тазобедренного сустава должны быть видны проксимальный отдел бедренной кости, головка бедра, шейка бедра, вертелы и необходимые окружающие ткани. Бедренная шейка не должна быть обрезана, закрыта или полностью перекрыта соседней костью. Область должна быть показана так, чтобы специалист мог выделить шейку бедра и total hip по анатомическим границам. На снимке бедра нужно проверить видимую геометрию конечности. В обычной правильной проекции бедро поворачивают внутрь примерно на 15–20 градусов. По изображению это оценивают не по словам оператора, а по форме костей. Малый вертел обычно должен быть виден лишь немного. Если он виден слишком хорошо, это может говорить о недостаточной внутренней ротации. Если бедро сильно повернуто, шейка выглядит укороченной или искажённой, кости перекрываются, а правильные границы нельзя определить, снимок нужно считать непригодным. Модель не должна писать, что пациент точно лежал неправильно. Правильнее описывать видимый результат: «на изображении выраженная ротация бедра, из-за этого анатомические границы искажены». Причина укладки может быть одной из возможных причин, но по одному обезличенному снимку она не подтверждается. Если изображение позволяет уверенно увидеть нужные структуры и выраженной деформации проекции нет, этот критерий считается выполненным. +Разметка тазобедренного сустава должна находиться на правильной кости. Область шейки бедра должна проходить именно по шейке и не заходить на большой вертел. Область total hip должна соответствовать проксимальному отделу бедра и не должна включать соседнюю кость или большое количество мягких тканей вместо кости. Если границы области интереса явно смещены, пересекают мягкие ткани, захватывают соседнюю кость или обрезают часть нужной кости, снимок непригоден. Правое и левое бедро нужно проверять отдельно. Если одно бедро выглядит правильно, это не делает автоматически пригодным второе. Если на анализируемом бедре видны эндопротез, винты, пластины, фиксаторы или другой материал, который пересекает область бедра, эту сторону нужно считать непригодной для стандартного дальнейшего анализа. Противоположное бедро может быть пригодным, но только если оно само полностью видно и на нём нет таких проблем. +На каждом снимке нужно искать артефакты. Артефакт - это посторонний объект или дефект изображения, который может закрывать кость, менять её контур или мешать правильной разметке. К артефактам относятся металлические части одежды, застёжки, клипсы, проволока, хирургические фиксаторы, эндопротезы, винты, цемент после операций, имплантируемые устройства, контрастное вещество, нерастворившиеся таблетки кальция и другие плотные объекты. Также нужно учитывать резкие полосы, необычные пятна, локальные участки сильной плотности, раздвоение контуров и другие неестественные элементы. Артефакт, который находится далеко от исследуемой области и не мешает видеть кость, не обязательно делает снимок непригодным. Но если артефакт находится внутри поясничного отдела, в области бедренной шейки, total hip или на границе области интереса, снимок нужно считать непригодным. Если модель не может надёжно понять, мешает ли артефакт анализу, она также должна выбрать «непригоден», потому что в этой задаче сомнительные случаи не пропускаются автоматически. +На поясничном снимке особенно важно искать хирургический материал и фиксаторы позвоночника, металлические клипсы или проволоку, цемент, имплантируемые устройства, крупные кальцинаты, контрастный материал и другие объекты, которые закрывают позвонки. На снимке бедра нужно искать эндопротез, винты, пластины, остаточные изменения после остеосинтеза, глютеальные импланты и другие объекты, проходящие через область бедра. Модель не должна ставить диагноз по этим объектам. Она должна только решить, мешают ли они дальнейшему анализу изображения. +Нужно проверять наличие движения во время сканирования. Видимые признаки движения - размытие, раздвоение костных контуров, несовпадение краёв, неодинаковая резкость разных частей изображения и невозможность провести устойчивую границу кости. Если движение мешает различать позвонки, бедренную шейку или total hip, снимок непригоден. Отсутствие размытия не доказывает, что движения не было вообще; оно означает только, что на изображении нет очевидного признака, мешающего дальнейшему анализу. Нужно проверять видимую форму костей. Если позвонок сильно деформирован, имеет необычно уменьшенную высоту, перекрыт или его границы нельзя определить, он может быть непригоден для дальнейшей разметки. Если из-за этого не остаётся достаточного количества хорошо видимых позвонков, весь снимок поясничного отдела нужно считать непригодным. Для бедра аналогично нужно учитывать выраженную деформацию, нарушение нормального контура, тяжёлую дисплазию или другое структурное изменение, из-за которого нельзя уверенно определить шейку, вертелы и проксимальный отдел бедра. Необходимо считать снимок непригодным, если видимое изменение мешает провести правильные анатомические границы. +Отдельно проверяются границы областей интереса. Край выделенной области должен совпадать с видимым краем кости. Нельзя включать мягкие ткани вместо кости, нельзя пропускать часть кости, нельзя захватывать соседний позвонок или соседнюю кость. Для позвоночника нужно проверить разделение соседних позвонков и положение области относительно тел позвонков. Для бедра нужно проверить область шейки, большой и малый вертел, внешний контур проксимального отдела и отсутствие значимого включения мягких тканей. Ошибка границы является достаточной причиной признать снимок непригодным, даже если всё изображение выглядит резким. +Если в обезличенном DICOM отсутствуют имя, номер пациента, дата рождения или другие личные данные, это само по себе не является причиной брака. Обезличивание не делает снимок непригодным. Но модель не должна восстанавливать из изображения возраст, пол, сторону исследования, производителя аппарата, протокол или другие невидимые сведения. Эти данные не входят в задачу оценки изображения. Если без них невозможно подтвердить, что показана нужная область или что разметка соответствует конкретному протоколу, снимок нужно считать непригодным для автоматического использования, а не заполнять недостающие сведения догадкой. +В результате модель должна отвечать примерно так: «Пригоден. Поясничный отдел виден полностью, выраженного движения и значимых артефактов нет, видимая разметка соответствует анатомии, границы области определяются». Либо так: «Непригоден. В области L2–L3 есть выраженное размытие и неправильное разделение тел позвонков; надёжная дальнейшая разметка невозможна». Для бедра пример формулировки может быть таким: «Непригоден. Выраженная ротация бедра и неправильное положение области шейки не позволяют надёжно определить анатомические границы». Это только примеры формы ответа; решение всегда должно основываться на конкретных видимых признаках. +Главное правило такое: пригодным считается только тот снимок, на котором нужная анатомия полностью видна, её границы различимы, выраженной ротации или движения нет, разметка соответствует анатомии, область интереса проведена правильно, а значимые артефакты не закрывают исследуемую зону. Если хотя бы один существенный пункт нарушен или его нельзя подтвердить по изображению, снимок нужно считать непригодным и передать на ручную проверку. В этой задаче лучше ошибочно направить сомнительный снимок специалисту, чем пропустить изображение, которое может привести к неправильному дальнейшему исследованию. diff --git a/example.jpg b/example.jpg deleted file mode 100755 index b4acd1a..0000000 Binary files a/example.jpg and /dev/null differ diff --git a/example2.jpg b/example2.jpg deleted file mode 100644 index cb92134..0000000 Binary files a/example2.jpg and /dev/null differ diff --git a/src/api/schemas/quality_response.py b/src/api/schemas/quality_response.py index 8b2250f..5441261 100644 --- a/src/api/schemas/quality_response.py +++ b/src/api/schemas/quality_response.py @@ -11,4 +11,48 @@ class QualityResponse(BaseModel): metrics: Dict[str, Any] position_validation: Optional[Dict[str, Any]] = None artifact_validation: Optional[Dict[str, Any]] = None - mask: Optional[str] = None # base64 encoded mask image \ No newline at end of file + mask: Optional[str] = None # base64 encoded mask image + + # New detailed fields + violation_type: Optional[str] = None + reason: Optional[str] = None + confidence_per_class: Optional[Dict[str, float]] = None + view_quality: Optional[str] = None + anatomical_region: Optional[str] = None + + +class DetailedQualityResponse(BaseModel): + """Detailed quality assessment response with all metrics""" + # Basic info + study_uid: str = "" + image_uid: str = "" + anatomical_region: str + quality_class: int + quality_label: str + + # Detailed violation info + violation_type: str + reason: str + + # Confidence + confidence: float + confidence_per_class: Dict[str, float] + + # View quality + view_quality: str + + # All metrics + metrics: Dict[str, Any] + + # Region-specific + spine_completeness: Optional[Dict[str, Any]] = None + vertebral_contours: Optional[Dict[str, Any]] = None + hip_completeness: Optional[Dict[str, Any]] = None + hip_rotation: Optional[Dict[str, Any]] = None + + # Overall + overall_quality: str + severity: str + + # Visualization + mask: Optional[str] = None \ No newline at end of file diff --git a/src/api/static/index.html b/src/api/static/index.html index ec21744..6cef7de 100644 --- a/src/api/static/index.html +++ b/src/api/static/index.html @@ -244,6 +244,69 @@ + + +