# 𦴠DXA Quality Assessment
Π‘Π΅ΡΠ²ΠΈΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° Π΄Π΅Π½ΡΠΈΡΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΉ (DXA):
ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ DICOM, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ Π°Π½Π°ΡΠΎΠΌΠΈΡΠ΅ΡΠΊΡΡ ΠΎΠ±Π»Π°ΡΡΡ, ΠΎΡΠ΅Π½ΠΈΠ²Π°Π΅Ρ, ΠΏΡΠΈΠ³ΠΎΠ΄Π½ΠΎ Π»ΠΈ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
Π΄Π»Ρ ΠΊΠ»ΠΈΠ½ΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΈΠΈ, ΠΈ ΡΠΎΡΠΌΠΈΡΡΠ΅Ρ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΎΡΡΡΡ.
## Π§ΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅
| Π¨Π°Π³ | Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ |
|---|---|
| ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π°Π½Π°ΡΠΎΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ | Π¨ΠΈΡΠΈΠ½Π° ΠΊΠ°Π΄ΡΠ° (ΠΏΠΎΠ·Π²ΠΎΠ½ΠΎΡΠ½ΠΈΠΊ / Π±Π΅Π΄ΡΠΎ) + Π³ΠΎΠ»ΠΎΠ²Π° ΠΎΠ±Π»Π°ΡΡΠΈ + Π³Π΅ΠΎΠΌΠ΅ΡΡΠΈΡ ΡΡΠΊΠΎΠΉ Π·ΠΎΠ½Ρ |
| ΠΠΈΠ½Π°ΡΠ½Π°Ρ ΠΎΡΠ΅Π½ΠΊΠ° ΠΊΠ°ΡΠ΅ΡΡΠ²Π° | ResNet18 (ImageNet) β Π»ΠΈΠ½Π΅ΠΉΠ½Π°Ρ Π³ΠΎΠ»ΠΎΠ²Π°; ΠΏΠΎΡΠΎΠ³ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ°Π½ ΠΏΠΎ F1 Π½Π° Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ |
| Π’ΠΈΠΏ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ | ΠΠ±ΡΠ°Ρ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ Π΄Π»Ρ ΡΠ½ΠΈΠΌΠΊΠΎΠ² Ρ Π½Π°ΡΡΡΠ΅Π½ΠΈΠ΅ΠΌ; Π΄Π΅ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠΈΠΏ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΊΠΈ ΡΠΈΠΏΠΎΠ² Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠ½ΠΈΠΌΠΊΠ° |
| ΠΡΡΡΡ | XLSX/CSV ΡΠΎ ΡΡΠΎΠ»Π±ΡΠ°ΠΌΠΈ ΠΈΠ· ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠΉ; ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ zip Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ Π·ΠΎΠ½Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ° |
| API | FastAPI: Π°Π½Π°Π»ΠΈΠ·, Π΄Π΅ΡΠ°Π»ΡΠ½ΡΠΉ Π°Π½Π°Π»ΠΈΠ·, ΠΏΠ°ΠΊΠ΅ΡΠ½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°, ΡΠΊΡΠΏΠΎΡΡ, DICOM SR (ΡΠ΅ΠΊΡΡ) |
| ΠΠ΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ | ΠΠ°Π³ΡΡΠ·ΠΊΠ° DICOM, ΡΠ°Π±Π»ΠΈΡΠ° ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ², ΠΏΠ°Π½Π΅Π»Ρ Π΄Π΅ΡΠ°Π»Π΅ΠΉ Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ, ΠΏΠ°Π½Π΅Π»Ρ Β«Π ΠΌΠΎΠ΄Π΅Π»ΠΈΒ» |
## Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΈ Π·Π°ΠΏΡΡΠΊ
```bash
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
./run.sh label # ΡΠ°Π·ΠΌΠ΅ΡΠΈΡΡ Π΄Π°ΡΠ°ΡΠ΅Ρ ΠΏΠΎ Excel
./run.sh rename # ΠΏΠ»Π°Π½ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΈΠΌΡΠ½ ΡΠ°ΠΉΠ»ΠΎΠ²
./run.sh train # ΠΎΠ±ΡΡΠΈΡΡ ΠΌΠΎΠ΄Π΅Π»Ρ ΠΊΠ°ΡΠ΅ΡΡΠ²Π°
./run.sh infer "dataset_hack/ΠΠ»Ρ ΡΠ΅ΡΡΠ°" results.xlsx # ΠΏΠ°ΠΊΠ΅ΡΠ½Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ°
./run.sh serve # API ΠΈ Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π½Π° :8000
./run.sh split && ./run.sh compare # ΡΡΠ°Π²Π½ΠΈΡΡ Π²Π°ΡΠΈΠ°Π½ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠΊΠΈ
./run.sh test # ΡΠ΅ΡΡΡ
```
ΠΠ»Ρ ΠΈΠ½ΡΠ΅ΡΠ΅Π½ΡΠ° ΡΠΎΠ»ΡΠΊΠΎ Π½Π° CPU (ΠΎΠ±ΡΠ°Π· ΠΌΠ΅Π½ΡΡΠ΅, Π±Π΅Π· CUDA-ΠΊΠΎΠ»ΡΡ):
```bash
pip install -r requirements.txt --extra-index-url https://download.pytorch.org/whl/cpu
```
ΠΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅Π½Ρ ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ Π½Π°ΠΏΡΡΠΌΡΡ:
```bash
python -m src.dxa.train --epochs 100 --output-dir models
python -m src.dxa.inference --input-path dataset_hack --output-path results.xlsx --zip-out masks.zip
```
ΠΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° ΡΠ΅ΡΠ²Π΅ΡΠ°:
- ΠΠ΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ: http://localhost:8000
- Swagger UI: http://localhost:8000/docs
## Docker
```bash
docker build -t dxa-quality .
docker run -v /path/to/data:/data -p 8000:8000 dxa-quality
```
Π§Π΅ΠΊΠΏΠΎΠΈΠ½Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π»Π΅ΠΆΠ°ΡΡ Π² `models/dxa_model.pth` Π΄ΠΎ ΡΠ±ΠΎΡΠΊΠΈ; ΠΏΡΡΡ Π·Π°Π΄Π°ΡΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ
`DXA_MODEL_PATH` (ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ `/app/models/dxa_model.pth`). Π‘Π±ΠΎΡΠΊΠ° ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ, ΡΡΠΎ
ΡΠ΅ΠΊΠΏΠΎΠΈΠ½Ρ ΡΠΈΡΠ°Π΅ΡΡΡ, ΠΈ ΠΏΠ°Π΄Π°Π΅Ρ, Π΅ΡΠ»ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π½Π΅Ρ β Π²ΠΌΠ΅ΡΡΠΎ ΡΠΈΡ
ΠΈΡ
500-Ρ
ΠΎΡΠ²Π΅ΡΠΎΠ² Π² ΡΠ°Π½ΡΠ°ΠΉΠΌΠ΅.
ΠΠ΅Ρ ΠΌΠΎΠ΄Π΅Π»ΠΈ Π²Π½ΡΡΡΡ ΠΎΠ±ΡΠ°Π·Π° Π·Π°ΡΠΈΡ, ΠΈΠ· ΡΠ΅ΡΠΈ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΡΠΊΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ.
---
## ΠΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΠ°
Π‘Ρ
Π΅ΠΌΠ° ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅Π³ΠΎ ΠΏΡΡΠΈ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ
ΡΠ΅ΡΠ΅Π½ΠΈΡ:
```
DICOM βββΆ ΠΏΡΠ΅Π΄ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° βββΆ ResNet18 (Π·Π°ΠΌΠΎΡΠΎΠΆΠ΅Π½) βββΆ Π»ΠΈΠ½Π΅ΠΉΠ½Π°Ρ Π³ΠΎΠ»ΠΎΠ²Π° βββΆ Π»ΠΎΠ³ΠΈΡ
β β
β ββββΆ Π³ΠΎΠ»ΠΎΠ²Π° ΠΎΠ±Π»Π°ΡΡΠΈ (Π²ΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½Π°Ρ)
β
ββββΆ Π³Π΅ΠΎΠΌΠ΅ΡΡΠΈΡ ΡΡΠΊΠΎΠΉ Π·ΠΎΠ½Ρ: ΠΎΠ±Π»Π°ΡΡΡ, ROI, Π³Π΅ΠΎΠΌΠ΅ΡΡΠΈΡ ΠΊΠ°Π΄ΡΠ°
ββββΆ ΡΠ²ΡΠΈΡΡΠΈΠΊΠΈ: ΡΠ΅Π·ΠΊΠΎΡΡΡ, Β«ΠΏΠ»ΠΎΡΠ½ΡΠ΅Β» Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ
```
ΠΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΠΎΡΠ΅ΠΌΡ ΠΎΠ½ΠΈ ΡΠ°ΠΊΠΈΠ΅:
1. **ΠΠΈΠ½Π΅ΠΉΠ½ΡΠΉ Π·ΠΎΠ½Π΄ Π²ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ fine-tune.** Π£Π½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ
ΡΠ½ΠΈΠΌΠΊΠΎΠ² Π² Π½Π°Π±ΠΎΡΠ΅ ~250.
ΠΠΎΠ»Π½ΡΠΉ fine-tune ResNet18 ΠΏΠ΅ΡΠ΅ΠΎΠ±ΡΡΠ°Π΅ΡΡΡ Π·Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡ
(train F1 β 1.0 ΠΏΡΠΈ
val AUC β 0.5). ΠΠ°ΠΌΠΎΡΠΎΠΆΠ΅Π½Π½ΡΠΉ backbone + Π»ΠΈΠ½Π΅ΠΉΠ½Π°Ρ Π³ΠΎΠ»ΠΎΠ²Π° ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ val AUC
β 0.7β0.85. Π Π΅ΠΆΠΈΠΌ `--head mlp --freeze-epochs 0` ΠΎΡΡΠ°Π²Π»Π΅Π½ Π΄Π»Ρ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ²
Π½Π° Π±ΠΎΠ»ΡΡΠ΅ΠΌ ΠΎΠ±ΡΡΠΌΠ΅ Π΄Π°Π½Π½ΡΡ
.
2. **ΠΠ΅ΡΠΊΠΈ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠ½ΠΈΠΌΠΊΠ°.** ΠΡΡΠΎΡΠ½ΠΈΠΊ β `labels/labels_images.csv`, ΠΏΠΎΡΡΡΠΎΠ΅Π½Π½ΡΠΉ
ΠΈΠ· ΡΠΊΡΠΏΠ΅ΡΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ `./run.sh label` (ΡΠ°Π·Π±ΠΎΡ β Π²
`assets/labeling.md`): Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΎΡΠΌΠ΅ΡΠ΅Π½Ρ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡ
ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ, Π° ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΎΠ±Π»Π°ΡΡΡ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ Π² Π½ΡΠΌ ΡΠΎΠ²Π½ΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·, ΠΏΠΎΡΡΠΎΠΌΡ
Π²Π΅ΡΠ΄ΠΈΠΊΡ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠΈΡΡΡ Π½Π° ΡΠ½ΠΈΠΌΠΎΠΊ ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎ. Π’Π°ΠΊΠΎΠΉ ΡΠ°Π·ΠΌΠ΅ΡΠΊΠΈ β 77 Π½Π°ΡΡΡΠ΅Π½ΠΈΠΉ ΠΈΠ·
252 (30.6 %). ΠΡΠ°Π²ΠΈΠ»ΠΎ Π²ΡΠ±ΡΠ°Π½ΠΎ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ: ΡΡΡΡ ΡΡΡΠ½ΡΡ
ΠΏΠΎΠΌΠ΅ΡΠΎΠΊ ΠΈΠ· ΠΈΠΌΡΠ½ ΡΠ°ΠΉΠ»ΠΎΠ²
Π΄Π°Π» Ρ
ΡΠ΄ΡΠΈΠΉ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π½Π° held-out Π½Π°Π±ΠΎΡΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ Π² ΠΌΠ΅ΡΠΊΠ°Ρ
ΠΎΠ½ΠΈ Π½Π΅ ΡΡΠ°ΡΡΠ²ΡΡΡ.
Π Π΅Π·Π΅ΡΠ²Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ `--labels-csv ""` Π±Π΅ΡΡΡ ΠΌΠ΅ΡΠΊΡ ΠΈΠ· ΡΡΡΡΠΈΠΊΡΠ° `_good`/`_bad` ΠΈ
ΠΎΡΡΠ°Π²Π»Π΅Π½ Π΄Π»Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ.
3. **Π‘ΠΊΠ»Π΅ΠΉΠΊΠ° ΠΏΠΎΠ±Π°ΠΉΡΠ½ΡΡ
Π΄ΡΠ±Π»Π΅ΠΉ.** Π Π΄Π°ΡΠ°ΡΠ΅ΡΠ΅ 544 ΡΠ°ΠΉΠ»Π°, Π½ΠΎ 252 ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ
ΡΠ½ΠΈΠΌΠΊΠ°:
ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΡ ΠΆΠ΅ ΠΊΠ°Π΄Ρ ΡΠΎΡ
ΡΠ°Π½ΡΠ½ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΠΎ ΠΏΠΎΠ΄ ΡΠ°Π·Π½ΡΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ (ΡΠ°ΡΡΡ β Ρ ΠΌΠ΅ΡΠΊΠΎΠΉ,
ΡΠ°ΡΡΡ β Π±Π΅Π·). ΠΠ΅Π· ΡΠΊΠ»Π΅ΠΉΠΊΠΈ ΠΎΠ΄Π½ΠΎ ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠΏΠ°Π΄Π°Π»ΠΎ Π±Ρ Π² ΠΎΠ±Π° ΠΊΠ»Π°ΡΡΠ°.
4. **Π Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡΠΌ.** Π‘Π½ΠΈΠΌΠΊΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ
ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π² train ΠΈ val β ΠΈΠ½Π°ΡΠ΅ ΠΌΠ΅ΡΡΠΈΠΊΠΈ Π·Π°Π²ΡΡΠ°ΡΡΡΡ Π·Π° ΡΡΡΡ ΡΡΠ΅ΡΠΊΠΈ.
5. **ΠΡΠ³ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΎΡΠΊΠ»ΡΡΠ΅Π½Π°.** ΠΡΠΎΠ²Π΅ΡΠ΅Π½ΠΎ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎ: ΡΡΠΊΠΎΡΡΠ½ΡΠΉ ΡΠ°Π·Π±ΡΠΎΡ ΠΈ ΡΠ΄Π²ΠΈΠ³
ΠΊΠ°Π΄ΡΠ° ΡΠ½ΠΈΠΆΠ°ΡΡ AUC Ρ 0.87 Π΄ΠΎ 0.56, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΠΊΠΎΡΡΠΈ ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅
ΠΎΠ±Π»Π°ΡΡΠΈ ΡΠ°ΠΌΠΈ ΡΠ²Π»ΡΡΡΡΡ ΠΏΡΠΈΠ·Π½Π°ΠΊΠ°ΠΌΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²Π°. Π€Π»Π°Π³ `--augment` Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π΅Ρ Π΄Π»Ρ
ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΎΠ².
6. **ΠΠΎΡΠΎΠ³ ΠΏΠΎ Π»ΠΎΠ³ΠΈΡΡ.** ΠΡΠΈ Π΄ΠΎΠ»Π΅ Π½Π°ΡΡΡΠ΅Π½ΠΈΠΉ ~15 % ΠΏΠΎΡΠΎΠ³ 0.5 Π΄Π°ΡΡ Π½ΡΠ»Π΅Π²ΠΎΠΉ recall.
ΠΠΎΡΠΎΠ³ ΠΏΠΎΠ΄Π±ΠΈΡΠ°Π΅ΡΡΡ ΠΏΠΎ F1 Π½Π° Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΠΈ ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΡΡΡ Π² ΡΠ΅ΠΊΠΏΠΎΠΈΠ½Ρ; ΡΠ΅ΡΠ΅Π½ΠΈΠ΅
ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΡΡΡ ΠΏΠΎ Π»ΠΎΠ³ΠΈΡΡ (ΡΠΈΡΠ»Π΅Π½Π½ΠΎ ΡΡΡΠΎΠΉΡΠΈΠ²ΠΎ ΠΏΡΠΈ Π½Π°ΡΡΡΠ΅Π½ΠΈΠΈ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΠ΅ΠΉ).
### Π‘Ρ
Π΅ΠΌΡ ΡΠΈΡΡΠ΅ΠΌΡ
| ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ | ΠΠΎΡΠΎΠΊ Π΄Π°Π½Π½ΡΡ
|
|---|---|
|
|
|
| ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° | Π Π°Π·Π²ΡΡΡΡΠ²Π°Π½ΠΈΠ΅ |
|---|---|
|
|
|
| ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π°Π½Π°ΡΠΎΠΌΠΈΡΠ΅ΡΠΊΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΠΈ | ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΡΡΠ½ΠΎΡΡΠΈ |
|---|---|
|
|
|
Π‘Ρ
Π΅ΠΌΡ Π²Π·ΡΡΡ ΠΈΠ· ΠΏΡΠΎΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° ΠΈ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠ΅Π»Π΅Π²ΡΡ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ: Π±Π»ΠΎΠΊΠΈ
`Orchestrator`, UNet-ΡΠ΅Π³ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΈ Π³ΠΎΡΠΎΠ²ΡΡ
Π²Π΅ΡΠ΄ΠΈΠΊΡΠΎΠ² ΠΊΠ°ΡΠ΅ΡΡΠ²Π° Π² API Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½Ρ.
Π Π°Π±ΠΎΡΠ°ΡΡΠΈΠΉ ΠΏΡΡΡ ΠΎΠΏΠΈΡΠ°Π½ Π²ΡΡΠ΅, Π½Π΅ΠΏΠΎΠ΄ΠΊΠ»ΡΡΡΠ½Π½ΡΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Ρ Π² ΡΠ°Π·Π΄Π΅Π»Π΅
Β«Π‘ΡΡΡΠΊΡΡΡΠ° ΠΏΡΠΎΠ΅ΠΊΡΠ°Β».
---
## Π€ΠΎΡΠΌΠ°Ρ Π²ΡΡ
ΠΎΠ΄Π½ΡΡ
Π΄Π°Π½Π½ΡΡ
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΡΡΠΎΠ»Π±ΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡΠΌ Π·Π°Π΄Π°Π½ΠΈΡ:
| Π‘ΡΠΎΠ»Π±Π΅Ρ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
|---|---|
| `path_to_study` | ΠΡΡΡ ΠΊ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ (Π΄Π»Ρ HTTP-Π·Π°Π³ΡΡΠ·ΠΊΠΈ β `upload://<ΠΈΠΌΡ>`) |
| `study_uid` | StudyInstanceUID |
| `image_uid` | SOPInstanceUID |
| `anatomical_region` | `spine` / `hip_left` / `hip_right` / `hip` |
| `quality_class` | 0 β ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠ΅, 1 β Π΅ΡΡΡ Π½Π°ΡΡΡΠ΅Π½ΠΈΠ΅ |
| `violation_type` | Π’ΠΈΠΏ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΏΡΡΡΠ°Ρ ΡΡΡΠΎΠΊΠ° |
| `processing_status` | `Success` ΠΈΠ»ΠΈ `Failure: <ΠΏΡΠΈΡΠΈΠ½Π°>` |
| `time_of_processing` | ΠΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ, ΡΠ΅ΠΊΡΠ½Π΄Ρ |
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡΡΡ `confidence`, `violation_reason`, `region_confidence`
β ΠΎΠ½ΠΈ Π½Π΅ ΠΌΠ΅ΡΠ°ΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΌΡ ΡΠ°Π·Π±ΠΎΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΡ
ΡΡΠΎΠ»Π±ΡΠΎΠ².
## API
| ΠΠ΅ΡΠΎΠ΄ | ΠΡΡΡ | ΠΠ°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ |
|---|---|---|
| GET | `/` | ΠΠ΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ |
| GET | `/api/v1/health` | Π‘ΡΠ°ΡΡΡ, ΠΏΡΠΈΠ·Π½Π°ΠΊ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΈ Π΅Ρ ΠΏΡΠΎΠΈΡΡ
ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ |
| GET | `/api/v1/model` | ΠΠ°ΡΡΠΎΡΠΊΠ° ΡΠ΅ΡΠ΅Π½ΠΈΡ: ΡΠ°Π·ΠΌΠ΅ΡΠΊΠ°, Π΄Π°Π½Π½ΡΠ΅, ΠΌΠ΅ΡΡΠΈΠΊΠΈ Ρ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π°ΠΌΠΈ, ΡΠ»ΠΎΠ²Π°ΡΡ Π½Π°ΡΡΡΠ΅Π½ΠΈΠΉ |
| 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 -F "file=@study/spine.dcm"
```
```json
{
"study_uid": "1.2.643...",
"image_uid": "1.2.643...",
"anatomical_region": "spine",
"quality_class": 1,
"quality_label": "ΠΡΡΡ Π½Π°ΡΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΡΠ΅ΡΡΠ²Π°",
"violation_type": "artifact",
"violation_type_label": "ΠΡΡΠ΅ΡΠ°ΠΊΡΡ ΠΈ ΠΈΠΌΠΏΠ»Π°Π½ΡΡ",
"violation_type_is_heuristic": true,
"violation_type_note": "Π’ΠΈΠΏ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ ΡΠ²ΡΠΈΡΡΠΈΠΊΠΎΠΉ ΠΏΠΎ ΠΌΠ΅ΡΡΠΈΠΊΠ°ΠΌ ΡΠ½ΠΈΠΌΠΊΠ°, Π° Π½Π΅ ΠΌΠΎΠ΄Π΅Π»ΡΡ...",
"reason": "ΠΠΎΡΡΠΎΡΠΎΠ½Π½ΠΈΠ΅ Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ Π°ΡΡΠ΅ΡΠ°ΠΊΡΡ Π² Π·ΠΎΠ½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ°",
"confidence": 0.72,
"threshold_probability": 0.5103,
"processing_status": "Success"
}
```
ΠΠΎΠ΄Ρ `violation_type` Π±Π΅ΡΡΡΡΡ ΠΈΠ· Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π°ΡΡ `src/dxa/violations.py`
(`positioning`, `axis_deviation`, `artifact`, `rotation`, `roi_incorrect`,
`motion`, `incomplete_anatomy`, `labeling_error`, `unspecified`) β ΠΏΠ΅ΡΠ²ΡΠ΅ ΠΏΡΡΡ
ΠΊΠΎΠ΄ΠΈΡΡΠ΅Ρ ΡΠΊΡΠΏΠ΅ΡΡΠ½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ°, ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΠΈΡ
ΠΎΠ΄ΡΡ ΠΈΠ· ΠΊΡΠΈΡΠ΅ΡΠΈΠ΅Π² ΠΏΡΠΈΠ³ΠΎΠ΄Π½ΠΎΡΡΠΈ. ΠΠΎΠ»Π΅
`violation_type_is_heuristic` ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΡΠΈΠΏ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ ΡΠ²ΡΠΈΡΡΠΈΠΊΠΎΠΉ, Π° Π½Π΅
ΠΌΠΎΠ΄Π΅Π»ΡΡ: ΠΌΠΎΠ΄Π΅Π»Ρ ΡΠ΅ΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π±ΠΈΠ½Π°ΡΠ½ΡΡ Π·Π°Π΄Π°ΡΡ. ΠΠΎΠ΄ΠΏΠΈΡΠΈ Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΎΡΠ΄Π°ΡΡ
ΡΠ΅ΡΠ²Π΅Ρ, ΡΠ²ΠΎΠ΅ΠΉ ΠΊΠΎΠΏΠΈΠΈ ΡΠ»ΠΎΠ²Π°ΡΡ ΡΡΠΎΠ½ΡΠ΅Π½Π΄ Π½Π΅ Π΄Π΅ΡΠΆΠΈΡ.
---
## ΠΠ΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ
ΠΠΎΠ»ΠΎΡΠ° ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π² ΡΠ°ΠΏΠΊΠ΅ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, **ΠΊΠ°ΠΊΠ°Ρ** ΠΌΠΎΠ΄Π΅Π»Ρ ΡΠ΅ΠΉΡΠ°Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ: ΠΈΠΌΡ
ΡΠ΅ΠΊΠΏΠΎΠΈΠ½ΡΠ°, ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΡΠ°Π·ΠΌΠ΅ΡΠΊΠΈ, ΡΠΏΠΎΡ
Ρ ΠΈ ΠΏΠΎΡΠΎΠ³. ΠΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ ΡΡΠ°Π·Ρ Π²ΠΈΠ΄Π½ΠΎ, ΠΊΠ°ΠΊΠ°Ρ
Π²Π΅ΡΡΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ, β Π±Π΅Π· ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ Π»ΠΎΠ³Π°ΠΌ.
Π‘ΡΡΠΎΠΊΠΈ ΡΠ°Π±Π»ΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠΎΠ² ΠΊΠ»ΠΈΠΊΠ°Π±Π΅Π»ΡΠ½Ρ, Π½ΠΎ ΠΎΠ± ΡΡΠΎΠΌ Π½Π°Π΄ΠΎ ΡΠΊΠ°Π·Π°ΡΡ ΠΏΡΡΠΌΠΎ β ΠΈΠ½Π°ΡΠ΅
Π½Π΅ Π΄ΠΎΠ³Π°Π΄ΡΠ²Π°ΡΡΡΡ. ΠΠ°Π΄ ΡΠ°Π±Π»ΠΈΡΠ΅ΠΉ Π²ΠΈΡΠΈΡ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ° Β«ΠΠ°ΠΆΠΌΠΈΡΠ΅ Π½Π° Π»ΡΠ±ΡΡ ΡΡΡΠΎΠΊΡΒ», Π² ΠΊΠΎΠ½ΡΠ΅
ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ Π΅ΡΡΡ ΠΊΠ½ΠΎΠΏΠΊΠ° Β«ΠΡΠΊΡΡΡΡΒ», Π° ΠΊΠ»ΠΈΠΊ ΠΏΠΎ ΡΡΡΠΎΠΊΠ΅ ΠΏΡΠΎΠΊΡΡΡΠΈΠ²Π°Π΅Ρ ΡΡΡΠ°Π½ΠΈΡΡ ΠΊ
ΠΏΠ°Π½Π΅Π»ΠΈ Π΄Π΅ΡΠ°Π»Π΅ΠΉ. ΠΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ° ΡΠΊΡΡΠ²Π°Π΅ΡΡΡ, ΠΊΠΎΠ³Π΄Π° ΡΠΈΠ»ΡΡΡ Π½Π΅ ΠΎΡΡΠ°Π²ΠΈΠ» Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ.
ΠΠ½ΠΎΠΏΠΊΠ° Β«ΠΡΠΊΡΡΡΡΒ» β Π½Π°ΡΡΠΎΡΡΠ°Ρ ΠΊΠ½ΠΎΠΏΠΊΠ°, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠ°Π½Π΅Π»Ρ Π΄ΠΎΡΡΡΠΏΠ½Π° ΠΈ Ρ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΡ
(Tab + Enter), Π° Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΡΡΡΡ. Π‘Π°ΠΌΠ° ΡΠ°Π±Π»ΠΈΡΠ° ΡΠΎ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠΎΠΉ ΠΈ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠΎΠΉ β Π½Π°
ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠΊΡΠΈΠ½ΡΠΎΡΠ΅.
ΠΠ°Π½Π΅Π»Ρ Π΄Π΅ΡΠ°Π»Π΅ΠΉ ΠΎΡΠΊΡΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎ ΠΊΠ»ΠΈΠΊΡ Π½Π° ΡΡΡΠΎΠΊΡ: Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅, ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΈ
Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ½ΠΈΠΌΠΊΠ°. Π‘ΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ ΠΎΠ±Π΅ Π²Π΅ΡΠΊΠΈ β Β«Π½Π°ΡΡΡΠ΅Π½ΠΈΠ΅Β» ΠΈ Β«Π½ΠΎΡΠΌΠ°Β»:
 |
 |
| ΠΠ°ΡΡΡΠ΅Π½ΠΈΠ΅. ΠΠ΅ΠΉΠ΄ΠΆ Β«ΠΠ°ΡΡΡΠ΅Π½ΠΈΠ΅Β», ΡΡΠΎΠ²Π΅Π½Ρ HIGH, Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Ρ Π²Π΅ΡΠΎΡΡΠ½ΠΎΡΡΡΡ ΠΈ ΠΏΠΎΡΠΎΠ³ΠΎΠΌ, ΡΠΈΠΏ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠ΅ΡΠΊΠΎΠΉ Β«ΡΠ²ΡΠΈΡΡΠΈΠΊΠ°Β». |
ΠΠΎΡΠΌΠ°. ΠΠ΅Π»ΡΠ½ΡΠΉ Π±Π΅ΠΉΠ΄ΠΆ. ΠΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ (ΡΠ΅Π·ΠΊΠΎΡΡΡ, Π³ΡΠ°Π½ΠΈΡΡ ΠΎΠ±Π»Π°ΡΡΠΈ) ΠΏΠΎΠ΄ΠΏΠΈΡΠ°Π½Ρ ΠΊΠ°ΠΊ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΡΠ΅ β ΠΈΡ
ΠΏΠΎΡΠΎΠ³ΠΈ Π½Π΅ ΠΊΠ°Π»ΠΈΠ±ΡΠΎΠ²Π°Π½Ρ. |
ΠΠ°Π½Π΅Π»Ρ **Β«Π ΠΌΠΎΠ΄Π΅Π»ΠΈΒ»** (ΠΊΠ½ΠΎΠΏΠΊΠ° Π² ΡΠ°ΠΏΠΊΠ΅): ΡΡΠΎ Π·Π° ΡΠ΅ΠΊΠΏΠΎΠΈΠ½Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, Π½Π° ΠΊΠ°ΠΊΠΎΠΉ
ΡΠ°Π·ΠΌΠ΅ΡΠΊΠ΅ ΠΎΠ½ ΠΎΠ±ΡΡΠ΅Π½, Ρ ΠΊΠ°ΠΊΠΈΠΌ ΠΏΠΎΡΠΎΠ³ΠΎΠΌ ΡΠ΅ΡΠ°Π΅Ρ, ΠΌΠ΅ΡΡΠΈΠΊΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ 95 % ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Π°ΠΌΠΈ,
ΡΠΎΡΡΠ°Π² Π΄Π°Π½Π½ΡΡ
, ΡΠ»ΠΎΠ²Π°ΡΡ ΡΠΈΠΏΠΎΠ² Π½Π°ΡΡΡΠ΅Π½ΠΈΠΉ ΠΈ ΡΠΏΠΈΡΠΎΠΊ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ Π²ΡΠ΅Ρ
ΡΡΠΈΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ β ΡΠ΅ΡΠ²Π΅Ρ (`/api/v1/health`, `/api/v1/model`).
Π€ΡΠΎΠ½ΡΠ΅Π½Π΄ Π½Π°ΠΌΠ΅ΡΠ΅Π½Π½ΠΎ Π½Π΅ Π΄Π΅ΡΠΆΠΈΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ
ΠΊΠΎΠΏΠΈΠΉ: ΡΠ°Π½ΡΡΠ΅ ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ ΡΠΈΠΏΠΎΠ² Π½Π°ΡΡΡΠ΅Π½ΠΈΠΉ
Π±ΡΠ»ΠΈ ΠΏΡΠΎΠ΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½Ρ Π² `dxa-app.js` ΠΈ ΡΠ°Π·ΠΎΡΠ»ΠΈΡΡ Ρ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΌΠΈ, ΠΈΠ·-Π·Π° ΡΠ΅Π³ΠΎ ΠΊΠΎΠ΄Ρ
ΡΠΊΡΠΏΠ΅ΡΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π»ΠΈΡΡ ΠΊΠ°ΠΊ Π΅ΡΡΡ.
Π§ΡΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΠ΅ΠΏΠ΅ΡΡ Π½Π΅ ΡΡΠ²Π΅ΡΠΆΠ΄Π°Π΅Ρ:
- **ΡΠΈΠΏ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ ΠΊΠ°ΠΊ Β«ΡΠ²ΡΠΈΡΡΠΈΠΊΠ°Β»** Ρ ΠΏΠΎΡΡΠ½Π΅Π½ΠΈΠ΅ΠΌ β ΠΌΠΎΠ΄Π΅Π»Ρ ΡΠ΅ΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ
Π±ΠΈΠ½Π°ΡΠ½ΡΡ Π·Π°Π΄Π°ΡΡ ΠΈ ΡΠΈΠΏ Π½Π΅ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ;
- **ΠΌΠ΅ΡΡΠΈΠΊΠ° ΡΠ°Π±ΠΎΡΠ΅Π³ΠΎ ΡΠ΅ΠΊΠΏΠΎΠΈΠ½ΡΠ° ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Π° ΠΊΠ°ΠΊ Π·Π°Π²ΡΡΠ΅Π½Π½Π°Ρ** ΠΏΡΡΠΌΠΎ Π² Π±Π°Π½Π½Π΅ΡΠ΅
ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΈ Π² ΠΊΠ°ΡΡΠΎΡΠΊΠ΅: ΡΠ΅ΠΊΠΏΠΎΠΈΠ½Ρ Π²ΡΠ±ΡΠ°Π½ Π»ΡΡΡΠΈΠΌ ΠΈΠ· ΠΏΡΡΠΈ seed'ΠΎΠ², ΡΠ΅ΡΡΠ½Π°Ρ
ΠΎΡΠ΅Π½ΠΊΠ° Π²Π°ΡΠΈΠ°Π½ΡΠ° β ΡΡΠ΅Π΄Π½Π΅Π΅ ΠΏΠΎ seed'Π°ΠΌ;
- **ΠΏΠ»ΠΈΡΠΊΠ° Β«Π‘Ρ. ΡΠ²Π΅ΡΠ΅Π½Π½ΠΎΡΡΡ ΠΌΠΎΠ΄Π΅Π»ΠΈΒ»** Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π½Π°Π·ΡΠ²Π°Π΅ΡΡΡ ΡΠΎΡΠ½ΠΎΡΡΡΡ: ΡΠΎΡΠ½ΠΎΡΡΡ
ΡΡΠ΅Π±ΡΠ΅Ρ ΡΡΠ°Π»ΠΎΠ½Π½ΡΡ
ΠΌΠ΅ΡΠΎΠΊ, ΠΊΠΎΡΠΎΡΡΡ
Π΄Π»Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° Π½Π΅Ρ;
- ΡΠΈΡΠ»ΠΎΠ²ΡΠ΅ ΠΌΠ΅ΡΡΠΈΠΊΠΈ Π² ΠΏΠ°Π½Π΅Π»ΠΈ Π΄Π΅ΡΠ°Π»Π΅ΠΉ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΠΈΠ΄ΡΡ ΠΏΠΎΠ΄ Π΄ΠΈΡΠΊΠ»Π΅ΠΉΠΌΠ΅ΡΠΎΠΌ ΠΎ
Π½Π΅ΠΊΠ°Π»ΠΈΠ±ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΠΈ ΠΏΠΎΡΠΎΠ³ΠΎΠ².
---
## ΠΠ΅ΡΡΠΈΠΊΠΈ
ΠΠ΅ΡΡΠΈΠΊΠΈ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡΠΌ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΡΡΡΡ
Ρ ΡΠ°Π·Π±ΡΠΎΡΠΎΠΌ. ΠΡΠ½ΠΎΠ²Π½Π°Ρ ΠΎΡΠ΅Π½ΠΊΠ° β Π½Π° **ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ** ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠΈ ΠΏΠΎ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡΠΌ
(ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ 199 ΡΠ½ΠΈΠΌΠΊΠΎΠ² / 81 ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅, Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ 53 ΡΠ½ΠΈΠΌΠΊΠ° / 19 ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΉ,
16 Π½Π°ΡΡΡΠ΅Π½ΠΈΠΉ), ΠΏΡΡΡ seed'ΠΎΠ² ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ, ΡΡΠ°Π»ΠΎΠ½ β Π²Π΅ΡΠ΄ΠΈΠΊΡ ΡΠΊΡΠΏΠ΅ΡΡΠ°:
| Π§ΡΠΎ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΎ | ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ | ΠΠ°ΠΊ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΎ |
|---|---|---|
| ROC-AUC | **0.6764** [0.6309, 0.7218] | 5 seed'ΠΎΠ² Π½Π° ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΌ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠΈ |
| PR-AUC | 0.4759 [0.4141, 0.5377] | ΡΠ°ΠΌ ΠΆΠ΅; Π±Π°Π·ΠΎΠ²ΡΠΉ ΡΡΠΎΠ²Π΅Π½Ρ ΠΏΡΠΈ 30 % Π½Π°ΡΡΡΠ΅Π½ΠΈΠΉ β 0.30 |
| F1 | 0.5676 [0.5270, 0.6082] | ΡΠ°ΠΌ ΠΆΠ΅; ΠΏΠΎΡΠΎΠ³ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ°Π½ Π½Π° ΡΠΎΠΉ ΠΆΠ΅ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ β ΡΠΌΠ΅ΡΠ΅Π½ΠΎ Π²Π²Π΅ΡΡ
|
| ROC-AUC ΠΏΠΎ ΠΎΠ±Π»Π°ΡΡΡΠΌ | ΠΏΠΎΠ·Π²ΠΎΠ½ΠΎΡΠ½ΠΈΠΊ 0.943, Π±Π΅Π΄ΡΠΎ R 0.576, Π±Π΅Π΄ΡΠΎ L 0.550 | ΡΠ°Π±ΠΎΡΠΈΠΉ ΡΠ΅ΠΊΠΏΠΎΠΈΠ½Ρ, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½Π°Ρ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΡ |
| ΠΠΎΠ½ΡΡΠΎΠ»ΡΠ½Π°Ρ Π·Π°Π΄Π°ΡΠ° Β«ΠΏΠΎΠ·Π²ΠΎΠ½ΠΎΡΠ½ΠΈΠΊ / Π±Π΅Π΄ΡΠΎΒ» | AUC 1.00 | ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ°Π±ΠΎΡΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π° |
| ΠΠΎΠ΄Π΅Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ½ΠΈΠΌΠΎΠΊ, Π° Π½Π΅ ΠΎΠ±Π»Π°ΡΡΡ | AUC 0.854 ΠΏΡΠΎΡΠΈΠ² 0.529 Ρ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΎΠ±Π»Π°ΡΡΠΈ | `discriminator` Π½Π° Π²ΡΡΠΌ Π½Π°Π±ΠΎΡΠ΅, Π²ΠΊΠ»ΡΡΠ°Ρ ΠΎΠ±ΡΡΠ°ΡΡΠΈΠ΅ ΡΠ½ΠΈΠΌΠΊΠΈ |
ΠΠ΅ΡΡΠΈΠΊΠΈ ΠΏΠΎ ΠΎΠ±Π»Π°ΡΡΡΠΌ β Π² `models/train_report.md`, ΠΎΠ½ ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΏΡΠΈ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠΈ.
Π Π°Π·Π±ΠΈΠ²ΠΊΠ° Π²Π°ΠΆΠ½Π°, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Ρ Π½Π΅ΡΠ°Π²Π½ΠΎΠΌΠ΅ΡΠ½ΠΎ: Π² ΠΏΠΎΠ·Π²ΠΎΠ½ΠΎΡΠ½ΠΈΠΊΠ΅
33 ΠΈΠ· 99, Ρ Π±ΡΠ΄Π΅Ρ 21β22 ΠΈΠ· 73β79, Π° ΠΎΠ±Π»Π°ΡΡΡ ΠΏΠΎΡΡΠΈ ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΏΠΎ
ΡΠΈΡΠΈΠ½Π΅ ΠΊΠ°Π΄ΡΠ°. ΠΠΎΡΡΠΎΠΌΡ ΠΎΠ±ΡΠΈΠΉ AUC ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΎΡΡΠ°ΠΆΠ°Π΅Ρ ΡΠ°Π·Π»ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ, Π° Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ
ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅ Π΄Π΅ΡΠ΅ΠΊΡΠ°.
### ΠΡΠ±ΠΎΡ ΠΏΡΠ°Π²ΠΈΠ»Π° ΡΠ°Π·ΠΌΠ΅ΡΠΊΠΈ
ΠΠ΅ΡΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ ΡΡΡΠΎΠΈΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ· ΡΠΊΡΠΏΠ΅ΡΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠ»ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ
ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΏΠΎΠΌΠ΅ΡΠΊΠΈ, ΠΏΡΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ Π²ΡΡΡΠ½ΡΡ Π² ΠΈΠΌΠ΅Π½Π°Ρ
ΡΠ°ΠΉΠ»ΠΎΠ² (ΡΡΡΡΠΈΠΊΡ `_bad`).
ΠΠΎΠΌΠ΅ΡΠΊΠΈ ΡΠ°ΡΡ
ΠΎΠ΄ΠΈΠ»ΠΈΡΡ Ρ ΠΎΡΠ΅Π½ΠΊΠΎΠΉ ΡΠΊΡΠΏΠ΅ΡΡΠ° Π² 15 ΡΠ»ΡΡΠ°ΡΡ
ΠΈΠ· 252, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ
Π²ΡΠ±ΠΈΡΠ°Π»ΠΎΡΡ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ΠΌ: ΠΎΠ΄Π½ΠΎ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅, ΠΏΡΡΡ seed'ΠΎΠ², ΠΎΠ΄ΠΈΠ½ ΡΡΠ°Π»ΠΎΠ½.
| ΠΠ΅ΡΡΠΈΠΊΠ° (ΡΡΠ°Π»ΠΎΠ½) | ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π±Π»ΠΈΡΠ° | Ρ ΡΡΡΡΠΈΠΊΡΠ°ΠΌΠΈ ΠΈΠΌΡΠ½ |
|---|---|---|
| ROC-AUC | **0.6764** [0.6309, 0.7218] | 0.6199 [0.5840, 0.6559] |
| PR-AUC | **0.4759** [0.4141, 0.5377] | 0.4046 [0.3702, 0.4391] |
| F1 | **0.5676** [0.5270, 0.6082] | 0.5426 [0.5073, 0.5778] |
| Recall / Precision | 0.700 / 0.486 | 0.863 / 0.404 |
ΠΠ°ΡΠ½Π°Ρ ΡΠ°Π·Π½ΠΈΡΠ° (ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π±Π»ΠΈΡΠ° β Ρ ΡΡΡΡΠΈΠΊΡΠ°ΠΌΠΈ): ROC-AUC **+0.0564**
[+0.0403, +0.0725], PR-AUC **+0.0713** [+0.0398, +0.1028] β Π·Π½Π°ΠΊΠΈ `+++++`, ΡΠΎ
Π΅ΡΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ Π½Π° Π²ΡΠ΅Ρ
ΠΏΡΡΠΈ seed'Π°Ρ
.
**ΠΡΠΈΠ½ΡΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Β«ΡΠΎΠ»ΡΠΊΠΎ ΡΠΊΡΠΏΠ΅ΡΡΠ½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ°Β».** ΠΠΎΠΌΠ΅ΡΠΊΠΈ Π² ΠΈΠΌΠ΅Π½Π°Ρ
ΡΠ°ΠΉΠ»ΠΎΠ²
ΠΏΡΠΎΡΡΠ°Π²Π»ΡΠ»ΠΈΡΡ Π²ΡΡΡΠ½ΡΡ ΠΈ ΠΎΠΊΠ°Π·Π°Π»ΠΈΡΡ Π½Π΅Π½Π°Π΄ΡΠΆΠ½ΡΠΌΠΈ: ΠΎΠ½ΠΈ ΡΡ
ΡΠ΄ΡΠ°Π»ΠΈ ΡΠΎΠ³Π»Π°ΡΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ Ρ
ΡΠΊΡΠΏΠ΅ΡΡΠΎΠΌ Π½Π° Π½Π΅Π²ΠΈΠ΄Π°Π½Π½ΡΡ
ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡΡ
. ΠΠ³ΠΎΠ²ΠΎΡΠΊΠ°: ΡΡΠ°Π»ΠΎΠ½ β ΡΠ° ΠΆΠ΅ ΡΠ°Π±Π»ΠΈΡΠ°, ΠΏΠΎΡΡΠΎΠΌΡ
Π²Π°ΡΠΈΠ°Π½Ρ, ΠΎΠ±ΡΡΠ°Π²ΡΠΈΠΉΡΡ Π½Π° Π½Π΅ΠΉ, Π² Π²ΡΠΈΠ³ΡΡΡΠ½ΠΎΠΌ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ; Π·Π½Π°ΡΠΈΠΌΠΎ ΡΠΎ, ΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅
Π½Π΅Π½Π°Π΄ΡΠΆΠ½ΡΡ
ΠΏΠΎΠΌΠ΅ΡΠΎΠΊ ΡΠΎΠ³Π»Π°ΡΠΈΠ΅ **ΡΠ½ΠΈΠΆΠ°Π΅Ρ**.
ΠΡΡΡΡ Ρ ΠΏΠΎΠ»Π½ΡΠΌΠΈ ΡΠΈΡΠ»Π°ΠΌΠΈ ΠΈ ΡΠ°Π·Π±ΠΎΡΠΎΠΌ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ β `assets/labeling.md`;
ΠΌΠ°ΡΠΈΠ½Π½ΡΠ΅ ΠΎΡΡΡΡΡ β `models/compare_rules/rule_comparison.md` ΠΈ
`models/train_report.json`.
ΠΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ½ΠΈΠΌΠΊΠ° β ΠΏΠΎΡΡΠ΄ΠΊΠ° 0.02β0.05 Ρ Π½Π° CPU (ResNet18 Ρ
Π·Π°ΠΌΠΎΡΠΎΠΆΠ΅Π½Π½ΡΠΌ backbone), ΡΠΎ Π΅ΡΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ Β«Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 3 ΠΌΠΈΠ½ΡΡ Π½Π° ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅Β»
Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Ρ Π±ΠΎΠ»ΡΡΠΈΠΌ Π·Π°ΠΏΠ°ΡΠΎΠΌ.
---
## ΠΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ (Π²Π°ΠΆΠ½ΠΎ Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΈΠΈ)
1. **Π Π°Π·ΠΌΠ΅ΡΠΊΠ° Π²ΡΠ²Π΅Π΄Π΅Π½Π° ΠΈΠ· ΠΎΡΠ΅Π½ΠΊΠΈ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡ.** ΠΠΊΡΠΏΠ΅ΡΡΠ½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ° ΠΎΠΏΠΈΡΡΠ²Π°Π΅Ρ
ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅, Π° Π½Π΅ ΡΠ½ΠΈΠΌΠΎΠΊ; ΠΏΠ΅ΡΠ΅Π½ΠΎΡ ΠΎΠ΄Π½ΠΎΠ·Π½Π°ΡΠ΅Π½ (ΠΎΠ±Π»Π°ΡΡΡ Π²ΡΡΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·),
Π½ΠΎ ΠΏΠΎΡΡΡΡΠ½ΠΎΠΉ ΡΠΊΡΠΏΠ΅ΡΡΠ½ΠΎΠΉ ΠΎΡΠ΅Π½ΠΊΠΈ ΡΠ½ΠΈΠΌΠΊΠΎΠ² Π² Π½Π°Π±ΠΎΡΠ΅ Π½Π΅Ρ. ΠΡΠΎΠΈΡΡ
ΠΎΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ
ΡΡΡΠΎΠΊΠΈ Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΎ Π² `labels/labels_images.csv`. Π Π°Π·Π±ΠΎΡ β Π²
`assets/labeling.md`.
2. **ΠΠ°Π»ΠΎ Π΄Π°Π½Π½ΡΡ
.** 252 ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΡ
ΡΠ½ΠΈΠΌΠΊΠ°, 77 Π½Π°ΡΡΡΠ΅Π½ΠΈΠΉ. ΠΠΎΠ²Π΅ΡΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Ρ
ΡΠΈΡΠΎΠΊΠΈΠ΅; ΠΎΡΠ΅Π½ΠΊΠ° Π½Π° Π·Π°ΠΊΡΡΡΠΎΠΌ Π½Π°Π±ΠΎΡΠ΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠ»ΠΈΡΠ°ΡΡΡΡ.
3. **Π’ΠΈΠΏ Π½Π°ΡΡΡΠ΅Π½ΠΈΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΡΠ²ΡΠΈΡΡΠΈΠΊΠ°ΠΌΠΈ, Π° Π½Π΅ ΠΎΠ±ΡΡΠ΅Π½Π½ΠΎΠΉ ΠΌΠΎΠ΄Π΅Π»ΡΡ.** ΠΠ»Ρ
ΡΠ΅ΡΡΠ½ΠΎΠ³ΠΎ ΠΌΡΠ»ΡΡΠΈΠΊΠ»Π°ΡΡΠ° Π½ΡΠΆΠ½Π° ΡΠ°Π·ΠΌΠ΅ΡΠΊΠ° ΡΠΈΠΏΠΎΠ² Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠ½ΠΈΠΌΠΊΠ°.
4. **ΠΠ±Π»Π°ΡΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΡΡΡ ΠΏΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΊΠ°Π΄ΡΠ°.** ΠΡΠΈΠ·Π½Π°ΠΊ Π±Π΅Π·ΠΎΡΠΈΠ±ΠΎΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π½Π° ΡΡΠΎΠΌ
ΠΎΠ±ΠΎΡΡΠ΄ΠΎΠ²Π°Π½ΠΈΠΈ (99/99 Π΄Π»Ρ ΠΏΠΎΠ·Π²ΠΎΠ½ΠΎΡΠ½ΠΈΠΊΠ°), Π½ΠΎ ΠΏΡΠΈ ΡΠΌΠ΅Π½Π΅ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ° ΠΏΠΎΡΠΎΠ³
`SPINE_MIN_WIDTH` ΠΏΠΎΡΡΠ΅Π±ΡΠ΅Ρ ΠΊΠ°Π»ΠΈΠ±ΡΠΎΠ²ΠΊΠΈ.
5. **Π DICOM Π½Π΅Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΊΠΈ ROI.** ΠΠΈ overlay, Π½ΠΈ graphic annotation Π² ΡΠ°ΠΉΠ»Π°Ρ
Π½Π΅Ρ,
ΠΏΠΎΡΡΠΎΠΌΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΡ Π½Π°Π½Π΅ΡΡΠ½Π½ΡΡ
ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π½Π΅Π»ΡΠ·Ρ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΠΏΡΡΠΌΡΠΌ
ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ΠΌ β ΠΎΡΠ΅Π½ΠΈΠ²Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π³Π΅ΠΎΠΌΠ΅ΡΡΠΈΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΠΉ Π·ΠΎΠ½Ρ.
6. **ΠΠ²ΡΠΈΡΡΠΈΠΊΠΈ ΠΈΠ· `src/quality/detailed_assessment.py` Π½Π΅ ΠΊΠ°Π»ΠΈΠ±ΡΠΎΠ²Π°Π½Ρ.**
ΠΠΎΡΠΎΠ³ΠΈ Π΄Π»Ρ Β«Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΡΒ», Β«Π°ΡΡΠ΅ΡΠ°ΠΊΡΠΎΠ²Β» ΠΈ ΠΎΡΡΡΡΠΏΠΎΠ² ROI ΡΠ°ΡΡΡΠΈΡΠ°Π½Ρ Π½Π° Π΄ΡΡΠ³ΠΎΠΉ
ΠΌΠ°ΡΡΡΠ°Π± ΠΈΠ½ΡΠ΅Π½ΡΠΈΠ²Π½ΠΎΡΡΠ΅ΠΉ: Π½Π° ΡΡΠΎΠΌ Π½Π°Π±ΠΎΡΠ΅ ΠΎΠ½ΠΈ ΡΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΏΠΎΡΡΠΈ Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ
ΡΠ½ΠΈΠΌΠΊΠ°, Π° ΠΏΡΠΈΠ·Π½Π°ΠΊ ΡΠ΅Π·ΠΊΠΎΡΡΠΈ Π²Π΅Π΄ΡΡ ΡΠ΅Π±Ρ ΠΏΡΠΎΡΠΈΠ²ΠΎΠΏΠΎΠ»ΠΎΠΆΠ½ΠΎ Π² ΠΏΠΎΠ·Π²ΠΎΠ½ΠΎΡΠ½ΠΈΠΊΠ΅ ΠΈ
Π±ΡΠ΄ΡΠ°Ρ
. ΠΠΎΡΡΠΎΠΌΡ Π² ΠΏΠ°Π½Π΅Π»ΠΈ Π΄Π΅ΡΠ°Π»Π΅ΠΉ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ **ΡΠΈΡΠ»ΠΎΠ²ΡΠ΅ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΡ** Ρ
ΠΏΠΎΠΌΠ΅ΡΠΊΠΎΠΉ Β«ΡΠΏΡΠ°Π².Β», Π° Π½Π΅ Π²Π΅ΡΠ΄ΠΈΠΊΡΡ Β«ΠΠ°/ΠΠ΅ΡΒ». ΠΠ»Π°ΡΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ
ΠΌΠΎΠ΄Π΅Π»Ρ. ΠΡΠΎΠ²Π΅ΡΠΈΡΡ Π΅Ρ Π²ΠΊΠ»Π°Π΄ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
```bash
python -m src.dxa.discriminator --model-path models/dxa_model.pth
```
## Π§ΡΠΎ ΠΏΡΠΎΠ²Π΅ΡΠ΅Π½ΠΎ ΠΈ ΠΊΠ°ΠΊ
| ΠΡΠΎΠ²Π΅ΡΠΊΠ° | ΠΠΎΠΌΠ°Π½Π΄Π° | Π Π΅Π·ΡΠ»ΡΡΠ°Ρ |
|---|---|---|
| ΠΠΎΠ΄Π΅Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ½ΠΈΠΌΠΎΠΊ, Π° Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±Π»Π°ΡΡΡ | `python -m src.dxa.discriminator` | AUC 0.854 ΠΏΡΠΎΡΠΈΠ² 0.529 Ρ ΠΏΡΠ°Π²ΠΈΠ»Π° Β«ΠΏΠΎΠ·Π²ΠΎΠ½ΠΎΡΠ½ΠΈΠΊ = Π½Π°ΡΡΡΠ΅Π½ΠΈΠ΅Β»; Π²Π½ΡΡΡΠΈ ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ Ρ ΠΌΠΎΠ΄Π΅Π»ΠΈ 0.85β0.93, Ρ ΠΏΡΠ°Π²ΠΈΠ»Π° 0.50 |
| ΠΠΎΠ½ΡΡΠ°ΠΊΡ API Π΄Π»Ρ Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° | `python -m pytest tests/test_api_contract.py` | ΠΏΠΎΠ»Ρ ΠΏΠ°Π½Π΅Π»ΠΈ Π΄Π΅ΡΠ°Π»Π΅ΠΉ, ΡΠ°Π·Π»ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΌΠ΅ΡΡΠΈΠΊ, PNG-Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ Π½Π΅ΠΊΠ°Π»ΠΈΠ±ΡΠΎΠ²Π°Π½Π½ΡΡ
Π²Π΅ΡΠ΄ΠΈΠΊΡΠΎΠ², ΠΊΠ°Π½ΠΎΠ½ΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΊΠΎΠ΄Ρ ΡΠΈΠΏΠΎΠ² Π½Π°ΡΡΡΠ΅Π½ΠΈΠΉ, ΠΊΠ°ΡΡΠΎΡΠΊΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ |
| ΠΠ΄ΠΈΠ½ΡΠΉ ΡΠ»ΠΎΠ²Π°ΡΡ Π½Π°ΡΡΡΠ΅Π½ΠΈΠΉ | `python -m pytest tests/test_violations.py` | ΠΊΠΎΠ΄Ρ, ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ, ΠΊΠΎΠ΄Ρ SR, ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΡ
Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ Ρ ΡΠ°Π±Π»ΠΈΡΠ΅ΠΉ |
| Π Π°Π·ΠΌΠ΅ΡΠΊΠ° ΠΈ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
| `python -m pytest tests/test_labels.py` | ΡΠΊΠ»Π΅ΠΉΠΊΠ° Π΄ΡΠ±Π»Π΅ΠΉ, ΡΠ°Π·Π±ΠΎΡ ΠΈΠΌΡΠ½, ΡΠΈΠΊΡΠ°ΡΠΈΡ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΡ, ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΡΡΠ΅ΡΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρ train/val |
| ΠΠΌΠ΅Π½Π° DICOM-ΡΠ°ΠΉΠ»ΠΎΠ² | `python -m pytest tests/test_rename_files.py` | ΡΠ°Π·Π±ΠΎΡ ΠΈΠΌΡΠ½, ΠΏΠΎΠΈΡΠΊ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π½ΠΎΠΌΠ΅ΡΠ° ΠΏΡΠΈ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠ΅, ΠΎΡΠΊΠ°Π· ΠΎΡ ΡΠ³Π°Π΄ΡΠ²Π°Π½ΠΈΡ ΠΎΠ±Π»Π°ΡΡΠΈ, ΡΠΈΠΊΠ» Β«ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ β ΠΎΡΠΊΠ°ΡΠΈΡΡΒ» |
| Π Π°Π·ΠΌΠ΅ΡΠΊΠ° ΠΏΠΎ ΡΠΊΡΠΏΠ΅ΡΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ | `python -m pytest tests/test_excel_labels.py` | ΡΡΠ΅Π½ΠΈΠ΅ ΠΊΡΠΈΡΠ΅ΡΠΈΠ΅Π², Π³ΠΎΠ»ΠΎΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ΠΎΠ±Π»Π°ΡΡΠΈ, ΠΏΠ΅ΡΠ΅Π½ΠΎΡ Π½Π° Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ Π±Π΅Π΄ΡΠΎ, ΠΏΡΠ°Π²ΠΈΠ»Π° `table`/`union`/`expert`, ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ |
| ΠΡΠ±ΠΎΡ ΠΏΡΠ°Π²ΠΈΠ»Π° ΠΌΠ΅ΡΠΊΠΈ | `./run.sh split && ./run.sh compare` | ROC-AUC 0.6764 ΠΏΡΠΎΡΠΈΠ² 0.6199 ΠΏΠΎ ΡΡΠ°Π»ΠΎΠ½Ρ, ΠΏΠ°ΡΠ½Π°Ρ Ξ +0.0564 [+0.0403, +0.0725], 5/5 seed'ΠΎΠ² Π² ΠΏΠΎΠ»ΡΠ·Ρ ΡΠΊΡΠΏΠ΅ΡΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΡ |
| ΠΠ΅ΡΡΠΈΠΊΠΈ ΠΈ ΠΏΠΎΡΠΎΠ³ | `python -m pytest tests/test_preprocess_and_model.py` | ΠΏΠΎΠ΄Π±ΠΎΡ ΠΏΠΎΡΠΎΠ³Π° ΠΏΡΠΈ Π΄ΠΈΡΠ±Π°Π»Π°Π½ΡΠ΅, roundtrip ΡΠ΅ΠΊΠΏΠΎΠΈΠ½ΡΠ°, BatchNorm |
| ΠΠ΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ | `node tests/browser/ui_check.js` | ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ° ΠΎ ΠΊΠ»ΠΈΠΊΠ°Π±Π΅Π»ΡΠ½ΠΎΡΡΠΈ ΡΡΡΠΎΠΊ Π²ΠΈΠ΄Π½Π° ΠΈ ΡΠΊΡΡΠ²Π°Π΅ΡΡΡ Π½Π° ΠΏΡΡΡΠΎΠΌ ΡΠΈΠ»ΡΡΡΠ΅; ΠΊΠ½ΠΎΠΏΠΊΠ° Β«ΠΡΠΊΡΡΡΡΒ» ΠΎΡΠΊΡΡΠ²Π°Π΅Ρ ΠΏΠ°Π½Π΅Π»Ρ; Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ°Π½Π΅Π»ΠΈ ΠΌΠ΅Π½ΡΡΡΡΡ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΡΡΡΠΎΠΊ; ΠΏΠ°Π½Π΅Π»Ρ Β«Π ΠΌΠΎΠ΄Π΅Π»ΠΈΒ» Π½Π°ΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ ΠΌΠ΅ΡΡΠΈΠΊΠ°ΠΌΠΈ ΠΈ ΡΠ»ΠΎΠ²Π°ΡΡΠΌ |
| Π Π°Π±ΠΎΡΠ° Π±Π΅Π· ΡΠ΅ΡΠΈ | `node tests/browser/ui_offline.js` | Π½ΠΎΠ»Ρ Π²Π½Π΅ΡΠ½ΠΈΡ
Π·Π°ΠΏΡΠΎΡΠΎΠ², ΡΡΠΈΠ»ΠΈ ΠΈ ΠΈΠΊΠΎΠ½ΠΊΠΈ Π½Π° ΠΌΠ΅ΡΡΠ΅ |
ΠΡΠ°ΡΠ·Π΅ΡΠ½ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΡΠ΅Π±ΡΡΡ Π·Π°ΠΏΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΠ²Π΅ΡΠ°:
```bash
python -m uvicorn src.main:app --port 8123
node tests/browser/ui_check.js # ΠΏΠ°Π½Π΅Π»Ρ Π΄Π΅ΡΠ°Π»Π΅ΠΉ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΡΡΡ ΠΏΠΎ ΠΊΠ»ΠΈΠΊΡ
node tests/browser/ui_offline.js # ΡΠ°Π±ΠΎΡΠ° Π±Π΅Π· Π΄ΠΎΡΡΡΠΏΠ° ΠΊ Π²Π½Π΅ΡΠ½ΠΈΠΌ ΡΠ΅ΡΠ²ΠΈΡΠ°ΠΌ
```
ΠΡΠ»Π°ΠΉΠ½-ΡΠ΅ΠΆΠΈΠΌ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΌΠΈ ΠΊΠΎΠΏΠΈΡΠΌΠΈ Tailwind ΠΈ FontAwesome
(`src/api/static/vendor`, `src/api/static/webfonts`); ΡΡΡΠ°Π½ΠΈΡΠ° Π½Π΅ ΠΎΠ±ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΊ CDN.
## ΠΠ»Π°Π½ Π΄ΠΎΡΠ°Π±ΠΎΡΠΊΠΈ
- Π Π°Π·ΠΌΠ΅ΡΠΈΡΡ ΡΠΈΠΏΡ Π½Π°ΡΡΡΠ΅Π½ΠΈΠΉ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΡΠ½ΠΈΠΌΠΊΠ° ΠΈ ΠΎΠ±ΡΡΠΈΡΡ ΠΌΡΠ»ΡΡΠΈΠ»Π΅ΠΉΠ±Π»-ΠΊΠ»Π°ΡΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ.
- Π‘ΠΎΠ±ΡΠ°ΡΡ 500+ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΉ Π΄Π»Ρ ΡΡΡΠΎΠΉΡΠΈΠ²ΡΡ
ΠΌΠ΅ΡΡΠΈΠΊ ΠΈ ΡΠ΅ΡΡΠ½ΠΎΠΉ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ.
- ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ Grad-CAM Π΄Π»Ρ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΡ ΡΠ΅ΡΠ΅Π½ΠΈΡ (ΠΌΠΎΠ΄ΡΠ»Ρ Π΅ΡΡΡ, Π½ΠΎ Π½Π΅ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°Π½).
- ΠΠ°ΠΌΠ΅Π½ΠΈΡΡ ΠΏΠΎΡΠΎΠ³ ΠΏΠΎ ΡΠΈΡΠΈΠ½Π΅ ΠΊΠ°Π΄ΡΠ° Π½Π° ΠΊΠ°Π»ΠΈΠ±ΡΠΎΠ²ΠΊΡ ΠΏΠΎ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠΌ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ°.
---
## Π‘ΡΡΡΠΊΡΡΡΠ° ΠΏΡΠΎΠ΅ΠΊΡΠ°
```
bone_2026/
βββ src/
β βββ main.py # FastAPI: ΠΌΠ°ΡΡΡΡΡΡ ΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ
β βββ dxa/ # Π΄Π΅ΠΉΡΡΠ²ΡΡΡΠΈΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΎΡΠ΅Π½ΠΊΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²Π°
β β βββ labels.py # ΡΠ°Π·Π±ΠΎΡ ΠΈΠΌΡΠ½, ΠΌΠ΅ΡΠΊΠΈ, ΡΠΊΠ»Π΅ΠΉΠΊΠ° Π΄ΡΠ±Π»Π΅ΠΉ, ΡΠΏΠ»ΠΈΡ
β β βββ excel_labels.py # ΡΠ°Π·ΠΌΠ΅ΡΠΊΠ° ΡΠ½ΠΈΠΌΠΊΠΎΠ² ΠΏΠΎ ΡΠΊΡΠΏΠ΅ΡΡΠ½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅
β β βββ rename_files.py # ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈΠΌΡΠ½ DICOM ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠΌΡ Π²ΠΈΠ΄Ρ
β β βββ violations.py # Π΅Π΄ΠΈΠ½ΡΠΉ ΡΠ»ΠΎΠ²Π°ΡΡ ΡΠΈΠΏΠΎΠ² Π½Π°ΡΡΡΠ΅Π½ΠΈΠΉ (ΠΊΠΎΠ΄Ρ, ΠΏΠΎΠ΄ΠΏΠΈΡΠΈ)
β β βββ model_card.py # ΠΊΠ°ΡΡΠΎΡΠΊΠ° ΡΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ /api/v1/model ΠΈ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°
β β βββ compare_labels.py # ΡΡΠ°Π²Π½Π΅Π½ΠΈΠ΅ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠ² ΡΠ°Π·ΠΌΠ΅ΡΠΊΠΈ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ Π½Π°Π±ΠΎΡΠ΅
β β βββ discriminator.py # ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π²ΠΊΠ»Π°Π΄Π° ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΡΠ½ΠΈΠΌΠΊΠ°
β β βββ render.py # ΡΠ΅Π½Π΄Π΅Ρ ΡΠ½ΠΈΠΌΠΊΠΎΠ² ΠΈ ΠΊΠΎΠ½ΡΠ°ΠΊΡΠ½ΡΡ
Π»ΠΈΡΡΠΎΠ²
β β βββ preprocess.py # DICOM -> ΡΠ΅Π½Π·ΠΎΡ (ΠΎΠ±ΡΠΈΠΉ Π΄Π»Ρ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ ΠΈ API)
β β βββ dataset.py # Dataset ΠΈ DataLoader
β β βββ model.py # ΡΠ΅ΡΡ, ΠΌΠ΅ΡΡΠΈΠΊΠΈ, ΠΏΠΎΠ΄Π±ΠΎΡ ΠΏΠΎΡΠΎΠ³Π°
β β βββ train.py # ΠΎΠ±ΡΡΠ΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΡΡΡ
β β βββ inference.py # ΠΏΠ°ΠΊΠ΅ΡΠ½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΠ΅Π½Ρ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ
β βββ quality/ # ΡΠ²ΡΠΈΡΡΠΈΠΊΠΈ (ΡΠ°ΡΡΠΈΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ API)
β βββ api/static/ # Π²Π΅Π±-ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ
β βββ model/, core/, pipeline/ # ΡΡΡΠ°ΡΠ΅Π²ΡΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»ΠΈ, Π½Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½Ρ ΠΊ API
βββ labels/labels_images.csv # ΡΠ°Π·ΠΌΠ΅ΡΠΊΠ° ΡΠ½ΠΈΠΌΠΊΠΎΠ²: ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½Π°Ρ (+ .xlsx)
βββ labels/labels_images_table.csv # Π²Π°ΡΠΈΠ°Π½Ρ Β«ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π±Π»ΠΈΡΠ°Β» (ΡΠΎ ΠΆΠ΅, ΡΡΠΎ Π²ΡΡΠ΅)
βββ labels/labels_images_union.csv # Π²Π°ΡΠΈΠ°Π½Ρ Β«ΡΠ°Π±Π»ΠΈΡΠ° ΠΈΠ»ΠΈ ΡΡΡΡΠΈΠΊΡ ΠΈΠΌΠ΅Π½ΠΈΒ»
βββ labels/labels_images_expert.csv # ΡΡΠ°Π»ΠΎΠ½ Π΄Π»Ρ ΠΎΡΠ΅Π½ΠΊΠΈ: ΡΠΎΠ»ΡΠΊΠΎ ΡΠ½ΠΈΠΌΠΊΠΈ Ρ ΠΎΡΠ΅Π½ΠΊΠΎΠΉ
βββ labels/split_expert_seed42.json # Π·Π°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ (19 ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΉ)
βββ labels/rename_map.csv # ΠΊΠ°ΡΡΠ° ΠΏΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠΉ ΡΠ°ΠΉΠ»ΠΎΠ² (Π΄Π»Ρ ΠΎΡΠΊΠ°ΡΠ°)
βββ assets/img/ # ΡΡ
Π΅ΠΌΡ Π°ΡΡ
ΠΈΡΠ΅ΠΊΡΡΡΡ ΠΈ ΡΠΊΡΠΈΠ½ΡΠΎΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°
βββ assets/labeling.md # ΠΊΠ°ΠΊ ΠΏΠΎΡΡΡΠΎΠ΅Π½Π° ΡΠ°Π·ΠΌΠ΅ΡΠΊΠ° ΠΈ ΠΊΠ°ΠΊ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π»ΠΈΡΡ Π²Π°ΡΠΈΠ°Π½ΡΡ
βββ models/dxa_model.pth # ΡΠ°Π±ΠΎΡΠΈΠΉ ΡΠ΅ΠΊΠΏΠΎΠΈΠ½Ρ (+ train_report.md)
βββ models/archive/ # ΠΏΡΠ΅ΠΆΠ½ΠΈΠ΅ ΡΠ΅ΠΊΠΏΠΎΠΈΠ½ΡΡ (ΡΠΌ. README Π²Π½ΡΡΡΠΈ)
βββ models/compare_rules/ # ΡΠ΅ΠΊΠΏΠΎΠΈΠ½ΡΡ ΠΈ ΠΎΡΡΡΡ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΠΏΡΠ°Π²ΠΈΠ» ΠΌΠ΅ΡΠΊΠΈ
βββ tests/ # pytest: ΠΌΠ΅ΡΠΊΠΈ, ΡΠΏΠ»ΠΈΡ, ΠΌΠ΅ΡΡΠΈΠΊΠΈ, ΠΌΠΎΠ΄Π΅Π»Ρ, API
βββ dataset_hack/ # Π΄Π°Π½Π½ΡΠ΅ (Π² git Π½Π΅ Ρ
ΡΠ°Π½ΡΡΡΡ)
βββ Dockerfile
βββ requirements.txt
βββ run.sh
```
## ΠΠ°ΠΏΡΡΠΊ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ
```bash
python -m src.dxa.train --epochs 100 --output-dir models
```
| ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ | ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ | ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ |
|---|---|---|
| `--data-root` | `dataset_hack` | ΠΠ°ΡΠ°Π»ΠΎΠ³ Π΄Π°ΡΠ°ΡΠ΅ΡΠ° |
| `--annotation-path` | `dataset_hack/ΠΠ_Π΄Π»Ρ_ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ/ΡΠ°Π·ΠΌΠ΅ΡΠΊΠ°.xlsx` | Excel Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΊΠΎΠΉ (ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡΡΡΡ ΠΎ ΡΠ°ΡΡ
ΠΎΠΆΠ΄Π΅Π½ΠΈΡΡ
) |
| `--labels-csv` | `labels/labels_images.csv` | Π Π°Π·ΠΌΠ΅ΡΠΊΠ° ΡΠ½ΠΈΠΌΠΊΠΎΠ² ΠΈΠ· `./run.sh label`; ΠΏΡΡΡΠ°Ρ ΡΡΡΠΎΠΊΠ° β ΠΌΠ΅ΡΠΊΠΈ ΠΈΠ· ΠΈΠΌΡΠ½ ΡΠ°ΠΉΠ»ΠΎΠ²; ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠΈΠΉ ΡΠ°ΠΉΠ» β ΠΎΡΠΊΠ°Ρ ΠΊ ΠΈΠΌΠ΅Π½Π°ΠΌ Ρ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ |
| `--split-file` | β | ΠΠ°ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΠΈΠ· `./run.sh split`; ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΉ held-out Π½Π°Π±ΠΎΡ Π΄Π»Ρ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ² ΡΠ°Π·ΠΌΠ΅ΡΠΊΠΈ |
| `--backbone` | `resnet18` | `resnet18` / `resnet34` |
| `--head` | `linear` | `linear` (Π»ΠΈΠ½Π΅ΠΉΠ½ΡΠΉ Π·ΠΎΠ½Π΄) / `mlp` |
| `--freeze-epochs` | `-1` | `-1` β backbone Π·Π°ΠΌΠΎΡΠΎΠΆΠ΅Π½ Π²ΡΠ΅Π³Π΄Π°; `0` β ΠΎΠ±ΡΡΠ°ΡΡ Π²ΡΡ ΡΠ΅ΡΡ |
| `--epochs`, `--batch-size`, `--learning-rate`, `--weight-decay` | 100 / 16 / 3e-4 / 5e-2 | ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ |
| `--balance` | `none` | `loss` / `sampler` Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠ΅Π½ΡΠ°ΡΠΈΠΈ Π΄ΠΈΡΠ±Π°Π»Π°Π½ΡΠ° |
| `--val-fraction`, `--seed` | 0.2 / 42 | Π Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΡΠΌ |
| `--augment` | Π²ΡΠΊΠ»ΡΡΠ΅Π½ΠΎ | ΠΠΊΠ»ΡΡΠ°Π΅Ρ ΡΡΠΊΠΎΡΡΠ½ΡΡ Π°ΡΠ³ΠΌΠ΅Π½ΡΠ°ΡΠΈΡ (ΡΡ
ΡΠ΄ΡΠ°Π΅Ρ ΠΌΠ΅ΡΡΠΈΠΊΠΈ, ΡΠΌ. ΠΏ. 5) |
| `--output-dir` | `models` | ΠΡΠ΄Π° ΡΠΎΡ
ΡΠ°Π½ΡΡΡ ΡΠ΅ΠΊΠΏΠΎΠΈΠ½Ρ ΠΈ ΠΎΡΡΡΡΡ |
| `--dry-run` | β | ΠΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΠ°Π·Π±ΠΎΡ Π΄Π°Π½Π½ΡΡ
ΠΈ ΡΠ°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ Π±Π΅Π· ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ |
ΠΠΎΡΠ»Π΅ ΠΎΠ±ΡΡΠ΅Π½ΠΈΡ Π² `--output-dir` ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ `dxa_model.pth`, `train_report.md`
ΠΈ `train_report.json`; ΠΎΡΡΡΡ ΡΠ΄ΠΎΠ±Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠΈΡΡ ΠΊ ΠΏΡΠ΅Π·Π΅Π½ΡΠ°ΡΠΈΠΈ.
## ΠΠΎΠΌΠ°Π½Π΄Π°
- **ΠΡΠ°ΡΠ΅Π² ΠΠ΅Π½ΠΈΡ** β ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°
- **ΠΡΠ°ΡΠ΅Π² Π’Π°ΡΡΡΠ½Π°** β ΠΊΠ°ΠΏΠΈΡΠ°Π½
Built for Bone Quality Assessment Hackathon 2026