269 lines
8.2 KiB
Markdown
269 lines
8.2 KiB
Markdown
# Bone Quality Assessment Project
|
||
|
||
## Project Overview
|
||
|
||
Medical AI service for automated assessment of DXA (bone densitometry) study quality. The system analyzes DICOM files and evaluates quality based on standard criteria.
|
||
|
||
### Core Purpose (Hackathon)
|
||
- 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
|
||
| Component | Technology |
|
||
|-----------|------------|
|
||
| Backend | Python 3.10, FastAPI, Uvicorn |
|
||
| ML/Deep Learning | PyTorch, torchvision (ResNet18) |
|
||
| Image Processing | PIL, OpenCV, pydicom, scipy |
|
||
| Data Handling | pandas, openpyxl |
|
||
| Containerization | Docker |
|
||
|
||
---
|
||
|
||
## Project Structure
|
||
|
||
```
|
||
bone_2026/
|
||
├── src/
|
||
│ ├── main.py # FastAPI app (DXA mode)
|
||
│ ├── run.py # Server runner
|
||
│ ├── dxa/ # DXA Quality module
|
||
│ │ ├── dataset.py # DXADataset class
|
||
│ │ ├── model.py # ResNet18 classifier
|
||
│ │ ├── train.py # Training script
|
||
│ │ ├── inference.py # Batch inference
|
||
│ │ └── __init__.py
|
||
│ ├── api/ # REST endpoints & schemas
|
||
│ │ ├── endpoints.py # Original endpoints
|
||
│ │ └── static/ # Web UI
|
||
│ │ ├── index.html
|
||
│ │ └── js/dxa-app.js
|
||
│ ├── core/ # Orchestrator
|
||
│ ├── quality/ # Quality scoring
|
||
│ │ ├── 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
|
||
│ └── НД_для_обучения/ # Training data
|
||
├── requirements.txt
|
||
├── Dockerfile
|
||
├── 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`)
|
||
- Loads DICOM files from studies
|
||
- Parses annotation Excel file
|
||
- **Automatically detects anatomical region from image content**
|
||
- Maps regions: spine, hip_right, hip_left
|
||
- Quality labels: 0 (OK), 1 (violation)
|
||
|
||
### Model (`model.py`)
|
||
- Architecture: ResNet18 (pretrained on ImageNet)
|
||
- Task: Binary classification (quality OK vs violation)
|
||
- Input: 224x224 RGB images
|
||
- Output: class probabilities
|
||
|
||
### Training (`train.py`)
|
||
```bash
|
||
python src/dxa/train.py --epochs 10 --batch-size 16
|
||
```
|
||
|
||
### Inference (`inference.py`)
|
||
```bash
|
||
python src/dxa/inference.py \
|
||
--input-path dataset_hack/Для\ теста \
|
||
--output-path results.xlsx \
|
||
--model-path models/dxa_model.pth
|
||
```
|
||
|
||
---
|
||
|
||
## Running the Project
|
||
|
||
### Training
|
||
```bash
|
||
python src/dxa/train.py --epochs 10
|
||
```
|
||
|
||
### Inference
|
||
```bash
|
||
python src/dxa/inference.py --input-path file.dcm --output-path result.xlsx
|
||
```
|
||
|
||
### API Server
|
||
```bash
|
||
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 |
|
||
| study_uid | StudyInstanceUID from DICOM |
|
||
| image_uid | SOPInstanceUID from DICOM |
|
||
| anatomical_region | spine / hip_left / hip_right / hip |
|
||
| quality_class | 0 (OK), 1 (violation) |
|
||
| violation_type | Type of violation (if any) |
|
||
| 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
|
||
|
||
The system automatically determines the anatomical region from the DICOM image content:
|
||
|
||
### Algorithm (`src/dxa/inference.py`)
|
||
1. **Spine vs Hip** - by bright region shape:
|
||
- Extract 95th percentile threshold
|
||
- Calculate bounding box aspect ratio
|
||
- Spine: bbox_aspect < 1.5 (more square)
|
||
- Hip: bbox_aspect > 1.5 (vertically elongated)
|
||
|
||
2. **Hip Left vs Right** - by brightness asymmetry:
|
||
- Calculate left/right bright pixel ratio
|
||
- hip_left: L/R ratio < 0.7 (left side brighter)
|
||
- hip_right: L/R ratio > 1.3 (right side brighter)
|
||
- hip: unclear (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)
|
||
|
||
---
|
||
|
||
## Multi-Model Architecture (Planned)
|
||
|
||
See `docs/multi_model_architecture.md` for the planned pipeline:
|
||
|
||
```
|
||
Pipeline:
|
||
1. Region Detector → 2. Segmentator → 3. Quality Classifier → 4. Violation Type → 5. Aggregator
|
||
```
|
||
|
||
### Planned Models:
|
||
|
||
| Model | Purpose | File |
|
||
|-------|---------|------|
|
||
| Region Detector | Spine/Hip detection | `src/models/region_detector.py` |
|
||
| Segmentator | Bone segmentation | `src/models/segmentation/` |
|
||
| Quality Classifier | OK/Violation binary | `src/models/classification/quality.py` |
|
||
| Violation Classifier | 7+ violation types | `src/models/classification/violation.py` |
|
||
| Artifact Detector | Motion, metal detection | `src/models/artifacts/detector.py` |
|
||
| Grad-CAM | Attention heatmap | `src/models/visualization/gradcam.py` |
|
||
|
||
---
|
||
|
||
## Docker
|
||
|
||
```bash
|
||
docker build -t dxa-quality .
|
||
docker run -v /data:/data -p 8000:8000 dxa-quality
|
||
```
|
||
|
||
---
|
||
|
||
## Development Notes
|
||
|
||
### Code Style
|
||
- Follow existing patterns in src/
|
||
- Type hints where appropriate
|
||
- Minimal comments (only for context)
|
||
|
||
### Key Components
|
||
- **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`:
|
||
- `torch`, `torchvision` - Deep learning
|
||
- `pydicom` - DICOM handling
|
||
- `pandas`, `openpyxl` - Data/Excel
|
||
- `fastapi`, `uvicorn` - Web framework
|
||
- `Pillow`, `opencv-python-headless` - Image processing
|
||
- `scipy` - Image analysis (blur, artifacts)
|