314 lines
9.9 KiB
Markdown
314 lines
9.9 KiB
Markdown
# 🦴 Bone Quality Assessment
|
||
|
||
[](https://www.python.org/)
|
||
[](https://fastapi.tiangolo.com/)
|
||
[](https://pytorch.org/)
|
||
[](https://www.docker.com/)
|
||
|
||
## 📋 Описание
|
||
|
||
Сервис искусственного интеллекта для автоматизированной оценки качества денситометрических изображений и их разметки. Система получает на вход рентгеновское денситометрическое исследование в формате DICOM, и оценивает качество выполнения исследования по стандартным критериям, а также корректность разметки анатомических структур на изображениях.
|
||
|
||
### Основные возможности
|
||
|
||
- 🖼️ **Анализ изображений** — загрузка и обработка медицинских изображений
|
||
- 🧠 **Сегментация объектов** — выделение анатомических структур (позвонки, кости)
|
||
- 📊 **Оценка качества** — проверка по 3 критериям:
|
||
- Артефакты (движение, шум, размытость)
|
||
- Позиционирование (правильное расположение объекта)
|
||
- Контрастность (качество изображения)
|
||
- 🔍 **Детекция нарушений** — определение типа нарушения для некачественных исследований
|
||
- 🌐 **Web-интерфейс** — удобная загрузка и визуализация результатов
|
||
- 📡 **REST API** — интеграция с внешними системами
|
||
- 📈 **Визуализация маски** — отображение сегментации на изображении
|
||
|
||
## 🏗️ Архитектура
|
||
|
||

|
||
|
||
## 🎯 Доступные режимы
|
||
|
||
### DXA Режим (хакатон)
|
||
Анализ денситометрических исследований:
|
||
```bash
|
||
# Обучение
|
||
python src/dxa/train.py --epochs 10
|
||
|
||
# Инференс
|
||
python src/dxa/inference.py --input-path dataset_hack/Для\ теста --output-path results.xlsx
|
||
```
|
||
|
||
|
||
## 🚀 Быстрый старт
|
||
|
||
### Требования
|
||
|
||
- Python 3.10+
|
||
- PyTorch 2.1+
|
||
- Docker (опционально)
|
||
|
||
### Локальная установка
|
||
|
||
```bash
|
||
# 1. Клонирование репозитория
|
||
git clone https://github.com/yourusername/bone-quality-assessment.git
|
||
cd bone-quality-assessment
|
||
|
||
# 2. Создание виртуального окружения
|
||
python -m venv venv
|
||
source venv/bin/activate # Linux/Mac
|
||
# или
|
||
venv\Scripts\activate # Windows
|
||
|
||
# 3. Установка зависимостей
|
||
pip install -r requirements.txt
|
||
|
||
# 4. Загрузка обученной модели (опционально)
|
||
# Поместите модель в папку models/dxa_model.pth
|
||
|
||
# 5. Запуск сервера
|
||
python run.py
|
||
```
|
||
|
||
Docker
|
||
|
||
```bash
|
||
# 1. Сборка образа
|
||
docker build -t bone-quality-api .
|
||
|
||
# 2. Запуск контейнера
|
||
docker run -p 8000:8000 bone-quality-api
|
||
|
||
# 3. Или используя docker-compose
|
||
docker-compose up -d
|
||
```
|
||
|
||
|
||
📡 API Endpoints
|
||
|
||
| Метод | Эндпоинт | Описание |
|
||
|--------|-------------------|--------------------------|
|
||
| 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
|
||
|
||
|
||
Пример запроса
|
||
```bash
|
||
curl -X POST "http://localhost:8000/api/v1/analyze" \
|
||
-H "accept: application/json" \
|
||
-H "Content-Type: multipart/form-data" \
|
||
-F "file=@/path/to/image.jpg"
|
||
```
|
||
|
||
Пример ответа
|
||
|
||
```json
|
||
{
|
||
"overall_quality": "GOOD",
|
||
"severity": "LOW",
|
||
"issues": [],
|
||
"confidence": 0.9,
|
||
"metrics": {
|
||
"artifact": {
|
||
"artifact": false,
|
||
"num_objects": 1,
|
||
"edge_energy": 0.234,
|
||
"object_size": 0.123
|
||
},
|
||
"position": {
|
||
"position": [0.45, 0.52],
|
||
"valid": true,
|
||
"deviation": 0.032
|
||
},
|
||
"contrast": {
|
||
"valid": true,
|
||
"contrast": 0.456
|
||
}
|
||
},
|
||
"mask": "base64_encoded_mask_image"
|
||
}
|
||
```
|
||
|
||
### Детальный анализ (/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/:
|
||
|
||
- 📤 Drag-and-drop загрузка изображений
|
||
- 🔍 Автоматический анализ
|
||
- 🎯 Визуализация маски сегментации
|
||
- 📈 Детальные метрики качества
|
||
- 🏷️ Подробный отчет о нарушениях
|
||
- 👆 Клик по строке для просмотра деталей
|
||
|
||
|
||
🛠️ Технологии
|
||
|
||
|Компонент | Технология
|
||
|-|-|
|
||
|Бэкенд | Python 3.10, FastAPI, Uvicorn
|
||
|ML | PyTorch, NumPy, SciPy
|
||
|Обработка изображений | PIL, OpenCV
|
||
|Визуализация | HTML5, CSS3, Canvas API
|
||
|Контейнеризация | Docker, Docker Compose
|
||
|Документация | Swagger UI, ReDoc
|
||
|
||
|
||
📁 Структура проекта
|
||
```text
|
||
bone_2026/
|
||
├── src/
|
||
│ ├── dxa/ # DXA Quality модуль
|
||
│ │ ├── model.py # ResNet18 классификатор
|
||
│ │ ├── dataset.py # Загрузчик данных
|
||
│ │ ├── train.py # Обучение
|
||
│ │ └── inference.py # Инференс
|
||
│ ├── api/ # REST API
|
||
│ ├── quality/ # Оценка качества
|
||
│ └── main.py # FastAPI приложение
|
||
├── models/
|
||
│ └── dxa_model.pth # Обученная модель
|
||
├── dataset_hack/ # DICOM датасет
|
||
├── Dockerfile
|
||
├── requirements.txt
|
||
├── run.sh
|
||
└── README.md
|
||
```
|
||
|
||
🧪 Тестирование
|
||
```bash
|
||
# Запуск тестов (если есть)
|
||
pytest tests/
|
||
```
|
||
|
||
# Проверка API
|
||
|
||
```bash
|
||
curl http://localhost:8000/api/v1/health
|
||
```
|
||
|
||
## 📊 Метрики качества
|
||
|
||
Артефакты
|
||
|
||
*Описание:* Обнаружение шума, размытости, фрагментации
|
||
|
||
Проверка:
|
||
|
||
- Энергия границ (edge_energy)
|
||
- Количество объектов (num_objects)
|
||
- Размер объекта (object_size)
|
||
|
||
### Позиционирование
|
||
|
||
*Описание:* Проверка правильности расположения объекта
|
||
|
||
Проверка:
|
||
|
||
- Центр масс объекта
|
||
- Отклонение от центра изображения
|
||
- Минимальный размер объекта
|
||
|
||
### Контраст
|
||
|
||
*Описание:* Оценка качества изображения
|
||
|
||
Проверка:
|
||
|
||
- Контраст внутри объекта
|
||
- Отношение средних (объект/фон)
|
||
- Интенсивность пикселей
|
||
|
||
## 🚀 Деплой
|
||
На сервер
|
||
```bash
|
||
# Копирование на сервер
|
||
scp -r ./bone-quality-assessment user@server:/var/www/
|
||
```
|
||
|
||
# Запуск в фоновом режиме
|
||
nohup python run.py > logs/out.log 2>&1 &
|
||
|
||
Использование с Nginx
|
||
```nginx
|
||
location /api/ {
|
||
proxy_pass http://localhost:8000;
|
||
proxy_set_header Host $host;
|
||
proxy_set_header X-Real-IP $remote_addr;
|
||
}
|
||
```
|
||
|
||
## 🤝 Вклад в проект
|
||
- Fork репозитория
|
||
- Создайте ветку для вашей фичи (git checkout -b feature/amazing-feature)
|
||
- Commit изменений (git commit -m 'Add amazing feature')
|
||
- Push в ветку (git push origin feature/amazing-feature)
|
||
- Откройте Pull Request
|
||
|
||
|
||
**📄 Лицензия**
|
||
|
||
MIT License
|
||
|
||
👥 Команда
|
||
Грачев Денис — Разработка - GitHub
|
||
|
||
### 🙏 Благодарности
|
||
|
||
***Oxford-IIIT Pet Dataset*** для обучения модели
|
||
|
||
***Сообществу PyTorch и FastAPI***
|
||
|
||
📞 Контакты
|
||
- 📧 Email: your.email@example.com
|
||
- 🐦 Telegram: @oxydencher
|
||
- 🐙 GitHub: gdg6
|
||
|
||
<div align="center"> <sub>Built with ❤️ for the Bone Quality Assessment Hackathon</sub> </div>
|